전체 네트워크 블록의 공격을 탐지하고 차단하도록 Fail2ban을 어떻게 교육합니까?

전체 네트워크 블록의 공격을 탐지하고 차단하도록 Fail2ban을 어떻게 교육합니까?

내 컴퓨터에 올바른 설치, 활성화 및 fail2ban규칙이 있습니다. 모든 것이 잘 작동합니다.sshssh-dosrecidive

최근에는 차단 후 IP를 전환하여 "반복" 규칙을 우회하는 동일한 네트워크의 여러 호스트에서 반복 공격 패턴이 증가하는 것을 확인했습니다.

2015-01-25 11:12:11,976 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.29
2015-01-25 11:12:13,165 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.42
2015-01-25 11:12:16,297 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.28
2015-01-25 11:12:20,446 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.104

나는 이를 탐지하고 이러한 모든 유형의 공격을 차단하는 "recidive24" 규칙을 만들어 전체 /24차단을 금지하고 싶습니다.

다음에서 제안을 찾았습니다.데비안 오류 파일Fail2ban의 경우 이를 적용했지만 다음과 같습니다.

  1. /24감옥이 발동되었을 때 포괄적 금지를 적용하면 ssh동일한 네트워크에 있는 누군가가 단일 IP에서 공격하여 나를 쉽게 차단할 수 있는 문제에 직면하게 됩니다.

  2. 감옥은 recidive완벽하지만 스톰이 IP를 변경해도 감옥이 실행되지는 않습니다...

그래서 IP의 처음 3바이트만 볼 수 있도록 필터 사양을 변경하고 싶지만 recidive여기서 헤매고 있습니다... 금지를 수행하는 정규 표현식은 (from /etc/fail2ban/recidive.conf)입니다.

# The name of the jail that this filter is used for. In jail.conf, name the 
# jail using this filter 'recidive', or change this line!
_jailname = recidive

failregex = ^(%(__prefix_line)s|,\d{3} fail2ban.actions:\s+)WARNING\s+\[(?!%(_jailname)s\])(?:.*)\]\s+Ban\s+<HOST>\s*$

...전체 IP와 일치합니다.

질문:호스트 IP의 처음 3바이트만 일치하도록 이 실패 정규식을 어떻게 변경할 수 있습니까?

스팸 IP가 감지되면 문제는 전체 서브넷을 차단하는 것이 아니라 상대적으로 쉽습니다. 문제는 subnet-recidive동일한 서브넷에 5개 이상의 적중이 있을 때 무언가가 트리거된다는 것입니다...recidive


다른 데몬을 사용하여 Fail2ban 로그 파일을 필터링하고 매번 마지막 바이트가 0인 두 번째 파일에 쓰고 이를 사용하여 재범 감옥을 트리거했지만 정말 서투른 것 같습니다.....

답변1

/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>

~을 위한발각필터를 수정해야 하는 부분이...조금 까다롭습니다. 하지만 좋은 점은 – 그럴 필요가 없다는 것입니다! 이 서브넷 차단 기능은 훌륭하게 작동합니다.

답변2

Fail2ban에는 전체 서브넷의 공격을 자동으로 차단하는 깔끔한 기능이 없습니다. 그러나 최신 버전의 failure2ban(저는 v0.11을 사용하고 있습니다), 몇 가지 간단한 fall2ban 스크립트 및 작은 순수 python3 스크립트를 사용하여 수행할 수 있습니다.

참고: 문제는 "전체 서브넷"과 관련이 있습니다(저는 이것을 CIDR 블록 또는 IP 범위라고 부릅니다). 이는 공격자가 제어하는 ​​주소 블록의 크기가 얼마나 큰지 모르기 때문에 어려운 일입니다. 공격자는 중간 주소가 합법적인 동안 실수로 동일한 블록에 있는 소수의 주소를 제어할 수도 있습니다.

1단계. 호스트의 CIDR 가져오기

fall2ban이 모니터링하는 로그 파일에는 일반적으로 CIDR 블록(127.0.0.0/24) 또는 IP 범위(127.0.0.0 - 127.0.0.255)가 아닌 호스트(예: 127.0.0.1)가 표시됩니다.

해결책은 먼저 작은 CIDR 블록을 가정한 다음 로그에서 오작동하는 호스트가 더 많이 보고됨에 따라 블록을 늘리는 것입니다. 분명히 CIDR은 이러한 호스트가 인접한 주소에 있는 경우에만 증가해야 합니다. 하지만 이는 복잡하며, 알고리즘이 아무리 정교해도 합법적인 주소를 캡처할 수 있습니다.

대신 whois에서 CIDR을 간단히 조회할 수도 있습니다. 이로 인해 whois 조회가 약간 지연되고 일부 트래픽이 발생합니다. 그러나 whois를 구문 분석하는 스크립트는 CIDR을 syslog에 기록할 수 있으며, 이는 이후에 fall2ban에 의해 다시 캡처될 수 있습니다.

참고: 이 스크립트를 원하는 action.d/lorem-ipsum.conf 스크립트의 actionban에 연결하는 것을 잊지 마십시오.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 조회를 사용하면 적절하다고 판단되는 maxretry 및 findtime을 기반으로 찾은 CIDR 블록을 간단히 억제할 수 있습니다. 제가 사용하는 감옥은 다음과 같습니다.

[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>

Step 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\; \}

답변3

Centos 7에서 이것을 시도 했는데 fail2ban때때로 IP 주소를 차단할 수 없다는 것을 발견했습니다. 감옥에 계속 추가하지만 여전히 sshd에 액세스할 수 있습니다. 방화벽과 일부 비호환성이 있습니다.

지금은 다른 접근 방식을 사용합니다. 나는 /etc/hosts.deny이것을 다음과 같이 수정한다:

SSHD: 43.*.*.*
SSHD: 58.*.*.*

실수로 자신의 IP 네트워크를 거기에 추가하지 마세요.

보안 로그에서 IP 주소를 수집하려면 다음을 사용합니다.

grep sshd /etc/hosts.deny

sshd 로그에서 가장 활동적인 IP 주소 10개와 해당 액세스 수를 얻으려면 다음을 사용하십시오.

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)

답변4

Python의 이 스크립트는 crontab */5분 내에 유사한 IP를 CIDR /23에서 /32까지의 네트워크 범위로 그룹화하는 데 효과적이지만, 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

관련 정보