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
Лицензия
Unknown
Загрузки
3094915
Владелец
Security + DevOps: Automatic Server Hardening