03-security — усиление SSH (hardening)

Ужесточает настройки SSH-демона: порт, запрет root-входа, отключение паролей, лимиты попыток — с защитой от потери доступа. 🔒 обязательный.

⚠️ Это самый опасный модуль установки. Ошибка в настройках SSH может привести к локауту — ситуации, когда вы больше не можете войти на сервер. Модуль спроектирован так, чтобы этого не допустить (см. раздел «Как не потерять доступ»), но прочитайте его до применения.

Зачем нужен

SSH — единственная дверь на сервер, и по умолчанию она настроена мягко: разрешён вход root по паролю, порт 22 сканируется ботами круглосуточно, число попыток входа велико. Этот модуль закрывает типовые векторы атаки: переносит SSH на нестандартный порт (по желанию), запрещает прямой вход root, отключает парольную аутентификацию (оставляя только вход по ключу), ограничивает число попыток и время на аутентификацию, отключает лишние функции (X11-форвардинг, DNS-резолвинг клиентов).

Настройки применяются через drop-in — отдельный файл /etc/ssh/sshd_config.d/99-mitdev.conf, который дополняет основной sshd_config, не переписывая его. Так штатный конфиг дистрибутива остаётся нетронутым, а наши правила лежат в одном месте и легко снимаются.

Без этого модуля сервер остаётся с настройками SSH «из коробки» — это рабочий, но небезопасный для интернета вариант. Модуля достаточно для базового hardening SSH; сетевую фильтрацию портов делает файрвол (модуль 09), а бан брутфорса — Fail2Ban (модуль 10).

Когда включать и когда не нужен

Зависимости и требования

Что именно делает

Пошагово, в порядке module_install:

  1. Вычисляет параметры: порт SSH_PORT (22), PermitRootLogin (no, если DISABLE_ROOT_LOGIN=yes), PasswordAuthentication (no, если DISABLE_PASSWORD_AUTH=yes).
  2. Страховка от локаута: если запрошено отключение пароля, но у deploy нет ни одного SSH-ключа (DEPLOY_SSH_KEYS/DEPLOY_SSH_KEY пусты) — пароль остаётся включённым, выводится предупреждение.
  3. Делает резервную копию текущего drop-in (если он был) через backup_file.
  4. Рендерит шаблон templates/ssh/99-mitdev.conf.template в /etc/ssh/sshd_config.d/99-mitdev.conf, подставляя порт, политику root/пароля, SSH_MAX_AUTH_TRIES, SSH_LOGIN_GRACE_TIME.
  5. Проверяет конфигурацию до перезапуска: sshd -t — это «сухая» проверка синтаксиса и корректности настроек sshd без применения. Если проверка не прошла — новый конфиг откатывается немедленно (возвращается прежний или удаляется), модуль завершается ошибкой, работающий SSH не трогается.
  6. Регистрирует откат (удаление drop-in + рестарт службы).
  7. socket-активация: если порт ≠ 22 и в системе есть ssh.socket (он «прибивает» порт 22), модуль отключает ssh.socket и включает классическую ssh.service, чтобы порт управлялся из sshd_config.
  8. Перезапускает SSH (systemctl restart) и проверяет, что служба поднялась (svc_active); если нет — ошибка.
  9. Отмечает модуль выполненным (state_mark).

Итоговые правила из шаблона (помимо порта/root/пароля): PubkeyAuthentication yes, MaxSessions 10, KbdInteractiveAuthentication no, X11Forwarding no, AllowAgentForwarding yes, AllowTcpForwarding yes, PermitEmptyPasswords no, ClientAliveInterval 300, ClientAliveCountMax 2, UseDNS no.

Как не потерять доступ (обязательно к прочтению)

Модуль встроил несколько защит, но финальная ответственность — на вас:

  1. Держите ВТОРУЮ SSH-сессию открытой. Перед применением откройте отдельное подключение к серверу и не закрывайте его до тех пор, пока не убедитесь, что новое подключение (новый порт / вход по ключу) работает. Если что-то пойдёт не так — вы сможете откатить настройки из уже открытой сессии.
  2. Сначала ключ, потом отключение пароля. Убедитесь, что вход по ключу под deploy работает (ssh -i ключ deploy@сервер), и только затем отключайте парольную аутентификацию. Модуль не отключит пароль без ключа, но лучше проверить самому.
  3. Не отключайте root-вход, не проверив deploy+sudo. После PermitRootLogin no заходить можно будет только под deploy (у него есть sudo из модуля 02).
  4. При смене порта откройте его в файрволе. Иначе после включения файрвола новый порт окажется закрыт. Проверьте: sudo mitdev firewall status.
  5. Модуль сам делает sshd -t перед рестартом и откатывает битый конфиг — но это защищает от синтаксических ошибок, а не от «забыл открыть порт в файрволе».

Проверка нового доступа из новой сессии (старую не закрывайте):

ssh -p <новый_порт> -i /путь/к/ключу deploy@<адрес-сервера>

Файлы, службы и порты

Путь / юнит / порт Назначение Владелец:права
/etc/ssh/sshd_config.d/99-mitdev.conf drop-in с настройками hardening root, 644
/etc/ssh/sshd_config.d/ каталог drop-in (создаётся при отсутствии) root, 755
служба ssh / sshd SSH-демон, перезапускается модулем системная
ssh.socket отключается, если порт ≠ 22 (Ubuntu socket-активация) системная
порт SSH_PORT (22) TCP-порт SSH; должен быть открыт в файрволе
/var/lib/mitdev/state/security.done отметка выполнения модуля root

Настройка

Переменная Тип / значения По умолчанию На что влияет Когда менять
SSH_PORT_DEFAULT число 1–65535 22 предлагаемый порт в мастере (итог — SSH_PORT) если хотите увести SSH со сканируемого 22
SSH_PORT число 1–65535 из мастера / SSH_PORT_DEFAULT фактический порт SSH задают в мастере
DISABLE_ROOT_LOGIN yes/no спрашивает мастер (по умолчанию yes, если есть ключ) запрет прямого входа root оставьте yes для продакшена
DISABLE_PASSWORD_AUTH yes/no спрашивает мастер отключение входа по паролю (только ключи) yes, когда ключ deploy проверен
SSH_MAX_AUTH_TRIES число 3 сколько попыток аутентификации на подключение уменьшать для строгости
SSH_LOGIN_GRACE_TIME секунды 30 сколько времени даётся на вход до разрыва уменьшать для строгости

Мастер спрашивает: порт SSH, запрещать ли root-вход, отключать ли пароль (последнее — только если у deploy есть ключ). На повторном запуске значения по умолчанию берутся из текущего конфига, чтобы согласие ничего не меняло (идемпотентность).

Как переопределить настройки

  1. Экспорт перед установкой (-E сохраняет переменные при sudo):
    SSH_PORT=2222 DISABLE_ROOT_LOGIN=yes DISABLE_PASSWORD_AUTH=yes sudo -E ./install.sh
    
  2. Правка config/defaults.confSSH_PORT_DEFAULT, SSH_MAX_AUTH_TRIES, SSH_LOGIN_GRACE_TIME.
  3. Ответы в мастере установки — порт, запрет root, отключение пароля задаются интерактивно.

Проверка, что всё работает

module_verify считает модуль успешным, если drop-in существует, sshd -t проходит и служба SSH активна.

Ручные проверки:

sudo sshd -t && echo "конфиг валиден"     # тихо = ок
cat /etc/ssh/sshd_config.d/99-mitdev.conf # ваши Port / PermitRootLogin / PasswordAuthentication
systemctl status "$(command -v sshd >/dev/null && echo sshd || echo ssh)"
ss -tlnp | grep ssh                        # SSH слушает на новом порту
sudo mitdev doctor                         # общая диагностика

Затем — обязательно проверьте вход из новой сессии (см. «Как не потерять доступ»).

Типовые задачи

Частые ошибки

Симптом Причина Что сделать
После смены порта не пускает новый порт закрыт в файрволе sudo mitdev firewall allow <порт>/tcp; из открытой сессии проверьте ss -tlnp
Пароль не отключился, хотя просили у deploy нет SSH-ключа (сработала страховка) добавьте ключ (модуль 02), затем повторите с DISABLE_PASSWORD_AUTH=yes
sshd -t падает при установке некорректная настройка модуль сам откатил конфиг; смотрите install.log/errors.log, исправьте переменные
Порт не сменился на Ubuntu активна ssh.socket модуль отключает её при порте ≠ 22; проверьте systemctl status ssh.socket
Совсем потерян доступ закрыли единственную сессию до проверки вход через консоль VPS-панели (recovery/VNC), затем sudo mitdev remove security

Безопасность и продакшен

Модуль уже закрывает: вход root по SSH (при DISABLE_ROOT_LOGIN=yes), парольную аутентификацию (при наличии ключа), лимит попыток и время на вход, X11-форвардинг, DNS-резолвинг клиентов, пустые пароли; валидацию конфига перед перезапуском.

Остаётся на клиенте: открыть выбранный SSH-порт в файрволе (модуль 09) и настроить бан брутфорса (Fail2Ban, модуль 10); хранить приватные ключи в безопасности; не отключать пароль до проверки входа по ключу.

Откат и удаление

См. также