Ubuntu 14.04에서 Fail2Ban으로 Nginx 서버를 보호하는 방법
소개
웹 서버를 운영할 때 사이트와 사용자를 보호하기 위한 보안 조치를 구현하는 것이 중요합니다. 방화벽 정책으로 웹 사이트와 애플리케이션을 보호하고 암호 인증으로 특정 영역에 대한 액세스를 제한하는 것은 시스템 보안의 훌륭한 출발점입니다. 그러나 공개적으로 액세스할 수 있는 암호 프롬프트는 악의적인 사용자와 봇의 무차별 대입 시도를 유도할 수 있습니다.
fail2ban
을 설정하면 이 문제를 완화하는 데 도움이 될 수 있습니다. 사용자가 반복적으로 서비스 인증에 실패하거나 다른 의심스러운 활동에 참여하는 경우 fail2ban
은 실행 중인 방화벽 정책을 동적으로 수정하여 잘못된 IP 주소를 일시적으로 차단할 수 있습니다. 각 fail2ban
"jail\은 실패한 시도를 나타내는 패턴에 대해 서비스에서 작성한 로그를 확인하여 작동합니다. Nginx 로그를 모니터링하도록 fail2ban
을 설정하는 것은 다음 중 일부를 사용하여 상당히 쉽습니다. 포함된 구성 필터와 일부는 직접 만들 것입니다.
이 가이드에서는 fail2ban
을 설치하고 침입 시도에 대해 Nginx 로그를 모니터링하도록 구성하는 방법을 보여줍니다. Ubuntu 14.04 서버를 사용합니다.
전제 조건
시작하기 전에 루트가 아닌 계정으로 Ubuntu 14.04 서버를 설정해야 합니다. 관리 명령을 실행하려면 이 계정을 sudo
권한으로 구성해야 합니다. sudo
권한으로 사용자를 설정하는 방법을 알아보려면 Ubuntu 14.04용 초기 서버 설정 가이드를 따르세요.
Nginx 설치 및 암호 인증 구성
fail2ban
으로 Nginx 서버를 보호하는 데 관심이 있다면 이미 서버를 설정하고 실행 중일 수 있습니다. 그렇지 않은 경우 apt
를 사용하여 Ubuntu의 기본 리포지토리에서 Nginx를 설치할 수 있습니다.
로컬 패키지 색인을 업데이트하고 다음을 입력하여 설치합니다.
- sudo apt-get update
- sudo apt-get install nginx
fail2ban
서비스는 로그인 진입점을 보호하는 데 유용합니다. 이것이 Nginx 설치에 유용하려면 최소한 서버에 있는 콘텐츠의 하위 집합에 대해 암호 인증을 구현해야 합니다. 이 가이드에 따라 Nginx 서버에 대한 암호 보호를 구성할 수 있습니다.
Fail2Ban 설치
Nginx 서버가 실행 중이고 비밀번호 인증이 활성화되면 fail2ban
을 설치할 수 있습니다(이전 단계에서 이미 Nginx를 설정한 경우 여기에 다른 리포지토리 다시 가져오기 포함).
- sudo apt-get update
- sudo apt-get install fail2ban
이렇게 하면 소프트웨어가 설치됩니다. 기본적으로 fail2ban
은 실패한 SSH 로그인 시도만 금지하도록 구성됩니다. 악의적인 활동을 나타내는 패턴에 대해 Nginx 로그를 확인하도록 구성하는 몇 가지 규칙을 활성화해야 합니다.
Fail2Ban 내에서 일반 설정 조정
시작하려면 fail2ban
이 모니터링할 애플리케이션 로그와 문제가 되는 항목이 발견될 때 취할 조치를 결정하는 데 사용하는 구성 파일을 조정해야 합니다. 제공된 /etc/fail2ban/jail.conf
파일은 이를 위해 제공되는 기본 리소스입니다.
수정하려면 이 파일을 /etc/fail2ban/jail.local
에 복사해야 합니다. 이렇게 하면 패키지 업데이트가 새 기본 파일을 제공하는 경우 변경 사항을 덮어쓰는 것을 방지할 수 있습니다.
- sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Nginx 로그 모니터링을 설정할 수 있도록 새로 복사한 파일을 엽니다.
- sudo nano /etc/fail2ban/jail.local
기본값 변경
파일 내에 설정된 기본값을 평가하여 필요에 맞는지 확인하는 것으로 시작해야 합니다. 파일 내의 [DEFAULT]
섹션에서 찾을 수 있습니다. 이러한 항목은 일반 정책을 설정하고 각각 특정 감옥에서 무시할 수 있습니다.
가장 먼저 살펴볼 항목 중 하나는 fail2ban
정책이 적용되지 않는 클라이언트 목록입니다. 이것은 ignoreip
지시문에 의해 설정됩니다. 자신을 잠그지 않으려면 자신의 IP 주소나 네트워크를 예외 목록에 추가하는 것이 좋은 경우가 있습니다. 금지를 수동으로 되돌릴 수 있기 때문에 쉘 액세스를 유지할 수 있는 경우 웹 서버 로그인에 대한 문제는 적습니다. 공백으로 구분된 추가 IP 주소 또는 네트워크를 기존 목록에 추가할 수 있습니다.
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP
조정할 수 있는 또 다른 항목은 밴타임
으로, 문제를 일으키는 회원이 몇 초 동안 금지되는지 제어합니다. 합법적인 사용자가 실수를 바로잡을 수 있도록 충분히 짧게 설정하면서 악의적인 행위자의 노력을 방해할 수 있을 만큼 충분히 긴 시간으로 설정하는 것이 이상적입니다. 기본적으로 이 값은 600초(10분)로 설정됩니다. 필요에 따라 이 값을 높이거나 낮춥니다.
[DEFAULT]
. . .
bantime = 3600
다음 두 항목은 잘못된 클라이언트를 결정하는 데 사용되는 로그 라인의 범위를 결정합니다. findtime
은 시간을 초 단위로 지정하고 maxretry
지시문은 해당 시간 내에 허용되는 시도 횟수를 나타냅니다. 클라이언트가 findtime
에 설정된 시간 내에 maxretry
번 이상 시도하면 차단됩니다.
[DEFAULT]
. . .
findtime = 3600 # These lines combine to ban clients that fail
maxretry = 6 # to authenticate 6 times within a half hour.
메일 알림 설정(선택 사항)
차단이 발생할 때마다 메일을 받으려면 이메일 알림을 활성화할 수 있습니다. 이렇게 하려면 먼저 이메일을 보낼 수 있도록 서버에 MTA를 설정해야 합니다. 이 작업에 Postfix를 사용하는 방법을 배우려면 이 가이드를 따르십시오.
MTA를 설정했으면 /etc/fail2ban/jail.local
파일의 [DEFAULT]
섹션에서 몇 가지 추가 설정을 조정해야 합니다. mta
지시문을 설정하여 시작하십시오. 위의 튜토리얼처럼 Postfix를 설정했다면 이 값을 "mail”로 변경하세요.
[DEFAULT]
. . .
mta = mail
알림을 받을 이메일 주소를 선택해야 합니다. 이 값으로 destemail
지시문을 수정합니다. sendername
지시문을 사용하여 알림 이메일의 "Sender\ 필드를 수정할 수 있습니다.
[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts
fail2ban
용어에서 "액션\은 클라이언트가 너무 많이 인증에 실패할 때 따르는 절차입니다. 기본 조치(action_
라고 함)는 단순히 IP 주소를 차단하는 것입니다. 해당 포트에서 그러나 메일을 설정한 경우 사용할 수 있는 다른 두 가지 미리 만들어진 작업이 있습니다.
action_mw
작업을 사용하여 클라이언트를 차단하고 위반 주소에 대한 "whois\ 보고서와 함께 구성된 계정으로 이메일 알림을 보낼 수 있습니다. action_mwl
를 사용할 수도 있습니다. 조치, 동일한 작업을 수행하지만 금지를 트리거한 잘못된 로그 행도 포함합니다.
[DEFAULT]
. . .
action = %(action_mwl)s
Nginx 로그를 모니터링하도록 Fail2Ban 구성
이제 몇 가지 일반 fail2ban
설정이 완료되었으므로 특정 동작 패턴에 대해 웹 서버 로그를 모니터링하는 일부 Nginx 전용 감옥을 활성화하는 데 집중할 수 있습니다.
구성 파일 내의 각 감옥은 대괄호 안에 감옥 이름이 포함된 헤더로 표시됩니다([DEFAULT]
섹션을 제외한 모든 섹션은 특정 감옥의 구성을 나타냄). 기본적으로 [ssh]
감옥만 활성화되어 있습니다.
Nginx 로그인 시도에 대한 로그 모니터링을 활성화하려면 [nginx-http-auth]
감옥을 활성화합니다. "true\가 되도록 이 섹션 내에서 enabled
지시문을 편집합니다.
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
. . .
Ubuntu의 fail2ban
패키지에 포함된 유일한 Nginx 전용 감옥입니다. 그러나 추가 기능을 추가하기 위해 자체 감옥을 만들 수 있습니다. 이러한 추가 감옥에 대한 영감과 구현 세부 사항 중 일부는 여기에서 나왔습니다.
[nginx-noscript]
감옥을 만들어 웹 사이트에서 실행 및 악용할 스크립트를 검색하는 클라이언트를 금지할 수 있습니다. 웹 서버와 함께 PHP 또는 다른 언어를 사용하지 않는 경우 이 감옥을 추가하여 이러한 유형의 리소스를 요청하는 사람들을 금지할 수 있습니다.
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
. . .
알려진 악성 봇 요청 패턴을 중지하기 위해 [nginx-badbots]
라는 섹션을 추가할 수 있습니다.
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
Nginx를 사용하여 사용자의 홈 디렉토리 내 웹 콘텐츠에 대한 액세스를 제공하지 않는 경우 [nginx-nohome]
감옥을 추가하여 이러한 리소스를 요청하는 사용자를 차단할 수 있습니다.
[nginx-nohome]
enabled = true
port = http,https
filter = nginx-nohome
logpath = /var/log/nginx/access.log
maxretry = 2
Nginx 서버를 개방형 프록시로 사용하려는 클라이언트를 금지해야 합니다. 이러한 요청과 일치하도록 [nginx-noproxy]
감옥을 추가할 수 있습니다.
[nginx-noproxy]
enabled = true
port = http,https
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2
필요한 수정 작업을 마치면 파일을 저장하고 닫습니다. 이제 우리가 만든 감옥에 대한 필터를 추가해야 합니다.
추가 Nginx 감옥에 대한 필터 추가
우리는 /etc/fail2ban/jail.local
파일을 몇 가지 추가 감옥 사양으로 업데이트하여 더 넓은 범위의 나쁜 행동을 일치시키고 금지했습니다. 우리가 만든 감옥에 대한 필터 파일을 만들어야 합니다. 이러한 필터 파일은 Nginx 로그 내에서 찾을 패턴을 지정합니다.
필터 디렉토리로 변경하여 시작하십시오.
- cd /etc/fail2ban/filter.d
실제로 추가 로그인 실패 로그 패턴과 일치하도록 사전 제공된 Nginx 인증 필터를 조정하여 시작하려고 합니다. 편집할 파일을 엽니다.
- sudo nano nginx-http-auth.conf
failregex
사양 아래에 추가 패턴을 추가합니다. 사용자가 사용자 이름이나 비밀번호를 입력하지 않은 행과 일치합니다.
[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
ignoreregex =
완료되면 파일을 저장하고 닫습니다.
다음으로 Nginx와 함께 사용할 apache-badbots.conf
파일을 복사할 수 있습니다. 이 파일을 있는 그대로 사용할 수 있지만 명확성을 위해 새 이름으로 복사합니다. 이는 감옥 구성 내에서 필터를 참조한 방법과 일치합니다.
- sudo cp apache-badbots.conf nginx-badbots.conf
다음으로 [nginx-noscript]
감옥에 대한 필터를 만듭니다.
- sudo nano nginx-noscript.conf
내부에 다음 정의를 붙여넣습니다. 서버에서 합법적으로 사용하는 언어 파일을 제거하거나 추가 접미사를 추가하려면 스크립트 접미사를 자유롭게 조정하십시오.
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
파일을 저장하고 닫습니다.
다음으로 [nginx-nohome]
감옥에 대한 필터를 만듭니다.
- sudo nano nginx-nohome.conf
다음 필터 정보를 파일에 넣습니다.
[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
완료되면 파일을 저장하고 닫습니다.
마지막으로 [nginx-noproxy]
감옥에 대한 필터를 만들 수 있습니다.
- sudo nano nginx-noproxy.conf
이 필터 정의는 서버를 프록시로 사용하려는 시도와 일치합니다.
[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =
완료되면 파일을 저장하고 닫습니다.
Nginx 감옥 활성화
구성 변경을 구현하려면 fail2ban
서비스를 다시 시작해야 합니다. 다음을 입력하면 됩니다.
- sudo service fail2ban restart
구성한 다른 차단 정책을 구현하여 서비스를 다시 시작해야 합니다.
활성화된 감옥에 대한 정보 얻기
fail2ban-client
명령을 사용하여 활성화된 모든 감옥을 볼 수 있습니다.
- sudo fail2ban-client status
활성화한 모든 감옥 목록이 표시됩니다.
OutputStatus
|- Number of jail: 6
`- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh
iptables
에서 fail2ban
이 방화벽 규칙을 수정하여 클라이언트 차단을 위한 프레임워크를 생성했는지 확인할 수 있습니다. 이전 방화벽 규칙이 없더라도 이제 fail2ban
이 클라이언트를 특수 제작된 체인에 추가하여 클라이언트를 선택적으로 금지할 수 있는 프레임워크를 사용할 수 있습니다.
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-badbots
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-nohome
-N fail2ban-nginx-noproxy
-N fail2ban-nginx-noscript
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-nginx-nohome -j RETURN
-A fail2ban-nginx-noproxy -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-ssh -j RETURN
어떤 감옥에서 시행 중인 차단에 대한 세부 정보를 보려면 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 정책 테스트
fail2ban
정책을 테스트하여 예상대로 트래픽을 차단하는지 확인하는 것이 중요합니다. 예를 들어 Nginx 인증 프롬프트의 경우 잘못된 자격 증명을 여러 번 제공할 수 있습니다. 한도를 초과하면 차단되고 사이트에 액세스할 수 없습니다. 이메일 알림을 설정하면 제공한 이메일 계정에서 차단에 관한 메시지를 볼 수 있습니다.
fail2ban-client
명령으로 상태를 보면 사이트에서 차단된 IP 주소를 볼 수 있습니다.
- 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: 12
`- action
|- Currently banned: 1
| `- IP list: 111.111.111.111
`- Total banned: 1
규칙이 작동하는 것에 만족하면 다음을 입력하여 fail2ban-client
를 사용하여 수동으로 IP 주소 차단을 해제할 수 있습니다.
- sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111
이제 인증을 다시 시도할 수 있습니다.
결론
Nginx 서버를 보호하기 위해 fail2ban
을 설정하는 것은 가장 간단한 경우에 매우 간단합니다. 그러나 fail2ban
은 특정 보안 요구 사항에 맞는 정책을 구성할 수 있는 상당한 유연성을 제공합니다. /etc/fail2ban/jail.local
파일 내 변수 및 패턴과 /etc/fail2ban/filter.d
내 종속 파일을 살펴봄으로써 및 /etc/fail2ban/action.d
디렉토리에서 필요에 따라 조정하고 변경할 많은 부분을 찾을 수 있습니다. fail2ban
으로 서버를 보호하는 방법의 기본 사항을 학습하면 최소한의 노력으로 많은 보안을 제공할 수 있습니다.
fail2ban
에 대해 자세히 알아보려면 다음 링크를 확인하세요.
- Fail2Ban이 Linux 서버에서 서비스를 보호하는 방법
- Ubuntu 14.04에서 Fail2Ban으로 SSH를 보호하는 방법
- Ubuntu 14.04에서 Fail2Ban으로 Apache 서버를 보호하는 방법