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
를 사용하여 리포지토리를 추가할 수 있습니다.
- sudo dnf install epel-release -y
dnf
패키지 관리자는 이제 새 소프트웨어를 설치할 때 기본 패키지 소스 외에 EPEL을 확인합니다. Fail2ban 설치를 진행합니다.
- sudo dnf install fail2ban -y
Fail2ban은 설치 후 자동으로 백그라운드 서비스를 설정합니다. 그러나 일부 기본 설정으로 인해 원하지 않는 결과가 발생할 수 있으므로 기본적으로 비활성화되어 있습니다. systemctl
명령을 사용하여 이를 확인할 수 있습니다.
- 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줄을 인쇄합니다.
- cd /etc/fail2ban
- 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
를 복사하면 됩니다.
- sudo cp jail.conf jail.local
이제 구성 변경을 시작할 수 있습니다. Rocky Linux 9와 함께 제공되는 기본 텍스트 편집기는 vi
입니다. vi
는 매우 강력한 텍스트 편집기이지만 사용 경험이 부족한 사용자에게는 다소 둔감할 수 있습니다. Rocky Linux 9 서버에서 구성 파일을 편집하기 위해 nano
와 같은 보다 사용자 친화적인 편집기를 설치할 수 있습니다.
- sudo dnf install nano -y
이제 nano
를 사용하여 Nginx 구성 파일을 편집할 수 있습니다.
- 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
. . .
$ (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
디렉토리 내부에 있는 파일 이름에 직접 대응합니다. . 이 디렉터리의 내용을 나열하면 사용 가능한 다른 미리 패키지된 필터를 볼 수 있으며 필요한 경우 사용할 수 있습니다.
- ls /etc/fail2ban/filter.d
Output3proxy.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
를 살펴보십시오.
- 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
을 실행합니다.
- sudo systemctl enable fail2ban
그런 다음 systemctl start
를 사용하여 처음으로 수동으로 시작합니다.
- sudo systemctl start fail2ban
systemctl status
로 실행 중인지 확인할 수 있습니다.
- 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
명령을 사용하여 활성화된 모든 감옥을 볼 수 있습니다.
- sudo fail2ban-client status
활성화된 감옥 목록이 표시되어야 합니다.
OutputStatus
|- Number of jail: 2
`- Jail list: nginx-http-auth, sshd
한 감옥에서 시행 중인 금지에 대한 세부 정보를 보려면 fail2ban-client
를 다시 사용하십시오.
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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-client
로 nginx-http-auth
구성의 상태를 보면 사이트에서 금지된 IP 주소를 볼 수 있습니다.
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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 주소 차단을 해제할 수 있습니다.
- 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를 보호하는 방법을 확인하십시오.