Fail2ban 설정하기

Last updated on 2023. 06. 17.

fail2ban 은 제목대로 서버에 무작위 로그인 시도하는 클라이언트에 대해 일정 횟수 로그인 실패할 경우 해당 IP를 원천적으로 차단하는 기능을 제공합니다. 생각보다 기능이 좋아서 보안 용도로 자주 사용하고 있습니다.

우분투에서 설치는 다음과 같이 간단히 할 수 있습니다.

[pi@localhost ~]# sudo apt-get install fail2ban

부팅 시 자동으로 시작되도록 시스템에 등록합니다.

[pi@localhost ~]# sudo systemctl enable fail2ban
[pi@localhost ~]# sudo systemctl restart fail2ban

fail2ban의 기본 설정은 /etc/fail2ban/jail.conf 파일입니다만, fail2ban 프로그램 업데이트할 때 설정이 덮어 쓰일 수가 있다고 하여 이 파일을 직접 수정하기보다는 개인화 설정 파일인 /etc/fail2ban/jail.local 사용을 권장합니다. jail.conf 설정을 보고 필요한 것을 하나씩 따와서 jail.local 을 만든다고 생각하면 쉬울 거 같습니다. 처음에 jail.local 파일은 없기 때문에 새로운 파일로 만들면 됩니다.

※ jail.local 을 빈 파일로부터 만들어서 빼먹을 수 있는 주의사항이 하나 있는데 각 항목 설정할 때 꼭 [DEFAULT] 이런 식으로 시작되는 header 넣어 줘야 합니다. 그렇지 않을 경우 fail2ban 서비스에 에러가 발생하여 작동하지 않습니다.

jail.local 파일을 간단히 작성해 봅시다.

[pi@localhost ~]# sudo vim /etc/fail2ban/jail.local

## default header 부터 일단 작성해 놓습니다.

[DEFAULT]
내용들...

jail.conf 의 항목을 보고 해당 항목을 따와서 jail.local 을 만들어 봅시다. default 헤더 아래에 나오는 순서대로 설정 필요한 항목을 살펴보겠습니다. ignoreip, bantime, findtime, maxretry 항목을 설정해 봅시다. 설치 후 기본값은 SSH 연결에 10분 동안 5회 이상 비밀번호가 틀리면 10분 동안 SSH 접속을 차단합니다. 저는 적당히 숫자를 바꾸었습니다.

[DEFAULT]

# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
ignoreip = 127.0.0.1/8 

# "bantime" is the number of seconds that a host is banned.
bantime = 43200

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600

# "maxretry" is the number of failures before a host get banned.
maxretry = 5
  • ignoreip : ban 되지 않을 IP 주소를 적으면 됩니다.
  • bantime : 접속을 차단할 시간. 초 단위로 60=1분, 3600=1시간, 43200=12시간입니다.
  • findtime : 여기 설정한 시간 동안 아래 maxretry 횟수를 확인
  • maxretry : 위에 설정한 findtime 동안 접속 시도 최대 허용 횟수

findtime 동안 maxretry를 초과하면 차단된다고 보면 됩니다.

이제 fail2ban 을 적용할 서비스 등록을 해 줍니다. 적용할 서비스의 헤더를 적어놓고 그 아래 내용을 추가합니다. 최종적으로 다음과 같은 jail.local 파일을 완성하였습니다.

[DEFAULT]

# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
ignoreip = 127.0.0.1/8 

# "bantime" is the number of seconds that a host is banned.
bantime = 43200

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log

설정을 다 했으면 fail2ban 을 재 시작하고 정상 동작하고 있는지 확인합니다.

[pi@localhost ~]# sudo service fail2ban restart
[pi@localhost ~]# sudo fail2ban-client status

Status
|- Number of jail: 
`- Jail list:

특별한 error가 발생되지 않으면 잘 작동하고 있는 겁니다.