Як захистити ваші сервери від злому?
Нещодавно побачив, що мене безкінечно намагаються зламати з різних хостів методом підбору пароля як під root, так і під кастомного користувача. Деякі хости намагалися підібрати пароль більше 10000 разів, і це за один місяць
Незважаючи на те, що у мене закритий root для зовнішнього світу, вирішив вжити заходів і дати по руках: прописуємо чіткий конфіг для SSH-з'єднань і встановлюємо Fail2Ban.
Кілька корисних команд, щоб ви могли перевірити свій сервер на предмет брутфорсу
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniqsudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nrСценарій №1: Ви не входите під root-користувача через логін/пароль і хочете закрити цю можливість для інших
sudo grep -q "^PermitRootLogin" /etc/ssh/sshd_config && \
{ sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config && echo "Замінено: PermitRootLogin yes на no"; } || \
{ echo "PermitRootLogin no" | sudo tee -a /etc/ssh/sshd_config && echo "Додано: PermitRootLogin no в кінець файлу"; } && \
sudo systemctl restart ssh.service && echo "SSH перезапущено, зміни застосовано успішно."Сценарій №2: Ви хочете входити під root-користувача напряму, але убезпечити себе від злому методом підбору паролів
Тут трохи складніша ситуація, і ми підемо стандартним методом — вхід за ключами.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Заходимо на віддалений сервер, який хочемо захистити, і вставляємо ПУБЛІЧНИЙ ключ, що згенерували в пункті 1 (
rsa_key.pub):
mkdir -p ~/.ssh echo ssh-rsa ВСТАВЛЯЄМО ВАШ ПУБЛІЧНИЙ КЛЮЧ >> ~/.ssh/authorized_keys chmod -R go= ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
sudo grep -q "^PasswordAuthentication" /etc/ssh/sshd_config && \
{ sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config && echo "Замінено: PasswordAuthentication yes на no"; } || \
{ echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config && echo "Додано: PasswordAuthentication no в кінець файлу"; }sudo grep -q "^ChallengeResponseAuthentication" /etc/ssh/sshd_config && \
{ sudo sed -i 's/^ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config && echo "Замінено: ChallengeResponseAuthentication yes на no"; } || \
{ echo "ChallengeResponseAuthentication no" | sudo tee -a /etc/ssh/sshd_config && echo "Додано: ChallengeResponseAuthentication no в кінець файлу"; }sudo grep -q "^PubkeyAuthentication" /etc/ssh/sshd_config && \
{ echo "PubkeyAuthentication вже увімкнено"; } || \
{ echo "PubkeyAuthentication yes" | sudo tee -a /etc/ssh/sshd_config && echo "Додано: PubkeyAuthentication yes в кінець файлу"; }sudo systemctl restart ssh.service && echo "SSH перезапущено, зміни застосовано успішно."
grep "^PasswordAuthentication" /etc/ssh/sshd_config grep "^ChallengeResponseAuthentication" /etc/ssh/sshd_config grep "^PubkeyAuthentication" /etc/ssh/sshd_config
- На всякий випадок перевіряємо, що другий конфіг-файл порожній або не зачіпає наші параметри; якщо зачіпає, то змінити/видалити за прикладом вище:
cat /etc/ssh/sshd_config.d/*.conf
Якщо ви для роботи використовуєте Termius, вставляємо для входу ПРИВАТНИЙ ключ і користувача, під якого входимо, в тому ж блоці, де раніше був пароль (його ми, звісно ж, видаляємо).
Встановлення Fail2Ban
sudo apt update sudo apt upgrade -y
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
- Вносимо зміни в розділі
[sshd]і додаємо такі рядки (якщо у вас дефолтний порт 22, його міняти не треба):
[sshd] enabled = true port = ssh logpath = %(sshd_log)s maxretry = 5 findtime = 10m bantime = -1
sudo systemctl restart fail2ban
Додаткові рекомендації для посилення безпеки сервера
Зміна стандартного SSH-порту
Більшість атак відбувається саме на порт 22. Щоб зменшити кількість спроб підключення ботів, змініть порт на інший (наприклад, 2222).
sudo nano /etc/ssh/sshd_config
#Port 22
Port 2222
sudo ufw allow 2222/tcp
sudo systemctl restart ssh
Обмеження доступу до SSH тільки для конкретних IP-адрес
Якщо у вас фіксована IP-адреса вдома чи на роботі — дозволяйте SSH-доступ тільки з неї:
sudo ufw allow from <ВАШ_IP> to any port 2222 proto tcp
Використання UFW (Uncomplicated Firewall)
UFW — простий і зручний інструмент для керування доступом до серверу. Мінімальний набір команд:
sudo ufw enable sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 2222/tcp sudo ufw status
Автоматичне оновлення безпеки
Встановіть автоматичні оновлення безпеки, щоб уникати вразливостей у системі:
sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades
Моніторинг із Fail2Ban Telegram-ботом або email-повідомленням
Fail2Ban можна налаштувати так, щоб він надсилав повідомлення про блокування IP-адрес на Telegram або email.
Це дозволить вам швидко реагувати, якщо йде спроба атаки.
Інтеграція із системами сповіщення, як-от Netdata або Prometheus + Grafana
Для більш глибокого моніторингу рекомендую встановити Netdata — зручний візуальний інтерфейс для відстеження ресурсів сервера, трафіку та підключень.
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
Корисні команди
sudo systemctl status fail2ban
sudo fail2ban-client status sshd
Загальні поради
- Не використовуйте очевидні логіни: навіть якщо
rootвимкнено,admin,userі подібні логіни часто скануються ботами. - Завжди робіть резервні копії SSH-доступу і ключів.
- Періодично перевіряйте логи та оновлюйте систему.
- Цей гайд допоможе вам підвищити безпеку вашого сервера та захистити його від брутфорс-атак.