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|inet6 | IPv4, IPv6 или оба |
Кто и как входит
| Директива | Что задаёт |
|---|
PermitRootLogin | yes, 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