Как я могу учить fail2ban обнаруживать и блокировать нападения от целой подсети?

Мой фаворит использует put команда.

  • :put* вставка от выбора в текущей строке
  • :put+ вставка от буфера в текущей строке

"*p/"+p также хорошо, но :pu[t] имеет некоторые преимущества:

  • это всегда вставляет linewise
  • можно добавить дополнительный параметр для управления, где вставить:
    • :$put+ вставка после последней строки
    • :0put+ вставка в начале файла
4
26.01.2015, 14:05
5 ответов

Fail2ban не имеет удобной функции для автоматической блокировки атак из целой подсети. Однако это можно сделать, используя последнюю версию fail2ban (. Я использую v0.11 ), несколько простых сценариев fail2ban и небольшой сценарий на чистом python3.

Примечание :Вопрос касается «целой подсети» (, которую я буду называть блоками CIDR или диапазонами IP-адресов ). Это сложная вещь, потому что мы не знаем, насколько большой блок адресов контролирует атакующий. Возможно даже, что злоумышленник случайно контролирует несколько адресов из одного и того же блока, причем интервал -между адресами является законным.

Шаг 1. Получите CIDR хостов

Файлы журналов, которые отслеживает fail2ban, обычно показывают хосты (, например. 127.0.0.1 )вместо блоков CIDR (127.0.0.0/24 )или диапазонов IP (127.0.0.0 -127.0.0.255 ).

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

Вместо этого мы также можем просто найти CIDR в whois. Это влечет за собой некоторую задержку для поиска whois и генерирует некоторый трафик. А вот скрипт, который разбирает whois, может просто записать CIDR в syslog, который затем снова может быть пойман fail2ban.

Примечание. :Не забудьте подключить этот скрипт к блокировке действий предпочитаемого вами скрипта action.d/lorem -ipsum.conf. Имейте в виду, что если maxretry > 1, то вы не сможете перехватывать блоки CIDR, в которых хосты выходят из строя только один раз!

#!/usr/bin/python

import sys, subprocess, ipaddress, syslog

def narrowest_cidr(cidrA, cidrB):
    _ip, subA = cidrA.split('/')
    _ip, subB = cidrB.split('/')

    if int(subA) > int(subB):
        return cidrA
    else:
        return cidrB

bad_ip = sys.argv[1]
cidrs = []
inetnums = []
ret = None

whois = subprocess.run(['whois', bad_ip], text=True,
        stdout=subprocess.PIPE, check=True)

for line in whois.stdout.split('\n'):
    if 'CIDR:' in line:
        cidrs.append(line.replace('CIDR:', '').strip())
    if 'inetnum:' in line:
        inetnums.append(line.replace('inetnum:', '').strip())

if len(cidrs) >= 1:
    if len(cidrs) == 1:
        cidr = cidrs[0]
    else:
        cidr = narrowest_cidr(cidrs[0], cidrs[-1])
elif len(inetnums) > 0:
    if len(inetnums) == 1:
        inetnum = inetnums[0]
        startip, endip = inetnum.split(' - ')
        cidrs = [ipaddr for ipaddr in ipaddress.summarize_address_range(ipaddress.IPv4Address(startip), ipaddress.IPv4Address(endip))]
        if len(cidrs) == 1:
            cidr = cidrs[0]
        else:
            cidr = narrowest_cidr(cidrs[0], cidrs[-1])
else:
    cidr = "no CIDR found"

syslog.openlog(ident="suspectrange")
syslog.syslog("{} has CIDR {}".format(bad_ip, cidr))

Шаг 2. Выясните, когда блокировать CIDR

Если бы у нас было динамическое определение CIDR, это могло бы стать немного сложнее, так как нам пришлось бы изменить то, что мы запрещаем. Но с помощью поиска whois мы можем просто забанить найденный нами блок CIDR,на основе maxretry и findtime, которые мы считаем подходящими. Вот тюрьма, которую я использую:

[fail2ban-cidr-recidive]
filter = fail2ban-cidr-recidive
action = nftables-common[name=BADRANGE]
logpath = /var/log/everything/current

#5 bans in 12hrs is 48hr ban
maxretry = 5
findtime = 12h
bantime = 2d

И сопутствующий фильтр

[Definition]

failregex = \[suspectrange\].* has CIDR <SUBNET>

