라즈베리파이를 이용해서 서버를 구축 중이다. 원격접속을 위해서 ssh 포트를 열어 두었는데, 접속로그를 보니 여러 특정IP에서 계속 로그인을 시도하고 있었다.
접속 로그 확인
$ sudo tail -f /var/log/auth.log
...
Aug 17 22:49:21 raspberrypi sshd[24869]: Failed password for root from 116.31.116.46 port 23122 ssh2
Aug 17 22:49:23 raspberrypi sshd[24869]: Failed password for root from 116.31.116.46 port 23122 ssh2
Aug 17 22:49:26 raspberrypi sshd[24869]: Failed password for root from 116.31.116.46 port 23122 ssh2
...
whois 명령을 통해서 116.31.116.46 IP를 검색해보니, 중국발IP이다.
$ whois 116.31.116.46
비밀번호를 계속 입력하는 방식으로 로그인을 시도하는것 같다. 우연히라도 비밀번호가 맞게되면 큰일이므로 무한로그인을 시도하는 IP를 자동으로 차단해 보자.
fail2ban 이라는 프로그램을 설치해서 [지정한 시간내]에 [지정한 횟수]만큼 실패하면, [지정한 시간만큼 접속을 차단]해 보자.
$ sudo apt-get install fail2ban
fail2ban 이 정상적으로 방화벽에 등록이 되었는지 확인해보자.
$ sudo iptables -L
fail2ban이 위와 같이 설치가 되어 있다면, ssh로그인을 제어 할 수 있다.
환경설정 파일을 조작하여 원하는 형태로 만들어보자. 기본적으로 10분간 3회 비밀번호가 틀리면, 그 이후부터 10분간 ssh접속이 차단된다.
$ sudo vi /etc/fail2ban/jail.conf
ignoreip 차단하지 않는 IP. 기본적으로 로컬 IP는 차단하지 않는다.
bantime 차단할 초단위 시간. 600 (10분)이 기본값. 86400(1일)
findtime 오류 횟수를 셀 시간.
maxretry 허용할 차단 횟수
findtime 600, maxretry 6 라고 가정하면 10분동안 6번 로그인 실패가 일어나면 bantime 만큼 로그인을 차단한다.
설정 파일을 모두 고쳤으면, fail2ban을 재시작한다.
$ sudo service fail2ban restart
iptables 를 통해서 차단된 IP리스트를 확인할 수 있다. 아까부터 무차별적으로 로그인하던 ip(116.31.116.46)가 차된됨을 확인 할 수 있다.
fail2ban이 재시작되면, 차단된 목록도 초기화가 된다. 실수로 자신의 IP가 차단되면, 서버를 재부팅하면된다. 또는 iptable 명령을 통해서 차단된 ip를 해제 할 수도 있다.