웹사이트 검색

Rocky Linux 9에서 Fail2Ban으로 Nginx 서버를 보호하는 방법


소개

웹 서버를 설정할 때 액세스를 제한하려는 사이트 섹션이 종종 있습니다. 웹 응용 프로그램은 종종 고유한 인증 및 권한 부여 방법을 제공하지만 이러한 방법이 부적절하거나 사용할 수 없는 경우 웹 서버 자체를 사용하여 액세스를 제한할 수 있습니다. 그러나 웹 서버 인증은 또한 사람들이 액세스를 시도할 수 있는 매우 예측 가능한 공격 표면 또는 공격 벡터를 나타냅니다.

네트워크에 노출된 모든 서비스는 이러한 방식으로 잠재적인 대상이 됩니다. 광범위하게 트래픽이 발생하는 웹 서버의 로그를 검토하면 사용자와 봇 모두에 의한 무차별 대입 공격을 나타내는 반복적이고 체계적인 로그인 시도를 자주 볼 수 있습니다.

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

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

이 가이드에서는 Rocky Linux 9 서버에 fail2ban을 설치하고 침입 시도에 대해 Nginx 로그를 모니터링하도록 구성하는 방법을 배웁니다.

전제 조건

  • 관리 작업을 수행하기 위해 sudo 권한이 있는 루트가 아닌 사용자로 Rocky Linux 9 서버 환경에 액세스합니다. 이러한 사용자를 만드는 방법을 알아보려면 Rocky Linux 9 초기 서버 설정 가이드를 따르세요.
  • Rocky Linux 9에 Nginx를 설치하는 방법에 대한 이 가이드의 1단계와 2단계에 따라 시스템에 Nginx를 설치했습니다.
  • Nginx는 Rocky Linux 9에서 Nginx로 비밀번호 인증을 설정하는 방법에 따라 비밀번호 인증으로 설치 및 구성되었습니다.

1단계 - Fail2ban 설치 및 구성

Fail2ban은 Rocky의 기본 소프트웨어 리포지토리에서 사용할 수 없습니다. 그러나 Red Hat 및 Rocky Linux의 타사 패키지에 일반적으로 사용되는 EPEL 또는 Enterprise Linux용 고급 패키지 리포지토리에서 사용할 수 있습니다. EPEL을 시스템 패키지 소스에 아직 추가하지 않은 경우 다른 패키지를 설치하는 것처럼 dnf를 사용하여 리포지토리를 추가할 수 있습니다.

  1. sudo dnf install epel-release -y

dnf 패키지 관리자는 이제 새 소프트웨어를 설치할 때 기본 패키지 소스 외에 EPEL을 확인합니다. Fail2ban 설치를 진행합니다.

  1. sudo dnf install fail2ban -y

Fail2ban은 설치 후 자동으로 백그라운드 서비스를 설정합니다. 그러나 일부 기본 설정으로 인해 원하지 않는 결과가 발생할 수 있으므로 기본적으로 비활성화되어 있습니다. systemctl 명령을 사용하여 이를 확인할 수 있습니다.

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

Fail2ban을 즉시 활성화할 수 있지만 먼저 일부 기능을 검토합니다.

fail2ban 서비스는 구성 파일을 /etc/fail2ban 디렉토리에 보관합니다. jail.conf라는 기본값이 있는 파일이 있습니다. 해당 디렉토리로 이동하여 head -20을 사용하여 해당 파일의 처음 20줄을 인쇄합니다.

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]

보시다시피 이 파일의 처음 몇 줄은 주석 처리되어 있습니다. 설정이 아닌 문서로 읽어야 함을 나타내는 # 문자로 시작합니다. 보시다시피 이 주석은 이 파일을 직접 수정하지 말라고 지시하고 있습니다. 대신 두 가지 옵션이 있습니다. jail.d/ 디렉토리 내의 여러 파일에서 Fail2ban에 대한 개별 프로필을 만들거나 jail.local에서 모든 로컬 설정을 만들고 수집합니다. 코드> 파일입니다. jail.conf 파일은 Fail2ban 자체가 업데이트될 때 주기적으로 업데이트되며 재정의를 생성하지 않은 기본 설정의 소스로 사용됩니다.

이 자습서에서는 jail.local을 만듭니다. jail.conf를 복사하면 됩니다.

  1. sudo cp jail.conf jail.local

이제 구성 변경을 시작할 수 있습니다. Rocky Linux 9와 함께 제공되는 기본 텍스트 편집기는 vi입니다. vi는 매우 강력한 텍스트 편집기이지만 사용 경험이 부족한 사용자에게는 다소 둔감할 수 있습니다. Rocky Linux 9 서버에서 구성 파일을 편집하기 위해 nano와 같은 보다 사용자 친화적인 편집기를 설치할 수 있습니다.

  1. sudo dnf install nano -y

