웹사이트 검색

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를 설치할 수 있습니다.

로컬 패키지 색인을 업데이트하고 다음을 입력하여 설치합니다.

  1. sudo apt-get update
  2. sudo apt-get install nginx

fail2ban 서비스는 로그인 진입점을 보호하는 데 유용합니다. 이것이 Nginx 설치에 유용하려면 최소한 서버에 있는 콘텐츠의 하위 집합에 대해 암호 인증을 구현해야 합니다. 이 가이드에 따라 Nginx 서버에 대한 암호 보호를 구성할 수 있습니다.

Fail2Ban 설치

Nginx 서버가 실행 중이고 비밀번호 인증이 활성화되면 fail2ban을 설치할 수 있습니다(이전 단계에서 이미 Nginx를 설정한 경우 여기에 다른 리포지토리 다시 가져오기 포함).

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

이렇게 하면 소프트웨어가 설치됩니다. 기본적으로 fail2ban은 실패한 SSH 로그인 시도만 금지하도록 구성됩니다. 악의적인 활동을 나타내는 패턴에 대해 Nginx 로그를 확인하도록 구성하는 몇 가지 규칙을 활성화해야 합니다.

Fail2Ban 내에서 일반 설정 조정

시작하려면 fail2ban이 모니터링할 애플리케이션 로그와 문제가 되는 항목이 발견될 때 취할 조치를 결정하는 데 사용하는 구성 파일을 조정해야 합니다. 제공된 /etc/fail2ban/jail.conf 파일은 이를 위해 제공되는 기본 리소스입니다.

수정하려면 이 파일을 /etc/fail2ban/jail.local에 복사해야 합니다. 이렇게 하면 패키지 업데이트가 새 기본 파일을 제공하는 경우 변경 사항을 덮어쓰는 것을 방지할 수 있습니다.

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

Nginx 로그 모니터링을 설정할 수 있도록 새로 복사한 파일을 엽니다.

  1. 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 로그 내에서 찾을 패턴을 지정합니다.

필터 디렉토리로 변경하여 시작하십시오.

  1. cd /etc/fail2ban/filter.d

실제로 추가 로그인 실패 로그 패턴과 일치하도록 사전 제공된 Nginx 인증 필터를 조정하여 시작하려고 합니다. 편집할 파일을 엽니다.

  1. 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 파일을 복사할 수 있습니다. 이 파일을 있는 그대로 사용할 수 있지만 명확성을 위해 새 이름으로 복사합니다. 이는 감옥 구성 내에서 필터를 참조한 방법과 일치합니다.

  1. sudo cp apache-badbots.conf nginx-badbots.conf

다음으로 [nginx-noscript] 감옥에 대한 필터를 만듭니다.

  1. sudo nano nginx-noscript.conf

내부에 다음 정의를 붙여넣습니다. 서버에서 합법적으로 사용하는 언어 파일을 제거하거나 추가 접미사를 추가하려면 스크립트 접미사를 자유롭게 조정하십시오.

[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

파일을 저장하고 닫습니다.

다음으로 [nginx-nohome] 감옥에 대한 필터를 만듭니다.

  1. sudo nano nginx-nohome.conf

다음 필터 정보를 파일에 넣습니다.

[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

완료되면 파일을 저장하고 닫습니다.

마지막으로 [nginx-noproxy] 감옥에 대한 필터를 만들 수 있습니다.

  1. sudo nano nginx-noproxy.conf

이 필터 정의는 서버를 프록시로 사용하려는 시도와 일치합니다.

[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

완료되면 파일을 저장하고 닫습니다.

Nginx 감옥 활성화

구성 변경을 구현하려면 fail2ban 서비스를 다시 시작해야 합니다. 다음을 입력하면 됩니다.

  1. sudo service fail2ban restart

구성한 다른 차단 정책을 구현하여 서비스를 다시 시작해야 합니다.

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

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

  1. sudo fail2ban-client status

활성화한 모든 감옥 목록이 표시됩니다.

Output
Status |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

iptables에서 fail2ban이 방화벽 규칙을 수정하여 클라이언트 차단을 위한 프레임워크를 생성했는지 확인할 수 있습니다. 이전 방화벽 규칙이 없더라도 이제 fail2ban이 클라이언트를 특수 제작된 체인에 추가하여 클라이언트를 선택적으로 금지할 수 있는 프레임워크를 사용할 수 있습니다.

  1. 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를 다시 사용하는 것이 더 쉬울 것입니다.

  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 정책 테스트

fail2ban 정책을 테스트하여 예상대로 트래픽을 차단하는지 확인하는 것이 중요합니다. 예를 들어 Nginx 인증 프롬프트의 경우 잘못된 자격 증명을 여러 번 제공할 수 있습니다. 한도를 초과하면 차단되고 사이트에 액세스할 수 없습니다. 이메일 알림을 설정하면 제공한 이메일 계정에서 차단에 관한 메시지를 볼 수 있습니다.

fail2ban-client 명령으로 상태를 보면 사이트에서 차단된 IP 주소를 볼 수 있습니다.

  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: 12 `- action |- Currently banned: 1 | `- IP list: 111.111.111.111 `- Total banned: 1

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

  1. 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 서버를 보호하는 방법