라즈베리파이3 B+ 설치가이드(15) fail2ban 설치하기

Updated:

라즈베리파이에 대한 외부 공격을 방어하기 위한 fail2ban을 설치하고 설정해보겠습니다.

1. fail2ban 소개하기

라즈베리파이를 홈서버로 구축하고 원격접속을 위해 외부로 IP를 공개하여 사용하는 사용자들이 있습니다. 이런 분들은 보안 강화를 위해 fail2ban을 설치하기를 권합니다. 라즈베리파이가 공유기를 통해 연결되어 있고, 포트포워드 등의 설정을 하지 않았다면 외부에서 보이지 않으니, 이런 경우는 fail2ban 설치가 필요없겠습니다.

누가 내 라즈베리파이에 접속하나 싶겠지만, 외부로 SSH 포트를 열어두고 /var/log/auth.log를 지켜보고 있으니, 누가 접속을 시도한 로그가 발견되었습니다. ip가 87.245.112.40 인데, whois로 확인해보니 중국에 위치하고 있네요;;;;;

pi@raspberrypi:~ $ whois 87.245.112.40
% This is the RIPE Database query service.
...
inetnum:        87.245.112.0 - 87.245.115.255
netname:        CH-SASAG-CUSTS-DYNAMIC-CLEOPATRA
descr:          sasag Kabelkommunikation AG
country:        CH
admin-c:        SASA3-RIPE
tech-c:         SASA3-RIPE
status:         ASSIGNED PA

fail2ban은 시스템 로그를 모니터링하여, 일정 횟수의 로그인 실패 시에 해당 IP를 iptables 명령으로 방화벽을 설정합니다. 침입자가 brute-force 공격을 시도할 경우에 대비책이 됩니다.

2. fail2ban 설치하기

그럼 apt 명령어를 사용해서 fail2ban을 설치하고 기본적인 설정을 해보겠습니다.

#!/bin/bash
pi@raspberrypi:~ $ sudo apt install fail2ban
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  python3-systemd whois
...
Setting up python3-systemd (233-1) ...
Processing triggers for systemd (232-25+deb9u4) ...
Processing triggers for man-db (2.7.6.1-2) ...
pi@raspberrypi:~ $

fail2ban은 /etc/fail2ban/jail.conf 파일이 기본 설정 파일입니다. 하지만, 이 파일에 설정 내용을 기입하면 패키지가 업데이트 되면 overwrite이 발생할 수 있습니다. 그래서 유저 설정파일은 /etc/fail2ban/jail.local 파일을 이용합니다. jail.conf 파일을 복사해서 사용하면 됩니다.

#!/bin/bash
pi@raspberrypi:~ $ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
pi@raspberrypi:~ $ sudo vi /etc/fail2ban/jail.local

jail.local 파일을 열어서 [sshd] 항목을 찾아서 아래와같이 기재합니다.

  • port : ssh 기본 포트가 지정되어 있습니다. 22번 외에 포트 번호를 변경해 사용하고 있으면 변경한 포트 번호를 기재해주면 됩니다.
  • logpath : %(sshd_log) 변수로 되어 있는데 이 변수가 지정하는 파일이 /var/log/auth.log 입니다. auth.log 파일을 모니터링해서 login fail 여부를 확인하는 것입니다.
  • maxretry : 허용할 fail 횟수입니다. 이를 초과하면 bantime 만큼 차단이 됩니다.
  • bantime : 차단을 수행할 초 단위의 시간입니다. -1은 영구적인 차단을 의미합니다.
[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = -1

jail.local 파일에 대한 수정이 끝나면 service를 재시작합니다. 그리고 iptables로 확인하면 fail2ban이 설정된 것을 볼 수 있습니다.

#!/bin/bash
pi@raspberrypi:/etc/fail2ban $ sudo service fail2ban restart
pi@raspberrypi:/etc/fail2ban $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-sshd   tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain f2b-sshd (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

fail2ban 설정이 잘되었는지 확인하기 위해서 로그인 패스워드를 잘못 기입해보았습니다. 3회 이상 로그인 암호를 틀리자 ip가 ban 처리 되었습니다.

#!/bin/bash
pi@raspberrypi:~ $ sudo tail -10 /var/log/fail2ban.log
2018-09-13 06:22:57,798 fail2ban.actions        [1676]: INFO    Set banTime = -1
2018-09-13 06:22:57,799 fail2ban.filter         [1676]: INFO    Set jail log file encoding to UTF-8
2018-09-13 06:22:57,801 fail2ban.filter         [1676]: INFO    Added logfile = /var/log/auth.log
2018-09-13 06:22:57,804 fail2ban.filter         [1676]: INFO    Set maxRetry = 3
2018-09-13 06:22:57,807 fail2ban.filter         [1676]: INFO    Set findtime = 600
2018-09-13 06:22:57,807 fail2ban.filter         [1676]: INFO    Set maxlines = 10
2018-09-13 06:22:58,124 fail2ban.server         [1676]: INFO    Jail sshd is not a JournalFilter instance
2018-09-13 06:22:58,150 fail2ban.jail           [1676]: INFO    Jail 'sshd' started
2018-09-13 06:22:58,254 fail2ban.actions        [1676]: NOTICE  [sshd] Ban 223.62.8.139

iptables 명령에서 ban 처리된 ip 리스트를 확인할 수 있습니다.

#!/bin/bash
pi@raspberrypi:/etc/fail2ban $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-sshd   tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain f2b-sshd (1 references)
target     prot opt source               destination
REJECT     all  --  223.62.8.139          anywhere             reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere
pi@raspberrypi:/etc/fail2ban $

fail2ban 설정은 잘 동작하고 있습니다. 이제 중국에서 또 칩입이 발생하나 잘 지켜봐야겠습니다.


더 많은 라즈베리파이 이야기 Pi Guide 보러가기


Leave a Comment