Полностью отбиваем тех, кто пытается несанкционированно получить доступ к серверу, с помощью Fail2Ban!
Здравствуйте, я бездарь. В предыдущей статье я смог подтвердить, что за один день было слишком много попыток доступа с разных 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-<name>
iptables -A f2b-<name> -j DROP
iptables -I INPUT -p all -j f2b-<name>
iptables -I FORWARD -p all -j f2b-<name>
actionstop = iptables -D INPUT -p all -j f2b-<name>
iptables -D FORWARD -p all -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L INPUT | grep -q 'f2b-<name>[ ]'
actionban = iptables -I f2b-<name> -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -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"
Теперь процесс будет автоматически запускаться даже после перезагрузки сервера.
На этом на сегодня все. Кстати, я подумал, что было бы интересно отобразить в диаграмме, с какими именами пользователей были попытки входа в систему из полученных логов. Снова жду вашего внимания.