ssh-hardening
Укрепление SSH (Роль Ansible)
Внимание: Эта роль была перенесена в нашу коллекцию по укреплению:
Пожалуйста, открывайте любые вопросы и запросы переделки там!
Требования
- Ansible > 2.5
Переменные роли
network_ipv6_enable
- По умолчанию: false
- Описание: true, если необходим IPv6. Также необходимо настроить
ssh_listen_to
для прослушивания IPv6 адресов (например,[::]
).
ssh_server_ports
- По умолчанию: ['22']
- Описание: порты, на которых ssh-сервер должен прослушивать
ssh_client_port
- По умолчанию: '22'
- Описание: порт, к которому должен подключаться ssh-клиент
ssh_listen_to
- По умолчанию: ['0.0.0.0']
- Описание: один или несколько IP адресов, к которым должен подключаться ssh-сервер. По умолчанию - все IPv4 адреса, но должно быть настроено на конкретные адреса по соображениям безопасности!
ssh_host_key_files
- По умолчанию: []
- Описание: Файлы ключей для sshd. Если пусто, будут использоваться ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'], если это поддерживается установленной версией sshd
ssh_host_key_algorithms
- По умолчанию: []
- Описание: Алгоритмы ключей хоста, которые предлагает сервер. Если пусто, будет использоваться умолчательный список, иначе переопределяет настройку с указанным списком алгоритмов
ssh_client_alive_interval
- По умолчанию: 600
- Описание: указывает интервал для отправки keepalive сообщений
ssh_client_alive_count
- По умолчанию: 3
- Описание: определяет, как часто отправляются keep-alive сообщения
ssh_permit_tunnel
- По умолчанию: false
- Описание: true, если требуется туннелирование SSH портов
ssh_remote_hosts
- По умолчанию: []
- Описание: один или несколько хостов и их пользовательские параметры для ssh-клиента. По умолчанию пусто. См. примеры в
defaults/main.yml
.
ssh_permit_root_login
- По умолчанию: no
- Описание: Отключает вход root-пользователя. Установите
without-password
илиyes
, чтобы разрешить вход root-пользователя
ssh_allow_tcp_forwarding
- По умолчанию: no
- Описание:
'no'
для отключения TCP переадресации. Установите'yes'
, чтобы разрешить TCP переадресацию. Если вы используете OpenSSH >= 6.2, вы можете указать'yes'
,'no'
,'all'
или'local'
.
Примечание: значения, передаваемые в эту переменную, должны быть строками, поэтому значения'yes'
и'no'
должны передаваться в кавычках.
ssh_gateway_ports
- По умолчанию:
false
- Описание:
false
для отключения привязки перенаправленных портов к нециклическим адресам. Установитеtrue
, чтобы принудительно привязать к адресам по умолчанию. Установитеclientspecified
, чтобы позволить клиенту указать, к какому адресу привязать.
- По умолчанию:
ssh_allow_agent_forwarding
- По умолчанию: false
- Описание: false для отключения переадресации агента. Установите true, чтобы разрешить переадресацию агента.
ssh_x11_forwarding
- По умолчанию: false
- Описание: false для отключения переадресации X11. Установите true, чтобы разрешить переадресацию X11.
ssh_pam_support
- По умолчанию: true
- Описание: true, если SSH поддерживает PAM.
ssh_use_pam
- По умолчанию: true
- Описание: false для отключения аутентификации PAM.
ssh_gssapi_support
- По умолчанию: false
- Описание: true, если SSH поддерживает GSSAPI.
ssh_kerberos_support
- По умолчанию: true
- Описание: true, если SSH поддерживает Kerberos.
ssh_deny_users
- По умолчанию: ''
- Описание: если указано, вход запрещен для имен пользователей, соответствующих одному из шаблонов.
ssh_allow_users
- По умолчанию: ''
- Описание: если указано, вход разрешен только для имен пользователей, соответствующих одному из шаблонов.
ssh_deny_groups
- По умолчанию: ''
- Описание: если указано, вход запрещен для пользователей, чья основная группа или список дополнительных групп соответствует одному из шаблонов.
ssh_allow_groups
- По умолчанию: ''
- Описание: если указано, вход разрешен только для пользователей, чья основная группа или список дополнительных групп соответствует одному из шаблонов.
ssh_authorized_keys_file
- По умолчанию: ''
- Описание: изменяет файл по умолчанию, который содержит открытые ключи, использующиеся для аутентификации пользователей.
ssh_trusted_user_ca_keys_file
- По умолчанию: ''
- Описание: указывает файл, содержащий открытые ключи доверенных сертификатов, используемые для подписи сертификатов пользователей.
ssh_trusted_user_ca_keys
- По умолчанию: []
- Описание: задает открытые ключи доверенных сертификатов, используемые для подписи сертификатов пользователей. Используется только если задан
ssh_trusted_user_ca_keys_file
.
ssh_authorized_principals_file
- По умолчанию: ''
- Описание: указывает файл, содержащий позволенные принципы. Используется только если задан
ssh_trusted_user_ca_keys_file
.
ssh_authorized_principals
- По умолчанию: []
- Описание: список хешей, содержащих пути к файлам и авторизованные принципы, см.
default_custom.yml
для всех вариантов. Используется только если заданssh_authorized_principals_file
.
ssh_print_motd
- По умолчанию: false
- Описание: false для отключения печати MOTD
ssh_print_pam_motd
- По умолчанию: false
- Описание: false для отключения печати MOTD через pam (Debian и Ubuntu)
ssh_print_last_log
- По умолчанию: false
- Описание: false для отключения отображения информации о последнем входе
sftp_enabled
- По умолчанию: false
- Описание: true для включения конфигурации sftp
sftp_umask
- По умолчанию: '0027'
- Описание: Указывает umask для sftp
sftp_chroot
- По умолчанию: true
- Описание: false для отключения chroot для sftp
sftp_chroot_dir
- По умолчанию: /home/%u
- Описание: изменение местоположения по умолчанию для chroot sftp
ssh_client_roaming
- По умолчанию: false
- Описание: включает экспериментальную возможность roaming клиента
sshd_moduli_file
- По умолчанию: '/etc/ssh/moduli'
- Описание: путь к файлу модулей SSH
sshd_moduli_minimum
- По умолчанию: 2048
- Описание: удаляет параметры Диффи-Хеллмана меньше указанного размера для уменьшения уязвимости
ssh_challengeresponseauthentication
- По умолчанию: false
- Описание: Указывает, разрешена ли аутентификация с помощью challenge-response (например, через PAM)
ssh_client_password_login
- По умолчанию: false
- Описание:
true
для разрешения аутентификации на основе пароля с клиентом ssh
ssh_server_password_login
- По умолчанию: false
- Описание:
true
для разрешения аутентификации на основе пароля с сервером ssh
ssh_banner
- По умолчанию:
false
- Описание:
true
, чтобы вывести баннер при входе
- По умолчанию:
ssh_banner_path
- По умолчанию: '/etc/sshd/banner.txt'
- Описание: путь к файлу баннера SSH
ssh_client_hardening
- По умолчанию:
true
- Описание:
false
, чтобы прекратить укрепление клиента
- По умолчанию:
ssh_client_port
- По умолчанию:
'22'
- Описание: Указывает номер порта для подключения к удаленному хосту.
- По умолчанию:
ssh_client_compression
- По умолчанию:
false
- Описание: Указывает, запрашивает ли клиент сжатие.
- По умолчанию:
ssh_compression
- По умолчанию:
false
- Описание: Указывает, активно ли сжатие на стороне сервера после успешной аутентификации пользователя.
- По умолчанию:
ssh_login_grace_time
- По умолчанию:
30s
- Описание: указывает время, разрешенное для успешной аутентификации на SSH сервере
- По умолчанию:
ssh_max_auth_retries
- По умолчанию:
2
- Описание: Указывает максимальное количество попыток аутентификации, разрешенных на одно подключение.
- По умолчанию:
ssh_max_sessions
- По умолчанию:
10
- Описание: Указывает максимальное количество открытых сессий, разрешенных с данного подключения.
- По умолчанию:
ssh_print_debian_banner
- По умолчанию:
false
- Описание:
true
, чтобы напечатать баннер, специфичный для Debian
- По умолчанию:
ssh_server_enabled
- По умолчанию:
true
- Описание:
false
, чтобы отключить сервер opensshd
- По умолчанию:
ssh_server_hardening
- По умолчанию:
true
- Описание:
false
, чтобы прекратить укрепление сервера
- По умолчанию:
ssh_server_match_address
- По умолчанию: ''
- Описание: Вводит условный блок. Если все условия в строке Match выполнены, ключевые слова в следующих строках переопределяют те, что установлены в глобальном разделе конфигурационного файла, пока не встретится другая строка Match или конец файла.
ssh_server_match_group
- По умолчанию: ''
- Описание: Вводит условный блок. Если все условия в строке Match выполнены, ключевые слова в следующих строках переопределяют те, что установлены в глобальном разделе конфигурационного файла, пока не встретится другая строка Match или конец файла.
ssh_server_match_user
- По умолчанию: ''
- Описание: Вводит условный блок. Если все условия в строке Match выполнены, ключевые слова в следующих строках переопределяют те, что установлены в глобальном разделе конфигурационного файла, пока не встретится другая строка Match или конец файла.
ssh_server_match_local_port
- По умолчанию: ''
- Описание: Вводит условный блок. Если все условия в строке Match выполнены, ключевые слова в следующих строках переопределяют те, что установлены в глобальном разделе конфигурационного файла, пока не встретится другая строка Match или конец файла.
ssh_server_permit_environment_vars
- По умолчанию:
no
- Описание:
yes
, чтобы указать, что ~/.ssh/environment и параметры environment= в ~/.ssh/authorized_keys обрабатываются sshd. С версией openssh 7.8 возможно указать белый список имен переменных окружения помимо глобальных настроек "yes" или "no"
- По умолчанию:
ssh_server_accept_env_vars
- По умолчанию: ''
- Описание: Указывает, какие переменные окружения, отправленные клиентом, будут скопированы в среду сессии; несколько переменных окружения могут быть разделены пробелом.
ssh_use_dns
- По умолчанию:
false
- Описание: Указывает, должен ли sshd искать имя удаленного хоста и проверять, что разрешенное имя хоста для удаленного IP адреса соответствует этому же IP адресу.
- По умолчанию:
ssh_server_revoked_keys
- По умолчанию: []
- Описание: список отозванных открытых ключей, которые сервер ssh всегда будет отклонять, полезно для отзыва известных слабых или скомпрометированных ключей.
ssh_max_startups
- По умолчанию: '10:30:100'
- Описание: Указывает максимальное количество одновременных неаутентифицированных соединений с демоном SSH.
ssh_macs
- По умолчанию: []
- Описание: измените этот список, чтобы переопределить macs. По умолчанию в
defaults/main.yml
ssh_kex
- По умолчанию: []
- Описание: измените этот список, чтобы переопределить kexs. По умолчанию в
defaults/main.yml
ssh_ciphers
- По умолчанию: []
- Описание: измените этот список, чтобы переопределить шифры. По умолчанию в
defaults/main.yml
ssh_custom_options
- По умолчанию: []
- Описание: индивидуальные строки для конфигурации SSH клиента
sshd_custom_options
- По умолчанию: []
- Описание: индивидуальные строки для конфигурации демона SSH
sshd_syslog_facility
- По умолчанию: 'AUTH'
- Описание: Код учреждения, используемый при записи сообщений от sshd
sshd_log_level
- По умолчанию: 'VERBOSE'
- Описание: уровень подробности, используемый при записи сообщений от sshd
sshd_strict_modes
- По умолчанию: true
- Описание: Проверяет режимы файлов и владельцев файлов пользователя и домашнего каталога перед приемом входа
sshd_authenticationmethods
- По умолчанию:
publickey
- Описание: Указывает методы аутентификации, которые должны быть успешно выполнены, чтобы пользователю был предоставлен доступ. Убедитесь, что вы установили все необходимые переменные для выбранного метода аутентификации. По умолчанию в
defaults/main.yml
- По умолчанию:
Настройка параметров, не указанных в переменных роли
Если вы хотите настроить параметры ssh, которых нет выше, вы можете использовать ssh_custom_options
(для /etc/ssh/ssh_config
) или sshd_custom_options
(для /etc/ssh/sshd_config
) для их установки. Эти параметры будут установлены в начале файла, чтобы вы могли переопределить параметры дальше в файле.
Пример плейбука:
- hosts: localhost
roles:
- dev-sec.ssh-hardening
vars:
ssh_custom_options:
- "Include /etc/ssh/ssh_config.d/*"
sshd_custom_options:
- "AcceptEnv LANG"
Изменение стандартного порта и идемпотентность
Эта роль использует стандартный порт 22 или порт, настроенный в инвентаре для подключения к серверу. Если стандартный порт ssh
изменяется через ssh_server_ports
, после перезапуска ssh сервера, он все равно будет пытаться подключиться через предыдущий порт. Для повторного запуска этой роли на том же сервере инвентарь придется обновить, чтобы использовать новый порt ssh.
Если идемпотентность важна, подумайте о использовании роли ssh-hardening-fallback
, которая является оберткой вокруг этой роли и возвращается к порту 22, если настроенный порт недоступен.
Пример плейбука
- hosts: localhost
roles:
- dev-sec.ssh-hardening
Локальное тестирование
Предпочтительный способ локального тестирования роли - использовать Docker. Вам нужно установить Docker на вашем компьютере. См. Начало работы для получения пакета Docker, соответствующего вашей системе.
Вы также можете использовать vagrant и Virtualbox или VMWare для локального тестирования. Вам нужно установить Virtualbox и Vagrant на вашем компьютере. См. Загрузки Vagrant для пакета vagrant, подходящего для вашей системы. Для всех наших тестов мы используем test-kitchen
. Если вы не знакомы с test-kitchen
, пожалуйста, ознакомьтесь с их руководством.
Затем установите test-kitchen:
# Установка зависимостей
gem install bundler
bundle install
Тестирование с Docker
# быстрый тест на одной машине
bundle exec kitchen test ssh-ubuntu1804-ansible-latest
# тест на всех машинах
bundle exec kitchen test
# для разработки
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest
# очистка
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest
Тестирование с Virtualbox
# быстрый тест на одной машине
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804
# тест на всех машинах
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test
# для разработки
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804
Для получения дополнительной информации смотрите test-kitchen.
Вопросы / Проблемы
Я не могу войти в свой аккаунт. Я зарегистрировал ключ клиента, но он все равно не пускает.
Если вы исчерпали все типичные проблемы (фаерволл, сеть, отсутствующий ключ, неправильный ключ, аккаунт отключен и т. д.), возможно, ваш аккаунт заблокирован. Быстрый способ выяснить это - посмотреть на хэш пароля вашего пользователя:
sudo grep myuser /etc/shadow
Если хэш включает !
, ваш аккаунт заблокирован:
myuser:!:16280:7:60:7:::
Правильный способ решить это - разблокировать аккаунт (passwd -u myuser
). Если у пользователя нет пароля, вы можете разблокировать его с помощью:
usermod -p "*" myuser
Кроме того, если вы собираетесь использовать PAM, вы включили его через ssh_use_pam: true
. PAM позволит заблокированным пользователям войти с помощью ключей.
Почему мое приложение больше не подключается через SSH?
Всегда сначала смотрите журналы, а если возможно, смотрите на переговоры между клиентом и сервером, которые завершились при подключении.
Мы видели некоторые проблемы в приложениях (на основе python и ruby), связанные с тем, что они использовали устаревший набор криптографических методов. Это конфликтует с этим модулем укрепления, который сократил список шифров, кодов аутентификации сообщений (MAC) и алгоритмов обмена ключами (KEX) до более безопасного выбора.
После использования роли шаблон / копия / файл Ansible больше не работает!
Эта роль по умолчанию отключает SFTP. Ansible использует по умолчанию SFTP для передачи файлов на удаленные хосты. Вам нужно установить scp_if_ssh = True
в вашем ansible.cfg. Таким образом Ansible будет использовать SCP для копирования файлов. Либо вы можете снова включить SFTP, установив sftp_enabled
в true
.
Не удается перезапустить sshd-сервис из-за отсутствия привилегий.
Если вы получаете следующую ошибку при выполнении обработчика "перезапустите sshd":
Не удается перезапустить службу ssh: Не удалось перезапустить ssh.service: Доступ запрещен
или
ошибка 1 при запуске systemctl show для 'ssh': Не удалось подключиться к шине: Нет такого файла или каталога
либо запустите плейбук как root
(без become: yes
на уровне плейбука), либо добавьте become: yes
к обработчику.
Это ошибка Ansible: смотрите здесь и здесь для получения дополнительной информации.
Участие
См. руководство для участников.
Лицензия и автор
- Автор:: Себастьян Гумприх
- Автор:: Кристоф Хартманн chris@lollyrock.com
Лицензировано по лицензии Apache Version 2.0 (далее "Лицензия"); вы не можете использовать этот файл, кроме как в соответствии с условиями Лицензии. Вы можете получить копию Лицензии на
http://www.apache.org/licenses/LICENSE-2.0
Если не предусмотрено действующим законодательством или согласовано в письменной форме, программное обеспечение, распределяемое по Лицензии, предоставляется "КАК ЕСТЬ", БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО УРОВНЯ, как явных, так и подразумеваемых. См. Лицензию для конкретного языка, регулирующего разрешения и ограничения по Лицензии.
This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
ansible-galaxy install dev-sec/ansible-ssh-hardening