Разное

Failtoban: Лучше, быстрее, надежнее / Хабр

03.02.2023

Содержание

Лучше, быстрее, надежнее / Хабр

Про fail2ban написано уже много, в том числе и на хабре. Эта статья немного о другом — как сделать защиту им еще надежнее и о еще пока неизвестных в широких кругах новых функциях fail2ban. Добавлю сразу — речь пойдет пока про development branch, хотя уже долго проверенный в бою.

Краткое вступление

В большинстве своем fail2ban устанавливается из дистрибутива (как правило это какая-нибудь

стабильная

старая версия) и настраивается по манам из интернета за несколько минут. Затем годами работает, без вмешательства админа. Нередко даже логи, за которыми вроде как следит fail2ban, не просматриваются.
Так вот, сподвигнуть на написание этого поста меня заставил случай, произошедший с одним сервером моего хорошего знакомого. Классика жанра — пришла абуза, за ней вторая и пошло поехало. Хорошо еще злоумышленник попался ленивый — логи не потер, да и повезло еще крупно, что logrotate был настроен, чтобы хранить логи месяцами.



Оказалось все довольно банально, подобрали пароль к его админской почте, который по совместительству был паролем для ssh (естественно без ключа). Не рут, но судоер, со всеми вытекающими. Первый его вопрос был: как подобрали — у меня же fail2ban там. И вот здесь как раз засада: не все представляют себе, что подбором паролей сегодня занимаются уже не отдельные компьютеры, а целые бот-сети, кстати поумневшие донельзя. Так вот по логам выяснили, что тут как раз такой случай: перебирала бот-сеть, причем на практике выяснившая его настройки в fail2ban (maxRetry=5, findTime=600 и banTime=600). Т.е. чтобы избежать бана, сеть делала 4 попытки в течении 10 минут с каждого IP. На минуточку в сети порядка 10 тысяч уникальных IP = что-то более 5 с половиной миллионов паролей в сутки.
Кроме того его почтовик делал большую глупость — а именно паузу до 10 секунд, при логине с неправильным именем. Т.е. выяснить, что некоторые имена, в том числе admin, реально имеются, этой сетке не составило труда. Далее шел целенаправленный перебор только паролей для имеющихся имен.
Подробнее на «ремонте» останавливаться не буду — это история долгая, и вообще тема для отдельной статьи. Скажу только, что все почистили и все разрешилось малой кровью, да и отделался он практически «легким» испугом.

Так вот, мысль написать статью возникла после того, как мне (частично заслужено) было высказано: «Так ты про такое знал и ничего не сказал, не предупредил. Да еще и решение есть и не поделился. Ну и сволочь ты». Короче, посему посту — быть.

Мой fail2ban

К безопасности «своих» серверов я отношусь чрезвычайно серьезно. Кроме того же fail2ban, всегда кастомного донельзя, у меня там и мониторинг и еще куча всего. Меня просто реально бесит, что из-за бестолковой серой массы, позволяющей брать под контроль бот-сетей свое железо, приходится убивать уйму времени на защиту (и постоянное сопровождение и контроль ее в дальнейшем). Кстати, чтобы минимизировать этот контроль, я и участвую активно в разработке и fail2ban, да и других проектов от безопасности.

Так вот, моя последняя расширенная версия [sebres:ban-time-incr], позволяет вывести этот назойливый зоопарк раз и навсегда (ну или пока они снова не приспособятся). Это фишка довольно часто обсуждалась всем коммюнити, но как-то руки не доходили. У меня оно жило в виде отдельных скриптов и каких-то кастомных изменений, пока не оформилось в готовый функционал.

Если коротко, то система, запоминая плохие IP адреса, позволяет каждый раз динамически (экспоненциально) увеличивать время блокировки (banTime) в зависимости от количества предыдущих запретов (banCount). При этом также каждый раз уменьшая количество (maxRetry) возможных провальных попыток (failure) до следующего бана. Наглядно это можно увидеть на следующем примере:

[Click to view LOG]

