라즈베리파이에 대한 외부 공격을 방어하기 위한 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 공격을 시도할 경우에 대비책이 됩니다.
그럼 apt 명령어를 사용해서 fail2ban을 설치하고 기본적인 설정을 해보겠습니다. 언제나처럼 apt 명령어로 update 후 install을 실행합니다.
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install fail2ban
fail2ban은 /etc/fail2ban/jail.conf 파일이 기본 설정 파일입니다. 하지만, 이 파일에 설정 내용을 기입하면 패키지가 업데이트 될 경우, overwrite이 발생할 수 있습니다. 그래서 유저 설정파일은 /etc/fail2ban/jail.local 파일을 이용합니다. jail.conf 파일을 jail.local 파일명으로 복사해서 사용하면 됩니다.
pi@raspberrypi:~ $ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
pi@raspberrypi:~ $ sudo vi /etc/fail2ban/jail.local
jail.local 파일을 열어서 [sshd] 항목을 찾아서 아래와같이 기재합니다.
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 5
bantime = -1
jail.local 파일에 대한 수정이 끝나면 service를 재시작합니다. 그리고 iptables로 확인하면 fail2ban이 설정된 것을 볼 수 있습니다.
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 처리 되었습니다.