Защита сервера OpenSSH: часть 1

SSH (Secure Shell) — это распространенный протокол удаленного управления сервером.

Одной из самых популярных реализаций протокола Secure Shell является набор утилит OpenSSH, который присутствует в BSD Unix, macOS, дистрибутивах Linux, а также в актуальных версиях Windows. В этой статье мы рассмотрим наилучшие практики и наиболее важные настройки службы sshd, которые позволяют защитить узел от злоумышленников, основной целью которых является получение несанкционированного удаленного доступа к системе.

Служба sshd — это серверный процесс OpenSSH, который прослушивает порт TCP и ожидает приема входящих подключений от пользователей (администраторов). Просмотреть справку демона в ОС Linux можно комадной:

$ man sshd

Рассмотрим практики, которых следует придерживаться для обеспечения должного уровня безопасности при использовании службы SSH:

  1. Аутентификация по паролю для пользователей должна быть отключена, пользователи должны аутентифицироваться исключительно по ключевой паре;
  2. Для создания ключевых пар необходимо использовать криптостойкие алгоритмы: к примеру EdDSA (эллиптические кривые Ed25519, Ed448); ECDSA (nistp256, nistip384, nistp521);
  3. В конфигурации sshd необходимо явно запретить обмен ключами по протоколу Диффи-Хеллмана;
  4. Для пользователя root должен быть запрещен удаленный вход в систему;
  5. Рекомендуется задать имена пользователей или группы, для которых разрешен удаленный вход в систему;
  6. Рекомендуется задать максимальное количество пользователей, одновременно подключенных к серверу;
  7. В случае, если перенаправление X11 не планируется использовать, его необходимо отключить;
  8. В целях защиты от DoS (CVE-2002-20001) , в конфигурационном файле sshd должны быть заданы параметры, ограничивающие максимальное количество процессов-обработчиков в привязке к IP-адресу клиента (OpenSSH 8.5+);
  9. В случае, если перенаправление портов по SSH использовать не планируется, его необходимо отключить;
  10. Необходимо задать лимит для неаутентифицированных подключений к демону SSH.

В ОС Linux конфигурационный файл sshd располагается по пути /etc/ssh/sshd_config. Полный перечень параметров конфигурации доступен в документации. Мы рассмотрим те из них, которые важны для безопасности системы, применительно к практикам, представленным выше:

  • PasswordAuthentication No — отключаем аутентификацию по паролю (параметр можно применить только в случае, если ключ ssh для пользователя уже сгенерирован и установлен в профиле пользователя);
  • PermitRootLogin No — запрещаем удаленный вход в систему для суперпользователя (root);
  • AllowUsers user1, user2, user3 — разрешаем удаленный вход в систему только указанным пользователям.
  • AllowGroups remote1, remote2 — разрешаем удаленный вход в систему только для тех пользователей, которые являются членами указанных групп. При необходимости, можно указать подсеть.
  • MaxSessions 2 — ограничиваем количество одновременно активных пользовательских сессий до двух;
  • PerSourceMaxStartups 1 — указываем, что на одного подключившегося пользователя демоном sshd может быть выделен только один процесс-обработчик;
  • PerSourceNetBlocksize 8:32 — задает количество бит адреса клиента. Этот параметр работает в связке с PerSourceMaxStartups. Значение указывается в формате IPv4:IPV6 и по умолчанию равно 32:128 (что означает, что каждый адрес рассматривается индивидуально);
  • AllowTcpForwarding No — запрещаем перенаправление портов, если этот функционал не используется;
  • KexAlgorithms -diffie-hellman-group1-sha1,diffie-hellman-group1-sha256,diffie-hellman-group14-sha1,diffie-hellman-group14-sha256,diffie-hellman-group15-sha256,diffie-hellman-group15-sha512,diffie-hellman-group16-sha256,diffie-hellman-group16-sha512,diffie-hellman-group17-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha512 — явно запрещаем обмен ключами по протоколу Диффи-Хеллмана (защита от эксплуатации CVE-2002-20001);
  • MaxStartups 5:30:60 — задаем максимальное количество неаутентифицированных подключений к демону SSH. Параметр имеет вид «start:rate:full» и его следует читать следующим образом: «sshd будет отклонять попытки подключения с вероятностью rate/100 (30%), если в настоящее время количество неаутентифицированных сессий достигло 5. Вероятность увеличивается линейно и все попытки подключения будут отклонены, если количество неаутентифицированных сессий достигло 60»;
  • MaxAuthTries 3 — отключать пользователя после трёх попыток неудачной аутентификации;
  • X11Forwarding No — запрещаем перенаправление X11, если не используется;
  • LoginGraceTime 30s — указываем максимальное время в 30 секунд на ввод пароля (по умолчанию 2 минуты).
Пример файла конфигурации

Внести корректировки в текущие параметры sshd можно следующим образом:

  • Создайте файл /etc/ssh/sshd_config.d/00-hardening.conf
  • Внесите в файл содержимое, аналогичное следующему (пример) и сохраните изменения:
PasswordAuthentication No
PermitRootLogin No
AllowUsers user1, user2, user3
AllowGroups 192.168.0.0/16
MaxSessions 2
PerSourceMaxStartups 1
PerSourceNetBlocksize 8:32
AllowTcpForwarding No
KexAlgorithms -diffie-hellman-group1-sha1,diffie-hellman-group1-sha256,diffie-hellman-group14-sha1,diffie-hellman-group14-sha256,diffie-hellman-group15-sha256,diffie-hellman-group15-sha512,diffie-hellman-group16-sha256,diffie-hellman-group16-sha512,diffie-hellman-group17-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha512
MaxStartups 5:30:60
MaxAuthTries 3
X11Forwarding No
LoginGraceTime 30s
  • В зависимости от дистрибутива, выполните команду перезагрузки службы:
# Для RHEL, CentOS, Debian 
$ sudo systemctl restart sshd

# Для Ubuntu 
$ sudo systemctl restart ssh

После применения параметров и перезапуска службы, проверить действующую конфигурацию OpenSSH можно с помощью команды sshd -T.

Больше про OpenSSH hardening можно прочитать в соответствующем руководстве на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *