Cogitatio materialis est

Защищаем SSH сервер

26th Oct 2014 Tags: #security #ssh #sshd

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

Основные приёмы

Все действия производятся в конфигурационном файле sshd демона -- /etc/ssh/sshd_config. Ниже приведу часть своего конфигурационного файла с комментариями.

  ### Network ###

# Используем нестандартный порт (>1024)
port 5679
# Используем только IPv4 соединения
# inet = IPv4, inet6 = IPv6, any = both 
AddressFamily inet
# Можно принимать соединения только с определённых IP-адресов
#ListenAddress 0.0.0.0

# Используем вторую версию протокола, т.к. первая подвержена
# известным уязвимостям
Protocol 2

# Отключаем перенаправление графики (X-сервер) до тех пор
# пока она явно не понадобится вам
X11Forwarding no

# Отключаем Disable TCPKeepAlive и используем ClientAliveInterval вместо этого,
# чтобы предотвратить атаки типа TCP Spoofing
TCPKeepAlive no
# Выкидваем пользователя через 10min (600 sec) неактивности
ClientAliveInterval 600
ClientAliveCountMax 3


  ### Key configuration files ###

# HostKeys для протокола версии 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

# Используем непривилегированный процесс для
# обработки входящего от клиента трафика
# sandbox - openSSH >= 5.9 ("yes" - для младших версий)
UsePrivilegeSeparation sandbox


# При изменении этих значений, требует удалить старый ключ
# /etc/ssh/ssh_host_rsa_key{,.pub}, и создать новый
# путём перезапуска sshd.
#
# Время жизни ключа, т.е. через какое время будет сгененрирован новый ключ
# в случае, если предыдущий был использован.
KeyRegenerationInterval 1h
# сила ключа
ServerKeyBits 2048

# Разрешаем авторизацию по публичному ключу
PubkeyAuthentication yes
# Место хранения доверенных ключей в каталоге пользователя
AuthorizedKeysFile      .ssh/authorized_keys


  ### Logging ###

# Префикс для syslog
SyslogFacility AUTH
# уровень подробности сообщений для самого sshd
LogLevel INFO

  ### Authentication ###

# список разрешённых пользователей
AllowUsers ivan

# ограничиваем время для ввода пароля для ssh-ключа
LoginGraceTime 30s

# запрещаем удалённо входить под учётной записью root
PermitRootLogin no

# Включаем явную проверку прав файлов и директорий с ssh-ключами
StrictModes yes

# Сколько раз переспрашивать пароль при неверном вводе
MaxAuthTries 3

# Запрещаем вход по пустому паролю
PermitEmptyPasswords no

# Запрещаем вход по паролю в принципе
# (Используем публичный/приватный ключ вместо этого)
PasswordAuthentication no

# Отключаем использование "challenge-responce" авторизацию,
# т.к. она бесполезна при использовании ключей
ChallengeResponseAuthentication no

# Так как мы не используем пароль, то и {PAM, login(1)} нам не нужены
UsePAM no
UseLogin no

# Позволяем клиенту передавать лишь определённый набор переменных окружения
# RH BZ#CVE-2014-2532
# ShellShock exploit
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL

Это те параметры, что настраиваются в конфигурационном файле sshd. После изменения настроек требуется перезапустить сервис sshd.

Комментарии

  • При использовании авторизации по ключу, ключ требуется предварительно сгенерировать на клиентской машине и скопировать публичный ключ на сервер. Пример:
client $ ssh-keygen
client $ cat ~/.ssh/id_rsa.pub | ssh -p 5679 ivan@serverurl.com "cat >> ~/.ssh/authorized_keys"
  • В файле /var/log/auth.log будут находиться сообщения от sshd. В случае, если этот файл отсутствует, вам требуется настроить вашу систему логирования. Вот здесь пример для syslog и syslon-ng. Я использую syslog-ng, и мне потребовалось добавить следующие строки в файл /etc/syslog-ng/syslog-ng.conf:
destination authlog { file("/var/log/auth.log"); };
log { source(src); destination(authlog); };

и перезапустить сервис syslog-ng.

  • При использовании нестандартного порта может потребоваться настроить ваш firewall (iptables, firewalld, etc).
    Пример настройки для iptables:
root# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 5679 -j ACCEPT
root# service iptables save
root# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED tcp dpt:5679
...

Если этого мало

Это лишь базовые настройки. Дополнительно можно настроить


Использованная литература