Fail2ban

From wiki.habital.lv
Jump to navigation Jump to search

Практически все компьютеры, которые имеют доступ из интернета, подвергаются попыткам взлома или по крайней мере проверяются на наличие открытых портов. Для разного рода аппликаций, имеющих доступ из интернета, можно применить одни или другие способы защиты, например пытаться защищать WEB-серверы с помощью WAF, SSH защищать с помощью “iptables” и т.д. Кроме того, имеется возможность создавать защиту сервисов с помощью программы “fail2ban” (https://www.fail2ban.org).

Настройка fail2ban

Исходная настройка “fail2ban” достаточно простая. Изначально необходимо скопировать файлы “/etc/fail2ban/fail2ban.conf” в “fail2ban.local” и
“/etc/fail2ban/jail.conf” в файл “jail.local” для того, чтобы после обновления пакета не потерять собственные настройки, после чего можно начинать корректировать “local”-файлы.

Собственные правила

Может случиться так, что имеющихся правил в пакете не достаточно для защиты. В таком случае можно создать собственные правила. Эти правила записываются в файл “jail.conf”, а также в собственный файл фильтра.

Блокирование внешних адресов от сканирования портов

Для блокирования внешних адресов от сканирования можно воспользоваться логами файервола. На данный момент в ряде дистрибутивов вместо исходных пакетов “iptables” устанавливаются пакеты “firewalld”. Пакет “firewalld” является так называемым “frontend”-ом по отношению к “iptables”. Я предпочитаю удалять пакеты “firewalld” с сервера и вместо них вернуться к “iptables”, которые на мой взгляд более гибкие. Правильно настроив файервол можно все необходимые срабатываемые правила файервола отправлять в лог-файл (как правило это “/var/log/messages”). Как минимум отправлять в лог всю информацию, которая попадает под правило “DENY”.

Лог “iptables” выглядит следующим образом:

... 
Dec 16 07:26:24 mail kernel: RULE XX -- DENY IN=eno1 OUT= MAC=fc:3f:db:08:5b:fe:
00:22:3f:0f:82:a0:08:00 SRC=92.63.196.10 DST=192.168.1.2 LEN=40 TOS=0x00 PREC=0x
00 TTL=244 ID=42991 PROTO=TCP SPT=56740 DPT=4166 WINDOW=1024 RES=0x00 SYN URGP=0
Dec 16 07:26:35 mail kernel: RULE XX -- DENY IN=eno1 OUT= MAC=fc:3f:db:08:5b:fe:
00:22:3f:0f:82:a0:08:00 SRC=134.119.220.26 DST=192.168.1.2 LEN=122 TOS=0x00 PREC
=0x00 TTL=52 ID=32991 DF PROTO=UDP SPT=22251 DPT=51157 LEN=102 
...

jail.local

В файл “jail.local” надо добавить следующий блок:

...
[portscan]

enabled   = true
logpath   = %(syslog_daemon)s
banaction = %(banaction_allports)s
maxretry  = 10
findtime  = 120
bantime   = 1d

В данном примере “logpath” указывает на “/var/log/messages”, который определяется в файле “paths-common.conf”.

portscan.conf

В директории “/etc/fail2ban/filter.d/” создаётся новый файл с наименованием “portscan.conf” (по аналогии с наименованием созданного блока в файле “jail.local”):

[INCLUDES]

before = command.conf

[Definition]
failregex = ^%(__prefix_line)sRULE \S+ .*DENY\ *IN=.* \S+ SRC=<HOST> .*

%(__prefix_line)s соответствует исходной информации из строчки лога - "Dec 16 07:26:24 mail kernel:".

Проверка правил

Проверить правило можно с помощью команды “fail2ban-regex”:

# fail2ban-regex /var/log/messages /etc/fail2ban/filter.d/portscan.conf

Running tests
=============

Use   failregex filter file : portscan, basedir: /etc/fail2ban
Use      datepattern : Default Detectors
Use         log file : /var/log/messages
Use         encoding : UTF-8


Results
=======

Failregex: 3764 total
|-  #) [# of hits] regular expression
|   1) [3764] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?\S*(?:\(\S+\))?[\]\)]?:?|[\[\(]?\S*(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?RULE \S+ .*DENY\ *IN=.* \S+ SRC=<HOST> .*
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [18776] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?
`-

Lines: 18776 lines, 0 ignored, 3764 matched, 15012 missed
[processed in 2.96 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 15012 lines

Если правило “regex” написано правильно, то при проверке будет указано количество правильных срабатываний.

Весь список правил можно увидеть с помощью команды “fail2ban-client status“, а информацию о заблокированных адресах можно получить добавив в указанную команду имя правила:

# fail2ban-client status portscan
Status for the jail: portscan
|- Filter
|  |- Currently failed:	5
|  |- Total failed:	1932
|  `- Journal matches:	
`- Actions
|- Currently banned:	60
|- Total banned:	73
`- Banned IP list:	<here is banned ip-address list>

Удаление адресов

В случае необходимости убрать заблокированный адрес надо в команду “fail2ban-client“ внести необходимый IP-адрес и имя правила - “fail2ban-client set portscan unbanip <IP-address>“.