Как я защитил сервер Fail2ban и перестал просыпаться по ночам
Первый звоночек
Как-то ночью я полез в логи сервера — и охренел. 1500 неудачных попыток входа по SSH за последние сутки. Кто-то из Китая долбился по дефолтному порту, перебирал root и admin. Спал я потом плохо — казалось, что вот-вот кто-то подберёт пароль.
Я тогда только начинал администрировать свой первый VPS. Думал, что сложный пароль — это всё, что нужно. Наивный.
Fail2ban тогда для меня был просто строчкой в мануалах. Типа «установи Fail2ban, он всё починит». Я не придавал значения, пока не увидел эти логи своими глазами.
Ставлю Fail2ban
Установка тривиальная:
sudo apt install fail2ban -y
После установки fail2ban сам создаёт правила iptables и начинает мониторить логи. Но по дефолту он настроен слабо — например, бан только на 10 минут, и только 5 неудачных попыток. Я усилил.
Создал локальный конфиг, который переопределяет дефолтный:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Поменял параметры: maxretry = 3, bantime = 86400 (сутки), findtime = 600. В три попытки за десять минут — баним на день. Жёстко, но эффективно.
Настройка под себя
Кроме SSH, я включил джейлы для nginx и WordPress. По логам видно, что боты долбятся и по вебу:
[nginx-http-auth]
enabled = true
[wordpress]
enabled = true
logpath = /var/log/auth.log
maxretry = 5
Отдельно настроил фильтр на wp-login.php — кто часто долбится на страницу входа, тот получает бан. WordPress сам по себе защищён, но дополнительные козыри в рукаве не помешают.
Тут я наступил на грабли. После включения джейла для nginx я забыл перезагрузить fail2ban и полчаса тупил — почему правила не применяются. Команда для перезапуска:
sudo systemctl restart fail2ban
После перезапуска проверил статус:
sudo fail2ban-client status
Увидел SSH, nginx-http-auth, wordpress — все активны. Выдохнул.
Первая блокировка
Через час после настройки fail2ban заблокировал первого нарушителя. Я проверил:
sudo fail2ban-client status sshd
В списке забаненных IP маячил адрес из Нидерландов. Приятное чувство — знать, что автоматика сработала, а я сплю спокойно.
Но была и ложная тревога. Однажды я сам себя забанил, когда тестировал новую конфигурацию SSH и несколько раз ошибся в пароле. Пришлось лезть через консоль Proxmox и разбанивать. С тех пор добавил свой IP в ignoreip:
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/24
Теперь локальная сетка и localhost вне подозрений.
Мониторинг через Telegram
Fail2ban умеет отправлять уведомления по email, но я человек простой — хочу в Telegram. Настроил action через curl и Telegram Bot API. В jail.local добавил:
action = %(action_mwl)s
telegram-notify
И создал скрипт-обёртку, который при каждом бане шлёт мне сообщение: «Забанен IP 1.2.3.4 за SSH-брутфорс». Теперь я знаю, сколько мусора отсекается, и сплю ещё крепче.
Кстати, уведомления я получаю всё тем же ботом, которого описал в предыдущей статье про Telegram-бота на Python. Там же всё и завязал.
Что дальше
Fail2ban научил меня одному: безопасность — это не «поставил и забыл». Раз в месяц я проверяю логи, смотрю, какие IP пытались пробиться, и при необходимости добавляю новые фильтры. Недавно добавил защиту на Postfix — почтовые боты тоже любят долбиться.
Уровень шума в логах упал процентов на 80. И главное — я перестал дёргаться по ночам. Теперь если кто-то ломится, fail2ban его отшибает за меня, а я узнаю об этом утром из уведомления.
Из полезного — почитай про recidive jail. Это когда одного и того же нарушителя банят повторно, уже на месяц. Я его включил, но пока не срабатывал — видимо, боты быстро переключаются на другие цели.