Fail2ban

Thank you for reading this post, don't forget to subscribe!

Fail2ban  про­грам­ма для бло­ки­ров­ки IP-адре­сов при пре­вы­ше­нии коли­че­ства попы­ток совер­ше­ния како­го-либо дей­ствия, напри­мер, неудач­но­го вво­да SSH-паро­ля или мно­го­крат­но­го запро­са веб-стра­ни­цы у сер­ве­ра NGINX.

Опи­сы­вая Fail2ban в двух сло­вах, мож­но ска­зать, что он поз­во­ля­ет на осно­ве ана­ли­за логов бло­ки­ро­вать тех, кто зло­упо­треб­ля­ет доступ­но­стью сер­ве­ра по сети. Напри­мер, защи­тить поч­то­вые ящи­ки от взло­ма путем пере­бо­ра паро­лей или мно­го­крат­но­го запро­са како­го-либо ресурса.

Читая неко­то­рые ста­тьи в интер­не­те, может сло­жить­ся непра­виль­ное мне­ние, что Fail2ban нужен толь­ко для защи­ты от брут-форс атак (пере­бор паро­лей). На самом деле, дан­ный про­грамм­ный про­дукт — систе­ма реа­ги­ро­ва­ния на подо­зри­тель­ные действия.

Установка и запуск

CentOS 7 / Red Hat:

yum install fail2ban

 

CentOS 6:

Добав­ля­ем репозиторий:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Уста­нав­ли­ва­ем пакет:

yum install fail2ban

Для запус­ка служ­бы вво­дим сле­ду­ю­щие команды:

systemctl enable fail2ban

systemctl start fail2ban

* Для ста­рых систем без systemd это будут коман­ды chkconfig fail2ban on / update-rc.d fail2ban defaults и service fail2ban start.

 

Базовая настройка

Про­цесс настрой­ки fail2ban не зави­сит от дис­три­бу­ти­ва Linux. Основ­ной кон­фи­гу­ра­ци­он­ный файл нахо­дит­ся по пути /etc/fail2ban/jail.conf. Одна­ко, его не реко­мен­ду­ет­ся менять и для настрой­ки исполь­зу­ют под­клю­ча­е­мые фай­лы из ката­ло­га /etc/fail2ban/jail.d.

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

vi /etc/fail2ban/jail.d/default.conf

При­ве­дем его к виду:

