Вступление
После базовой настройки SSH многие ожидают, что сервер сразу перейдёт в режим входа только по ключу. Но на cloud VPS это работает не всегда. Даже если ты уже создал отдельного администратора, добавил SSH-ключ, запретил root-вход и прописал PasswordAuthentication no в своём hardening-файле, итоговая проверка может всё равно показывать:
passwordauthentication yes
Это означает, что парольный вход по SSH на сервере всё ещё разрешён. На cloud VPS частая причина в том, что cloud-init добавляет собственную SSH-настройку, а OpenSSH при чтении конфигурации обычно использует первое полученное значение параметра, а не “последнее из файлов”. Поэтому ранний файл вроде 50-cloud-init.conf с PasswordAuthentication yes может фактически сломать ожидаемую схему с 99-hardening.conf. В Ubuntu 24.04 это особенно важно учитывать ещё и потому, что openssh-server работает через systemd socket activation, а настройки из /etc/ssh/sshd_config и /etc/ssh/sshd_config.d/ читаются генератором systemd для настройки ssh.socket.
В этом разделе разберём, как правильно найти источник конфликта, убрать его из активной конфигурации, запретить cloud-init возвращать парольную аутентификацию в будущем и убедиться, что сервер действительно принимает SSH только по ключу.
Когда нужен этот раздел
Этот шаг нужен, если после команды:
sudo sshd -T | egrep 'usepam|permitrootlogin|passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|allowusers|disableforwarding|x11forwarding|loglevel'
ты видишь в выводе строку:
passwordauthentication yes
Именно её и нужно исправить.
Что означает этот вывод
Если сервер показывает:
passwordauthentication yes
это значит:
- SSH всё ещё принимает парольный вход
- сервер ещё не переведён полностью в режим входа только по ключу
- hardening SSH на этом этапе ещё не завершён
Для боевого VPS это нужно исправить. Параметр ssh_pwauth в cloud-init как раз и отвечает за то, будет ли sshd настроен на приём парольной аутентификации.
Важно
Пока в effective-конфигурации SSH видно passwordauthentication yes, парольный вход остаётся активным.
Шаг 1. Проверяем, в каком файле включён парольный вход
Сначала нужно понять, откуда именно приходит эта настройка.
Открой терминал на сервере и выполни:
sudo grep -R -nH '^\s*PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null
Если на сервере есть конфликт, ты можешь увидеть примерно такой вывод:
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication yes
/etc/ssh/sshd_config.d/99-hardening.conf:3:PasswordAuthentication no
Это означает, что в одном SSH-файле парольный вход включён, а в другом выключен. Но здесь важно понимать главное: для OpenSSH обычно работает правило “first obtained value will be used”. Поэтому сам факт наличия PasswordAuthentication no в более позднем файле ещё не гарантирует, что итоговая effective-конфигурация реально выключила парольный вход.
Что проверить после шага
После этой команды ты должен точно понимать:
- в каком файле стоит
PasswordAuthentication yes - в каком файле стоит
PasswordAuthentication no
Если у тебя есть строка с 50-cloud-init.conf, значит проблему, скорее всего, создаёт именно cloud-init. Это типичный сценарий для cloud-образов.
Ошибка новичка
Некоторые смотрят только в свой 99-hardening.conf и думают, что этого достаточно. Но SSH читает не один файл, а всю итоговую конфигурацию, включая дополнительные файлы из /etc/ssh/sshd_config.d/.
Шаг 2. Убираем конфликтующий SSH-файл cloud-init из активной конфигурации
Если ты увидел, что файл 50-cloud-init.conf включает парольный вход, не удаляй его сразу. Безопаснее убрать его из активной конфигурации через переименование.
Выполни:
sudo mv /etc/ssh/sshd_config.d/50-cloud-init.conf /etc/ssh/sshd_config.d/50-cloud-init.conf.bak
После этого SSH больше не будет читать этот файл как активный конфиг, потому что он уже не заканчивается на .conf.
Что делает эта команда
Команда не удаляет файл навсегда, а просто меняет ему имя. Это удобно: при необходимости ты сможешь вернуть его обратно.
Что проверить после шага
Проверь, что активного файла с именем 50-cloud-init.conf больше нет:
ls -la /etc/ssh/sshd_config.d/
В списке должен быть файл:
50-cloud-init.conf.bak
а не 50-cloud-init.conf.
Важно
На этом этапе мы только убираем конфликтующий SSH-файл из активной конфигурации. Но этого недостаточно: нужно ещё запретить cloud-init возвращать парольную аутентификацию в будущем.
Шаг 3. Запрещаем cloud-init включать SSH-пароли
Теперь создадим отдельный файл настройки для cloud-init.
Открой новый файл:
sudo nano /etc/cloud/cloud.cfg.d/99-disable-ssh-password-auth.cfg
Вставь в него:
#cloud-config
ssh_pwauth: false
Сохрани файл.
Что означает ssh_pwauth: false
Эта настройка говорит cloud-init, что парольную аутентификацию по SSH включать не нужно. Документация cloud-init прямо описывает ssh_pwauth как параметр, который определяет, будет ли sshd настроен на приём парольной аутентификации.
Что проверить после шага
Проверь содержимое файла:
sudo cat /etc/cloud/cloud.cfg.d/99-disable-ssh-password-auth.cfg
Ты должен увидеть:
#cloud-config
ssh_pwauth: false
Ошибка новичка
Если убрать только 50-cloud-init.conf, но не задать ssh_pwauth: false, парольная аутентификация может вернуться позже при изменении cloud-конфигурации или пересоздании инстанса.
Шаг 4. Проверяем свой hardening-файл SSH
Теперь нужно убедиться, что твой основной hardening-файл действительно содержит правильные настройки.
Открой файл:
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf
Приведи его к такому виду:
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
UsePAM yes
PermitEmptyPasswords no
DisableForwarding yes
PermitTunnel no
PermitUserEnvironment no
X11Forwarding no
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 4
MaxStartups 10:30:60
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
AllowUsers your_admin_user
Замени your_admin_user на своего администратора, например:
AllowUsers slaoh
Что означает эта конфигурация
PermitRootLogin no— запрещает вход по SSH подrootPubkeyAuthentication yes— разрешает вход по ключуPasswordAuthentication no— запрещает SSH-паролиKbdInteractiveAuthentication no— отключает keyboard-interactiveUsePAM yes— оставляет PAM включённымDisableForwarding yes— отключает forwardingPermitTunnel no— запрещает туннелиPermitUserEnvironment no— запрещает пользовательское влияние через environmentX11Forwarding no— отключает X11 forwardingAllowUsers ...— разрешает вход только нужному пользователюLogLevel VERBOSE— делает SSH-логи полезнее для проверки входа
Часть этих параметров — это уже твоя политика hardening, а не обязательные настройки Ubuntu по умолчанию. Но для сценария “боевой VPS с входом только по ключу” такая схема логична и последовательна. Повторю главное: здесь критичен именно итоговый результат через sshd -T, а не просто красивый файл на диске.
Что проверить после шага
Проверь содержимое файла:
sudo cat /etc/ssh/sshd_config.d/99-hardening.conf
И убедись, что там есть строка:
PasswordAuthentication no
Шаг 5. Проверяем синтаксис конфигурации SSH
Перед перезапуском SSH всегда нужно проверить конфиг на ошибки.
Выполни:
sudo sshd -t
Если команда ничего не вывела, синтаксис в порядке.
Что проверить после шага
Если ошибок нет, ты просто вернёшься в приглашение терминала.
Если ошибка есть, SSH обычно покажет:
- имя файла
- номер строки
- причину проблемы
Важно
Нельзя перезапускать SSH вслепую после редактирования конфигов. Сначала всегда делай sudo sshd -t, иначе можно случайно отрезать себе доступ к серверу.
Шаг 6. Перезапускаем SSH и проверяем socket activation
Если синтаксис корректный, перезапусти SSH:
sudo systemctl restart ssh
После этого проверь состояние:
sudo systemctl status ssh --no-pager
sudo systemctl status ssh.socket --no-pager
Что проверить после шага
На Ubuntu 24.04 особенно важно проверить ssh.socket, потому что openssh-server использует systemd socket activation, а настройки из sshd_config и sshd_config.d/ участвуют в настройке ssh.socket. Именно поэтому после изменений нельзя ограничиваться проверкой только одной службы.
Ориентир здесь такой:
ssh.socketдолжен быть активен и слушатьsshd -tне должен показывать ошибок- дальше итог нужно подтверждать через
sshd -T
То есть главным доказательством правильной настройки считается не один только status, а итоговая effective-конфигурация.
Шаг 7. Проверяем итоговую effective-конфигурацию SSH
Теперь снова выполни итоговую проверку:
sudo sshd -T | egrep 'usepam|permitrootlogin|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|x11forwarding|disableforwarding|loglevel|allowusers'
Правильный результат должен быть таким:
usepam yes
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no
x11forwarding no
disableforwarding yes
loglevel VERBOSE
allowusers your_admin_user
Если у тебя вместо your_admin_user стоит slaoh, это нормально:
allowusers slaoh
Самая важная строка
В этом выводе тебя интересует в первую очередь:
passwordauthentication no
Если ты видишь именно no, значит SSH действительно переведён в режим входа только по ключу. Именно effective-конфигурация здесь является главным критерием, потому что OpenSSH использует первое найденное значение параметра, а не просто “самый поздний файл”.
Что проверить после шага
Убедись, что в выводе одновременно есть:
permitrootlogin nopasswordauthentication nopubkeyauthentication yesallowusers your_admin_user
Если это так, значит SSH-hardening для этого этапа настроен правильно.
Шаг 8. Проверяем вход новым пользователем в отдельном окне
Перед тем как закрывать текущую SSH-сессию, обязательно открой новое окно терминала на своём компьютере и проверь вход под своим администратором.
Например:
ssh your_admin_user@your_server_ip
Или, если нужно явно указать ключ:
ssh -i ~/.ssh/id_ed25519 your_admin_user@your_server_ip
После входа на сервер выполни:
whoami
id
sudo -i
whoami
Правильный результат
Сначала ты должен увидеть:
your_admin_user
А после sudo -i:
root
Это означает, что схема работает правильно:
- прямой SSH-вход под
rootзапрещён - парольный вход по SSH запрещён
- вход по ключу под обычным администратором работает
- административные действия выполняются через
sudo
Ошибка новичка
Нельзя сначала выключать парольный вход, а потом закрывать текущую сессию без проверки. Всегда сначала открывай новое окно и убеждайся, что вход под новым пользователем действительно работает.
Итог
Если после команды sudo sshd -T ты видишь passwordauthentication yes, это значит, что где-то в активной SSH-конфигурации осталась другая настройка, включающая парольный вход. На cloud VPS частой причиной оказывается файл 50-cloud-init.conf, созданный cloud-init, а сама проблема усугубляется тем, что OpenSSH обычно использует первое полученное значение параметра. Поэтому правильная схема здесь такая: найти источник PasswordAuthentication yes, убрать конфликтующий 50-cloud-init.conf из активной конфигурации, зафиксировать ssh_pwauth: false через cloud-init, проверить свой 99-hardening.conf, затем перепроверить sshd -t, состояние ssh.socket и итоговую effective-конфигурацию через sshd -T. Если в финале сервер показывает passwordauthentication no, значит SSH действительно переведён в режим входа только по ключу.