Защищаем SSH сервер
В этой короткой заметке я собрал воедино способы повышения защищённости 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
...
Если этого мало
Это лишь базовые настройки. Дополнительно можно настроить
- firewall (iptables)
- fail2ban
- port knoking
- /etc/hosts.deny