Минимальный набор для домашнего или VPS-сервера: вход по ключу, без пароля и без прямого root по SSH. На RHEL 9 правки удобно класть в drop-in, не трогая весь /etc/ssh/sshd_config.

Важно: не закрывайте текущую сессию, пока не проверите вход во втором окне. Иначе легко остаться без доступа.

Ужесточение sshd на Rocky / AlmaLinux 9

1. Ключ на клиенте

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_server
ssh-copy-id -i ~/.ssh/id_ed25519_server.pub user@server

Проверьте вход по ключу:

ssh -i ~/.ssh/id_ed25519_server user@server

2. Drop-in для sshd

mkdir -p /etc/ssh/sshd_config.d
cat > /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
X11Forwarding no
AllowTcpForwarding no
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
EOF

Если нужен туннель (например, для локального проброса) — оставьте AllowTcpForwarding yes.

Проверка конфига и перезапуск:

sshd -t
systemctl reload sshd

3. Ограничение пользователей (опционально)

echo 'AllowUsers youruser' >> /etc/ssh/sshd_config.d/99-hardening.conf
sshd -t && systemctl reload sshd

4. Порт не 22 (опционально)

Смена порта снижает шум сканеров, но не заменяет ключи и Fail2ban:

echo 'Port 2222' >> /etc/ssh/sshd_config.d/99-hardening.conf
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
sshd -t && systemctl reload sshd

Не забывайте указывать порт в клиенте: ssh -p 2222 ....

5. Рядом по смыслу

  • Fail2ban для SSH — отдельная заметка в этом разделе.
  • firewalld: разрешён только нужный порт SSH.
  • Для админ-панелей за Traefik — Authelia с 2FA, а не открытый UI в интернет.

Замечания

  • На облачных образах иногда уже есть cloud-init и PasswordAuthentication no — сверьте sshd -T | grep -i password.
  • SELinux: смена порта SSH требует semanage port (пакет policycoreutils-python-utils).

Итог: sshd принимает только ключи обычного пользователя — меньше поверхности для брутфорса.