Что делаем и почему
- Не работаем под root — создаем администратора с sudo.
- Вход только по SSH-ключам, пароли отключаем.
- Включаем UFW: «закрыто все, кроме необходимого».
- Устанавливаем Fail2Ban: блокирует IP при подборе пароля/ключа.
Администратор-пользователь и группы
Создаем пользователя и добавляем его в sudo + ограничительную группу SSH:
sudo adduser admin
sudo usermod -aG sudo admin
sudo groupadd -f sshusers
sudo usermod -aG sshusers admin
id admin
SSH-ключи: генерация и добавление
Локально (Windows/macOS/Linux):
ssh-keygen -t ed25519 -C "key-for-admin"
На сервере под root или существующим администратором:
sudo -u admin -H bash -lc 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'
sudo -u admin -H bash -lc 'cat >> ~/.ssh/authorized_keys' # вставьте содержимое *.pub, затем Ctrl+D
sudo -u admin -H bash -lc 'chmod 600 ~/.ssh/authorized_keys'
Важно: на сервер попадает только публичный .pub. Частный ключ хранится локально.
Усилим SSH (запрет паролей и root-входа)
Откройте /etc/ssh/sshd_config и укажите:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
Перезапустите SSH:
sudo systemctl restart sshd
Проверьте, что ключи работают до того, как отключите пароли, иначе потеряете доступ.
UFW: «закрыто по умолчанию»
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH # порт 22
sudo ufw allow 80,443/tcp # если нужен веб
sudo ufw enable
sudo ufw status numbered
Нужны дополнительные порты (например, 8080)? Добавьте явным правилом: sudo ufw allow 8080/tcp.
Fail2Ban: установка и автозапуск
sudo apt -y install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager
Настройка Fail2Ban: jail.local для sshd
Создайте/отредактируйте
/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
bantime.increment = true
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
action = %(action_mwl)s
Перезапустите:
sudo systemctl restart fail2ban
%(action_mwl)s отправит письмо (если настроена почта) + лог, а также заблокирует IP.
Интеграция Fail2Ban с UFW (альтернатива)
Создайте файл
/etc/fail2ban/jail.d/ufw-sshd.local:
[sshd]
enabled = true
action = ufw
maxretry = 5
findtime = 10m
bantime = 1h
Применяйте:
sudo systemctl restart fail2ban
Проверка работы и логи
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u ssh --since "today"
sudo ufw status verbose
Как тестировать бан: с другого узла сделайте 5–6 неверных попыток входа, проверьте status sshd — IP появится в списке заблокированных.
Бонусы безопасности (по желанию)
- Изменить SSH-порт (не защита, но снижает шум сканеров): Port 2222 в sshd_config + ufw allow 2222/tcp.
- Ограничить SFTP-доступ (chroot) для группы.
- Включить 2FA для SSH: libpam-google-authenticator + настройка /etc/pam.d/sshd и sshd_config (AuthenticationMethods publickey,keyboard-interactive).
- Лимиты попыток sudo: passwd -l root, sudo visudo с timestamp_timeout=5.
Чек-лист защиты
- Вход по ключам работает, пароли и root-логин отключены.
- UFW: deny incoming/allow outgoing, разрешены только необходимые порты.
- Fail2Ban защищает sshd (и по желанию nginx/postfix/…); логи проверены.
- Выполнен тест-бан, задокументированы правила и доступа.