2014-09-23 20:05:31,146 fail2ban.observer [named-refused] Increase Ban    XXX.XXX.XX.XXX (10 # 5 days, 8:04:55 -> 2014-09-29 04:10:24)
2014-09-23 20:05:31,120 fail2ban.actions  [named-refused] Ban     XXX.
XXX.XX.XXX (_ # 0:15:00 -> 2014-09-23 20:20:29) 2014-09-23 15:30:32,625 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-20 23:24:14,620 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (9 # 2 days, 16:06:18 -> 2014-09-23 15:30:31) 2014-09-20 23:24:14,569 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-20 23:39:13) 2014-09-20 21:10:36,708 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-19 13:03:03,377 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (8 # 1 day, 8:07:34 -> 2014-09-20 21:10:36) 2014-09-19 13:03:03,361 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-19 13:18:02) 2014-09-19 12:38:17,743 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 20:13:23,647 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (7 # 16:24:55 -> 2014-09-19 12:38:17) 2014-09-18 20:13:23,620 fail2ban.actions [named-refused] Ban XXX.
XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 20:28:22) 2014-09-18 20:07:06,053 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 12:03:53,282 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (6 # 8:03:14 -> 2014-09-18 20:07:05) 2014-09-18 12:03:53,266 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 12:18:51) 2014-09-18 11:22:40,704 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 07:11:12,200 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (5 # 4:09:43 -> 2014-09-18 11:20:54) 2014-09-18 07:11:12,160 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 07:26:11) 2014-09-18 06:47:46,618 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 04:37:29,972 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (4 # 2:02:16 -> 2014-09-18 06:39:44) 2014-09-18 04:37:29,967 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 04:52:28) 2014-09-18 04:32:49,491 fail2ban.
actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 02:55:05,706 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (3 # 1:23:31 -> 2014-09-18 04:18:35) 2014-09-18 02:55:05,698 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 03:10:04) 2014-09-18 01:18:37,976 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 00:40:09,592 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (2 # 0:38:30 -> 2014-09-18 01:18:37) 2014-09-18 00:40:09,548 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 00:55:07) 2014-09-17 22:47:05,872 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-17 22:32:05,804 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-17 22:47:05)

Здесь хорошо заметно, как каждый следующий бан продлевает время блокировки от 15 минут (0:15:00) первый раз, до 5 с лишним дней (5 days, 8:04:55) после десятой блокировки. У меня в базе есть IP у которых «срок» уже — от нескольких месяцев до перманентного бана.

Ниже можно увидеть, как новый функционал отразился на решении собственно банить IP XXX.XXX.XX.XXX. В примере параметр maxRetry установлен равным 5. Так мы видим, что пока IP не признан плохим он был первый раз забанен после 5-ти попыток, второй раз, уже как плохой — после 3-х (каждая попытка была засчитана за 2), третий и т.д. — после 2-х (попытка идет за 3) и четвертый раз забанен сразу после первой попытки (считается сразу за 5-ть):

[Click to view LOG]

2014-09-18 04:37:29,155 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 04:37:28, 3 # -> 5, Ban
2014-09-18 04:37:29,148 fail2ban.filter   [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 04:37:28
......
2014-09-18 02:55:04,790 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 02:55:04, 2 # -> 3, Ban
2014-09-18 02:55:04,763 fail2ban.
filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 02:55:04 2014-09-18 02:22:37,683 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 02:22:37, 2 # -> 3 2014-09-18 02:22:37,648 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 02:22:37 ...... 2014-09-18 00:40:08,908 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 00:40:08, 1 # -> 2, Ban 2014-09-18 00:40:08,625 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 00:40:08 2014-09-17 23:48:54,404 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-17 23:48:53, 1 # -> 2 2014-09-17 23:48:54,397 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 23:48:53 2014-09-17 22:49:04,647 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-17 22:49:03, 1 # -> 2 2014-09-17 22:49:04,620 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 22:49:03 ...... 2014-09-17 22:32:05,593 fail2ban.filter [named-refused] Found XXX.
XXX.XX.XXX - 2014-09-17 22:32:05 2014-09-17 22:06:29,952 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 22:06:29 2014-09-17 21:47:43,439 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 21:47:42 2014-09-17 20:43:41,490 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 20:43:40 2014-09-17 16:44:35,130 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 16:44:34

Без этой логики подсчета failure, умные бот-сети научились подстраивать свою работу так, чтобы просто не попадать в бан. Когда я допилил таки и эту логику и выкатил в продакшн, за считанные дни я избавился практически от всей той нечисти, которую привык видеть годами в своих логах. Например, сейчас средний нормальный ежедневный прирост моих auth.log где то в районе 20-50 строк, раньше на некоторых серверах он был в сотни и тысячи раз больше.

Пока что это development branch, лежит pull request-ом, релиз запланирован пока в версии 0. 9.2.
Кому интересно, почитать подробнее про реализацию и историю решения можно здесь — Ban time incr by sebres · Pull Request #716 · fail2ban/fail2ban.

Однако пока эта версия ляжет апдейтом на ваш сервер, пройдет еще немало времени — пока релиз выйдет в mainline, пока его в дистрибутивы возьмут… История длинная, например тот же debian все еще использует 0.8.x — собственно поэтому и статья. Так что качаем руками, устанавливаем… профит.

Взять эту версию можно здесь fail2ban-ban-time-incr.zip (sebres master branch).
Порт для debian-ов: ban-time-incr-debian.zip (merged master debian branch, и хоть и не main line — буду стараться по возможности поддерживать ветку актуальной).

Установить его довольно просто. Если у вас уже до того был fail2ban, установленный из дистрибутива, сохраняем из «/etc/fail2ban/» старые «fail2ban.local» и «jail.local» (Ну и лучше старые «fail2ban.conf» и «jail.conf»). Я бы на всякий случай (из-за возможных личных изменениях в filter и action) сохранил бы куда-нибудь весь каталог «/etc/fail2ban/».

Далее сносим старый дистрибутивный fail2ban, например:

sudo service fail2ban stop
sudo apt-get remove fail2ban

Собственно установка:

cd /tmp
unzip ~/downloads/fail2ban-ban-time-incr.zip
cd fail2ban-ban-time-incr/
sudo python setup.py install

[UPD] Иногда на некоторых дистрибутивах, при ручной установке, почему-то не устанавливается сервис (например нет файла /etc/init.d/fail2ban) — и соответственно через сервис не (авто)стартует, только через fail2ban-client start.

[Что делать…]

Это можно поправить копированием из дистрибутива или например из архива (потом не забываем поправить права):

cd /tmp/fail2ban-ban-time-incr-debian
sudo cp /etc/init.d/fail2ban ~/init.fail2ban.org
sudo cp ./files/debian-initd /etc/init.d/fail2ban
chmod u+x,g+x,o+x /etc/init.d/fail2ban

И проверить внутри путь к fail2ban-client (which fail2ban-client):
— при /usr/local/bin/fail2ban-clientDAEMON=/usr/local/bin/$NAME-client
— при /usr/bin/fail2ban-clientDAEMON=/usr/bin/$NAME-client
Не забываем проверить автозапуск сервиса (update-rc. d, rcconf, file-rc… любимое подставить).

[/UPD]

Теперь чтобы заработал новый функционал, нужно в вашем jail.local в [default] (либо для каждой конкретной jail) добавить опцию: bantime.increment = true. Пример и описание можно пока найти в «jail.conf».
Некоторое здесь кратко:

  • bantime.rndtime — максимальное время, используется для добавления к banTime случайного времени, для предотвращения «умных» бот-сетей вычислять точное время, когда IP разблокируется снова. Пример bantime.rndtime = 10m
  • bantime.factor — коэффициент для вычисления экспоненты роста для формулы bantime.formula или множителей bantime.multipliers, по умолчанию значение коэффициента 1, что соответствует увеличению времени запрета на 1, 2, 4, 8, 16… Увеличивая этот параметр для некоторых jail, можно увеличивать время блокировки более агрессивно.
  • bantime. formula — используется по умолчанию для вычисления следующего значения времени запрета, значение по умолчанию: bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
    Тот же рост времени запрета будет достигнут используя множители bantime.multipliers равные 1, 2, 4, 8, 16, 32…
    Пример более агрессивной формулы для фактора «1» и имеет те же значения роста только для фактора равного «2.0 / 2.885385″:
    bantime.formula = ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)
  • bantime.multipliers — параметр может используется вместо формулы дискретно для вычисления следующего значения времени запрета. Значение множителя равное «-1» (может стоять только в конце списка) и заносит адрес в перманентный бан (до ручного разблокирования).
    Пример 1: bantime.multipliers = 1 2 4 8 16 32 64 — увеличивает время запрета на 1, 2, 4,… и если последний ban count был больше последнего индекса мультипликаторов, то будет всегда использован последний множитель (64 в примере), что при факторе равном «1» и оригинальном времени запрета (10 минут) — соответствует 10. 6 часам.
    Пример 2: bantime.multipliers = 1 5 30 60 300 720 1440 2880 — может использоваться для небольшого начального времени запрета (bantime = 60) — т.к. увеличение становится более агрессивным, имеем bantime равный: 1 мин, 5 мин, 30 мин, 1 час, 5 часов, 12 часов, 1 день, 2 дня соответственно.

Если во время проб или в продакшн какой-нибудь (хороший) IP случайно многократно улетел в бан (и стал соответственно плохим) он забудется (снова станет «белым») сам по истечении трехкратного времени последнего бана и dbpurgeage (находится в fail2ban.local), либо если с него руками снять бан, используя:

fail2ban-client set $JAIL unbanip $IP

Я для тестирования регулярок использую fail2ban-regex, а для теста работоспособности что-нибудь типа:

logger -t 'test:auth' -i -p auth.info "pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser=admin rhost=1. 2.3.4"

Не забываем про старт:

sudo service fail2ban start

Вот собственно и все, теперь надеюсь ваш сервер стал еще чуточку защищенней. Ну а вы не ленитесь и поглядывайте все-таки в логи (доверяй, но проверяй).

P.S. Стандартная приписка: Fail2Ban is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. Короче говоря — пользуйтесь на здоровье, но на свой страх и риск…
И да пребудут ваши сервера в безопасности.

P.P.S. Да чуть не забыл, у меня тут назапланировано что-то допилить, что-то уже готово, нужно просто оформить нормально и выложить, так вот — опрос «Что по вашему следовало бы (до)делать в первую очередь».

Настройка Fail2Ban в Linux для защиты SSH, Apache, MySQL, Exim

Fail2ban позволяет блокировать доступ к серверу или запущенным службам на основе анализа логов доступа и подключений. Fail2Ban автоматически может создавать правила файервола для блокировки конкретных IP адресов, если действия с этого IP определяются как подозрительные. Так, Fail2Ban может защитить ваш сервер от перебора паролей по SSH, DDoS атак, попыток эксплуатации эксплоитов, выполнении запрещенных действий.

Любой сервис сервера, порты которого открыты во внешний мир, потенциально уязвим. Порты некоторых сервисов можно закрыть, но так можно поступить не со всеми. Например, если вы хотите, чтобы у вас полноценно работала почтовая SMTP служба, вы не можете отключить ее или заблокировать порт на firewall и время от времени в логах можно наблюдать записи о попытке подбора пароля к учетной записи. Так происходит и с другими сервисами.

Обычно на всех своих серверах, я закрываю SSH доступа с наружи, т.к. подключаюсь к своим серверам со своего статического IP-адреса или через OpenVPN подключение. Но это не всегда возможно. На помощь приходит замена стандартных портов, либо настройка на сервере службы fail2ban. В этом примере мы покажем, как установить и использовать fail2ban в CentOS, однако вы можете использовать эту инструкцию и для других дистрибутивов Linux.

Содержание:

  • Установка и первичная настройка Fail2Ban в CentOS 8/7
  • Использование Fail2Ban для защиты SSH от перебора паролей
  • Логи Fail2Ban
  • Защита Apache с помощью Fail2Ban
  • Настройка связки Fail2Ban и Nginx
  • Защита MySQL с помощью Fail2Ban
  • Правила Fail2Ban для Exim
  • Белый список IP в Fail2Ban, разблокировка IP-адресов

Установка и первичная настройка Fail2Ban в CentOS 8/7

Пакет для установки fail2ban находится в репозитории Epel, подключим его:

# yum install epel-release -y

После подключения репозитория, можно установить fail2ban через yum или dnf (в CentOS 8):

# yum install fail2ban -y

Как и любой другой сервис, fail2ban нужно добавить в автозагрузку, чтобы он автоматически запускался при рестарте системы:

[root@server ~]# systemctl enable fail2ban

Created symlink /etc/systemd/system/multi-user. target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.

Служба fail2ban хранит файлы конфигурации в директории /etc/fail2ban. Главный файл конфигурации — /etc/fail2ban/jail.conf. Так как данный файл может быть перезаписан при обновлении сервиса, для работы нужно создать файл jail.local. Также файлы в директории /etc/fail2ban/jail.d/ могут использоваться для переопределения настроек в выше указанных файлах. Файлы применяются в следующем порядке:

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

Использование Fail2Ban для защиты SSH от перебора паролей

Создадим файл и внесем настройки:

# nano /etc/fail2ban/jail.local

И добавим в него содержимое:

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail. d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true

Данная конфигурация устанавливает новое время для блокировки IP адресовм для всех служб, устанавливает использование iptables для блокировок и включается защиту для sshd.

Чтобы использовать для фильтрации firewalld, укажите:

banaction = firewallcmd-ipset

После изменения настроек перезапустите сервис:

# systemctl restart fail2ban

Чтобы посмотреть статус fail2ban, и проверить список защищаемых службы, выполните команду:

[root@server ~]# fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd

Вы можете запросить текущий статус блокировок fail2ban для конкретной службы:

# fail2ban-client status sshd

В файле jail.conf можно описать общие параметры, которые не будут переопределяться в jail.local.

Разблокируйте строку:

ignoreip = 127. 0.0.1/8

Измените следующие значения:
bantime = 10m — время на которое будет заблокирован IP
findtime = 10m — время, в течение которого будут подсчитываться неудачные попытки авторизации.
maxretry = 3 — количество попыток до блокировки

Чтобы получать оповещения по электронной почте, вам нужно настроить следующие параметры:
destemail = [email protected] –получатель
sender = [email protected] — отправитель
mta = postfix — SMTP служба, через которую осуществляется отправка

Чтобы настроить блокировку для отдельных сервисов, в файле /etc/fail2ban/jail.local после блока [DEFAULT] создается блок для нужного сервиса, например, как с sshd. Добавим в него некоторые настройки:

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s

Мы указали какой порт блокировать и куда писать логи блокировки. Обратите внимание на директорию /etc/fail2ban/filter. d, там описываются фильтры с помощью которых будут анализироваться записи в журнале и проверять, указывает ли та или иная запись на неудачную аутентификацию. Если вывести список файлов в каталоге, можно обнаружить правила fail2ban для большинство популярных сервисов:
# ls /etc/fail2ban/filter.d

Файлы очень подробно описаны и можно изучить нужный вам, чтобы понимать, как происходят проверки журнала.

Логи Fail2Ban

Чтобы проверить журнал fail2ban, выполните команду:

# journalctl -b -u fail2ban

Так же можно проверить логи в реальном времени:

# tail -F /var/log/fail2ban.log

Вывод из лога:

2019-12-05 12:13:26,914 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 222.186.180.17
2019-12-05 12:13:26,930 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 222.186.180.223
2019-12-05 12:13:26,944 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 36.72.82.10
2019-12-05 12:13:26,958 fail2ban. actions [9750]: NOTICE [sshd] Restore Ban 40.117.135.57
2019-12-05 12:13:26,973 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 45.55.155.224
2019-12-05 12:13:26,988 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 67.205.135.127
2019-12-05 12:13:27,003 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 83.171.107.216
2019-12-05 12:13:43,362 fail2ban.filter [9750]: INFO [sshd] Found 183.87.134.98 - 2019-12-05 12:13:42
2019-12-05 12:13:45,571 fail2ban.filter [9750]: INFO [sshd] Found 183.87.134.98 - 2019-12-05 12:13:45
2019-12-05 12:15:46,109 fail2ban.filter [9750]: INFO [sshd] Found 112.64.170.178 - 2019-12-05 12:15:45
2019-12-05 12:17:05,317 fail2ban.actions [9750]: NOTICE [sshd] Unban 222.186.175.216

Как видите, fail2ban работает и периодически блокирует или убирает блокировку для IP адресов.

Чтобы проверить, какие IP адреса заблокированы в iptables службой fail2ban, выполните:

# iptables -L

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

Защита Apache с помощью Fail2Ban

Если вы хотите настроить fail2ban для вашего apache (httpd), добавьте следующие настройки в jail.local:

# выявляем неудачные попытки ввода пароля
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/httpd/error_log
maxretry = 3
# блокирует IP, которые напрямую обращаются к скриптам с расширением php, asp, exe, pl, cgi, scgi
[apache-noscript]
enabled = true
port= http,https
filter = apache-noscript
logpath = /var/log/httpd/error_log
maxretry = 3
# выявляем попытки переполнения Апача
[apache-overflows]
enabled = true
port= http,https
filter = apache-overflows
logpath = /var/log/httpd/error_log
maxretry = 2
# выявляем неудачные попытки поиска в домашней директории на сервере
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/httpd/*error_log
maxretry = 2

После изменения конфигурационного файла, выполняем рестарт сервиса и проверяем статус:

[root@server ~]# fail2ban-client status apache

Status for the jail: apache
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/httpd/error_log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

Для теста, я установил на сервер Joomla, после чего пытался открыть несуществующий файл и fail2ban меня заблокировал:

[root@server httpd]# fail2ban-client status apache-noscript

Status for the jail: apache-noscript
|- Filter
| |- Currently failed: 1
| |- Total failed: 6
| `- File list: /var/log/httpd/error_log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: *. *.*.*

Настройка связки Fail2Ban и Nginx

Если веб-сервером у вас выступает nginx и на сайте есть разделы требующие авторизации, у вас так же могут быть проблемы с попытками перебора паролей. Для fail2ban мы можем указать использовать файл nginx-http-auth.conf, По умолчанию он уже описан в конфигурационном файле /etc/fail2ban/jail.conf:

[root@server ~]# cat /etc/fail2ban/jail.conf | grep nginx

[nginx-http-auth]
logpath = %(nginx_error_log)s
# To use 'nginx-limit-req' jail you should have `ngx_http_limit_req_module`
# and define `limit_req` and `limit_req_zone` as described in nginx documentation
# http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
# or for example see in 'config/filter.d/nginx-limit-req.conf'
[nginx-limit-req]
logpath = %(nginx_error_log)s
[nginx-botsearch]
logpath = %(nginx_error_log)s
logpath = %(nginx_access_log)s

Нам нужно ли включить его в конфигурационном файле /etc/fail2ban/jail. local добавив:

[nginx-http-auth]
enabled = true

После все проведенных настроек, не забываем выполнять перезагрузку сервиса:

# systemctl restart fail2ban

Защита MySQL с помощью Fail2Ban

Для защиты MySQL нужно добавить отдельный блок в конфигурационный файл jail.local:

[mysqld-auth]
enabled = true
filter = mysqld-auth
port = 3306
logpath = /var/log/mysql/error.log

Данная настройка защитит вас от перебора паролей для пользователя mysql (это очень частый брутфорс).

Правила Fail2Ban для Exim

Чтобы настроить защиту для почтового сервиса exim, внесите следующую конфигурацию:

[exim]
enabled = true
filter = exim
action = iptables-multiport[name=exim,port="25,465,587"]
logpath = /var/log/exim/mainlog

Таким образом вы можете настроить fail2ban для работы практически со всеми популярными сервисами и ваш сервер станет максимально безопасен.

Белый список IP в Fail2Ban, разблокировка IP-адресов

Чтобы разблокировать IP, который попал в блокировку fail2ban, используйте команду:

# fail2ban-client set SECTION unbanip IP — где SECTION название секции в конфигурационном файле, по правилам которого был заблокирован ваш IP адрес. Например:

# fail2ban-client set apache-noscript unbanip 185.*.*.*

Вы можете добавить определенные IP адреса в исключения fail2ban (белый список). Для этого в конфигурационном файле jail.conf внесите IP в строку:

ignoreip =185.*.*.*

Добавив свой IP-адрес в исключения, я выполнил несколько атак подобно предыдущей и блокировки не произошло.

Как вы видите, fai2ban довольно просто в настройке, но вполне эффективное средство дополнительной защиты вашего сервера от злоумышленников. Для Windows к сожалению, я не видел бесплатных программ с подобным функционалом (можно попробовать реализовать блокировку IP адресов с помощью PowerShell – см. статью Защита RDP от перебора паролей).

Fail2ban — ArchWiki

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

Предупреждение: Использование программного обеспечения для блокировки IP-адресов остановит тривиальные атаки, но оно зависит от дополнительного демона и успешного ведения журнала. Кроме того, если злоумышленник знает ваш IP-адрес, он может отправлять пакеты с поддельным заголовком источника и заблокировать ваш IP-адрес. Обязательно укажите свой IP в игнорировать .

Содержимое

  • 1 Установка
  • 2 Использование
    • 2. 1 клиент fail2ban
  • 3 Конфигурация
    • 3.1 Включение джейлов
    • 3.2 Получение оповещения по электронной почте
    • 3.3 Брандмауэр и службы
  • 4 Советы и рекомендации
    • 4.1 Пользовательская тюрьма SSH
    • 4.2 Серверная часть Systemd: фильтрация журналов
    • 4.3 Сервисное упрочнение
  • 5 См. также

Установка

Установка fail2ban.

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

Настройка Fail2ban и включение/запуск fail2ban.service .

fail2ban-client

Fail2ban-client позволяет отслеживать джейлы (перезагрузка, перезагрузка, статус и т. д.), просматривать все доступные команды:

 $ клиент fail2ban
 

Для просмотра всех включенных джейлов:

 # статус клиента fail2ban
 

Для проверки состояния тюрьмы, например. на сшд :

 # fail2ban-client status sshd 
 Статус для джейла: sshd
|- Фильтр
| |- В настоящее время не удалось: 1
| |- Всего неудачно: 9
| `- Журнал соответствует: _SYSTEMD_UNIT=sshd. service + _COMM=sshd
`- Действия
   |- В настоящее время забанено: 1
   |- Всего забанено: 1
   `- Список запрещенных IP-адресов: 0.0.0.0
 

Для компактной версии для всех джейлов, включая забаненные айпи:

 # fail2ban-client забанен 
 [{'sshd': ['192.168.100.50']}, {'apache-auth': []}]
 

Конфигурация

Эта статья или раздел нуждается в дополнении.

Причина: Добавить примечание о dbpurgeage , см. [1]. (Обсудить в Talk:Fail2ban)

Из-за возможности создания файлов Pacnew и Pacsave для /etc/fail2ban/jail.conf во время обновления, jail.conf(5) §ФОРМАТ ФАЙЛОВ КОНФИГУРАЦИИ рекомендует пользователям создать /etc/fail2ban/jail.local для «упрощения обновлений».

Например, чтобы изменить время бана по умолчанию на 1 день:

 /etc/fail2ban/jail.local 
 [ПО УМОЛЧАНИЮ]
bantime = 1d 

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

Перезагрузите fail2ban.service , чтобы применить изменения конфигурации.

Включение джейлов

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

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

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

Получение оповещения по электронной почте

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

 /etc/fail2ban/jail.local 
 [ПО УМОЛЧАНИЮ]
destemail = ваше имя@example.com
отправитель = ваше имя@example.com
# чтобы забанить и отправить электронное письмо с отчетом whois на destemail.
действие = %(action_mw)s
# то же, что и action_mw, но также отправляет соответствующие строки журнала
#action = %(action_mwl)s 

Брандмауэр и службы

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

 /etc/fail2ban/jail.local 
 [ПО УМОЛЧАНИЮ]
запрет = nftables
banaction_allports = nftables[type=allports] 

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

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

Пользовательская тюрьма SSH

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

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

 /etc/fail2ban/jail.d/sshd.local 
 [sshd]
включено = верно
фильтр = sshd
запрет = iptables
серверная часть = системный
максимальная попытка = 5
время нахождения = 1д
бантайм = 2 нед
ignoreip = 127. 0.0.1/8 

Примечание:

  • Может потребоваться установить LogLevel VERBOSE в /etc/ssh/sshd_config , чтобы разрешить полный мониторинг fail2ban, так как в противном случае ошибочные пароли могут регистрироваться неправильно.
  • Fail2ban поддерживает IPv6, начиная с версии 0.10. Соответственно настройте свой брандмауэр, например. запустить/включить ip6tables.service .
  • При использовании пространств имен журналов (добавляя LogNamespace= something в юнит-файл), вы можете заставить fail2ban читать эти журналы, установив backend следующим образом: backend = systemd[journalfiles="/var/log/journal /*. something /system.journal"] .

Совет:

  • При использовании интерфейсов iptables, таких как ufw, можно использовать banaction = ufw вместо использования iptables.
  • При использовании Shorewall можно использовать banaction = Shorewall , а также установить BLACKLIST на ALL в /etc/shorewall/shorewall.conf , в противном случае правило, добавленное для запрета IP-адреса, будет влиять только на новые подключения.

Серверная часть Systemd: фильтрация журналов 9.*DROP_.*SRC=

<АДРЕС> DST=.*$ journalmatch = _TRANSPORT=kernel

См. также systemd.journal-fields(7).

Повышение безопасности службы

В настоящее время Fail2ban необходимо запускать как root . Поэтому вы можете рассмотреть возможность усиления процесса с помощью systemd.

Создайте вставной файл конфигурации для fail2ban.service :

 /etc/systemd/system/fail2ban.service.d/override.conf 
 [Служба]
Приватные устройства=да
PrivateTmp=да
ProtectHome=только для чтения
ProtectSystem=строгий
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 

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

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

Создайте /etc/fail2ban/fail2ban.local с правильным путем logtarget :

 /etc/fail2ban/fail2ban.local 
 [Определение]
logtarget = /var/log/fail2ban/fail2ban.log
 

Создайте каталог /var/log/fail2ban/ как root.

Наконец, перезагрузите демон systemd, чтобы применить изменения устройства, и перезапустите fail2ban. service .

См. также

  • Использование Fail2Ban Jail для добавления пользователя в белый список
  • Оптимизация фильтров Fail2Ban
  • Fail2Ban и sendmail
  • Fail2Ban и iptables
  • Fail2Ban 0.8.3 Howto
  • Мониторинг журнала fail2ban

Безопасность Linux: Защитите свои системы с помощью fail2ban

Опубликовано: 4 июня 2020 г. | | на Кен Хесс (выпускники Sudoer, Red Hat)

Изображение

Фото  Flickr  из  Pexels

Безопасность для системных администраторов — это постоянная борьба, потому что вы должны защищать свои системы в достаточной степени, чтобы защитить их от нежелательных атак, но не настолько, чтобы это мешало производительности пользователей. Трудно поддерживать баланс. Всегда есть жалобы на «слишком высокую» безопасность, но когда система скомпрометирована, жалобы варьируются от «Недостаточно безопасности» до «Почему вы не использовали более эффективные меры безопасности?» Это настоящая борьба. Существуют элементы управления, которые вы можете внедрить, которые одновременно эффективны против атак злоумышленников и в то же время достаточно незаметны, чтобы пользователи могли работать в целом беспрепятственно. Fail2ban — это решение для защиты сервисов от грубой силы и других автоматизированных атак.

Примечание. Fail2ban можно использовать только для защиты служб, требующих аутентификации по имени пользователя и паролю. Например, вы не можете защитить ping с помощью fail2ban.

В этой статье я демонстрирую, как защитить демон SSH (SSHD) от атаки грубой силы. Вы можете настроить фильтры, как их называет fail2ban , чтобы защитить почти все службы прослушивания в вашей системе.

Установка и первоначальная настройка

К счастью, есть готовый к установке пакет для fail2ban , который включает все зависимости, если таковые имеются, для вашей системы.

 $ sudo dnf -y install fail2ban 

Включить и запустить fail2ban .

 $ sudo systemctl включить fail2ban
$ sudo systemctl start fail2ban 

Если у вас нет проблем с синтаксисом в вашей конфигурации fail2ban , вы не увидите никаких стандартных выходных сообщений.

Теперь нужно настроить несколько основных вещей в fail2ban , чтобы защитить систему, не мешая самой себе. Скопируйте /etc/fail2ban/jail.conf файл в /etc/fail2ban/jail.local . Нас интересует файл конфигурации jail.local .

 $ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 

Откройте /etc/fail2van/jail.local в вашем любимом редакторе и внесите следующие изменения или проверьте эти несколько заданы параметры. Ищите настройку ignoreip и добавляйте в эту строку все IP-адреса, которые должны иметь доступ без возможности блокировки. По умолчанию вы должны добавить петлевой адрес и все IP-адреса, локальные для защищаемой системы.

 ignoreip = 127. 0.0.1/8 192.168.1.10 192.168.1.20 

Вы также можете добавить целые сети IP-адресов, но это отнимет большую часть защиты, для которой вы хотите использовать fail2ban . Держите его простым и локальным на данный момент. Сохраните файл jail.local и перезапустите службу fail2ban .

 $ sudo systemctl restart fail2ban 

Вы должны перезапускать fail2ban каждый раз, когда вносите изменения в конфигурацию.

Настройка отфильтрованного сервиса

Новая установка fail2ban на самом деле мало что вам даст. Вы должны настроить так называемые фильтры для любого сервиса, который хотите защитить. Почти каждая система Linux должна быть доступна по SSH. Есть некоторые обстоятельства, когда вы наверняка остановите и отключите SSHD, чтобы лучше защитить свою систему, но я предполагаю, что каждая система Linux разрешает подключения SSH.

Пароли, как всем известно, не являются хорошим решением для обеспечения безопасности. Однако часто это стандарт, по которому мы живем. Итак, если пользовательский или административный доступ ограничен SSH, вам следует принять меры для его защиты. Использование fail2ban «смотреть» SSHD на наличие неудачных попыток доступа с последующим баном — хорошее начало.

Примечание. Перед внедрением любого элемента управления безопасностью, который может препятствовать доступу пользователя к системе, сообщите пользователям, что этот новый элемент управления может заблокировать их доступ к системе на десять минут (или на то время, которое вы решите), если их неудачные попытки входа в систему превысят пороговое значение. параметр.

Для настройки фильтруемых служб необходимо создать соответствующий файл «джейл» под /etc/fail2ban/jail.d каталог. Для SSHD создайте новый файл с именем sshd.local и введите в него инструкции по фильтрации сервисов.

 [ссд]
включено = верно
порт = ssh
действие = iptables-мультипорт
путь к журналу = /var/журнал/безопасный
максимальная попытка = 3
bantime = 600 

Создайте заголовок [sshd] и введите настройку, которую вы видите выше, в качестве отправной точки. Большинство настроек говорят сами за себя. Для двух, которые могут быть интуитивно неочевидны, настройка «действие» описывает действие, которое вы хотите fail2ban принять в случае нарушения. Для нас fail2ban использует iptables для блокировки IP-адреса системы-нарушителя на «бантайм» 600 секунд (10 минут).

Конечно, вы можете изменить любой из этих параметров в соответствии с вашими потребностями. Десяти минут кажется достаточно, чтобы бот или скрипт «перешли» на менее безопасные хосты. Однако десять минут — это не так много, чтобы оттолкнуть пользователей, которые ошиблись при вводе пароля более трех раз.

Если вы удовлетворены настройками, перезапустите служба fail2ban .

Как выглядит блокировка

В защищенной системе (192.168.1.83), tail /var/log/fail2ban.log для просмотра текущих действий по бану.

 2020-05-15 09:12:06,722 fail2ban.filter [25417]: INFO [sshd] Found 192. 168.1.69 - 2020-05-15 09:12:06
2020-05-15 09:12:07,018 fail2ban.filter [25417]: INFO [sshd] Found 192.168.1.69 - 2020-05-15 09:12:07
2020-05-15 09:12:07,286 fail2ban.actions [25417]: УВЕДОМЛЕНИЕ [sshd] Бан 192.168.1.69
2020-05-15 09:22:08,931 fail2ban.actions [25417]: NOTICE [sshd] Unban 192.168.1.69 

Вы можете видеть, что IP-адрес 192.168.1.69 был заблокирован в 09:12 и разблокирован через десять минут в 09 :22.

В удаленной системе 192.168.1.69 действие запрета выглядит следующим образом:

 $ ssh 192.168.1.83
Пароль [email protected]:
Разрешение отклонено, попробуйте еще раз.
Пароль [email protected]:
Разрешение отклонено, попробуйте еще раз.
Пароль [email protected]:
Разрешение отклонено (публичный ключ, gssapi-keyex, gssapi-with-mic, пароль).
$ сш 192.168.1.83
ssh: подключиться к хосту 192.168.1.83, порт 22: в соединении отказано 

Вы можете видеть, что я трижды неправильно ввел свой пароль, прежде чем меня забанили. Запрещенный пользователь, если он явно не проинформирован, не будет знать, почему он больше не может получить доступ к целевой системе. Фильтр fail2ban выполняет действие скрытого бана. Он не дает никаких объяснений удаленному пользователю, а также не уведомляет пользователя о снятии запрета.

Снятие бана с системы

Неизбежно случится так, что будет забанена система, которую необходимо быстро разбанить. Другими словами, вы не можете или не хотите ждать окончания срока бана. Следующая команда немедленно разбанит систему.

 $ sudo fail2ban-client set sshd unbanip 192.168.1.69 

После выполнения этой команды вам не нужно перезапускать демон fail2ban.

Подведение итогов

Вот как работает fail2ban . Вы настраиваете фильтр, и при выполнении условий удаленная система банится. Вы можете запретить на более длительный период времени, и вы можете настроить несколько фильтров для защиты вашей системы. Помните, что fail2ban является единым решением и не защищает вашу систему от других уязвимостей. Многоуровневый, многогранный подход к безопасности — это стратегия, которой вы хотите следовать.

Добавить комментарий

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