[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
ignoreip = 127.0.0.1/8

* где:

  • maxretry — коли­че­ство дей­ствий, кото­рые раз­ре­ше­но совер­шить до бана.
  • findtime — вре­мя в секун­дах, в тече­ние кото­ро­го учи­ты­ва­ет­ся maxretry;
  • bantime — вре­мя, на кото­рое будет бло­ки­ро­вать­ся IP-адрес;
  • action — дей­ствия, кото­рое будет выпол­нять­ся, если Fail2ban обна­ру­жит актив­ность, соот­вет­ству­ю­щую кри­те­ри­ям поиска;
  • ignoreip — игно­ри­ро­вать защи­ту, если запро­сы при­хо­дят с пере­чис­лен­ных адресов.

* В дан­ном при­ме­ре, если в тече­ние 8 минут (480) будет най­де­но 5 строк (maxretry = 4), содер­жа­щих кри­те­рий филь­тра, Fail2ban забло­ки­ру­ет IP-адрес, с кото­ро­го идет под­клю­че­ние на 12 минут (720);
* В сек­ции [DEFAULT] хра­нят­ся общие настрой­ки для всех пра­вил. Каж­дую из настро­ек мож­но пере­опре­де­лить при кон­фи­гу­ри­ро­ва­нии само­го правила.

Настройка правил

Для ново­го пра­ви­ла необ­хо­ди­мо создать кон­фи­гу­ра­ци­он­ный файл в ката­ло­ге /etc/fail2ban/jail.d, напри­мер:

vim /etc/fail2ban/jail.d/service.conf

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 10
findtime = 600

* где:

  • ssh — назва­ние для правила;
  • enabled поз­во­ля­ет быст­ро вклю­чать (true) или отклю­чать (false) правило;
  • port — порт целе­во­го сер­ви­са. При­ни­ма­ет­ся бук­вен­ное или цифир­ное обозначение;
  • filter — фильтр (кри­те­рий поис­ка), кото­рый будет исполь­зо­вать­ся для поис­ка подо­зри­тель­ных дей­ствий. По сути, это имя фай­ла из ката­ло­га /etc/fail2ban/filter.d без .conf на конце;
  • action — дей­ствие, совер­ша­е­мое в слу­чае сра­ба­ты­ва­ния пра­ви­ла. В квад­рат­ных скоб­ках ука­за­ны назва­ние для пра­ви­ла, сете­вой порт и про­то­кол для блокирования;
  • logpath — рас­по­ло­же­ние лог-фай­ла, в кото­ром фильтр будет искать подо­зри­тель­ную актив­ность на осно­ве опи­сан­ных критериев.

* обра­ти­те вни­ма­ние, что мы пере­опре­де­ли­ли пара­мет­ры по умол­ча­нию maxretryfindtime и action.

Что­бы изме­не­ния всту­пи­ли в силу, пере­за­пус­ка­ем сервис:

systemctl restart fail2ban

* в ста­рых вер­си­ях service fail2ban restart.

 

Действия и фильтры

Действия

Фай­лы с настрой­кой дей­ствий нахо­дят­ся в ката­ло­ге /etc/fail2ban/action.d. Что­бы бло­ки­ро­вать адрес, Fail2ban созда­ет пра­ви­ло в бранд­мау­э­ре netfilter. Для это­го, чаще все­го, исполь­зу­ют­ся ути­ли­ты iptables или firewall-cmd. Послед­няя при­ме­ня­ет­ся в послед­них вер­си­ях CentOS / Red Hat / Fedora. iptables более уни­вер­саль­ная и может исполь­зо­вать­ся, почти, во всех систе­мах Linux.

Оста­но­вим­ся на опи­са­нии самых исполь­зу­е­мых действий:

  • iptables — созда­ние про­сто­го пра­ви­ла в netfilter с помо­щью одно­имен­ной утилиты;
  • iptables-multiport — исполь­зо­ва­ние моду­ля multiports, поз­во­ля­ю­щий добав­лять диа­па­зо­ны пор­тов для блокировки;
  • iptables-ipset — исполь­зо­ва­ние ipset для при­да­ния более лако­нич­но­го вида правилам;
  • iptables-allports — бло­ки­ру­ет для адре­са все порты;
  • firewallcmd-new — созда­ние про­сто­го пра­ви­ла в netfilter с помо­щью firewall-cmd;
  • firewallcmd-ipset — добав­ля­ет пра­ви­ла с помо­щью ути­ли­ты firewall-cmd, исполь­зуя ipset;
  • firewallcmd-rich-rules — созда­ет rich-rules при помо­щи firewall-cmd.

Подроб­нее, как созда­ют­ся пра­ви­ла в netfilter при помо­щи iptables и firewalld.

Фильтры

Филь­тры, в основ­ном, пред­став­ля­ют набор регу­ляр­ных выра­же­ний для поис­ка клю­че­вых слов в log-фай­лах. Они нахо­дят­ся в ката­ло­ге /etc/fail2ban/filter.d.

Для созда­ния и настрой­ки сво­их филь­тров, мож­но исполь­зо­вать име­ю­щи­е­ся фай­лы в каче­стве шпаргалки.

 

Примеры правил

В дан­ных при­ме­рах бло­ки­ров­ка IP-адре­са будет про­ис­хо­дить на 12 минут после 4-х попы­ток вво­да паро­ля в тече­ние 8 минут. Эти пара­мет­ры берут­ся из настро­ек [DEFAULT]. Если их нуж­но пере­опре­де­лить, про­сто добав­ля­ем их при опи­са­нии правила.

SSH

CentOS

vim /etc/fail2ban/jail.d/ssh.conf

[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure

 

Asterisk

vi /etc/fail2ban/jail.d/asterisk.conf

[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/messages

NGINX

vim /etc/fail2ban/jail.d/nginx.conf

[nginx]
enabled = true
port = http,https
filter = nginx-http-auth
action = iptables-multiport[name=nginx, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

NGINX DDoS (req limit)

Дан­ное пра­ви­ло помо­жет защи­тить веб-сер­вер nginx от DDoS-атак. В неко­то­рых сбор­ках, для дан­но­го пра­ви­ло может не ока­зать­ся гото­во­го филь­тра, поэто­му в дан­ном при­ме­ре, мы его созда­дим вручную.

Созда­ем фильтр:

vim /etc/fail2ban/filter.d/nginx-limit-req.conf

[Definition]

ngx_limit_req_zones = [^"]+

failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>

ignoreregex =

 

Созда­ем пра­ви­ло в Fail2ban:

vim /etc/fail2ban/jail.d/nginx-ddos.conf

[nginx-ddos]
enabled = true
port = http,https
filter = nginx-limit-req
action = iptables-multiport[name=nginxddos, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

 

После настрой­ки не забы­ва­ем пере­за­пу­стить fail2ban:

systemctl restart fail2ban

 

Работа со списком заблокированных адресов

Просмотр

Полу­чить ста­ти­сти­ку забло­ки­ро­ван­ных адре­сов мож­но сле­ду­ю­щей командой:

fail2ban-client status <имя правила>

Полу­чить спи­сок пра­вил мож­но командой:

fail2ban-client status

При нали­чие забло­ки­ро­ван­ных IP-адре­сов мы уви­дим, при­мер­но, следующее:

`- action
|- Currently banned: 2
|  `- IP list:       31.207.47.55 10.212.245.29

 

С помо­щью iptables:

iptables -L -n --line

С помо­щью firewall-cmd:

firewall-cmd --direct --get-all-rules

Удаление

Сред­ства­ми fail2ban:

Для уда­ле­ние адре­са из спис­ка вводим:

fail2ban-client set <имя пра­ви­ла> unbanip <IP-адрес>

напри­мер:

fail2ban-client set ssh unbanip 31.207.47.55

 

С помо­щью iptables:

iptables -D <цепоч­ка пра­вил> -s IP-адрес

напри­мер:

iptables -D fail2ban-ssh -s 10.212.245.29

 

С помо­щью firewall-cmd:

firewall-cmd --direct --permanent --remove-rule <пра­ви­ло>

напри­мер:

firewall-cmd --direct --permanent --remove-rule ipv4 filter f2b-sshd 0 -s 188.134.7.221

После необ­хо­ди­мо пере­чи­тать правила:

firewall-cmd --reload