← Весь справочник

sshd

SSH-сервер — ключевые опции sshd_config, проверка конфига sshd -t / -T, перезагрузка без потери доступа

sshd — сервер OpenSSH: принимает входящие SSH-подключения. Его поведение задаёт /etc/ssh/sshd_config плюс файлы из /etc/ssh/sshd_config.d/*.conf. Тут разбираются настройки сервера; клиентская сторона (ssh, ключи, ~/.ssh/config) — на странице про ssh.

Синтаксис

sshd -t                 # проверить конфиг
sshd -T                 # напечатать итоговые значения всех опций
/usr/sbin/sshd [опции]  # запустить сервер (обычно это делает systemd)

Опции командной строки

ОпцияЧто делает
-tпроверить синтаксис конфига и ключей хоста; при ошибке — код 255 и строка с номером
-Tпроверить и вывести действующие значения всех опций (имена в нижнем регистре)
-T -C user=…,host=…,addr=…итоговые значения для конкретного подключения — с учётом блоков Match
-f файлдругой файл конфигурации
-p портслушать этот порт (переопределяет Port)
-o 'Опция значение'задать опцию как строку конфига
-Dне уходить в фон
-dотладка: один сеанс, подробный вывод, не уходит в фон
-eписать журнал в stderr вместо syslog
-E файлписать журнал в файл

Основные директивы sshd_config

Где слушать

ДирективаЧто задаёт
Port 22порт; несколько строк Port — несколько портов
ListenAddress 0.0.0.0адрес (и порт: ListenAddress 10.0.0.1:2222)
AddressFamily any|inet|inet6IPv4, IPv6 или оба

Кто и как входит

ДирективаЧто задаёт
PermitRootLoginyes, prohibit-password (по умолчанию: root только по ключу), forced-commands-only, no
PasswordAuthentication yes|noвход по паролю
PubkeyAuthentication yes|noвход по ключу (по умолчанию yes)
KbdInteractiveAuthentication yes|noинтерактивный ввод (одноразовые коды, PAM-запросы)
PermitEmptyPasswords noразрешить ли пустые пароли
AuthorizedKeysFile .ssh/authorized_keysгде искать открытые ключи пользователя
AllowUsers alice bob@10.0.0.*пускать только этих пользователей (можно user@хост)
DenyUsers, AllowGroups, DenyGroupsто же по запрету и по группам
UsePAM yesпроходить через PAM (в Ubuntu — yes)

Защита и сеансы

ДирективаЧто задаёт
MaxAuthTries 6попыток входа за одно соединение
LoginGraceTime 120секунд на вход, потом соединение рвётся
MaxStartups 10:30:100лимит одновременных неавторизованных подключений
MaxSessions 10сеансов в одном соединении
ClientAliveInterval 300 / ClientAliveCountMax 3проверять живость клиента и рвать «мёртвые» сеансы
X11Forwarding, AllowTcpForwarding, AllowAgentForwardingразрешить пробросы
LogLevel INFO|VERBOSE|DEBUGподробность журнала
Match User|Group|Address …блок: опции ниже действуют только для подходящих подключений, до следующего Match или конца файла

Как применяется конфиг

  • Первое значение побеждает. Для большинства опций sshd берёт первое встреченное значение и игнорирует следующие.
  • Include /etc/ssh/sshd_config.d/*.conf стоит в начале основного файла Ubuntu. Значит, файлы из sshd_config.d/ перекрывают то, что написано ниже в sshd_config.
  • Изменения применяются только после перезагрузки сервера: systemctl reload ssh или service ssh reload (сначала проверяют конфиг), либо kill -HUP $(cat /run/sshd.pid). Уже открытые сеансы не обрываются.

Примеры

# что реально действует сейчас (а не что написано в файле)
sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|allowusers) '

# закрыть вход по паролю отдельным файлом — он прочитается раньше основного
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/10-hardening.conf
sshd -t && service ssh reload

# пускать только двух пользователей, одного — только из локальной сети
echo 'AllowUsers deploy admin@10.0.0.*' >> /etc/ssh/sshd_config.d/10-hardening.conf

# пароль разрешён только из одной подсети
cat >> /etc/ssh/sshd_config <<'EOF'
Match Address 10.0.0.0/24
    PasswordAuthentication yes
EOF

# какие значения получит конкретный пользователь с конкретного адреса
sshd -T -C user=deploy,host=client,addr=10.0.0.5 | grep passwordauthentication

# запустить второй экземпляр на другом порту с журналом в файл — для отладки
mkdir -p /run/sshd
/usr/sbin/sshd -p 2222 -E /tmp/sshd.log -o PidFile=/tmp/sshd2.pid

# отладочный сервер в терминале: виден каждый шаг входа
/usr/sbin/sshd -d -p 2223

# проверить вход без интерактивных вопросов
ssh -o BatchMode=yes -p 2222 deploy@127.0.0.1 true && echo вход работает

Подводные камни

  • Перезагрузка с битым конфигом убивает сервер. kill -HUP при ошибке в конфиге не откатывается: основной процесс sshd завершается, порт перестаёт слушаться. Всегда sshd -t перед перезагрузкой. service ssh reload и systemctl reload ssh делают эту проверку сами.
  • Не закрывай текущую сессию, пока не проверишь вход в новой. Ошибка в AllowUsers или PasswordAuthentication no без ключа — и доступ потерян.
  • AllowUsers — белый список. Как только он появился, все, кого в нём нет (включая root), получат Permission denied. В журнале: not allowed because not listed in AllowUsers.
  • Значение в sshd_config.d/ перекрывает основной файл. Пишешь PasswordAuthentication no в конец sshd_config, а в sshd_config.d/50-cloud-init.conf стоит yes — останется yes. Проверяй через sshd -T.
  • Match действует до конца файла. Всё, что написано после блока Match, относится к нему. Ставь Match-блоки в самый конец.
  • Missing privilege separation directory: /run/sshd — при ручном запуске (без systemd) каталога нет. mkdir -p /run/sshd.
  • В Ubuntu 24.04 порт слушает ssh.socket. На машине с systemd после смены Port или ListenAddress нужны systemctl daemon-reload и systemctl restart ssh.socket, а не только reload сервиса — об этом написано прямо в комментарии sshd_config.
  • Две строки Port не заменяют друг друга, а открывают оба порта.
  • Владелец authorized_keys. При StrictModes yes (по умолчанию) sshd проверяет владельца и права домашнего каталога, ~/.ssh и authorized_keys. Файл, скопированный от root в чужой домашний каталог без chown, — частая причина отказа во входе по ключу; держи ~/.ssh в 700, файл — в 600.

См. также

ssh · ss · service · useradd · sudo