Fail2ban
Практически все компьютеры, которые имеют доступ из интернета, подвергаются попыткам взлома или по крайней мере проверяются на наличие открытых портов. Для разного рода аппликаций, имеющих доступ из интернета, можно применить одни или другие способы защиты, например пытаться защищать 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> .*
Проверка правил
Проверить правило можно с помощью команды “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, <@\textcolor{blue}{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” написано правильно, то при проверке будет указано количество правильных срабатываний.