Pull to refresh

CodingFuture + Puppet. Часть II: доступ и стандартное окружение (cfauth + cfsystem)

Reading time 8 min
Views 6.9K

Вариант развёртывания Linux систем на базе Puppet 4. Часть II: доступ и стандартное окружение (cfauth + cfsystem)


Вкратце:


  1. cfauth — настраивает сервис SSH, админскую учётную запись, sudo, пароль суперпользователя
  2. cfsystem — настройка: APT, временной зоны, отправки системных писем, синхронизация времени, расширенный список стандартных пакетов
  3. Все модули интегрированы с модулем сетевого фильтра cfnetwork и не требуют дополнительных настроек


Тематический цикл:



Данная пара модулей служит для автоматизации стандартных действий, которые требуется осуществить практически на любой развёрнутой системе.


Модуль 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 & NFS
  • admin_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.local
  • puppet_host = "puppet.${::trusted['domain']}" — адрес Puppet Server
  • puppet_cahost = $puppet_host — адрес Puppet CA
  • puppet_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 для SMTP
  • smarthost_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 APT
  • release = 'jessie' — название релиза

класс cfsystem::ubuntu


Специфично для Ubuntu:


  • apt_url = 'mirror://mirrors.ubuntu.com/mirrors.txt' — Базовый адрес для APT
  • release = '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
Tags:
Hubs:
+10
Comments 0
Comments Leave a comment

Articles