이제 nano를 사용하여 Nginx 구성 파일을 편집할 수 있습니다.

  1. sudo nano jail.local

기본값 변경

파일 내에 설정된 기본값을 평가하여 시작합니다. 파일 내의 [DEFAULT] 섹션에서 찾을 수 있습니다. 이러한 항목은 일반 정책을 설정하며 애플리케이션별로 재정의할 수 있습니다. nano를 사용하는 경우 Ctrl+W를 누르고 검색 문자열을 입력한 다음 Enter 키를 눌러 파일 내에서 검색할 수 있습니다.

가장 먼저 살펴볼 항목 중 하나는 fail2ban 정책이 적용되지 않는 클라이언트 목록입니다. 이것은 ignoreip 지시문에 의해 설정됩니다. 자신을 잠그지 않으려면 자신의 IP 주소나 네트워크를 예외 목록에 추가하는 것이 좋은 경우가 있습니다. 이것은 SSH보다 웹 서버 로그인의 문제가 적습니다. 쉘 액세스를 유지할 수 있다면 언제든지 금지를 되돌릴 수 있기 때문입니다. 이 행의 주석을 제거하고 공백으로 구분된 추가 IP 주소 또는 네트워크를 기존 목록에 추가할 수 있습니다.

[DEFAULT]

. . .
#ignoreip = 127.0.0.1/8 your_home_IP

조정할 수 있는 또 다른 항목은 밴타임으로, 문제를 일으키는 회원이 몇 초 동안 금지되는지 제어합니다. 이 시간은 악의적이고 자동화된 노력을 방해할 만큼 충분히 길게 설정하는 동시에 사용자가 실수를 수정할 수 있을 만큼 짧게 설정하는 것이 이상적입니다. 기본적으로 이 시간은 10분으로 설정됩니다. 이 값을 늘리거나 줄일 수 있습니다.

[DEFAULT]

. . .
bantime = 10m

다음 두 항목은 잘못된 클라이언트를 결정하는 데 사용되는 로그 라인의 범위를 결정합니다. findtime은 시간을 초 단위로 지정하고 maxretry 지시문은 해당 시간 내에 허용되는 시도 횟수를 나타냅니다. 클라이언트가 findtime에 설정된 시간 내에 maxretry번 이상 시도하면 차단됩니다.

[DEFAULT]

. . .
findtime = 10m
maxretry = 5

action 매개변수는 Fail2ban이 차단을 시작하려고 할 때 취하는 조치를 구성합니다. action_ 값은 파일에서 이 매개변수 바로 전에 정의됩니다. 기본 조치는 차단 시간이 경과할 때까지 위반 호스트의 트래픽을 거부하도록 방화벽 구성을 업데이트하는 것입니다.

[DEFAULT]
. . .
action = $(action_)s
. . .

&#36 (action_)를 위와 교체할 수 있는 다른 action_ 스크립트가 기본적으로 제공됩니다.

…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

다음 단계에서는 Nginx 관련 구성으로 이동합니다.

2단계 – Nginx 로그를 모니터링하도록 Fail2Ban 구성

이제 몇 가지 일반 fail2ban 설정이 완료되었으므로 웹 서버 로그에서 특정 패턴을 모니터링하는 일부 Nginx 전용 감옥을 활성화할 수 있습니다.

구성 파일 내의 각 감옥은 대괄호 안에 감옥 이름이 포함된 헤더로 표시됩니다. [DEFAULT] 섹션을 제외한 모든 섹션은 특정 감옥의 구성을 나타냅니다. 기본적으로 [ssh] 감옥만 활성화되어 있습니다.

Nginx 로그인 시도에 대한 로그 모니터링을 활성화하려면 [nginx-http-auth] 감옥을 활성화하십시오. 이 섹션에 enabled = true 지시문을 추가합니다.

…
[nginx-http-auth]

enabled  = true
port     = http,https
logpath = %(nginx_error_log)s
. . .

수정을 마쳤으면 파일을 저장하고 닫습니다. nano를 사용하는 경우 Ctrl+X를 누른 다음 메시지가 표시되면 Y를 누르고 Enter를 누릅니다. 다음으로 nginx-http-auth에 대한 필터 구성을 검토합니다.

3단계 – Nginx 감옥에 대한 필터 검토

jail.local[nginx-http-auth] 블록에 Nginx에 특정한 규칙이 포함되어 있지 않다는 것을 눈치채셨을 것입니다. 이러한 규칙은 Fail2ban 내부에 자동으로 하드코딩되지 않습니다. 실제로 [nginx-http-auth] 헤더는 Fail2ban의 미리 패키지된 필터의 filter.d 디렉토리 내부에 있는 파일 이름에 직접 대응합니다. . 이 디렉터리의 내용을 나열하면 사용 가능한 다른 미리 패키지된 필터를 볼 수 있으며 필요한 경우 사용할 수 있습니다.

  1. ls /etc/fail2ban/filter.d
