Що таке Fail2ban
Fail2ban – це система захисту від вторгнень, яка моніторить логи сервера та автоматично блокує IP адреси, що проводять підозрілу активність. Інструмент особливо ефективний проти брутфорс атак на SSH, веб-додатки та інші сервіси.
Принцип роботи
|
1 2 3 4 5 |
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Логи │───▶│ Fail2ban │───▶│ iptables │ │ сервісів │ │ аналізує │ │ блокує │ └─────────────┘ └─────────────┘ └─────────────┘ |
- Моніторинг логів – сканує файли логів в реальному часі
- Виявлення патернів – розпізнає підозрілу активність за регулярними виразами
- Автоматичне блокування – додає правила в iptables для блокування зловмисних IP
Інсталяція
Ubuntu/Debian
|
1 2 3 |
sudo apt update sudo apt install fail2ban |
CentOS/RHEL
|
1 2 3 |
sudo yum install epel-release sudo yum install fail2ban |
Перевірка встановлення
|
1 2 3 |
sudo systemctl status fail2ban fail2ban-client version |
Базова конфігурація
Структура конфігурації
|
1 2 3 4 5 6 7 |
/etc/fail2ban/ ├── jail.conf # Базова конфігурація (не редагувати) ├── jail.local # Користувацькі налаштування ├── filter.d/ # Фільтри для розпізнавання атак ├── action.d/ # Дії при виявленні атак └── fail2ban.conf # Глобальні налаштування |
Створення jail.local
|
1 2 3 |
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local |
Основні налаштування
Глобальні параметри
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[DEFAULT] # Час блокування (секунди) bantime = 3600 # Період спостереження (секунди) findtime = 600 # Максимальна кількість спроб maxretry = 3 # IP адреси що ігноруються ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # Email для сповіщень destemail = admin@yourdomain.com sender = fail2ban@yourdomain.com # Дія при бані action = %(action_mwl)s |
Захист SSH
|
1 2 3 4 5 6 7 8 9 |
[sshd] enabled = true port = ssh,22222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 |
Захист Apache/Nginx
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[apache-auth] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache2/error.log maxretry = 6 [nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 6 [nginx-limit-req] enabled = true port = http,https filter = nginx-limit-req logpath = /var/log/nginx/error.log maxretry = 10 |
Спеціальні фільтри для вашого проекту
Захист Docker сервісів
Фільтр для C&C сервера:
|
1 2 |
sudo nano /etc/fail2ban/filter.d/c2-server.conf |
|
1 2 3 4 5 6 7 |
[Definition] failregex = ^.*\[ERROR\].*Failed login attempt from <HOST>.*$ ^.*\[WARN\].*Suspicious activity from <HOST>.*$ ^.*Unauthorized access attempt.*<HOST>.*$ ignoreregex = |
Jail для C&C сервера:
|
1 2 3 4 5 6 7 8 9 |
[c2-server] enabled = true port = 8082,8444 filter = c2-server logpath = /path/to/c2/logs/access.log maxretry = 3 bantime = 7200 findtime = 300 |
Захист баз даних
PostgreSQL захист:
|
1 2 3 4 5 6 7 8 |
[postgresql] enabled = true port = 5432,5433 filter = postgresql logpath = /var/log/postgresql/postgresql-*.log maxretry = 3 bantime = 86400 |
Redis захист:
|
1 2 |
sudo nano /etc/fail2ban/filter.d/redis.conf |
|
1 2 3 4 5 6 |
[Definition] failregex = ^.*\[.*\] .*Connection from <HOST>.*AUTH failed.*$ ^.*\[.*\] .*Invalid password from <HOST>.*$ ignoreregex = |
Управління Fail2ban
Основні команди
|
1 2 3 4 5 6 7 8 9 10 11 |
# Запуск/зупинка sudo systemctl start fail2ban sudo systemctl stop fail2ban sudo systemctl restart fail2ban # Автозапуск sudo systemctl enable fail2ban # Статус сервісу sudo systemctl status fail2ban |
Моніторинг jail
|
1 2 3 4 5 6 7 8 9 |
# Статус всіх jail sudo fail2ban-client status # Статус конкретного jail sudo fail2ban-client status sshd # Список заблокованих IP sudo fail2ban-client get sshd banip |
Управління банами
|
1 2 3 4 5 6 7 8 9 |
# Заблокувати IP вручну sudo fail2ban-client set sshd banip 192.168.1.100 # Розблокувати IP sudo fail2ban-client set sshd unbanip 192.168.1.100 # Додати IP до whitelist sudo fail2ban-client set sshd addignoreip 192.168.1.50 |
Розширені налаштування
Інтеграція з Docker логами
|
1 2 3 |
# Скрипт для парсингу Docker логів sudo nano /usr/local/bin/docker-log-monitor.sh |
|
1 2 3 4 5 6 |
#!/bin/bash docker logs nginx 2>&1 | grep "$(date '+%Y/%m/%d')" | \ while IFS= read -r line; do echo "$(date '+%b %d %H:%M:%S') nginx: $line" >> /var/log/nginx/docker.log done |
Email сповіщення
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[DEFAULT] # SMTP налаштування sendername = Fail2Ban sender = fail2ban@yourserver.com destemail = admin@yourcompany.com # Дії з email action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"] action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath="%(logpath)s"] |
Географічна фільтрація
|
1 2 3 4 5 6 |
# Встановлення geoip sudo apt install geoip-bin geoip-database # Створення фільтра за країнами sudo nano /etc/fail2ban/action.d/geoblock.conf |
|
1 2 3 4 5 6 7 8 9 10 |
[Definition] actionstart = actionstop = actioncheck = actionban = COUNTRY=$(geoiplookup <ip> | awk -F ": " '{print $2}' | awk -F "," '{print $1}') if [ "$COUNTRY" = "China" ] || [ "$COUNTRY" = "Russia" ]; then iptables -I fail2ban-<name> 1 -s <ip> -j DROP fi actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP |
Оптимізація продуктивності
Налаштування для високого навантаження
|
1 2 3 4 5 6 7 8 9 10 |
[DEFAULT] # Зменшення частоти сканування logtarget = /var/log/fail2ban.log loglevel = INFO syslogsocket = auto # Оптимізація пам'яті dbfile = /var/lib/fail2ban/fail2ban.sqlite3 dbpurgeage = 86400 |
Ротація логів
|
1 2 |
sudo nano /etc/logrotate.d/fail2ban |
|
1 2 3 4 5 6 7 8 9 10 11 |
/var/log/fail2ban.log { weekly missingok rotate 52 compress delaycompress postrotate fail2ban-client reload endscript } |
Інтеграція з моніторингом
Grafana Dashboard
|
1 2 3 |
# Експорт метрик для Prometheus sudo nano /usr/local/bin/fail2ban-exporter.sh |
|
1 2 3 4 5 6 7 8 9 |
#!/bin/bash echo "# HELP fail2ban_banned_total Total banned IPs" echo "# TYPE fail2ban_banned_total counter" for jail in $(fail2ban-client status | grep "Jail list:" | sed 's/.*Jail list://g' | sed 's/,//g'); do count=$(fail2ban-client status $jail | grep "Currently banned:" | awk '{print $4}') echo "fail2ban_banned_total{jail=\"$jail\"} $count" done |
Slack/Discord сповіщення
|
1 2 |
sudo nano /etc/fail2ban/action.d/slack.conf |
|
1 2 3 4 5 6 7 8 9 |
[Definition] actionstart = actionstop = actioncheck = actionban = curl -X POST -H 'Content-type: application/json' \ --data '{"text":"🚫 Fail2ban: Banned IP <ip> on jail <name>"}' \ https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK actionunban = |
Кейс: Захист після Ransomware атаки
Налаштування для вашого проекту
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# /etc/fail2ban/jail.local [DEFAULT] bantime = 86400 # 24 години бану findtime = 300 # 5 хвилин спостереження maxretry = 2 # Максимум 2 спроби ignoreip = 127.0.0.1/8 YOUR_OFFICE_IP [sshd] enabled = true port = 22222 # Ваш нестандартний SSH порт maxretry = 2 bantime = 604800 # Тиждень бану для SSH [nginx-auth] enabled = true port = 80,443 filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 3 [docker-mysql] enabled = true port = 3306 filter = mysql-auth logpath = /var/log/mysql/error.log maxretry = 1 # Негайний бан для MySQL bantime = 2592000 # Місяць бану |
Тестування конфігурації
Перевірка фільтрів
|
1 2 3 4 5 6 7 8 9 |
# Тест SSH фільтра fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf # Тест Nginx фільтра fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-http-auth.conf # Тест власного фільтра fail2ban-regex /path/to/your/log /etc/fail2ban/filter.d/your-filter.conf |
Симуляція атаки
|
1 2 3 4 5 6 7 8 |
# Генерація тестових логів для SSH for i in {1..5}; do echo "$(date '+%b %d %H:%M:%S') server sshd[1234]: Failed password for invalid user test from 192.168.1.100 port 22 ssh2" >> /var/log/auth.log done # Перевірка спрацювання sudo fail2ban-client status sshd |
Проблеми та рішення
Самоблокування
|
1 2 3 4 5 6 |
# Додання власного IP в whitelist sudo fail2ban-client set sshd addignoreip YOUR_IP # Постійне додання в конфігурацію ignoreip = 127.0.0.1/8 ::1 YOUR_OFFICE_IP/32 |
Iptables конфлікти
|
1 2 3 4 5 6 7 |
# Перевірка правил sudo iptables -L fail2ban-sshd -n # Ручне очищення правил sudo iptables -F fail2ban-sshd sudo fail2ban-client restart |
Логи не сканується
|
1 2 3 4 5 6 7 |
# Перевірка прав доступу ls -la /var/log/auth.log sudo usermod -a -G adm fail2ban # Перевірка шляхів логів sudo fail2ban-client get sshd logpath |
Висновки
Fail2ban – потужний інструмент захисту, який:
- Автоматично блокує атакуючих без втручання адміністратора
- Масштабується від невеликих VPS до великих кластерів
- Інтегрується з існуючими системами логування
- Налаштовується під специфічні потреби проекту
Після ransomware атаки fail2ban стає критично важливим елементом захисту, особливо для серверів з відкритими сервісами розробки та тестування.
Рекомендація: встановіть fail2ban одразу після налаштування сервера, до розгортання додатків. Це дозволить накопичити статистику атак та налаштувати оптимальні правила блокування.