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