
Этот puppet-модуль предоставляет множество конфигураций, связанных с безопасностью, обеспечивая всестороннюю базовую защиту.
Этот модуль Puppet обеспечивает безопасную конфигурацию вашей базовой ОС с укреплением и является частью DevSec Hardening Framework.
После добавления этого модуля вы можете использовать класс:
class { 'os_hardening': }
Все параметры содержатся в основном классе os_hardening, поэтому вам просто нужно передать их следующим образом:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
Если вы используете этот модуль в среде PE, вы должны установить pe_environment = true
В противном случае Puppet выдаст ошибку (дублирующийся ресурс)!
system_environment = 'default'
определяет контекст, в котором работает система. Некоторые параметры не работают для docker/lxcpe_environment = false
установите значение true, если вы используете Puppet Enterprise ВАЖНО — см. вышеextra_user_paths = []
добавляет дополнительные пути к переменной PATH пользователя (по умолчанию пусто).umask = undef
umask, используемый для создания новых домашних каталогов с помощью useradd / newusers (например, '027')maildir = undef
путь для maildir (например, '/var/mail')usergroups = true
true, если вы хотите отдельные группы для каждого пользователя, false в противном случаеsys_uid_min = undef и sys_gid_min = undef
переопределяют настройку по умолчанию для login.defspassword_max_age = 60
максимальный срок действия пароляpassword_min_age = 7
минимальный срок действия пароля (до разрешения любого другого изменения пароля)password_warn_age = 7
количество дней предупреждения до истечения срока действия пароляlogin_retries = 5
максимальное количество попыток входа при неверном пароле (обычно переопределяется PAM / auth_retries)login_timeout = 60
тайм-аут аутентификации в секундах, после которого вход будет завершёнchfn_restrict = ''
какие поля могут изменять обычные пользователи с помощью chfnallow_login_without_home = false
true, если разрешить вход пользователям без домашнего каталогаallow_change_user = false
может ли пользователь использовать su для смены своего логинаignore_users = []
массив системных учётных записей пользователей, которые не должны быть укреплены (пароль отключён, а оболочка установлена на /usr/sbin/nologin)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
папки, для которых необходимо убедиться, что группа и остальные пользователи не имеют прав на запись в них или в их содержимоеignore_max_files_warnings = false
true, если вы не хотите, чтобы Puppet регистрировал предупреждения о max_files и производительности при рекурсивном обходе папок с более чем 1000 файлов, например /bin /usr/binrecurselimit = 5
глубина каталога для рекурсивной проверки прав доступаpasswdqc_enabled = true
true, если вы хотите использовать строгую проверку паролей в PAM с помощью passwdqcauth_retries = 5
максимальное количество попыток аутентификации, после которого учётная запись блокируется на некоторое времяauth_lockout_time = 600
время в секундах, которое должно пройти, если учётная запись была заблокирована из-за слишком большого количества неудачных попыток аутентификацииpasswdqc_options = 'min=disabled,disabled,16,12,8'
установите любую строку параметров (в виде строки), которую вы хотите передать в passwdqcmanage_pam_unix = false
true, если вы хотите, чтобы pam_unix управлялся этим модулемenable_pw_history = true
true, если вы хотите, чтобы pam_unix запоминал историю паролей для предотвращения повторного использования паролей (требует manage_pam_unix = true)pw_remember_last = 5
количество последних паролей (например, 5 предотвратит повторное использование пользователем любого из его последних 5 паролей)only_root_may_su = false
true, когда только root и члены группы wheel могут использовать su; должно быть true для соответствия CIS Benchmarkroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
зарегистрированные TTY для rootwhitelist = []
все файлы, которые должны сохранить свои биты SUID/SGID, если они установлены (будут объединены с предопределённым списком разрешённых файлов)blacklist = []
все файлы, у которых должны быть удалены биты SUID/SGID, если они установлены (будут объединены с предопределённым списком запрещённых файлов)remove_from_unknown = false
true, если вы хотите удалить биты SUID/SGID из любого файла, который явно не настроен в blacklist. Это заставит каждый запуск Puppet искать по смонтированным файловым системам биты SUID/SGID, которые не настроены в списках по умолчанию и пользовательском списке запрещённых. Если будет найден бит SUID/SGID, он будет удалён, если только этот файл не находится в вашем whitelist.dry_run_on_unknown = false
как remove_from_unknown выше, только биты SUID/SGID не удаляются. Он по-прежнему будет искать по файловым системам биты SUID/SGID, но будет только выводить их в ваш журнал. Этот параметр рекомендуется только при первом настройке remove_from_unknown для битов SUID/SGID, чтобы вы могли видеть изменяемые файлы и вносить корректировки в ваш whitelist и blacklist.enable_module_loading = true
true, если вы хотите разрешить изменение модулей ядра после запуска системы (например, modprobe, rmmod)load_modules = []
загружает эти модули через initramfs, если enable_module_loading имеет значение falsedisable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
массив файловых систем (модулей ядра), которые должны быть отключеныcpu_vendor = 'intel'
требуется только если enable_module_loading = false: установите производителя CPU для загружаемых модулейicmp_ratelimit = '100'
значение по умолчанию '100', позволяет переопределение, требуется строкаdesktop_enabled = false
true, если это настольная система, т. е. Xorg, KDE/GNOME/Unity и т. д.enable_ipv4_forwarding = false
true, если этой системе требуется пересылка пакетов в IPv4 (например, маршрутизатор), false в противном случаеmanage_ipv6 = true
true для укрепления настройки ipv6, false для полного игнорирования ipv6enable_ipv6 = false
false для отключения ipv6 в этой системе, true для включенияenable_ipv6_forwarding = false
true, если этой системе требуется пересылка пакетов в IPv6 (например, маршрутизатор), false в противном случаеarp_restricted = true
true, если вы хотите ограничить поведение объявления и ответа на ARP, false в противном случаеarp_ignore_samenet = false
true отбрасывает пакеты, которые не из той же подсети (arp_ignore = 2), false проверяет только целевой IP (arp_ignore = 1)enable_sysrq = false
true для включения волшебной клавиши sysrq, false в противном случаеenable_core_dump = false
false для предотвращения создания дампов ядра, true в противном случаеenable_stack_protection = true
для рандомизации адресного пространства (ASLR). ASLR может помочь защититься от определённых типов атак с переполнением буфера. ASLR может размещать базу, библиотеки, кучу и стек в случайных позициях в адресном пространстве процесса, что затрудняет атакующей программе предсказание адреса памяти следующей инструкции.enable_rpfilter = true
true для включения фильтрации обратного пути (отбрасывание поддельных пакетов), false в противном случаеrpfilter_loose = false
(только если enable_rpfilter имеет значение true) нестрогий режим (rp_filter = 2), если true, в противном случае строгий режимenable_log_martians = true
true для включения журналирования подозрительных / ненаправляемых сетевых пакетов, false в противном случае ПРЕДУПРЕЖДЕНИЕ — это может создавать огромные файлы журналов!unwanted_packages = []
пакеты, которые должны быть удалены из системыwanted_packages = []
пакеты, которые должны быть добавлены в системуdisabled_services = []
службы, которые не должны быть включеныenable_grub_hardening = false
установите true для включения некоторых правил укрепления grubgrub_user = 'root'
имя пользователя grub, которое необходимо указать при изменении конфигурации в приглашении grubgrub_password_hash = ''
хэш пароля, созданный с помощью grub-mkpasswd-pbkdf2, который связан с grub_userboot_without_password = true
настройка Grub так, чтобы пароль требовался только при изменении записи, а не при загрузке существующей записиsystem_umask = undef
если эта переменная установлена, настройте umask для всех пользователей в системе (например, '027')manage_home_permissions = false
установите true для управления правами на файлы и каталоги локальных пользователей (g-w,o-rwx)ignore_home_users = []
массив пользователей, которые не должны ограничиваться manage_home_permissionsmanage_log_permissions = false
установите true для управления правами на файлы журналов (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
установите основной каталог журналовignore_restrict_log_dir = []
массив для исключения каталогов журналов в основном каталоге журналовignore_files_in_folder_to_restrict = []
массив для игнорирования файлов, подлежащих укреплению, в каталогах из массива folder_to_restrictmanage_cron_permissions = false
установите true для управления правами на файлы cron (og-rwx)enable_sysctl_config = true
установите false для отключения конфигурации sysctlmanage_system_users = true
установите false для отключения управления системными пользователями (пустой пароль и установка оболочки nologin)shadow_group = undef
переопределяет владельца группы для /etc/shadowshadow_mode = undef
переопределяет права доступа к файлу /etc/shadowТакже можно задать параметры в Hiera следующим образом:
os_hardening::password_max_age: 90
os_hardening::password_min_age: 0
os_hardening::password_warn_age: 14
os_hardening::unwanted_packages: ['telnet']
os_hardening::ignore_users: ['git','githook','ansible','apache','puppetboard']
Поскольку CIS Distribution Independent Linux Benchmark является хорошей отправной точкой для укрепления систем, было сочтено целесообразным реализовать простой способ работы с разовыми задачами, для которых не нужно писать целый модуль.
Например, для повышения соответствия CIS DIL на системе Debian следует задать следующее:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
Настройки NTP по умолчанию на самом деле довольно хороши для большинства ситуаций, поэтому немедленно реализовывать модуль не обязательно. Однако, если вы используете модуль для управления этими службами, это, конечно, предпочтительнее.
Этот модуль был протестирован и должен работать на большинстве дистрибутивов Linux. Полный список поддерживаемых операционных систем см. в metadata.json
Если вы хотите внести свой вклад, пожалуйста, следуйте нашему руководству по внесению вклада.
На вашей системе должен быть установлен интерпретатор Ruby. Возможно, для этой цели стоит использовать rvm. Кроме того, вам необходимо установить Puppet Development Kit PDK и Docker Community Edition, так как интеграционные тесты выполняются в контейнерах Docker.
Для всех наших интеграционных тестов мы используем test-kitchen. Если вы не знакомы с test-kitchen, пожалуйста, ознакомьтесь с их руководством.
# Тесты синтаксиса и lint
pdk validate
# Модульные тесты
pdk test unit
По умолчанию интеграционные тесты выполняются в контейнерах Docker — к сожалению, не все тесты могут выполняться в средах контейнеров (например, настройки sysctl).
# Установка зависимостей
gem install bundler
bundle install
# список всех тестовых экземпляров
bundle exec kitchen list
# быстрый тест на одной машине
bundle exec kitchen test ubuntu-16-04-puppet5
# тест на всех машинах
bundle exec kitchen test
Для полных интеграционных тестов с DigitalOcean вам необходимо получить там учётную запись и настроить некоторые переменные окружения:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN — токен доступа для DigitalOceanDIGITALOCEAN_SSH_KEY_IDS — ID вашего ssh-ключа в DigitalOcean, см. это для получения дополнительной информацииSSH-ключ должен называться ~/.ssh/do_ci и быть добавлен в ваш профиль в DigitalOcean.
После этого вы готовы запускать тесты, как описано в разделе Интеграционные тесты (Docker).
Если вы хотите запустить полные интеграционные тесты с Github Actions в своём форке, вам необходимо добавить эти переменные окружения в настройках вашего форка:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN — токен доступа для DigitalOceanCI_SSH_KEY — закрытая часть ssh-ключа, доступного в DigitalOcean для ваших экземпляров, в форме base64 (например, cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS — ID CI_SSH_KEY в DigitalOcean, см. это для получения дополнительной информацииВаши патчи будут автоматически протестированы с помощью Github Actions. Сводка тестов видна на Github в вашем PR, подробности можно найти в связанных тестах.
Вы можете связаться с нами несколькими способами:
За оригинальный перенос chef-os-hardening на puppet:
Спасибо всем!!
Лицензировано на условиях Apache License, Version 2.0 (далее — «Лицензия»); вы не можете использовать этот файл, кроме как в соответствии с Лицензией. Копию Лицензии можно получить по адресу
http://www.apache.org/licenses/LICENSE-2.0
Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по Лицензии, распространяется на основе «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующего разрешения и ограничения по Лицензии.