Шаг 3. Фактическая блокировка CIDR

Как вы могли заметить, я использую action.d/nft -common.conf. nftables позволяет блокировать блоки CIDR вместо отдельных хостов. Для этого требуется небольшое изменение в первой строке actionstart части сценария действия :

.
actionstart = nft add set netdev f2b <set_name> \{ type ipv4_addr\; \}

Следует изменить на:

actionstart = nft add set netdev f2b <set_name> \{ type ipv4_addr\; flags interval\; \}
1
10.12.2020, 20:05

Я пытался fail2ban в Centos 7 и обнаружил, что иногда IP-адреса не блокируются. Он продолжает добавлять их в тюрьму, но они все равно имели доступ к sshd. Существует некоторая несовместимость с firewalld.

Теперь я использую другой подход. Я изменил /etc/hosts.deny следующим образом:

sshd: 43.*.*.*
sshd: 58.*.*.*

Просто не добавляйте туда свои собственные IP сети случайно.

Для приветствия IP-адресов из защищенного журнала используйте:

grep sshd /etc/hosts.deny

Для получения 10 наиболее активных IP-адресов из sshd-журнала с количеством доступа используйте:

d=[0-9]{1,3}
s=[\.\-]
n=[^0-9]
ip="$d$s$d$s$d$s$d"
egrep $ip /var/log/secure | sed -r "s/^.*$n($ip).*$/\1/g" | sed s/-/./g | sort | uniq -c | sort -g | tail -10

(источник: http://whoishacking.com)

.
1
27.01.2020, 21:00

fail2ban действительно имеет hostsdeny.conf в /etc/fail2ban/action.d , что означает, что вам нужно только объявить action = hostsdeny

Пример из howtoforge :

# Here we use TCP-Wrappers instead of Netfilter/Iptables. 
# "ignoreregex" is used to avoid banning the user "myuser".

[ssh-tcpwrapper]

enabled     = true
filter      = sshd
action      = hostsdeny
              sendmail-whois[name=SSH, dest=you@mail.com]
ignoreregex = for myuser from
logpath     = /var/log/messages
1
27.01.2020, 21:00

Самый простой способ добавить эту магию/24(кому-то может понравиться даже/22)в команды iptablesдля всех джейлов — это добавить два файла:

/etc/fail2ban/action.d/iptables-multiport.local
/etc/fail2ban/action.d/iptables-allports.local

со следующим содержанием:

[Definition]
actionban = <iptables> -I f2b-<name> 1 -s <ip>/24 -j <blocktype>
actionunban = <iptables> -D f2b-<name> -s <ip>/24 -j <blocktype>

Для части обнаружения вам нужно изменить фильтры... это немного сложнее. Но хорошая часть -не нужна! эта блокировка подсети работает довольно хорошо.

1
26.03.2020, 22:59

Этот скрипт на Python работает нормально, в crontab */5 минут, чтобы сгруппировать похожие IP-адреса в сетевой диапазон, от CIDR /23 до /32; он вызывает fail2ban, но также может напрямую вызывать IPTABLE.

https://github.com/WKnak/fail2ban-block-ip-range

Он группирует эти IP-адреса

151 193.56.28.160
108 45.142.120.135
107 45.142.120.62
105 45.142.120.99
105 45.142.120.93
105 45.142.120.192
104 45.142.120.87
104 45.142.120.60
104 45.142.120.209
104 45.142.120.200
104 45.142.120.133
103 45.142.120.180
103 45.142.120.149
102 45.142.120.59
100 45.142.120.215
 78 45.142.120.57
 78 45.142.120.11
 77 45.142.120.82
 77 45.142.120.20
 76 45.142.120.63
 76 45.142.120.34
 76 45.142.120.138
 73 45.142.120.65
 60 78.128.113.66
  6 45.150.206.113
  3 123.30.50.91
  2 5.188.206.204
  2 45.150.206.119
  2 45.150.206.115
  2 45.150.206.114
  1 51.210.127.200

как

fail2ban-client set postfix-sasl banip 78.128.113.66/32
fail2ban-client set postfix-sasl banip 45.142.120.0/24
fail2ban-client set postfix-sasl banip 193.56.28.160/32
fail2ban-client set postfix-sasl banip 45.150.206.112/29
1
15.01.2021, 23:40

Теги

Похожие вопросы