웹사이트 검색

CentOS 8 및 Fedora 33에서 Fail2Ban을 설치 및 구성하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 센트OS 8
  • 센트OS 7

이 페이지에서

  1. 전제 조건
  2. Fail2Ban 설치
  3. Fail2Ban 구성
    1. jail.local 구성
    2. 추가 설정
    3. IP 화이트리스트\n
    4. 차단 시간 및 재시도 횟수\n
    5. 이메일 알림

    1. SSHD 감옥
    2. Nginx 감옥

    Fail2Ban은 다양한 프로세스의 로그 파일을 스캔하고 너무 많은 암호 실패를 만드는 IP 주소를 차단하는 로그 구문 분석 유틸리티입니다. 시도된 로그인이 발견되면 Fail2Ban은 일시적 또는 영구적으로 공격자의 IP 주소를 차단하기 위해 iptables에 새로운 규칙을 추가합니다. 또한 이메일을 통해 동일한 내용을 알려줄 수 있습니다.

    주로 SSH를 통한 침입 탐지에 중점을 두지만 로그 파일을 사용하는 모든 서비스에서 작동하도록 구성할 수 있습니다.

    전제 조건

    1. A Fedora 33 or a CentOS 8 based server with a non-root user with sudo privileges.

    2. Install Nano editor because that's what we will use.

      $ sudo dnf install nano -y
      

    Fail2Ban 설치

    CentOS 8에 Fail2Ban을 설치하려면 먼저 EPEL Yum 저장소를 설치해야 합니다.

    $ sudo dnf install epel-release
    

    Fedora 33은 Fail2Ban과 함께 제공됩니다.

    Fedora 33 및 CentOS 8 모두에 Fail2Ban을 설치하려면 다음 명령을 실행하십시오.

    $ sudo dnf install fail2ban
    

    설치가 완료되면 서비스를 활성화해야 합니다.

    $ sudo systemctl enable fail2ban
    

    다음으로 fail2ban 서비스를 시작합니다.

    $ sudo systemctl start fail2ban
    

    이제 서비스 상태를 확인하여 제대로 작동하는지 확인할 수 있습니다.

    $ sudo systemctl status fail2ban
    ? fail2ban.service - Fail2Ban Service
         Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
         Active: active (running) since Mon 2020-11-02 21:15:59 UTC; 5s ago
           Docs: man:fail2ban(1)
        Process: 19031 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
       Main PID: 19032 (f2b/server)
          Tasks: 3 (limit: 1125)
         Memory: 11.0M
            CPU: 96ms
         CGroup: /system.slice/fail2ban.service
                 ??19032 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start
    
    Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Starting Fail2Ban Service...
    Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Started Fail2Ban Service.
    Nov 02 21:15:59 howtoforge-tutorial fail2ban-server[19032]: Server ready
    

    Fail2Ban 구성

    Fail2Ban 서비스는 구성 파일을 /etc/fail2ban 디렉토리에 보관합니다. 그 안에 jail.conf 파일이 있습니다. 이 파일은 일반적으로 패키지 업그레이드 중에 재정의되므로 편집하면 안 됩니다.

    대신 모든 구성은 jail.local이라고 하는 새 파일에서 수행해야 합니다. 이 두 파일의 설정은 /etc/fail2ban/jail.d/ 디렉토리의 파일을 통해 추가로 재정의할 수 있습니다.

    구성은 다음 순서로 적용됩니다.

    <시작>

  4. <코드>/etc/fail2ban/jail.conf
  5. etc/fail2ban/jail.d/*.conf, 알파벳순
  6. <코드>/etc/fail2ban/jail.local
  7. /etc/fail2ban/jail.d/*.local, 알파벳순

jail.conf에는 [DEFAULT] 섹션과 개별 서비스에 대한 섹션이 있습니다. 이러한 섹션은 .local 파일에서 정의하여 재정의할 수 있습니다.

jail.local 구성

새로운 jail.local 파일을 생성합니다.

$ sudo nano /etc/fail2ban/jail.local

다음 코드를 붙여넣습니다.

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override backend=auto in /etc/fail2ban/jail.conf
backend = systemd

[sshd]
enabled = true

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다. 이렇게 하면 모든 서비스에 대해 새로운 기본 bantime이 설정되고 백엔드가 systemd로 변경되며 "sshd 감옥이 활성화됩니다.

새로운 변경 사항을 구현하려면 Fail2ban을 다시 시작하십시오.

$ sudo systemctl restart fail2ban

fail2ban-client 유틸리티를 사용하여 새로 적용된 설정을 확인할 수 있습니다.

$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

또한 다음과 같은 방법으로 각 감옥의 자세한 상태를 구체적으로 얻을 수 있습니다.

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

자세한 설정

jail.conf/jail.local 파일을 사용하여 사용자 지정할 수 있는 훨씬 더 많은 설정을 제공합니다. 다음으로 몇 가지 설정을 살펴보겠습니다.

화이트리스트 IP

다음 코드를 사용하여 Fail2ban에 의해 차단되는 IP를 화이트리스트/무시할 수 있습니다.

[DEFAULT]
ignoreip = 127.0.0.1/8 123.45.67.89

특정 감옥에 대해서만 IP를 화이트리스트에 추가하려면 fail2ban-client를 통해 그렇게 할 수 있습니다.

$ sudo fail2ban-client set JAIL addignoreip 123.45.67.89

위의 명령에서 JAIL을 설정을 편집하려는 감옥의 이름으로 바꿉니다.

금지 시간 및 재시도 횟수

차단을 위한 시간과 재시도 횟수를 설정할 수 있는 3가지 설정이 있습니다.

bantime - IP가 차단되는 시간(초)입니다. 영구 금지를 설정하려면 이 값을 음수로 설정하십시오. 기본값은 10분 또는 600초입니다.

findtime - 금지가 설정되기 전에 로그인 시도 사이의 시간입니다. 이 값은 항상 초 단위입니다. 예를 들어, Fail2ban이 5번의 로그인 시도 실패 후 IP를 차단하도록 설정된 경우, 이러한 5번의 시도는 설정된 10분 bantime 제한 내에 발생해야 합니다.

maxretry - 차단이 적용되기 전에 단일 IP 주소에서 재시도한 횟수입니다. 기본값은 3입니다.

이러한 설정을 사용자 지정하려면 [DEFAULT] 섹션 아래의 tc ail2ban\\jail.local 파일에 다음 줄을 붙여넣습니다.

bantime = 3600
findtime = 300
maxretry = 4

이메일 알림

이메일 알림을 보내려면 먼저 MTA(Mail Transfer Agent)를 설치해야 합니다. 목적을 위해 sendmail을 설치합니다.

$ sudo dnf install sendmail

이메일을 받으려면 [DEFAULT] 섹션 아래의 tc ail2ban\\jail.local 파일에 다음 코드를 추가하십시오.

destemail = 
sendername = Fail2Ban
mta = sendmail
action = %(action_mw)s

destemail은 메일을 수신하려는 ID인 대상 이메일 ID를 나타내고, sendername은 보낸 사람의 이름을 나타내므로 Fail2Ban을 사용하고 있습니다. mta는 여기에서 sendmail인 사용 중인 메일 전송 에이전트를 나타냅니다. Postfix를 사용하는 경우 mta 변수에 mail 값을 사용하십시오.

action은 침입이 감지되면 수행되는 기본 조치를 나타냅니다. 기본값은 사용자만 차단하는 %(action_)s입니다. %(action_mw)s는 차단하고 Whois 보고서가 포함된 이메일을 보냅니다. 반면 %(action_mwl)s는 금지하고 관련 로그 파일의 정보와 함께 Whois 보고서가 포함된 이메일을 보냅니다. 이것은 감옥에 따라 변경할 수도 있습니다.

개인 감옥 설정

이미 알고 있듯이 [DEFAULT] 섹션은 모든 Jail에 적용되므로 일부 특정 Jail과 해당 설정을 살펴볼 때입니다.

SSHD 감옥

jail.local 파일에서 이미 [sshd]를 정의했습니다. 다음 코드를 통해 조금 더 커스터마이징할 수 있습니다.

[sshd]

enabled = true
port = ssh
logpath = %(ssh_log)s

이 경우 기본 SSH 포트인 포트에 대해 미리 정의된 변수 ssh를 사용하고 있습니다. 다른 SSH 포트를 사용하는 경우 변경해야 합니다. 로그 경로는 모니터링할 로그 파일의 위치를 나타냅니다. %(ssh_log)s는 Fail2bans 표준 구성 파일(/etc/fail2ban/paths-common.conf)에 정의된 값을 사용합니다.

Nginx 감옥

Nginx에는 Fail2Ban에서 사용할 수 있는 감옥이 여러 개 있습니다. 예를 들어 사이트에서 암호로 보호된 부분이 반복적으로 공격을 받는 경우 jail.local 파일의 [nginx-http-auth] 섹션을 사용할 수 있습니다.

[nginx-http-auth]
enabled = true

[nginx-botsearch]라는 섹션을 추가하여 존재하지 않는 폴더나 위치에 대한 요청을 중지할 수도 있습니다.

[nginx-badbots]
enabled  = true

다른 Nginx 감옥도 있지만 Fail2Ban으로 미리 구성되어 있지 않습니다. 수동으로 생성해야 하며 대부분은 Fail2Ban과 함께 제공되는 Apache를 기반으로 할 수 있습니다.

Fail2Ban 필터 및 Failregexs

Fail2Ban 구성에는 필터라는 또 다른 설정이 있습니다. 필터는 로그 파일의 행이 실패한 인증을 나타내는지 여부를 결정합니다.

구성 파일의 필터 값은 .conf 확장자가 제거된 /etc/fail2ban/filter.d 디렉토리에 있는 파일에 대한 참조입니다.

디렉터리를 확인하여 어떤 종류의 필터를 사용할 수 있는지 확인할 수 있습니다.

$ ls /etc/fail2ban/filter.d

Nginx에 대한 2개의 로그 파일이 표시됩니다. nginx-badbots.confnginx-http-auth.conf.

이러한 구성 파일은 정규식(regex)을 사용하여 로그 파일을 구문 분석합니다. 이를 Failregex라고 합니다. 고유한 정규식을 작성하여 새 필터를 사용자 지정하거나 만들 수 있습니다. 이러한 정규식은 이 자습서의 범위를 벗어나기 때문에 자세히 다루지 않습니다.

Fail2Ban 로그 및 방화벽 모니터링

앞에서 설명한 것처럼 systemctl을 사용하여 Fail2Ban 상태를 확인할 수 있습니다.

$ sudo systemctl status fail2ban

좀 더 자세히 알아보려면 journalctl 명령을 사용할 수 있습니다.

$ sudo journalctl -b -u fail2ban

fail2ban-client를 사용하여 fail2ban-server 또는 개별 감옥의 상태를 쿼리할 수도 있습니다.

$ sudo fail2ban-client status
$ sudo fail2ban-client status jail_name

Fail2bans 로그 파일을 쿼리할 수도 있습니다.

$ sudo tail -F /var/log/fail2ban.log

iptables에 대해 구성된 현재 규칙을 나열할 수 있습니다.

$ sudo iptables -L

해당 규칙을 활성화하는 데 필요한 명령을 반영하는 형식으로 iptables 규칙을 나열할 수도 있습니다.

$ sudo iptables -S

결론

이것으로 Fedora 33 또는 CentOS 8 기반 서버에서 Fail2Ban을 설치하고 구성하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.