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를 설치할 수 있습니다.
로컬 패키지 색인을 업데이트하고 다음을 입력하여 설치합니다.
- sudo apt-get update
- sudo apt-get install apache2
fail2ban
서비스는 로그인 진입점을 보호하는 데 유용합니다. 이것이 Apache 설치에 유용하려면 최소한 서버에 있는 콘텐츠의 하위 집합에 대해 암호 인증을 구현해야 합니다. 이 가이드에 따라 Apache 서버에 대한 암호 보호를 구성할 수 있습니다.
Fail2Ban 설치
Apache 서버가 실행 중이고 비밀번호 인증이 활성화되면 계속해서 fail2ban
을 설치할 수 있습니다(이전 단계에서 이미 Apache를 설정한 경우 여기에 다른 리포지토리 다시 가져오기 포함).
- sudo apt-get update
- sudo apt-get install fail2ban
이렇게 하면 소프트웨어가 설치됩니다. 기본적으로 fail2ban
은 실패한 SSH 로그인 시도만 금지하도록 구성됩니다. 악의적인 활동을 나타내는 패턴에 대해 Apache 로그를 확인하도록 구성하는 몇 가지 규칙을 활성화해야 합니다.
Fail2Ban 내에서 일반 설정 조정
시작하려면 fail2ban
이 모니터링할 애플리케이션 로그와 문제가 되는 항목이 발견될 때 취할 조치를 결정하는 데 사용하는 구성 파일을 조정해야 합니다. 제공된 /etc/fail2ban/jail.conf
파일은 이를 위해 제공되는 기본 리소스입니다.
수정하려면 이 파일을 /etc/fail2ban/jail.local
에 복사해야 합니다. 이렇게 하면 패키지 업데이트가 새 기본 파일을 제공하는 경우 변경 사항을 덮어쓰는 것을 방지할 수 있습니다.
- sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Apache 로그 모니터링을 설정할 수 있도록 새로 복사한 파일을 엽니다.
- 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
서비스를 다시 시작해야 합니다. 다음을 입력하면 됩니다.
- sudo service fail2ban restart
구성한 다른 차단 정책을 구현하여 서비스를 다시 시작해야 합니다.
활성화된 감옥에 대한 정보 얻기
fail2ban-client
명령을 사용하여 활성화된 모든 감옥을 볼 수 있습니다.
- sudo fail2ban-client status
활성화한 모든 감옥 목록이 표시됩니다.
OutputStatus
|- Number of jail: 7
`- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache
fail2ban
이 방화벽 규칙을 수정하여 클라이언트 차단을 위한 프레임워크를 생성한 것을 볼 수 있습니다. 이전 방화벽 규칙이 없더라도 이제 fail2ban
이 클라이언트를 특수 제작된 체인에 추가하여 클라이언트를 선택적으로 금지할 수 있는 프레임워크를 사용할 수 있습니다.
- 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
를 다시 사용하는 것이 더 쉬울 것입니다.
- sudo fail2ban-client status apache
OutputStatus 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 주소를 볼 수 있습니다.
- sudo fail2ban-client status apache
OutputStatus 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 주소 차단을 해제할 수 있습니다.
- 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 서버를 보호하는 방법