mysurik.ru

Как я защитил сервер Fail2ban и перестал просыпаться по ночам

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. Это когда одного и того же нарушителя банят повторно, уже на месяц. Я его включил, но пока не срабатывал — видимо, боты быстро переключаются на другие цели.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *