웹사이트 검색

Fail2Ban이 Linux 서버에서 서비스를 보호하는 방법


소개

SSH는 사실상 클라우드 서버에 연결하는 방법입니다. 내구성이 뛰어나고 확장 가능합니다. 새로운 암호화 표준이 개발됨에 따라 새로운 SSH 키를 생성하는 데 사용할 수 있으므로 핵심 프로토콜이 안전하게 유지됩니다. 그러나 어떤 프로토콜이나 소프트웨어 스택도 완벽하지 않으며 SSH가 인터넷을 통해 광범위하게 배포된다는 것은 SSH가 사람들이 통과할 수 있는 매우 예측 가능한 공격면 또는 공격 벡터를 나타낸다는 것을 의미합니다. 액세스 권한을 얻으십시오.

네트워크에 노출된 모든 서비스는 이러한 방식으로 잠재적인 대상이 됩니다. 광범위하게 트래피킹되는 서버에서 실행되는 SSH 서비스의 로그를 검토하면 사용자와 봇 모두에 의한 무차별 대입 공격을 나타내는 반복적이고 체계적인 로그인 시도를 자주 볼 수 있습니다. SSH 서비스를 일부 최적화하여 SSH 키를 위해 암호 인증을 비활성화하는 것과 같이 이러한 공격이 성공할 가능성을 거의 0에 가깝게 줄일 수 있지만 여전히 사소하고 지속적인 책임을 질 수 있습니다.

이 책임을 완전히 받아들일 수 없는 대규모 프로덕션 배포는 일반적으로 SSH 서비스 앞에 WireGuard와 같은 VPN을 구현하므로 추가 소프트웨어 추상화 또는 추가 없이 외부 인터넷에서 기본 SSH 포트 22에 직접 연결할 수 없습니다. 게이트웨이. 이러한 VPN 솔루션은 널리 신뢰되지만 복잡성이 추가되고 일부 자동화 또는 기타 작은 소프트웨어 후크가 손상될 수 있습니다.

전체 VPN 설정을 커밋하기 전에 또는 추가로 Fail2ban이라는 도구를 구현할 수 있습니다. Fail2ban은 특정 횟수의 로그인 시도 실패 후 특정 IP를 금지하도록 방화벽 구성을 자동으로 변경하는 규칙을 생성하여 무차별 암호 대입 공격을 상당히 완화할 수 있습니다. 이렇게 하면 서버가 사용자의 개입 없이 이러한 액세스 시도에 대해 스스로를 강화할 수 있습니다.

다른 자습서에서는 Fail2ban으로 SSH를 보호하는 방법에 대해 논의했습니다. 이 가이드에서는 Fail2ban이 실제로 어떻게 작동하는지, 이 지식을 사용하여 이 서비스의 동작을 수정하거나 확장하는 방법에 대해 자세히 설명합니다.

Fail2ban의 기본

Fail2ban의 목적은 공통 서비스의 로그를 모니터링하여 인증 실패 패턴을 파악하는 것입니다.

fail2ban이 서비스의 로그를 모니터링하도록 구성된 경우 해당 서비스에 맞게 구성된 필터를 확인합니다. 필터는 복잡한 정규식을 사용하여 특정 서비스에 대한 인증 실패를 식별하도록 설계되었습니다. 정규식은 패턴 일치에 사용되는 일반적인 템플릿 언어입니다. 이러한 정규식 패턴을 failregex라는 내부 변수로 정의합니다.

기본적으로 Fail2ban에는 공통 서비스에 대한 필터 파일이 포함되어 있습니다. 웹 서버와 같은 서비스의 로그가 해당 필터의 failregex와 일치하면 해당 서비스에 대해 미리 정의된 작업이 실행됩니다. action은 관리자의 기본 설정에 따라 다양한 작업을 수행하도록 구성할 수 있는 변수입니다.

기본 조치는 로컬 방화벽 규칙을 수정하여 잘못된 호스트/IP 주소를 차단하는 것입니다. 이 작업을 확장하여 예를 들어 시스템 관리자에게 이메일을 보낼 수 있습니다.

기본적으로 10분 동안 3번의 인증 실패가 감지되면 조치가 취해지며, 기본 차단 시간은 10분입니다. 이는 구성 가능합니다.

기본 iptables 방화벽을 사용하는 경우 fail2ban은 서비스가 시작될 때 체인이라고도 하는 새로운 방화벽 규칙 세트를 생성합니다. 포트 22로 향하는 모든 TCP 트래픽을 새 체인으로 보내는 INPUT 체인에 새 규칙을 추가합니다. 새 체인에는 INPUT 체인으로 돌아가는 단일 규칙을 삽입합니다. Fail2ban 서비스가 중지되면 체인 및 관련 규칙이 제거됩니다.

Fail2ban 서비스 설정 탐색

Fail2ban은 /etc/fail2ban/ 디렉토리 아래의 계층 구조 내에 있는 여러 파일을 통해 구성됩니다.

fail2ban.conf 파일은 데몬이 정보를 기록하는 방식과 데몬이 사용할 소켓 및 pid 파일과 같은 일부 작동 설정을 구성합니다. 그러나 기본 구성은 애플리케이션별 "jails\를 정의하는 파일에 지정됩니다.

기본적으로 fail2ban은 jail.conf 파일과 함께 제공됩니다. 그러나 이것은 업데이트에서 덮어쓸 수 있으므로 이 파일을 jail.local 파일에 복사하고 거기에서 조정해야 합니다.

이미 jail.local 파일이 있는 경우 nano 또는 선호하는 텍스트 편집기를 사용하여 엽니다.

  1. sudo nano /etc/fail2ban/jail.local

jail.local 파일이 없거나 열려 있는 파일이 비어 있는 경우 jail.conf 파일을 복사한 다음 새 파일을 엽니다.

  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  2. sudo nano /etc/fail2ban/jail.local

여기에서 사용할 수 있는 옵션을 살펴보고 이 파일이 시스템의 다른 구성 파일과 어떻게 상호 작용하는지 살펴보겠습니다.

기본 섹션

파일의 첫 번째 부분은 fail2ban 정책의 기본값을 정의합니다. 이러한 옵션은 각 개별 서비스의 구성 섹션에서 재정의할 수 있습니다.

주석을 제거하면 기본 섹션 전체가 다음과 같이 표시됩니다.

[DEFAULT]

ignoreip = 127.0.0.1/8
bantime = 10m
findtime = 10m
maxretry = 3
backend = auto
usedns = warn
destemail = root@localhost
sendername = Fail2Ban
banaction = iptables-multiport
mta = sendmail
protocol = tcp
chain = INPUT
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
action = %(action_)s

이것이 무엇을 의미하는지 살펴보겠습니다.

  • ignoreip: 이 매개변수는 차단 시스템에서 무시해야 하는 IP 주소를 식별합니다. 기본적으로 이것은 머신 자체에서 오는 트래픽을 무시하도록 설정되어 있으므로 자신의 로그를 채우거나 자신을 잠그지 않습니다.
  • bantime: 이 매개변수는 금지 기간을 초 단위로 설정합니다. 기본값은 10분입니다.
  • findtime: 이 매개변수는 Fail2ban이 반복적으로 실패한 인증 시도를 찾을 때 주의를 기울일 창을 설정합니다. 기본값은 10분으로 설정되어 있으며 이는 소프트웨어가 지난 10분 동안 실패한 시도 횟수를 계산함을 의미합니다.
  • maxretry: 차단이 시작되기 전에 findtime 창 내에서 허용되는 실패한 시도 횟수를 설정합니다.
  • 백엔드: 이 항목은 Fail2ban이 로그 파일을 모니터링하는 방법을 지정합니다. auto 설정은 fail2ban이 pyinotify를 시도한 다음 gamin을 시도한 다음 사용 가능한 항목에 따라 폴링 알고리즘을 시도한다는 것을 의미합니다. inotify는 파일 액세스 시기를 추적하기 위한 내장 Linux 커널 기능이고 pyinotify는 Fail2ban에서 사용하는 inotify에 대한 Python 인터페이스입니다.
  • usedns: 차단을 구현하는 데 역방향 DNS를 사용할지 여부를 정의합니다. 이것을 "no\로 설정하면 도메인 호스트 이름 대신 IP 자체가 금지됩니다. warn 설정은 호스트 이름을 조회하고 그러한 방식으로 금지를 시도하지만 검토를 위해 활동을 기록합니다.
  • destemail: 알림을 메일로 보내도록 작업을 구성한 경우 알림 메일을 보낼 주소입니다.
  • 발신자 이름: 이것은 생성된 알림 이메일의 발신인 필드에서 사용됩니다.
  • banaction: 임계값에 도달했을 때 사용할 조치를 설정합니다. 이것은 실제로 iptables-multiport.conf라는 /etc/fail2ban/action.d/에 있는 파일의 경로입니다. 이것은 실제 iptables 방화벽 조작을 처리하여 IP 주소를 차단합니다. 나중에 살펴보겠습니다.
  • mta: 알림 이메일을 보내는 데 사용되는 메일 전송 에이전트입니다.
  • 프로토콜: IP 차단이 구현될 때 삭제되는 트래픽 유형입니다. 이는 새로운 iptables 체인으로 전송되는 트래픽 유형이기도 합니다.
  • 체인: 트래픽을 fail2ban 깔때기로 보내는 점프 규칙으로 구성될 체인입니다.

나머지 매개변수는 지정할 수 있는 다른 작업을 정의합니다. 다음과 같이 텍스트 문자열 내에서 변수 대체를 사용하여 위에서 정의한 일부 매개 변수를 전달합니다.

%(var_name)s

위의 줄은 var_name의 내용으로 대체됩니다. 이를 사용하여 action 변수가 기본적으로 action_ 정의로 설정되어 있음을 알 수 있습니다(차단만 가능, 메일 알림 없음).

이는 금지를 수행하는 데 필요한 매개변수 목록(서비스 이름, 포트, 프로토콜 및 체인)과 함께 iptables-multiport 작업을 호출하여 구성됩니다. __name__은 아래 섹션 헤더에 지정된 서비스 이름으로 대체됩니다.

서비스별 섹션

기본 섹션 아래에는 기본 설정을 재정의하는 데 사용할 수 있는 특정 서비스에 대한 섹션이 있습니다. 이는 정상적인 값과 다른 매개변수만 수정하는 규칙을 따릅니다(구성에 대한 규칙).

각 섹션 헤더는 다음과 같이 지정됩니다.

[서비스 이름]

enabled = true 줄이 있는 모든 섹션을 읽고 활성화합니다.

각 섹션 내에서 로그를 구문 분석하는 데 사용해야 하는 필터 파일(파일 확장자 제외) 및 로그 파일 자체의 위치를 포함하여 매개변수가 구성됩니다.

이 점을 염두에 두고 SSH 서비스에 대한 작업을 지정하는 섹션은 다음과 같습니다.

[SSH]

enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log
maxretry    = 6

이것은 이 섹션을 활성화하고 포트를 기본 "ssh\ 포트(포트 22)로 설정합니다. 이 섹션에 대한 /var/log/auth.log에 있는 로그를 확인하도록 Fail2ban에 지시합니다. sshd.conf라는 파일의 /etc/fail2ban/filters.d 디렉토리에 정의된 필터링 메커니즘을 사용하여 로그를 구문 분석합니다.

필요한 다른 모든 정보는 [DEFAULT] 섹션에 정의된 매개 변수에서 가져옵니다. 예를 들어 작업은 iptables-multiport라는 파일을 참조하는 iptables-multiport 금지 조치를 사용하여 위반 IP 주소를 금지하는 action_로 설정됩니다. conf/etc/fail2ban/action.d에서 찾을 수 있습니다.

보시다시피 [DEFAULT] 섹션의 작업은 일반적이고 유연해야 합니다. 합리적인 기본값을 제공하는 매개변수와 함께 매개변수 대체를 사용하면 필요할 때 정의를 재정의할 수 있습니다.

필터 파일 검사

구성에서 진행되는 작업을 이해하려면 대부분의 작업을 수행하는 필터 및 작업 파일을 이해해야 합니다.

필터 파일은 fail2ban이 잘못된 특성을 식별하기 위해 로그 파일에서 찾을 줄을 결정합니다. action 파일은 서비스 시작 시 방화벽 구조 구축, 규칙 추가 및 삭제, 서비스 중지 시 방화벽 구조 해제에 이르기까지 필요한 모든 작업을 구현합니다.

위 구성에서 SSH 서비스가 요청한 필터 파일을 살펴보겠습니다.

  1. sudo nano /etc/fail2ban/filter.d/sshd.conf
[INCLUDES]

before = common.conf

[Definition]

_daemon = sshd
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s*$
        ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
        ^%(__prefix_line)sFailed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ %(__md5hex)s(, client user ".*", client host ".*")?))?\s*$
        ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
        ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s*$
        ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
ignoreregex =

[INCLUDES] 섹션 헤더는 이 파일 앞이나 뒤에 읽히는 다른 필터 파일을 지정합니다. 이 예에서는 common.conf 파일을 읽어 이 파일의 다른 줄 앞에 배치합니다. 이렇게 하면 구성에서 사용할 일부 매개변수가 설정됩니다.

다음으로 필터 일치에 대한 실제 규칙을 정의하는 [Definition] 섹션이 있습니다. 먼저 _daemon 매개변수를 사용하여 모니터링 중인 데몬의 이름을 설정합니다.

그런 다음 로그 파일에서 일치하는 줄이 발견될 때 트리거할 패턴을 설정하는 실제 failregex 정의를 검토합니다. 이는 사용자가 올바르게 인증하지 않을 때 발생할 수 있는 다양한 오류 및 실패를 기반으로 일치하는 정규식입니다.

%(__prefix_line)s와 같은 줄 부분은 우리가 소싱한 common.conf 파일의 매개변수 설정 값으로 대체됩니다. 이것은 운영 체제가 표준 방법을 사용할 때 로그 파일에 기록하는 다양한 주요 정보를 일치시키는 데 사용됩니다. 예를 들어 /var/log/auth.log의 일부 라인은 다음과 같을 수 있습니다.

May  6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 
May  6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2
May  6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth]

강조 표시된 부분은 운영 체제가 추가 컨텍스트를 제공하기 위해 삽입하는 표준 패턴입니다. 그 이후에는 iptables 방화벽 서비스가 실패 시도를 로그에 기록하는 몇 가지 방법이 있습니다.

위의 처음 두 줄에서 두 개의 별도 실패(PAM 인증 오류 및 암호 오류)를 볼 수 있습니다. 필터에 정의된 정규식은 가능한 실패 행과 일치하도록 설계되었습니다. 이러한 줄을 조정할 필요는 없지만 필터 파일을 직접 만들어야 하는 경우 보호하려는 응용 프로그램에 대한 무단 사용 오류를 나타내는 모든 로그 항목을 포착해야 할 필요성을 알고 있어야 합니다. .

하단에서 현재 비어 있는 ignoreregex 매개변수를 볼 수 있습니다. 특정 시나리오에서 fail2ban에 대한 실패 트리거를 무효화하려는 경우 일반적으로 실패 조건과 일치하는 보다 구체적인 패턴을 제외하는 데 사용할 수 있습니다. 우리는 이것을 조정하지 않을 것입니다.

검사가 끝나면 파일을 저장하고 닫습니다.

작업 파일 검사

이제 작업 파일을 살펴보겠습니다. 이 파일은 악성 호스트를 금지하고 필요에 따라 해당 호스트를 추가 및 제거하기 위한 수정을 허용하는 구조로 방화벽을 설정하는 역할을 합니다.

SSH 서비스가 호출하는 작업은 iptables-multiport입니다. 지금 연결된 파일을 엽니다.

  1. sudo nano /etc/fail2ban/action.d/iptables-multiport.conf

주석이 제거된 이 파일은 다음과 같습니다.

[INCLUDES]
before = iptables-blocktype.conf

[Definition]
actionstart = iptables -N fail2ban-<name>
                iptables -A fail2ban-<name> -j RETURN
                iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actioncheck = iptables -n -L <chain> | grep -a 'fail2ban-<name>[ \t]'

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>

actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>

[Init]
name = default
port = ssh
protocol = tcp
chain = INPUT

이 파일은 blocktype 매개변수를 정의하는 iptables-blocktype.conf라는 다른 작업 파일을 소싱하여 시작합니다. 이 매개변수는 클라이언트가 차단될 때 설정될 제한을 구성합니다. 기본적으로 blocktype은 패킷을 거부하고 포트에 연결할 수 없다는 거부 메시지와 함께 금지된 클라이언트가 보낸 ping에 응답하도록 설정됩니다. 우리는 이것을 아래 금지 규칙에서 사용할 것입니다.

