웹사이트 검색

Ubuntu 14.04에서 Fail2Ban으로 Apache 서버를 보호하는 방법


소개

웹 서버를 운영할 때 사이트와 사용자를 보호하기 위한 보안 조치를 구현하는 것이 중요합니다. 방화벽 정책으로 웹 사이트와 애플리케이션을 보호하고 암호 인증으로 특정 영역에 대한 액세스를 제한하는 것은 시스템 보안의 훌륭한 출발점입니다. 그러나 공개적으로 액세스할 수 있는 암호 프롬프트는 악의적인 사용자와 봇의 무차별 대입 시도를 유도할 수 있습니다.

fail2ban을 설정하면 이 문제를 완화하는 데 도움이 될 수 있습니다. 사용자가 반복적으로 서비스 인증에 실패하거나 다른 의심스러운 활동에 참여하는 경우 fail2ban은 실행 중인 방화벽 정책을 동적으로 수정하여 잘못된 IP 주소를 일시적으로 차단할 수 있습니다. 각 fail2ban "jail\은 실패한 시도를 나타내는 패턴에 대해 서비스에서 작성한 로그를 확인하여 작동합니다. Apache 로그를 모니터링하도록 fail2ban을 설정하는 것은 포함된 구성 필터를 사용하여 쉽습니다. .

이 가이드에서는 fail2ban을 설치하고 침입 시도에 대해 Apache 로그를 모니터링하도록 구성하는 방법을 보여줍니다. Ubuntu 14.04 서버를 사용합니다.

전제 조건

시작하기 전에 루트가 아닌 계정으로 Ubuntu 14.04 서버를 설정해야 합니다. 관리 명령을 실행하려면 이 계정을 sudo 권한으로 구성해야 합니다. sudo 권한으로 사용자를 설정하는 방법을 알아보려면 Ubuntu 14.04용 초기 서버 설정 가이드를 따르세요.

Apache 설치 및 암호 인증 구성

fail2ban으로 Apache 서버를 보호하는 데 관심이 있다면 이미 서버를 설정하고 실행 중일 수 있습니다. 그렇지 않은 경우 apt를 사용하여 Ubuntu의 기본 리포지토리에서 Apache를 설치할 수 있습니다.

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

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

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

Fail2Ban 설치

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

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

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

Fail2Ban 내에서 일반 설정 조정

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

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

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

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

  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

Apache 로그를 모니터링하도록 Fail2Ban 구성

이제 몇 가지 일반 fail2ban 설정이 있으므로 특정 동작 패턴에 대해 웹 서버 로그를 모니터링하는 Apache 전용 감옥을 활성화하는 데 집중할 수 있습니다.

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

Apache 로그인 시도에 대한 로그 모니터링을 활성화하기 위해 [apache] 감옥을 활성화합니다. "true\가 되도록 이 섹션 내에서 enabled 지시문을 편집합니다.

[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6
. . .

Apache 서버가 기본 로그 위치(/var/log/apache/error.log)에 기록하는 경우 감옥은 이미 올바른 위치를 찾도록 구성되어 있습니다. 다른 위치에 로그인하는 경우 필요에 따라 logpath를 수정합니다. 또한 이 특정 감옥에 대해 다른 제한을 설정하려면 maxretry 지시문을 조정하거나 이 감옥에 대한 findtime 값을 추가하십시오.

[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .

위의 감옥은 기본 인증 실패 금지를 처리합니다. 활성화할 가치가 있는 미리 구성된 다른 감옥도 있습니다( [apache-multiport] 감옥은 필요하지 않은 레거시 감옥입니다).

[apache-noscript] 감옥은 웹 사이트에서 실행 및 악용할 스크립트를 검색하는 클라이언트를 금지하는 데 사용됩니다. 웹 서버와 함께 PHP 또는 다른 언어를 사용하지 않는 경우 이 감옥을 활성화하여 이러한 유형의 리소스를 요청하는 사람들을 금지할 수 있습니다.

[apache-noscript]

enabled  = true
. . .

[apache-overflows] 감옥은 비정상적으로 길고 의심스러운 URL을 요청하려는 클라이언트를 차단하는 데 사용됩니다. 이는 종종 버퍼 오버플로를 트리거하여 Apache를 악용하려는 시도의 징후입니다. 이러한 유형의 공격을 방지하려면 이 감옥을 활성화할 수 있습니다.

[apache-overflows]

enabled  = true
. . .

[apache-overflows] 항목을 복사하여 붙여넣고 약간 수정하여 일부 추가 검사를 수행할 수 있습니다. 예를 들어 해당 섹션을 복사하여 붙여넣고 감옥 이름과 필터를 apache-badbots로 수정하여 일부 알려진 악성 봇 요청 패턴을 중지할 수 있습니다.

[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

Apache를 사용하여 사용자의 홈 디렉토리 내 웹 콘텐츠에 대한 액세스를 제공하지 않는 경우 다시 복사하여 붙여넣고 감옥 및 필터 이름을 apache-nohome으로 변경할 수 있습니다.

[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-nohome]

enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

마지막으로 PHP와 함께 Apache를 사용하는 경우 악의적인 목적으로 특정 PHP 동작을 사용하려는 시도를 차단하는 [php-url-fopen] 감옥을 활성화할 수 있습니다. 올바른 액세스 로그 위치를 가리키도록 logpath 지시문을 변경해야 할 수 있습니다(Ubuntu에서 기본 위치는 /var/log/apache2/access.log임). 다른 감옥의 오류 로그와 일치하는 패턴과 유사한 패턴을 사용할 수 있습니다.

[php-url-fopen]

enabled = true
port    = http,https
filter  = php-url-fopen
logpath = /var/log/apache*/*access.log

필요한 수정 작업을 마치면 파일을 저장하고 닫습니다.

Apache 감옥 구현

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

  1. sudo service fail2ban restart

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

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

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

  1. sudo fail2ban-client status

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

Output
Status |- Number of jail: 7 `- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache

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

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-apache -N fail2ban-apache-badbots -N fail2ban-apache-nohome -N fail2ban-apache-noscript -N fail2ban-apache-overflows -N fail2ban-php-url-fopen -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-apache -j RETURN -A fail2ban-apache-badbots -j RETURN -A fail2ban-apache-nohome -j RETURN -A fail2ban-apache-noscript -j RETURN -A fail2ban-apache-overflows -j RETURN -A fail2ban-php-url-fopen -j RETURN -A fail2ban-ssh -j RETURN

어떤 감옥에서 시행 중인 차단에 대한 세부 정보를 보려면 fail2ban-client를 다시 사용하는 것이 더 쉬울 것입니다.

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

Fail2Ban 정책 테스트

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

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

  1. sudo fail2ban-client status apache
Output
Status for the jail: apache |- filter | |- File list: /var/log/apache2/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 apache unbanip 111.111.111.111

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

결론

Apache 서버를 보호하기 위해 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으로 Nginx 서버를 보호하는 방법