Установка и использование Fail2ban в Debian 12
На этой странице
- Как это работает
Настройка Fail2ban
- Включение тюрьмы
- Следите за журналами
- Поиск неисправностей
- Внесение в белый список собственных IP-адресов
- Запрет вручную
- Разблокировка вручную
- Заключение
Fail2ban отслеживает файлы журналов на предмет ошибок входа в систему и временно запрещает IP-адресу источника, подверженному сбоям, доступ к хосту. Это защита от атак грубой силы с подбором пароля. Очень полезно иметь Fail2ban на хостах, подключенных к Интернету.
Версия Fail2ban в Debian 12 — 1.0.2.
root@posti:~# fail2ban-client version
1.0.2
Чтобы узнать, запущен ли в данный момент Fail2ban, отправьте на сервер команду ping с помощью Fail2ban-client. Сервер Fail2ban отвечает «понг», если он запущен.
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#
Как это работает
Fail2ban собирает фильтры, действия и отслеживаемые файлы в тюрьму. В раздаче идут несколько джейлов. Их необходимо включить, чтобы начать работать. Фильтр определяет, как обнаруживать ошибки аутентификации. действие определяет, как происходит запрет и разбан.
Попытки вторжения вызывают бан, если в течение времени поиска обнаружены хотя бы неудачные попытки входа в систему maxretry с одного и того же IP-номера. Затем IP банят на бантайм секунды. После того, как бан действителен в течение бантайм секунд, бан снимается и IP снова может получить доступ к хосту. Fail2ban может обрабатывать как IPv4, так и IPv6.
Дополнительную информацию можно прочитать в файлах в каталоге /usr/share/doc/fail2ban/.
Настройка Fail2ban
В системах Debian GNU/Linux по умолчанию устанавливается Fail2ban с включенной sshd-джейлой и разумными настройками. Это делается в файле /etc/fail2ban/jail.d/defaults-debian.conf. Это единственная тюрьма, работающая по умолчанию. Другие джейлы должны быть включены системным администратором.
Итак, если вы хотите, чтобы отслеживались только входы в систему по ssh и запрещались злоумышленники, которые плохо себя ведут, дополнительная настройка не требуется.
К сожалению, в Debian 12 Fail2ban может не работать с настройками по умолчанию. В Debian 12 пакет rsyslog помечен как необязательный, что означает, что его нельзя установить, поэтому журналы собираются только в журнале Journald [wiki.debian.org/Rsyslog].
В системах ISPConfig error2ban работает, поскольку автоустановщик ISPConfig устанавливает rsyslog, а в руководстве по серверу ISPConfig Perfect указано, как установить rsyslog.
При использовании rsyslog файлы журналов появляются в каталоге /var/log/, поэтому конфигурация по умолчанию error2ban находит файлы журналов. Если rsyslog не установлен, необходимо изменить конфигурацию Fail2ban, чтобы он считывал журналы из журнала systemd. Добавьте в раздел по умолчаниюjail.local backend=systemd, вот так
[DEFAULT]
backend = systemd
Включение тюрьмы
Документация рекомендует все свои модификации помещать в .local файлы. Это позволяет избежать проблем, когда файлы, поставляемые с дистрибутивом, обновляются или изменяются сопровождающим [Читать файл /usr/share/doc/fail2ban/README.Debian.gz].
Например, включение тюрьмы pure-ftpd осуществляется добавлением в файл /etc/fail2ban/jail.local (создайте файл, если он еще не существует) строки
[pure-ftpd]
enabled = true
Название джейла в квадратных скобках начинает раздел настроек этого джейла.
Закончив внесение изменений, принудительно перечитайте файлы конфигурации с помощью команды
systemctl reload fail2ban
Теперь джейл должен быть запущен, что можно проверить с помощью Fail2ban-client:
root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
| |- Currently failed: 0
| |- Total failed: 106
| `- File list: /var/log/syslog
`- Actions
|- Currently banned: 0
|- Total banned: 4
`- Banned IP list:
root@posti:/etc/fail2ban#
Поскольку в файле Jail.local для этой тюрьмы есть только «включенная» настройка, все остальные настройки являются настройками по умолчанию из дистрибутива. Обычно они имеют хорошие значения, поэтому дополнительная настройка не требуется. При необходимости раздел Jail.local для этой тюрьмы может содержать настройки, которые переопределяют настройки, установленные в файлах .conf.
В этом примере изменяются findtime, maxretry и Bantime для тюрьмы pure-ftpd:
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1d
Fail2ban-клиент показывает время в секундах, но в файлах конфигурации время можно ввести в более простом формате, например 10 часов вместо 36000 секунд. man Jail.conf в главе «ФОРМАТ СОКРАЩЕНИЙ ВРЕМЕНИ» объясняет удобные для пользователя форматы ввода времени.
В Fail2ban-client есть возможность конвертировать время из удобного для пользователя формата в секунды.
# fail2ban-client --str2sec 1d3h7m
97620
Следите за журналами
Чтобы определить, какие джейлы следует активировать, следуйте журналам, созданным службами, работающими на хосте. Полезным будет инструмент, создающий сводки журналов, например logwatch или pflogsumm. Чтение необработанных журналов занимает много времени и утомительно.
Проверьте, доступен ли джейл для службы, работающей на хосте, возможно, прочитав Jail.conf.
Как только журналы покажут что-то интересное или тревожное, пора заняться исследованием. Например, pflogsumm отправил по электронной почте сводку со следующими строками:
136 unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136 hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123 unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123 hostname mail.whatami.co does not resolve to address 193.32.162.23
Это показывает, что IP 91.224.92.40 не удалось войти в электронную почту 136 раз и еще один аналогичный случай. Fail2ban должен был предотвратить столько попыток. Чтобы понять, почему этого не произошло, изучите журнал Fail2ban.
root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#
Этот IP-адрес пытается подключиться примерно с 10-минутными интервалами, и error2ban Jail postfix-sasl его обнаруживает.
Хорошая идея выяснить, принадлежит ли этот IP-адрес законному пользователю хоста, у которого просто есть старый пароль на смартфоне или каком-либо другом устройстве, пытающемся подключиться через определенные промежутки времени. Я использую geoiplookup, он показывает IP из какой страны. Мои пользователи из моей страны, поэтому иностранные пользователи, как правило, являются плохими актерами. geoiplookup поставляется из пакетов Debian geoip-database и geoip-bin.
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania
Чтобы узнать, почему IP не забанили, изучите findtime этой тюрьмы:
root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#
Недавно я видел эти медленные атаки. Злоумышленник знает, что время поиска составляет 10 минут, поэтому пытается избежать блокировки, пытаясь войти в систему через более длительные интервалы. В данном случае это сработало. Чтобы неудавшиеся входы приводили к банам, увеличьте время нахождения в тюрьме, например до 10 часов. Добавьте в файл Jail.local в секцию [postfix-sasl]:
findtime = 10h
Затем после перезагрузки systemctl error2ban у тюрьмы будет больше времени поиска:
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#
Еще один способ проникновения злоумышленников — это настойчивость. Даже если злоумышленник забанен, просто дождитесь окончания бана и продолжайте подбирать пароль. Время бана можно было бы увеличить, но это создаст проблемы для законных пользователей, которые могут неправильно ввести пароль и затем не смогут получить доступ к своей учетной записи, пока время бана не истечет. Существует тюрьма для рецидивистов, называемая рецидивистами. Он работает путем поиска повторных банов по IP в журнале fail2ban, а затем бана на длительный срок, например на неделю.
Следующий листинг взят из отчета logwatch:
--------------------- pam_unix Begin ------------------------
sshd:
Authentication Failures:
unknown (212.70.149.150): 59 Time(s)
Поиск этого IP-адреса в файле журнала показывает:
2024-02-21 03:42:39,121 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04
Fail2ban работает как положено, находя неправильные логины и выдавая бан на 10 минут. Во время этого запрета нарушитель не имеет доступа к этому хосту, но продолжает работу после снятия запрета. Похоже, это случай серьезной попытки взлома. Решение состоит в том, чтобы включить рецидивную тюрьму с низким количеством попыток и длительным баном.
Мне нравится использовать короткий первоначальный бан, скажем, на 10 минут. Если реального пользователя забанили, он просто ждет этого времени, надеясь использовать это время, чтобы найти правильный пароль, а затем повторить попытку. Те, кого снова забанят в тот же день, будут забанены на неделю. Значения по умолчанию для рецидивной тюрьмы можно найти в файле Jail.conf, время бана составляет 1 неделю, а время поиска — 1 день, мне кажется, это нормально. Но я установил maxretry на 2, нарушителей банят быстрее. Я добавил в файл Jail.local:
[recidive]
enabled = true
maxretry = 2
Баны на срок более 1 недели, на мой взгляд, нецелесообразны. В конечном итоге старый IP-адрес повсеместно забанен или занесен в черный список, и нарушитель получит новый IP. Старый IP передается какому-то невиновному новому пользователю Интернета, который не должен быть наказан за плохие поступки, в которых виновен предыдущий владелец этого IP.
Поиск неисправностей
После загрузки ОС или перезапуска состояние fail2ban восстанавливается, поэтому баны продолжаются до тех пор, пока не истечет время бана. Таким образом, тестирование и устранение неполадок могут включать перезапуски.
Для проверки конфигурации существует опция тестирования:
fail2ban-server --test
Чтобы узнать, забанен ли IP-адрес, можно воспользоваться последними версиями Fail2ban.
# fail2ban-client banned 43.131.9.186
[['recidive']]
Команда показывает список тюрем, где данный IP-адрес в настоящее время запрещен.
В более старых версиях Fail2ban этой команды нет. Тестирование каждой тюрьмы по отдельности можно выполнить следующим образом:
# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232
Если в выводе указан IP-адрес, значит, он был в списке запрещенных IP-адресов. Команда tr предназначена для того, чтобы разбить список запрещенных IP-номеров (это одна длинная строка) на один IP-адрес в каждой строке.
Чтобы узнать, что происходит с конкретным IP-адресом, посмотрите его в файлеfail2ban.log:
root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80
2024-03-06 09:00:40,295 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE [sshd] Unban
Подробный дамп конфигурации Fail2ban показывает настройки для проверки:
# fail2ban-client -vvv -d
Внесение в белый список собственных IP-адресов
Возможно, ваши собственные хосты будут забанены, или вы хотите быть уверены, что некоторые иностранные хосты никогда не будут забанены, даже если они ведут себя плохо. Эти IP-номера могут быть занесены в белый список. По умолчанию ничего не занесено в белый список, вы можете проверить это с помощью:
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~
Параметр ignoreip можно установить в каждом разделе тюрьмы, но этот параметр должен влиять на все тюрьмы, поэтому лучше установить его в разделе DEFAULT. Возможно, лучше всего настроить игнорирование внутренней подсети, чтобы все ваши собственные хосты избегали банов. Это из начала Jail.local:
[DEFAULT]
ignoreip = 92.237.123.96/27
Раздел «По умолчанию» может иметь другие настройки, которые влияют на все джейлы. Например, туда можно было бы добавить findtime=10h.
Запрет вручную
Чтобы проверить, что происходит при бане, установите бан вручную. Сначала проверьте себя в тюрьме с коротким временем бана, чтобы в конечном итоге вы могли вернуться, если по ошибке забаните себя. Например
# fail2ban-client set sshd banip 8.8.4.4</>
Если какой-то IP-адрес ведет себя плохо, но вы не можете заставить fail2ban обнаружить его и забанить, установка ручного бана в рецидивной тюрьме избавит вас от этого IP-адреса на неделю.
# fail2ban-client set recidive banip 8.8.4.4
Запрет подсети работает с использованием нотации CIDR:
fail2ban-client set recidive banip 5.188.87.0/24
Разблокировка вручную
Снять бан возможно, но учтите, что если плохое поведение продолжится, IP снова будет забанен. Поэтому вам следует выяснить, что происходит (например, прочитав журналы) и исправить плохое поведение.
# fail2ban-client set recidive unbanip 8.8.4.4
ИП могут запретить в нескольких тюрьмах. Чтобы разбанить IP во всех тюрьмах, используйте
# fail2ban-client unban 8.8.4.4
Однако мне редко приходится это делать. У меня есть 10-минутный бан, за исключением рецидивной тюрьмы, которая длится 1 неделю, поэтому я отвязываюсь только от рецидивной тюрьмы, срок действия других тюрем уже истек. Если вы не используете рецидивную тюрьму, IP может быть заблокирован в нескольких тюрьмах одновременно, так что это полезно.
Чтобы разбанить все IP-адреса во всех тюрьмах, сделайте
fail2ban-client unban --all
Заключение
Fail2ban усложняет подбор паролей, но не полностью предотвращает попытки взломщиков получить доступ к хосту. Для SSH принудительное использование ключей SSH обеспечивает большую защиту, предотвращая вход в систему с паролем. Для других служб многофакторная аутентификация предотвращает вход в систему, если известен только пароль.