다음으로 규칙 정의 자체에 도달합니다. actionstart 작업은 fail2ban 서비스가 시작될 때 iptables 방화벽을 설정합니다. 새 체인을 만들고 해당 체인에 규칙을 추가하여 호출 체인으로 반환한 다음 올바른 프로토콜 및 포트 대상과 일치하는 트래픽을 새 체인으로 전달하는 규칙을 INPUT 체인의 시작 부분에 삽입합니다.

jail.local 파일에서 정의한 action과 함께 전달한 값을 사용하여 이를 수행합니다. 이름은 각 서비스의 섹션 헤더에서 가져옵니다. chain, protocolport는 해당 파일의 action 줄 자체에서 가져옵니다.

여기에서 다른 파일에 의해 설정된 모든 매개변수는 꺾쇠 괄호 안에 매개변수 이름을 포함하여 참조됩니다.

<param_name>

동반 actionstop 정의로 이동하면 방화벽 명령이 actionstart 명령의 반전을 구현하고 있음을 알 수 있습니다. Fail2ban 서비스가 중지되면 추가한 모든 방화벽 규칙을 완전히 제거합니다.

actioncheck라는 또 다른 작업은 금지 규칙을 추가하기 전에 적절한 체인이 생성되었는지 확인합니다.

다음으로 actionban이라는 실제 금지 규칙에 도달합니다. 이 규칙은 생성된 체인에 새 규칙을 추가하여 작동합니다. 규칙은 잘못된 클라이언트의 소스 IP 주소와 일치합니다. 이 매개변수는 maxretry 제한에 도달하면 인증 로그에서 읽습니다. 파일 상단의 [INCLUDE] 섹션에서 가져온 blocktype 매개변수로 정의된 블록을 시작합니다.

actionunban 규칙은 이 규칙을 제거합니다. 금지 시간이 경과하면 fail2ban에 의해 자동으로 수행됩니다.

마지막으로 [Init] 섹션에 도달합니다. 이는 모든 적절한 값을 전달하지 않고 작업 파일이 호출되는 경우 일부 기본값을 제공합니다.

Fail2ban 서비스가 차단을 구현하기 위해 구성 파일을 처리하는 방법

이제 세부 사항을 확인했으므로 fail2ban이 시작될 때 발생하는 프로세스를 살펴보겠습니다.

초기 구성 파일 로드

먼저 기본 프로세스가 작동해야 하는 조건을 결정하기 위해 기본 fail2ban.conf 파일을 읽습니다. 필요한 경우 소켓, pid 및 로그 파일을 생성하고 사용하기 시작합니다.

다음으로 fail2ban은 구성 세부 정보를 위해 jail.conf 파일을 읽습니다. jail.d 디렉토리에서 .conf로 끝나는 모든 파일을 알파벳순으로 읽습니다. 이러한 파일에서 찾은 설정을 내부 구성에 추가하여 jail.conf 파일에 설명된 값보다 새 값 우선 순위를 부여합니다.

그런 다음 jail.local 파일을 검색하고 이 프로세스를 반복하여 새 값을 적용합니다. 마지막으로 jail.d 디렉토리를 다시 검색하여 .local로 끝나는 파일을 알파벳순으로 읽습니다.

우리의 경우에는 jail.conf 파일과 jail.local 파일만 있습니다. jail.local 파일에서는 jail.conf 파일과 다른 값만 정의하면 됩니다. fail2ban 프로세스는 이제 발견한 모든 파일의 조합을 나타내는 일련의 지시문을 메모리에 로드했습니다.

각 섹션을 검사하고 enabled = true 지시문을 검색합니다. 하나를 찾으면 해당 섹션에 정의된 매개변수를 사용하여 정책을 구축하고 필요한 조치를 결정합니다. 서비스 섹션에서 찾을 수 없는 모든 매개변수는 [DEFAULT] 섹션에 정의된 매개변수를 사용합니다.

작업 파일을 구문 분석하여 시작 작업 결정

Fail2ban은 금지/금지 해제 정책을 구현하기 위해 호출할 작업 스크립트를 파악하기 위해 action 지시문을 찾습니다. 찾을 수 없는 경우 위에서 결정된 기본 작업으로 돌아갑니다.