Output
3proxy.conf freeswitch.conf proftpd.conf apache-auth.conf froxlor-auth.conf pure-ftpd.conf apache-badbots.conf gitlab.conf qmail.conf apache-botsearch.conf grafana.conf recidive.conf apache-common.conf groupoffice.conf roundcube-auth.conf apache-fakegooglebot.conf gssftpd.conf scanlogd.conf apache-modsecurity.conf guacamole.conf screensharingd.conf apache-nohome.conf haproxy-http-auth.conf selinux-common.conf apache-noscript.conf horde.conf selinux-ssh.conf apache-overflows.conf ignorecommands sendmail-auth.conf apache-pass.conf kerio.conf sendmail-reject.conf apache-shellshock.conf lighttpd-auth.conf sieve.conf assp.conf mongodb-auth.conf slapd.conf asterisk.conf monit.conf softethervpn.conf bitwarden.conf murmur.conf sogo-auth.conf …

지금은 nginx-http-auth.conf를 살펴보십시오.

  1. cat /etc/fail2ban/filter.d/nginx-http-auth.conf
Output
# fail2ban filter configuration for nginx [Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$ ignoreregex = datepattern = {^LN-BEG} …

이러한 파일에는 로그의 한 줄이 실패한 인증 시도인지 여부를 결정하는 정규식(텍스트 구문 분석의 일반적인 속기)이 포함되어 있습니다. 필요에 따라 직접 수정할 수 있습니다.

다음 단계에서는 Fail2ban을 활성화하고 테스트합니다.

4단계 – Nginx 감옥 활성화

이 시점에서 지금부터 자동으로 실행되도록 Fail2ban 서비스를 활성화할 수 있습니다. 먼저 systemctl enable을 실행합니다.

  1. sudo systemctl enable fail2ban

그런 다음 systemctl start를 사용하여 처음으로 수동으로 시작합니다.

  1. sudo systemctl start fail2ban

systemctl status로 실행 중인지 확인할 수 있습니다.

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 22h ago Docs: man:fail2ban(1) Main PID: 5962 (fail2ban-server) Tasks: 7 (limit: 2327) Memory: 12.6M CPU: 195ms CGroup: /system.slice/fail2ban.service └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

참고: 향후 구성 변경을 구현하려면 fail2ban 서비스를 다시 시작해야 합니다. sudo systemctl restart fail2ban을 사용하여 이를 수행할 수 있습니다.

활성화된 감옥에 대한 정보 얻기

fail2ban-client 명령을 사용하여 활성화된 모든 감옥을 볼 수 있습니다.

  1. sudo fail2ban-client status

활성화된 감옥 목록이 표시되어야 합니다.

Output
Status |- Number of jail: 2 `- Jail list: nginx-http-auth, sshd

한 감옥에서 시행 중인 금지에 대한 세부 정보를 보려면 fail2ban-client를 다시 사용하십시오.

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

이 튜토리얼의 마지막 단계에서는 Fail2ban 구성이 작동하는지 확인하기 위해 의도적으로 차단을 테스트합니다.

5단계 – Fail2Ban 정책 테스트

Fail2ban 정책을 테스트하여 예상대로 트래픽을 차단하는지 확인하는 것이 중요합니다. 이렇게 하려면 로컬 웹 브라우저에서 서버로 이동합니다. Nginx 인증 프롬프트에서 잘못된 자격 증명을 반복해서 입력합니다. 여러 번 시도한 후 연결이 끊어진 것처럼 서버가 응답을 완전히 중지해야 합니다.

fail2ban-clientnginx-http-auth 구성의 상태를 보면 사이트에서 금지된 IP 주소를 볼 수 있습니다.

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- File list: /var/log/nginx/error.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 108.172.85.62

규칙이 작동하는 것에 만족하면 다음을 입력하여 fail2ban-client를 사용하여 수동으로 IP 주소 차단을 해제할 수 있습니다.

  1. sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62

이제 인증을 다시 시도할 수 있습니다.

결론

Fail2ban은 특정 보안 요구 사항에 맞는 정책을 구성할 수 있는 상당한 유연성을 제공합니다. /etc/fail2ban/jail.local 파일 내 변수 및 패턴과 /etc/fail2ban/filter.d 내 종속 파일을 살펴봄으로써 및 /etc/fail2ban/action.d 디렉토리에서 필요에 따라 조정하고 변경할 많은 부분을 찾을 수 있습니다. fail2ban으로 서버를 보호하면 유용한 보안 기준을 제공할 수 있습니다.

fail2ban을 사용하는 더 많은 방법을 알아보려면 Rocky Linux 9에서 Fail2Ban으로 SSH를 보호하는 방법을 확인하십시오.