Fail2ban (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Fail2ban. Дата последней синхронизации: 20 декабря 2020. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Fail2ban (англ.) сканирует лог-файлы (например, /var/log/httpd/error_log) и блокирует IP-адреса, которые ведут себя подозрительно, к примеру, делая слишком много попыток входа с неверным паролем в попытках найти уязвимости и т.п. Обычно Fail2ban используется для обновления правил с целью блокировки IP-адресов на определённое время, но можно настроить и другие действия — например, отправку письма по электронной почте.

Важно: Использование блокировки по IP защитит только от простейших атак, но для работы потребуется дополнительный демон и правильно настроенное журналирование. К тому же злоумышленники, знающие ваш IP-адрес, могут послать пакеты с подменёнными заголовками отправителя и лишить вас доступа к серверу. Не забудьте прописать собственные IP-адреса в ignoreip.

Установка

Установите пакет fail2ban.

Использование

Настройте Fail2ban, после чего включите и запустите службу fail2ban.service.

fail2ban-client

Утилита fail2ban-client позволяет следить за "клетками" (jails) (reload, restart, status и т.д.). Чтобы увидеть список всех доступных команд, введите:

$ fail2ban-client

Просмотр включённых "клеток" (jails):

# fail2ban-client status

Проверка статуса "клетки" на примере таковой для sshd:

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     9
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   0.0.0.0

Настройка

Рекомендуется создать файл /etc/fail2ban/jail.local, так как /etc/fail2ban/jail.conf может быть перезаписан во время обновления системы. К примеру, задать время блокировки в 1 день можно следующим образом:

/etc/fail2ban/jail.local
[DEFAULT]
bantime = 1d

Также можно создавать отдельные файлы name.local в каталоге /etc/fail2ban/jail.d, например, /etc/fail2ban/jail.d/sshd.local.

Перезапустите службу fail2ban.service для применения изменений.

Включение "клеток"

По умолчанию все "клетки" отключены. Добавьте строку enabled = true к конфигурации той "клетки", которую необходимо включить. Например, включение "клетки" OpenSSH выглядит следующим образом:

/etc/fail2ban/jail.local
[sshd]
enabled = true

См. #Пользовательская "клетка" SSH.

Почтовые уведомления

Для получения электронных писем при блокировке IP-адресов следует настроить SMTP-клиент (например, msmtp (англ.)) и изменить действие по умолчанию:

/etc/fail2ban/jail.local
[DEFAULT]
destemail = вашеимя@example.com
sender = вашеимя@example.com

# для блокировки и отправки электронного письма на destemail с whois-отчётом
action = %(action_mw)s

# то же, что и action_mw, но включает в себя ещё и связанные строки из лога
#action = %(action_mwl)s

Межсетевой экран и службы

По умолчанию Fail2ban использует iptables. Однако, настройка большинства и служб не представляет трудности. Пример использования nftables:

/etc/fail2ban/jail.local
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]

См. содержимое директории /etc/fail2ban/action.d/ для получения других примеров, например, ufw.conf.

Советы и рекомендации

Пользовательская "клетка" SSH

Важно: Зная ваш IP-адрес, злоумышленник может послать пакеты с подменёнными заголовками отправителя, тем самым лишив вас доступа к серверу. Ключи SSH предоставляют отличное решение проблемы брутфорса без подобных последствий.

Отредактируйте файл /etc/fail2ban/jail.d/sshd.local, добавив эту секцию и обновив список доверенных IP-адресов в ignoreip:

/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8
Примечание:
  • Может понадобиться задать LogLevel VERBOSE в файле /etc/ssh/sshd_config, чтобы разрешить Fail2ban полноценный мониторинг. В противном случае, ошибки ввода пароля могут быть неправильно зарегистрированы.
  • Fail2ban поддерживает IPv6 с версии 0.10. Настройте межсетевой экран соответственно, например, запустите и включите службу ip6tables.service.
  • Fail2ban поддерживает работу с пространствами имён журнала (которые задаются с помощью LogNamespace=ваше_пространство_имён в файлах юнитов). Задайте параметру backend, к примеру, значение backend = systemd[journalfiles="/var/log/journal/*.ваше_пространство_имён/system.journal"], чтобы активировать эту возможность.
Совет:
  • При использовании фронтендов iptables, например, ufw (англ.), можно использовать banaction = ufw вместо iptables.
  • При использовании Shorewall (англ.) можно прописать banaction = shorewall и также задать значение ALL параметру BLACKLIST в файле /etc/shorewall/shorewall.conf. В противном случае, правила, добавленные для блокировки IP-адреса, будут влиять только на новые соединения.

Защита службы

Поскольку Fail2ban следует запускать от имени суперпользователя, можно дополнительно защитить службу с помощью systemd.

Создайте конфигурационный drop-in файл для службы fail2ban.service:

/etc/systemd/system/fail2ban.service.d/override.conf
[Service]
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

Параметр CAP_DAC_READ_SEARCH (в строке CapabilityBoundingSet) позволяет Fail2ban читать любые файлы и каталоги, а CAP_NET_ADMIN и CAP_NET_RAW позволяют Fail2ban управлять любым межсетевым экраном c командной оболочкой. См. capabilities(7) для получения более подробной информации.

При использовании параметра ProtectSystem=strict иерархия файловой системы будет доступна только для чтения, а ReadWritePaths позволит Fail2ban также вести запись в заданные каталоги.

От имени суперпользователя создайте каталог /var/log/fail2ban/ и пропишите в файл /etc/fail2ban/fail2ban.local корректный путь logtarget:

/etc/fail2ban/fail2ban.local
[Definition]
logtarget = /var/log/fail2ban/fail2ban.log

Для применения изменений в файлах юнитов перезагрузите демон systemd и перезапустите службу fail2ban.service.

Смотрите также