*КУБ - повний комплекс хмарних послуг!

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