Полностью отбиваем тех, кто пытается несанкционированно получить доступ к серверу, с помощью Fail2Ban!

8 min

language: ja bn en es hi pt ru zh-cn zh-tw

Здравствуйте, я бездарь. В предыдущей статье я смог подтвердить, что за один день было слишком много попыток доступа с разных IP-адресов.
Я беззаботно использовал его до сих пор, и хотя фактического несанкционированного доступа не было, меры должны быть приняты.
Честно говоря, мне не нравится, что накопление лог-файлов становится слишком большим и трудночитаемым. Поэтому я решил внедрить Fail2Ban, который заинтересовал меня, когда он был установлен как зависимость при установке iRedMail.

Что это?

Можно блокировать IP-адреса, если из аудита логов обнаружено заданное количество попыток.
Также можно отбрасывать сами пакеты при попытках через iptables. [Установка

На этот раз я вошел как root, поэтому не буду использовать sudo. После поиска пакетов я нашел следующий пакет и установлю его.

pkg install py311-fail2ban-1.1.0  
  

В основном, не рекомендуется изменять сам файл конфигурации fail2ban.conf; вместо этого следует создать и записать в jail.conf. Поэтому на этот раз
Попытки входа, связанные с этими тремя: SSH, Postfix, Dovecot, очень нежелательны, поэтому я настрою их.
Кроме того, просматривая различные сайты, я обнаружил, что можно настроить не только секунды, но и 1w, 1d, поэтому я настрою это по-крупному. Я безжалостно забаню на неделю.

~ # cat /usr/local/etc/fail2ban/jail.local  
[sshd]  
enabled = true  
port    = ssh  
logpath = /var/log/auth.log  
bantime = 1w  
findtime = 1d  
maxretry = 5  
  
[postfix]  
enabled = true  
port    = smtp,ssmtp,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=postfix, port=smtp, protocol=tcp]  
  
[dovecot]  
enabled = true  
port    = pop3,pop3s,imap,imaps,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=dovecot, port=imap, protocol=tcp]  
  

Кажется, лучше создать секцию [default], но пока я ограничусь этими тремя и добавлю, если понадобится. Кстати, причина, по которой я установил срок в одну неделю, заключается в следующем:

  • Во-первых, я использую аутентификацию по ключу, поэтому ошибиться невозможно.

  • После входа на почтовый сервер аутентификация остается активной в течение некоторого времени, поэтому я редко пытаюсь войти вручную.

  • Если IP-адрес забанен, я хочу отбросить все пакеты.

  • Более 5 неудачных попыток входа в день — это само по себе странно.

Так что это довольно строго? Или мягко? Мне не нравится тратить ресурсы, устанавливая слишком короткий период бана, поэтому я сделал так. Кстати, кажется, можно также банить GET-методы на HTTP-сервере. https://hana-shin.hatenablog.com/entry/2023/05/24/210949 Я не внедрял это, так как использую этот сервер только как промежуточный, но если понадобится, возможно, попробую. И я добавил action = block-drop, настройки для этого следующие.

# cat /usr/local/etc/fail2ban/action.d/block-drop.conf  
[Definition]  
  
actionstart = iptables -N f2b-&LTname>  
              iptables -A f2b-&LTname> -j DROP  
              iptables -I INPUT -p all -j f2b-&LTname>  
              iptables -I FORWARD -p all -j f2b-&LTname>  
  
actionstop = iptables -D INPUT -p all -j f2b-&LTname>  
             iptables -D FORWARD -p all -j f2b-&LTname>  
             iptables -F f2b-&LTname>  
             iptables -X f2b-&LTname>  
  
actioncheck = iptables -n -L INPUT | grep -q 'f2b-&LTname>[     ]'  
  
actionban = iptables -I f2b-&LTname> -s &LTip> -j DROP  
  
actionunban = iptables -D f2b-&LTname> -s &LTip> -j DROP  
  

В основном, когда IP-адрес забанен, я настроил отбрасывание всех пакетов. Я вспомнил о Reject и, пересмотрев https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables, пришел к выводу, что Reject следует использовать, когда вы хотите, чтобы другая сторона знала, что ей было отказано. Поскольку в данном случае это бан, я решил безжалостно отбрасывать пакеты в небытие.

Запуск и проверка работоспособности

Поскольку это FreeBSD, запуск осуществляется так:

service fail2ban start  
  

Если отображается 'Server ready', то все в порядке. Проверю логи, чтобы убедиться, что все работает правильно.

# tail /var/log/fail2ban.log  
2024-07-24 13:34:05,654 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,755 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,884 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,000 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,317 fail2ban.actions        [39963]: WARNING [sshd]  already banned  
2024-07-24 13:34:06,731 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:06  
2024-07-24 13:37:14,327 fail2ban.filter         [39963]: INFO    [sshd] Found - 2024-07-24 13:37:14  
2024-07-24 13:42:12,266 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:12  
2024-07-24 13:42:17,389 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:17  
2024-07-24 13:42:23,357 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:23  
  

Обычно IP-адреса отображаются, но на этот раз я их скрыл. Он был немедленно забанен! Попался, сопляк! — кричу я про себя.
(Все равно это бот, и что я думаю, сражаясь с машиной?) Отбросив этот бессмысленный жест победы, я добавлю следующее в /etc/rc.conf для автоматического запуска.

fail2ban_enable="YES"  
  

Теперь процесс будет автоматически запускаться даже после перезагрузки сервера.


На этом на сегодня все. Кстати, я подумал, что было бы интересно отобразить в диаграмме, с какими именами пользователей были попытки входа в систему из полученных логов. Снова жду вашего внимания.

Related Posts