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).
Когда включать и когда не нужен
- Всегда включён — обязательный модуль.
- Отключение пароля (
DISABLE_PASSWORD_AUTH=yes) имеет смысл только когда у deploy-пользователя уже установлен SSH-ключ. Если ключа нет — модуль сам не отключит пароль (страховка от локаута), даже если вы попросили. - Смена порта нужна, если хотите снизить шум от сканеров; функционально порт 22 работает не хуже.
Зависимости и требования
- Идёт после 02-user: именно наличие SSH-ключа у deploy разрешает безопасно отключать пароль.
- Порядок с файрволом важен. Если вы меняете SSH-порт, убедитесь, что файрвол (модуль 09) открывает новый порт. Команда
mitdev firewall enableдобавляет правило для текущегоSSH_PORTпервым, чтобы доступ не потерялся. Не включайте файрвол с открытым только 22-м портом, если SSH уже переехал. - Мультидистро: имя службы определяется автоматически (
sshна Debian/Ubuntu,sshdна RHEL/SUSE). На части образов Ubuntu SSH запускается через socket-активацию (ssh.socket) — модуль это учитывает (см. ниже). - Нужен установленный
sshd(есть на любом сервере с SSH-доступом).
Что именно делает
Пошагово, в порядке module_install:
- Вычисляет параметры: порт
SSH_PORT(22),PermitRootLogin(no, еслиDISABLE_ROOT_LOGIN=yes),PasswordAuthentication(no, еслиDISABLE_PASSWORD_AUTH=yes). - Страховка от локаута: если запрошено отключение пароля, но у deploy нет ни одного SSH-ключа (
DEPLOY_SSH_KEYS/DEPLOY_SSH_KEYпусты) — пароль остаётся включённым, выводится предупреждение. - Делает резервную копию текущего drop-in (если он был) через
backup_file. - Рендерит шаблон
templates/ssh/99-mitdev.conf.templateв/etc/ssh/sshd_config.d/99-mitdev.conf, подставляя порт, политику root/пароля,SSH_MAX_AUTH_TRIES,SSH_LOGIN_GRACE_TIME. - Проверяет конфигурацию до перезапуска:
sshd -t— это «сухая» проверка синтаксиса и корректности настроек sshd без применения. Если проверка не прошла — новый конфиг откатывается немедленно (возвращается прежний или удаляется), модуль завершается ошибкой, работающий SSH не трогается. - Регистрирует откат (удаление drop-in + рестарт службы).
- socket-активация: если порт ≠ 22 и в системе есть
ssh.socket(он «прибивает» порт 22), модуль отключаетssh.socketи включает классическуюssh.service, чтобы порт управлялся изsshd_config. - Перезапускает SSH (
systemctl restart) и проверяет, что служба поднялась (svc_active); если нет — ошибка. - Отмечает модуль выполненным (
state_mark).
Итоговые правила из шаблона (помимо порта/root/пароля): PubkeyAuthentication yes, MaxSessions 10, KbdInteractiveAuthentication no, X11Forwarding no, AllowAgentForwarding yes, AllowTcpForwarding yes, PermitEmptyPasswords no, ClientAliveInterval 300, ClientAliveCountMax 2, UseDNS no.
Как не потерять доступ (обязательно к прочтению)
Модуль встроил несколько защит, но финальная ответственность — на вас:
- Держите ВТОРУЮ SSH-сессию открытой. Перед применением откройте отдельное подключение к серверу и не закрывайте его до тех пор, пока не убедитесь, что новое подключение (новый порт / вход по ключу) работает. Если что-то пойдёт не так — вы сможете откатить настройки из уже открытой сессии.
- Сначала ключ, потом отключение пароля. Убедитесь, что вход по ключу под deploy работает (
ssh -i ключ deploy@сервер), и только затем отключайте парольную аутентификацию. Модуль не отключит пароль без ключа, но лучше проверить самому. - Не отключайте root-вход, не проверив deploy+sudo. После
PermitRootLogin noзаходить можно будет только под deploy (у него есть sudo из модуля 02). - При смене порта откройте его в файрволе. Иначе после включения файрвола новый порт окажется закрыт. Проверьте:
sudo mitdev firewall status. - Модуль сам делает
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 есть ключ). На повторном запуске значения по умолчанию берутся из текущего конфига, чтобы согласие ничего не меняло (идемпотентность).
Как переопределить настройки
- Экспорт перед установкой (
-Eсохраняет переменные приsudo):SSH_PORT=2222 DISABLE_ROOT_LOGIN=yes DISABLE_PASSWORD_AUTH=yes sudo -E ./install.sh - Правка
config/defaults.conf—SSH_PORT_DEFAULT,SSH_MAX_AUTH_TRIES,SSH_LOGIN_GRACE_TIME. - Ответы в мастере установки — порт, запрет 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 # общая диагностика
Затем — обязательно проверьте вход из новой сессии (см. «Как не потерять доступ»).
Типовые задачи
- Сменить SSH-порт (безопасно):
SSH_PORT=2222 sudo -E ./install.sh # применит модуль security sudo mitdev firewall allow 2222/tcp # открыть новый порт # проверить вход в НОВОЙ сессии, затем можно закрыть 22 в файрволе - Отключить пароль после проверки ключа:
DISABLE_PASSWORD_AUTH=yes sudo -E ./install.sh - Временно вернуть настройки SSH к дефолту дистрибутива:
sudo mitdev remove security - Посмотреть текущую политику SSH:
cat /etc/ssh/sshd_config.d/99-mitdev.conf
Частые ошибки
| Симптом | Причина | Что сделать |
|---|---|---|
| После смены порта не пускает | новый порт закрыт в файрволе | 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); хранить приватные ключи в безопасности; не отключать пароль до проверки входа по ключу.
Откат и удаление
- Авто-откат при падении установки (
module_rollback): удаляет drop-in99-mitdev.confи перезапускает SSH — демон возвращается к настройкам дистрибутива. Кроме того, битый конфиг откатывается ещё внутри установки (после неудачногоsshd -t), так что работающий SSH не теряется. mitdev remove security: удаляет drop-in и перезапускает SSH. Демон возвращается к дефолту дистрибутива: порт 22, вход по паролю включён. Выводится предупреждение — при необходимости обновите правила файрвола (закрытый нестандартный порт, открытый 22). Флаг--purgeдополнительного эффекта не даёт.
См. также
- ../SECURITY.md — общая модель безопасности сервера.
- ../COMMANDS.md —
mitdev firewall,mitdev doctor,mitdev remove. - 02-user.md — SSH-ключи и sudo, нужны до отключения пароля/root.
- ../CONFIGURATION.md — переменные SSH.