*КУБ– полный комплекс облачных услуг!

Защита Linux VPS: SSH-ключи, UFW и Fail2Ban

Захист Linux VPS: SSH-ключі, UFW і Fail2Ban

Что делаем и почему

  • Не работаем под 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
				
			
Linux VPS

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'
				
			
Linux VPS

Важно: на сервер попадает только публичный .pub. Частный ключ хранится локально.

Усилим SSH (запрет паролей и root-входа)

Откройте /etc/ssh/sshd_config и укажите:

				
					PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
				
			

Перезапустите SSH:

				
					sudo systemctl restart sshd
				
			
Linux VPS

Проверьте, что ключи работают до того, как отключите пароли, иначе потеряете доступ.

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

				
			
Linux VPS

%(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
				
			
Linux VPS

Проверка работы и логи

				
					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/…); логи проверены.
  • Выполнен тест-бан, задокументированы правила и доступа.