linux-labs

Вики / Службы и systemd

sshd (SSH-сервер)

Сервис Ubuntu 24.04 · OpenSSH 9.6 СлужбыСетьSSHБезопасность

Сервер SSH — удалённый доступ по ключам, конфиг и хардненинг.

sshd — сервер OpenSSH, принимает удалённые подключения (порт 22 по умолчанию). Управляется systemd (юнит называется ssh в Ubuntu). Аутентификация — по ключам (рекомендуется) или паролю.

Вход по ключу: публичный ключ клиента кладётся в ~/.ssh/authorized_keys на сервере (см. ssh-keys).

systemctl status ssh
ss -tlnp | grep :22               # слушает ли порт (см. ss)

Главный конфиг — /etc/ssh/sshd_config (+ сниппеты в /etc/ssh/sshd_config.d/). Безопасная база:

PermitRootLogin no
PasswordAuthentication no         # только ключи
PubkeyAuthentication yes
Port 22

Применить изменения безопасно (не обрывая текущую сессию):

sudo sshd -t                      # проверить синтаксис конфига
sudo sshd -T | grep -i permitroot # показать ДЕЙСТВУЮЩИЕ значения (важно!)
sudo systemctl reload ssh         # применить (юнит ssh)

⚠️ Меняя SSH-конфиг удалённо, держи второй открытый сеанс — если ошибёшься, не закроешь себе доступ. Полезно: sudo sh -c 'sleep 300 && systemctl restart ssh' & как страховку с авто-откатом по таймеру.

Параметр Зачем
PermitRootLogin no не пускать root напрямую
PasswordAuthentication no только ключи (главное против брутфорса)
MaxAuthTries 3 меньше попыток за коннект
AllowUsers alice bob белый список пользователей
AllowGroups sshusers белый список групп
AllowTcpForwarding no запретить туннели (если не нужны)
X11Forwarding no отключить проброс X
ClientAliveInterval 300 отключать мёртвые сессии

Гибко — через Match (для группы/адреса):

Match Group sftponly
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
systemctl status ssh              # состояние сервера
sshd -t                           # проверка sshd_config (синтаксис)
sudo sshd -T                      # эффективная конфигурация (все параметры)
ss -tlnp | grep :22               # слушает ли порт
journalctl -u ssh -f              # логи подключений/отказов
journalctl -u ssh | grep -i fail  # неудачные входы (брутфорс? см. fail2ban)
ssh -v user@host                  # отладка подключения с клиента

Permission denied (publickey)

Права на сервере: ~/.ssh=700, authorized_keys=600, владелец — сам пользователь. journalctl -u ssh → часто «Authentication refused: bad ownership or modes». См. ssh-keys.

Connection refused

Сервер не слушает порт: ss -tlnp | grep :22, systemctl status ssh. Либо порт закрыт файрволом — разреши 22/tcp (см. firewall).

Connection timed out

Сетевой/файрвол-уровень (не дошёл до sshd): маршрут, security group, nftables. Проверь nc -zv host 22.

Сменил порт — не пускает

SELinux/порт не разрешён, файрвол на старом порту, или клиент идёт на 22. Открой новый порт в firewall, проверь sshd -T | grep -i port.

Заблокировал себя сменой конфига

Зайди через консоль гипервизора/serial и откати sshd_config (или sshd -t показал бы ошибку до reload — всегда проверяй).

sudo sshd -t                      # проверить конфиг
sudo sshd -T | grep -i <param>    # действующее значение
systemctl reload ssh              # применить
ss -tlnp | grep :22 ; journalctl -u ssh -f
# база: PermitRootLogin no · PasswordAuthentication no · AllowUsers

См. также