← Linux: безопасность
11 мин · средне · Урок 3 из 5

Харденинг SSH-сервера

Как защитить главную точку входа: отключить пароли и root-логин, сменить дефолты и закрыть лишнее в sshd_config.

Почему SSH это цель номер один

SSH это главная дверь на сервер, и её постоянно дёргают. Любой публичный сервер ловит непрерывный перебор паролей по SSH от ботов. Если вход по паролю открыт и пароль слабый, рано или поздно его подберут. Харденинг это закрытие самых очевидных путей внутрь. Настройки живут в /etc/ssh/sshd_config и в файлах каталога /etc/ssh/sshd_config.d/, после правки сервису дают перечитать конфиг.

Отключить вход по паролю

Главный шаг — перейти на ключи из первого урока и выключить пароли совсем. Тогда перебор паролей бессмысленен: пароля просто нет.

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes

Прежде чем выключать пароли, убедись, что вход по ключу уже работает, иначе закроешь себе доступ. Полезно держать открытой вторую SSH-сессию, пока проверяешь новую конфигурацию.

Почему правка sshd_config иногда не действует

На Debian 12 и Ubuntu 22.04 в начале /etc/ssh/sshd_config стоит строка:

Include /etc/ssh/sshd_config.d/*.conf

sshd берёт первое встреченное значение параметра, а не последнее. Файлы из sshd_config.d/ подключаются раньше основного конфига, и cloud-init часто кладёт туда PasswordAuthentication yes. Тогда твоя правка ниже по файлу просто игнорируется, причём молча.

Поэтому сначала смотри, что sshd реально применил, и что лежит в каталоге:

$ sudo sshd -T | grep -i passwordauth
passwordauthentication yes
$ ls /etc/ssh/sshd_config.d/
50-cloud-init.conf

sshd -T печатает итоговую конфигурацию после всех Include. Если она расходится с тем, что ты написал, ищи перебивающий файл.

Надёжный путь — класть свои настройки отдельным файлом в тот же каталог, с номером побольше, но при этом убрать конфликтующую строку из cloud-init файла (иначе он всё равно окажется первым):

# /etc/ssh/sshd_config.d/99-hardening.conf
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no

После правки снова прогони sudo sshd -T | grep -i passwordauth и убедись, что значение стало no.

Запретить root-логин

Прямой вход под root опасен: это сразу всемогущий доступ, и имя root известно всем ботам. Лучше заходить обычным пользователем и поднимать права через sudo из урока про пользователей.

PermitRootLogin no

Теперь даже с правильным ключом под root напрямую не зайти, а атакующему надо угадать ещё и имя пользователя.

Применить и проверить

После правки конфиг проверяют на ошибки и просят сервис перечитать его:

$ sudo sshd -t            # проверить синтаксис конфига
$ sudo systemctl reload ssh

reload предпочтительнее restart: активные сессии не рвутся, новые соединения уже идут по новым правилам.

sshd -t ловит опечатку до перезапуска. Без этой проверки кривой конфиг уронит sshd, и ты останешься без доступа.

Что ещё уменьшает поверхность

Несколько настроек, которые закрывают лишнее:

Всё это работает в связке с принципом наименьших привилегий: открыто ровно то, что нужно, остальное закрыто.

Смена порта и socket-активация

Начиная с Ubuntu 22.10 sshd поднимается по socket-активации: порт слушает не сам сервис, а юнит ssh.socket. Обычный reload тут не поможет, новый Port из конфига подхватится только после перезапуска сокета.

$ systemctl is-enabled ssh.socket   # enabled = socket-активация включена
$ sudo systemctl daemon-reload
$ sudo systemctl restart ssh.socket

Если ssh.socket отключён или такого юнита нет (Debian 12, Ubuntu 22.04), порт применяется обычным sudo systemctl reload ssh. Проверить, где на самом деле слушает sshd, всегда можно через ss -tlnp | grep sshd.

Что важно запомнить

SSH это главная цель перебора, поэтому пароли отключают (PasswordAuthentication no) и переходят на ключи, а прямой root-логин запрещают (PermitRootLogin no), заходя обычным пользователем через sudo.

Правку легко потерять: Include /etc/ssh/sshd_config.d/*.conf в начале файла подключается первым, а первое значение параметра и выигрывает. Итоговую конфигурацию показывает sshd -T.

Перед перезапуском конфиг проверяют sshd -t и держат запасную сессию, чтобы не закрыть себе доступ. Дополнительно сужают круг (AllowUsers), ограничивают попытки (MaxAuthTries, fail2ban).

В следующем уроке разберём сканирование образов на уязвимости.

Прошли материал до конца? Отметьте урок пройденным.