작업 지시문은 읽을 작업 파일의 이름과 해당 파일에 필요한 매개 변수를 전달하는 키-값 사전으로 구성됩니다. 이러한 값은 종종 서비스 섹션에서 구성된 설정을 참조하여 매개변수 대체 형식을 취합니다. "name\ 키는 일반적으로 섹션 헤더의 값으로 설정될 특수 __name__ 변수의 값으로 전달됩니다.

그런 다음 Fail2ban은 이 정보를 사용하여 action.d 디렉토리에서 관련 파일을 찾습니다. 먼저 .conf로 끝나는 관련 작업 파일을 찾은 다음 에도 있는 함께 제공되는 .local 파일에 포함된 설정으로 거기에서 찾은 정보를 수정합니다. action.d 디렉토리.

필요한 작업을 결정하기 위해 해당 파일을 구문 분석합니다. actionstart 값을 읽어 환경을 설정하기 위해 취해야 하는 조치를 확인합니다. 여기에는 향후 금지 규칙을 수용하기 위한 방화벽 구조 생성이 포함되는 경우가 많습니다.

이 파일에 정의된 조치는 action 지시문에서 전달된 매개변수를 사용합니다. 이러한 값을 사용하여 적절한 규칙을 동적으로 생성합니다. 특정 변수가 설정되지 않은 경우 액션 파일에 설정된 기본값을 보고 빈칸을 채울 수 있습니다.

필터링 규칙을 결정하기 위해 필터 파일 구문 분석

jail.* 파일의 서비스에 대한 매개변수에는 로그 파일의 위치와 파일을 확인하는 데 사용해야 하는 폴링 메커니즘도 포함됩니다(이는 백엔드에 의해 정의됨). 매개변수). 또한 로그의 라인이 실패를 나타내는지 여부를 판별하는 데 사용해야 하는 필터도 포함합니다.

Fail2ban은 filter.d 디렉토리에서 .conf로 끝나는 일치하는 필터 파일을 찾습니다. 이 파일을 읽어 잘못된 행을 일치시키는 데 사용할 수 있는 패턴을 정의합니다. 그런 다음 .local로 끝나는 일치하는 필터 파일을 검색하여 기본 매개변수를 덮어썼는지 확인합니다.

서비스의 로그 파일을 읽을 때 이러한 파일에 정의된 정규식을 사용합니다. 서비스의 로그 파일에 기록된 모든 새 줄에 대해 filter.d 파일에 정의된 각 failregex 줄을 시도합니다.

정규식이 일치 항목을 반환하면 ignoreregex에 의해 정의된 정규식에 대해 행을 확인합니다. 이것도 일치하면 fail2ban이 이를 무시합니다. 줄이 failregex의 식과 일치하지만 ignoreregex의 식과 일치하지 않는 경우 줄을 일으킨 클라이언트에 대해 내부 카운터가 증가하고 관련 타임스탬프가 이벤트를 위해 생성되었습니다.

jail.* 파일의 findtime 매개변수에 의해 설정된 시간 창에 도달하면(이벤트 타임스탬프에 의해 결정됨) 내부 카운터가 다시 감소하고 이벤트 금지 정책과 더 이상 관련이 없는 것으로 간주됩니다.

시간이 지남에 따라 추가 인증 실패가 기록되면 시도할 때마다 카운터가 증가합니다. 카운터가 구성된 시간 창 내에서 maxretry 매개변수에 의해 설정된 값에 도달하면 fail2ban은 actioncheck 작업을 호출하여 차단을 시작합니다. >action.d/ 파일을 서비스에 사용합니다. 이는 actionstart 액션이 필요한 구조를 설정했는지 여부를 결정하기 위한 것입니다. 그런 다음 actionban 작업을 호출하여 위반 클라이언트를 차단합니다. 이 이벤트에 대한 타임스탬프도 설정합니다.

bantime 매개변수로 지정된 시간이 경과하면 fail2ban은 actionunban 조치를 호출하여 클라이언트를 금지 해제합니다.

결론

지금까지 fail2ban이 어떻게 작동하는지에 대해 상당히 깊이 이해했습니다. 표준 구성에서 벗어날 때 fail2ban의 동작을 예측 가능한 방식으로 조작하기 위해 어떻게 작동하는지 아는 것이 도움이 됩니다.

fail2ban으로 다른 서비스를 보호하는 방법에 대해 알아보려면 Ubuntu 22.04에서 Fail2Ban으로 Nginx 서버를 보호하는 방법을 참조하세요.