*КУБ - повний комплекс хмарних послуг!
Створюємо користувача і додаємо його в sudo + обмежувальну групу SSH:
sudo adduser admin
sudo usermod -aG sudo admin
sudo groupadd -f sshusers
sudo usermod -aG sshusers admin
id admin

Локально (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. Приватний ключ зберігається локально.
Відкрийте /etc/ssh/sshd_config і вкажіть:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
Перезапустіть SSH:
sudo systemctl restart sshd

Перевірте, що ключі працюють до того, як вимкнете паролі, інакше втратите доступ.
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.
sudo apt -y install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager

Створіть/відредагуйте
/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.
Створіть файл
/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 з’явиться в списку заблокованих.