Вариант развёртывания Linux систем на базе Puppet 4. Часть II: доступ и стандартное окружение (cfauth + cfsystem)
Вкратце:
- cfauth — настраивает сервис SSH, админскую учётную запись,
sudo
, пароль суперпользователя- cfsystem — настройка: APT, временной зоны, отправки системных писем, синхронизация времени, расширенный список стандартных пакетов
- Все модули интегрированы с модулем сетевого фильтра cfnetwork и не требуют дополнительных настроек
Тематический цикл:
- Часть I: сеть и сетевой фильтр (cfnetwork + cffirehol)
- Часть II: доступ и стандартное окружение (cfauth + cfsystem)
- Часть III: установка Puppet Server (cfpuppetserver)
- Часть IV: централизованное управление (cftotalcontrol)
- Часть V: базы данных (cfdb)
- Часть VI: актуальные чёрные списки и защищённый стук
Данная пара модулей служит для автоматизации стандартных действий, которые требуется осуществить практически на любой развёрнутой системе.
Модуль cfauth
цели
- Вычистить OpenSSH конфиг и оставить только самое необходимое
- Доступ только по публичному ключу
- Отключение получения DNS хостов клиента — и запально, и дополнительные тормоза (не всегда)
- Отключение баннеров OpenSSH и Debian
- Включение агрессивного SSH KeepAlive
- Разрешить доступ по SSH только для пользователей специальной группы
ssh_access
- Установка пароля суперпользователя в зашифрованном виде
- Создание отдельного пользователя для доступа по SSH
- Разрешение
sudo
команд - По умолчанию без пароля (упрощает администрирование большого количества систем):
/opt/puppetlabs/puppet/bin/puppet agent --test
/usr/bin/apt-get update
/usr/bin/apt-get dist-upgrade
/usr/bin/apt-get autoremove *
- По умолчанию разрешённые параметры окружения:
DEBIAN_FRONTEND
- Допустимо отключение пароля
sudo
для всех команд — удобно и относительно безопасно для большого количества машин в ДМЗ
- Разрешение
конфигурация
cfauth::admin_auth_keys
— обязательный список публичных SSH ключей в формате ssh_authorized_key
- параметр
user
уже задан type = 'ssh-rsa'
— по умолчанию
- параметр
admin_user = 'adminaccess'
— имя учётной записи для администратора. Желательно поменять и не использовать стандартное.admin_password = undef
— если указан, то устанавливает захешированный пароль для пользователейroot
и$admin_user
Рекомендуется использоватьmkpasswd -m sha-512
для генерации пароляadmin_hosts = undef
— передаётся какsrc
для сетевого фильтраcfnetwork::service_port
. Настоятельно рекомендуется.sudo_no_password_all = false
— еслиtrue
, то разрешает пользователю$admin_user
запускать все команды черезsudo
без пароляsudo_no_password_commands = undef
— дополнительный списокsudo
команд, которые$admin_user
может выполнить без пароля. Для случаев, когда нецелесообразно разрешать все команды.sudo_env_keep = []
— дополнительные переменные окружения, которые разрешено оставлять дляsudo
sshd_ports = 22
— список SSH портов по умолчанию. Автоматически создаёт сервисcfssh
черезcfnetwork::describe_services
sshd_config_template = 'cfauth/sshd_config.epp'
— возможность переопределить стандартный шаблон генерации конфигурационного файла OpenSSH
Модуль cfsystem
Данный модуль ориентирован не только на обособленные системы, но и на возможность предоставлять стандартные сервисы внутри ДМЗ в целях ограничения допустимых исходящих соединений и поддержания этических сетевых норм — не ломиться бригадой из десятков систем на внешние сервисы.
цели
- Установка
hostname
в соответствии сcertname
— для профилактики - Установить настройки APT для конкретного релиза Debian или Ubuntu
- По умолчанию APT pinning установлен 1001 для основных пакетов, что принудительно устанавливает актуальные пакеты даже если требуется откат на более старые версии (актуально, если были случайно установлены пакеты testing или unstable)
- При необходимости, настроить кэширующий прокси-сервер
- Целесообразно только при развёртывании более одной система в одном месте
- Используется apt-cacher-ng
- Может использоваться как простой HTTP/HTTPS прокси для скачивания иных обновлений в инфраструктуру без необходимости разрешать исходящие соединения во внешний мир. По понятным причинам HTTPS не кэшируется.
- Устанавливает часовой пояс.
Рекомендация: на вкус и цвет, но UTC по умолчанию решает множество проблем — говорю и как админ, и как разработчик. - Устанавливает постоянную синхронизацию времени
- При необходимости, позволить другим машинам использовать данную систему как эталон времени
- Установить настройки
SMTP
- При необходимости, указать smarthost с логином и паролем
- При необходимости, разрешить другим локальным машинам централизовано пересылать свои системные сообщения
Примечание: это удобно с точки зрения сетевой безопасности, хранения доступа к smarthost или правильных настроек DNS и т.п.
- Установить все необходимые правила сетевого фильтра через
cfnetwork
API - Установить множество разнообразные подручных средств админа, которые не входят в стандартный список утилит, в т.ч.: etckeeper, curl, htop, tree, ethtool, iftop, netcat, netstat-nat, conntrack, telnet, screen, apticron, chkrootkit, rkhunter, debsums и т.д. (не полон и будеть расширяться, возможно добавиться конфигурационная опция)
- Установить и извлекать специальные факты
cf_location
иcf_location_pool
, которые удобно использовать в конфигурации Hiera. - Настройка стандартных параметров системы
- Принудительная установка noop планировщика ввода-вывода для SSD и виртуальных дисков (на гостевых системах)
- Возможность добавить произвольные команды в /etc/rc.local
- Установка всех возможных локалей и выбор одной стандартной (по умолчанию en_US.UTF-8)
- Ежедневная проверка необходимости перезагрузки, если версия ядра не совпадает с самой новой установленной
- Принудительной обновление puppet.conf клиента
- Набор вспомогательных скриптов, установленных под /opt/codingfuture/bin и добавленных в путь Shell и Csh:
- cf_clear_email_queue — удалить все письма из системной очереди на отсылку
- cf_clear_frozen_emails — удалить только замороженные письма из очереди на отсылку
- cf_send_test_email — послать тестовое письма на адрес админа
- cf_kernel_version_check — проверить расхождение между запущенной версией ядра и самой последней установленной
класс cfsystem
Все вложенные классы, добавляются автоматически.
allow_nfs = false
— если не разрешено, то выпиливает установленные по умолчанию RPC & NFSadmin_email = undef
— адрес электронный почты для системных уведомленийrepo_proxy = undef
— установка HTTP/HTTPS прокси-сервера для скачивания системных пакетов
host
— IP или имяport
— TCP порт
add_repo_cacher = false
— установить прокси-сервер, принимающий клиентов на$service_face
service_face = 'any'
— интерфейсcfnetwork::iface
, на котором слушать клиентов, если включены сервисыntp_servers = [ 'pool.ntp.org' ]
— список NTP серверов для синхронизацииadd_ntp_server = false
— установить NTP-сервер, принимающий клиентов на$service_face
timezone = 'Etc/UTC'
— временная зонаapt_purge
— передаётся вapt::purge
, удаляет все неуправляемые настройки репозиториев и преференций пакетовapt_update
— передаётся вapt::update
. По умолчанию, ежедневно с таймаутом в 300 секунд.apt_pin = 1001
— приоритет для стандартных пакетов. Дополнительные репозитории добавляются как $apt_pin + 1 (1001 >= принудительный downgrade)apt_backports_pin = 600
— если не установить >= $apt_pin > 1000, то пакеты будут автоматически откатываться на старую версию (так по умолчанию, из-за ограниченной поддержки обновлений безопасности)real_hdd_scheduler = 'deadline'
— планировщик ввода-вывода реальных жёстких дисков по умолчанию. Для SSD и виртуалок всегда noop.rc_local = undef
— дополнительный список команд для /etc/rc.localpuppet_host = "puppet.${::trusted['domain']}"
— адрес Puppet Serverpuppet_cahost = $puppet_host
— адрес Puppet CApuppet_env = $::environment
— текущая среда (обычноproduction
)puppet_use_dns_srv = false
— использовать ли DNS SRV записи для обнаружения$puppet_host
и$puppet_cahost
locale = 'en_US.UTF-8'
— локаль по умолчанию
класс cfsystem::hierapool
Установка и поддержка фактов, которые удобно использовать для настройке иерархии в hiera.yaml.
cf_location
— по сути ассоциативное название физического центра данных. На этой основе удобно выставлять адреса репозитория пакетов APT и т.п..cf_location_pool
— конкретная группа серверов, подразумевает под собой отдельную ДМЗ группу в конкретном месте расположения.
Пример:
---
:backends:
- yaml
:hierarchy:
- "%{::trusted.domain}/%{::trusted.hostname}"
- "%{::trusted.domain}"
- "%{::cf_location}/%{::cf_location_pool}"
- "%{::cf_location}"
- common
:merge_behavior: deeper
:yaml:
:datadir:
Параметры:
location = undef
— сохраняет в/etc/cflocation
, если заданpool = undef
— сохраняет в/etc/cflocationpool
, если задан
класс cfsystem::email
Настройка отправки системных уведомлений.
smarthost = undef
— устанавливает smarthost для SMTPsmarthost_login = undef
— логин для smarthost при необходимостиsmarthost_password = undef
— пароль для smarthost при необходимостиrelay_nets = <private subnets>
— список сетей, которым разрешено пересылать письма через эту систему (само по себе не включает)listen_ifaces = undef
— список названийcfnetwork::iface
интерфейсов, на которых слушать клиентов для пересылки писемdisable_ipv6 = true
— отключение IPv6 — идёт прямиком в конфиг Exim4.
Примечание: использование IPv6 для SMTP пока плохая идея.
класс cfsystem::sysctl
vm_swappiness = 1
— 0-100 (%), уменьшает использование swap до минимума по умолчанию.
Данный функционал ещё не полный и скорее всего будет расширяться.
класс cfsystem::debian
Специфично для Debian:
apt_url = 'http://httpredir.debian.org/debian'
— Базовый адрес для APT
Внимание: были замечены проблемы с apt-cacher-ng — лучше указать фиксированный, если используется для инфраструктурыsecurity_apt_url = 'http://security.debian.org/'
— Базовый адрес для Debian Security APTrelease
= 'jessie' — название релиза
класс cfsystem::ubuntu
Специфично для Ubuntu:
apt_url = 'mirror://mirrors.ubuntu.com/mirrors.txt'
— Базовый адрес для APTrelease = 'wily'
— название релиза
тип cfsystem::debian::debconf
Обёртка вокруг стандартного типа package
, но с поддержкой идеологически правильной конфигурации Debian Config.
package = $title
— название пакета, прямо вpackage
ensure = present
— прямо вpackage
config = []
— конфигурационные опции дляdebconf-set-selections
Живой пример
Полноценное развёртывание инфраструктуры в Vagrant можно посмотреть здесь.
настройки Hiera
---
classes:
- cfsystem
# При необходимости устанавливает настройки для фактов `cf_location` и `cf_location_pool` на последующих вызовах
# Обычно, эти факты устанавливаются при инициализации системы
cfsystem::hierapool::location: 'somelocation'
cfsystem::hierapool::pool: 'somepool'
cfauth::admin_user: vagrant
# mkpasswd -m sha-512: 'vagrant'
cfauth::admin_password: '$6$W32Psa5h$l7iIrVFdG.6SRta86n1GlDcMBapDP3fpzLD4F2Vkz2xTfd2GFg34h5CEBH3JifiVRszumAteGDLXZEbp2bx3Z0'
cfauth::sudo_no_password_all: true
cfauth::admin_auth_keys:
data_test:
key: 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQDiruOsKA2xTeITRnmLlWph1xNdyoX7cufWU48737E8KQSltRZEeyyLKKPR0L+XTwrvpIhwymikP+7K77KMF8yEg9f98FaYtxGdEvPqGVO7Dezdg3eQmQzYce0/wlgLXn0GJa2TcrG7lvSnHkCjbOV5lRWP5vY92skYQHhuwtMgtQ=='
options:
- 'from="10.0.0.0/8,192.168.0.0/16,172.16.0.0/12"'
# Здесь должен быть хорошо выверенный список разрешённых IP
cfauth::admin_hosts:
- '10.0.0.0/8'
- '192.168.0.0/16'
- '172.16.0.0/12'
# Использовать APT кэш, NTP и SMTP Smarthost на инфраструктурном сервере
cfsystem::repo_proxy:
host: maint.example.com
port: 3142
cfsystem::ntp_servers: 'maint.example.com'
cfsystem::email::smarthost: 'maint.example.com'
# Такие настройки должны быть на самом 'maint.example.com'
#===================================================
cfsystem::add_repo_cacher: true
cfsystem::add_ntp_server: true
cfsystem::ntp_servers:
- 0.debian.pool.ntp.org
- 1.debian.pool.ntp.org
- 2.debian.pool.ntp.org
- 3.debian.pool.ntp.org
cfsystem::email::smarthost:
cfsystem::email::listen_ifaces: 'main'
UPD 2016-02-18:
- Добавлено описание авто-конфигурации планировщика ввода-вывода для дисков
- Поддержка произвольных команд в /etc/rc.local
UPD 2016-03-12:
- Управление APT pinning
- Управления локалями
- Проверка на необходимость перезагрузки, если версия ядра не совпадает с самой новой установленной
- Набор ранее не документированных вспомогательных скриптов для Exim
- Опции конфигурации Puppet Agent
- Тип cfsystem::debian::debconf
- Добавлена поддержка переменный окружения для
sudo