WAS/Apache

Apache 웹서버 공격 자동 차단

Lawmin 2024. 8. 30. 10:27

1. fail2ban 설치 (CentOS 7 / fail2ban v0.11.2 기준)

$ sudo ym instsall epel-release
$ sudo yum install fail2ban fail2ban-systemd

 

2. 기본 설정

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

 

3. /etc/fail2ban/jail.local 에 설정 추가

$ sudo vi /etc/fail2ban/jail.local

...
[httpd-dos]
enabled = true
#port = http,https
filter = httpd-dos
logpath = /var/log/httpd/access_log
maxretry = 100
findtime = 10
bantime = 60
action = firewallcmd-rich-rules[port="80,443,8080"]
...

1) 위 설정 예시는 10초동안 100번 반복 접속시 60초 동안, 80/443/8080 포트를 차단하는 설정입니다.

    ※ 여기서 port 는 의미가 없습니다.

2) logpath[로그경로], maxretry[차단할실패반복횟수], findtime[반복횟수체크시간(초)], bantime[차단시간(초)], action[동작] 은 상황에 맞게 변경 필요하며, action은 /etc/fail2ban/action.d 내 동일이름.conf 파일을 참조해서 수정합니다.

 

 

4. /etc/fail2ban/filter.d/httpd-dos.conf 생성

$ sudo vi /etc/fail2ban/filter.d/http-dos.conf

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex =

1) failregex 는 해당 방식으로 로그가 발생할 경우, 실패반복 횟수가 올라가게 됩니다. 로그 포맷에 맞게 적절히 수정해주시면 됩니다. 기본 설정인 경우, 위와 같이 설정하면 됩니다. POST, PUT 등 다른 메소드를 추가하거나, 아예 해당 부분을 삭제해도 무방합니다.

2) logpath[로그경로], maxretry[차단할실패반복횟수], findtime[반복횟수체크시간(초)], bantime[차단시간(초)]은 상황에 맞게 변경 필요하며, action은 /etc/fail2ban/action.d 내 파일이 존재해야 하니 한번 확인해 보세요.

 

5. 서비스 시작

$ sudo systemctl start fail2ban
$ sudo systemctl status fail2ban

 

6. 테스트 : httpd 로 서비스 하는 페이지에 반복 접속해서 잘 차단되는지 확인합니다.

 

7. 확인 방법 (아래와 유사하게 확인 가능합니다.)

$ sudo fail2ban-client status http-dos

Status for the jail: http-dos
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     35
|  `- File list:        /var/log/httpd/access_log
`- Actions
   |- Currently banned: 0
   |- Total banned:     2
   `- Banned IP list: (차단된 IP)

 

또는,

$ sudo tail -f /var/log/fail2ban.log

 

차단 시, firewall 설정 변화 확인 (action[firewallcmd-rich-rules] 에 지정한 대로 rich rules 에 차단 규칙이 등록됨)

$ sudo firewall-cmd --list-all
public (active)
...
  rich rules:
        rule family="ipv4" source address="차단된IP" port port="1-65535" protocol="tcp" reject type="icmp-port-unreachable"
...

 

8. 로그 관련 설정

정상적으로 적용된 것이 확인되었으면, 불필요한 정보성 로그가 쌓이지 않도록 하고, rotation도 고려합니다.

1) 로그 레벨 변경 (INFO[접근/차단/경고/에러 등의 로그 표시] → NOTICE[차단/경고/에러 등의 로그 표시] 등) 

INFO는 로그가 너무 많이 쌓이므로 설정할 때를 제외하고 NOTICE를 추천합니다.

$ sudo vi /etc/fail2ban/fail2ban.conf

...
#loglevel = INFO
loglevel = NOTICE
...

$ sudo systemctl restart fail2ban

 

2) logrotate 수정 (필요 시)

기본적으로 매일 /var/log/fail2ban.log가 적정 크기(1MB 등)로 유지되도록 설정되어 있으나,

7일치 보관하게 변경하려면 아래와 같이 설정해 볼 수 있습니다.

$ sudo vi /etc/logrotate.d/fail2ban

/var/log/fail2ban.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    postrotate
	  fail2ban-client flushlogs 1>/dev/null
    endscript
}

 

  • /var/log/fail2ban.log: 회전할 로그 파일을 지정합니다.
  • daily: 로그 파일을 매일 회전시킵니다.
  • rotate 7: 최근 7일치 로그만 보관하고, 그 이후의 로그 파일은 삭제합니다.
  • compress: 회전된 로그 파일을 gzip으로 압축합니다. (예: fail2ban.log.1.gz)
  • delaycompress: 로그 파일이 회전된 당일에는 압축하지 않고 다음 회전 때 압축합니다. 즉, 최신 로그는 압축되지 않은 상태로 유지됩니다.
  • missingok: 로그 파일이 없어도 오류를 출력하지 않고 넘어갑니다.
  • notifempty: 로그 파일이 비어 있으면 회전하지 않습니다.
  • copytruncate: 로그 파일을 회전하는 동안 로그 파일을 열어 두는 프로세스를 중단하지 않고, 현재 로그 파일의 내용을 복사하고, 원본 파일을 잘라냅니다. fail2ban이 로그 파일을 계속 쓰고 있는 경우에 유용합니다.

* 설정 테스트

$ sudo logrotate -d /etc/logrotate.d/fail2ban

 

 

 

* logrotate cron 설정 여부 확인 (파일이 있으면 매일 실행됩니다. [기본])

$ sudo ls /etc/cron.daily/logrotate