May 16, 2025

Як захистити ваші сервери від злому?

Нещодавно побачив, що мене безкінечно намагаються зламати з різних хостів методом підбору пароля як під root, так і під кастомного користувача. Деякі хости намагалися підібрати пароль більше 10000 разів, і це за один місяць
Незважаючи на те, що у мене закритий root для зовнішнього світу, вирішив вжити заходів і дати по руках: прописуємо чіткий конфіг для SSH-з'єднань і встановлюємо Fail2Ban.

Кілька корисних команд, щоб ви могли перевірити свій сервер на предмет брутфорсу

  • Перевіряємо успішні входи на свій сервер (повинен бути ваш IP):
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq
  • Перевірити неуспішні входи в систему через пароль і відсортувати за кількістю спроб входу:
sudo 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-ключі на своєму домашньому ПК:
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
  • Встановлюємо Fail2Ban:
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
  • Після зміни порту не забудьте відкрити його у файрволі (ufw або iptables).
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)

Корисні команди

  • Перевірити статус Fail2Ban:
sudo systemctl status fail2ban
  • Перевірити заблоковані IP-адреси:
sudo fail2ban-client status sshd

Загальні поради

  • Не використовуйте очевидні логіни: навіть якщо root вимкнено, admin, user і подібні логіни часто скануються ботами.
  • Завжди робіть резервні копії SSH-доступу і ключів.
  • Періодично перевіряйте логи та оновлюйте систему.
  • Цей гайд допоможе вам підвищити безпеку вашого сервера та захистити його від брутфорс-атак.

Мій телеграм канал - https://t.me/+MhR1Y8cXq_5iYmM6

По всім запитанням - https://t.me/sasha_postyt

Лям на крипті...