우분투에서 SSH 해킹시도 차단하기 (fail2ban 도커 설치)

SSH 해킹시도 확인
오라클 A1, E2 등의 클라우드나 미니PC등의 리눅스 서버를 운영하다보면 모르는 IP로 SSH 접속시도가 시도때도 없이 계속됩니다. 로그를 확인하면 어떤 놈들이 들이대는지 확인할 수 있습니다.
# 접속시도 확인
last -f /var/log/btmp
# 나눠서 보기
last -f /var/log/btmp | more
내부 네트워크만 쓰는 분들이 아니라면 생각보다 많은 해킹 시도에 놀랄 수 있습니다. 대부분 성공하지 못하지만 상당히 찝찝하니 해결을 하는 게 좋습니다.
해킹시도 IP 차단 방법
여러가지 기능으로 차단할 수 있지만 개인적으로 가장 간단하다고 판단한 fail2ban으로 설명합니다.
Fail2ban
fail2ban은 관리자가 규칙을 만들어서 이에 해당되는 클라이언트의 IP를 차단할 수 있습니다. SSH 접속 시도 뿐만 아니라 다른 접속도 막을 수 있지만 이 글에서 다루지는 않습니다.
Fail2ban 도커로 설치
조건 : docker, docker compose 실행가능한 환경. 도커 및 도커컴포즈 설치에 관한 내용은 인터넷에 많으니 생략합니다.
00. 도커 및 도커 컴포즈 설치 확인
# 아래 명령어 실행. 버전이 표시되지 않으면 도커 설치부터
docker version
docker-compose version
# docker-compose 플러그인으로 설치한 경우
docker compose version
01. 도커 컴포즈를 실행할 폴더 작성 및 이동. 저의 경우는 오라클 A1에서 /home/docker 경로 하위에 폴더를 작성합니다.
mkdir -p /home/docker/fail2ban
cd /home/docker/fail2ban
02. /home/docker/fail2ban 폴더에서 docker-compose.yaml 파일 작성. 저의 경우는 nano 에디터를 사용합니다.
nano docker-compose.yml
아래 내용을 docker-compose.yml파일에 붙여넣기 합니다. 붙여넣기 후 nano저장 및 종료. 블로그에서 마우스 우클릭을 막아두어서 복사가 안될수도 있으니 그냥 파일도 올립니다.
[ docker-compose.yml 파일의 내용 ]
version: "3.5"
services:
fail2ban:
image: crazymax/fail2ban:latest
container_name: fail2ban
network_mode: "host"
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- "./data:/data"
- "/var/log:/var/log:ro"
env_file:
- "./fail2ban.env"
restart: always
03. /home/docker/fail2ban 폴더에서 fail2ban.env파일 작성
nano fail2ban.env
아래 내용을 fail2ban.env에 붙여넣기 합니다. 붙여넣기 후 nano 저장 및 종료. 저는 zoho메일 계정정보를 사용해서 SSMTP관련 내용이 채워져 있는데 메일계정 등록 안하실 분들은 SSMTP항목을 비우거나 아예 삭제하시면 될 거 같습니다. (테스트 못해봄)
[ fail2ban.env 파일의 내용 ]
TZ=Asia/Seoul
F2B_LOG_TARGET=STDOUT
F2B_LOG_LEVEL=INFO
F2B_DB_PURGE_AGE=1d
SSMTP_HOST=
SSMTP_PORT=
SSMTP_HOSTNAME=
SSMTP_USER=
SSMTP_PASSWORD=
SSMTP_TLS=
04. 도커 컴포즈 실행
이제 fail2ban이 실행됩니다. 하지만 규칙이 정해지지 않았기 때문에 아무일도 일어나지 않습니다.
docker-compose up -d
# docker compose plugin으로 설치하신 분들은
docker compose up -d
Fail2ban 필터(규칙) 작성
SSH 접속시도를 5회 초과해서 시도할 경우 해당 IP를 차단하는 규칙을 만들겁니다.
01. /home/docker/fail2ban/data/jail.d/ 경로로 이동합니다.
cd /home/docker/fail2ban/data/jail.d/
02. /home/docker/fail2ban/data/jail.d/ 경로에서 sshd.conf 파일을 작성합니다.
nano sshd.conf
[ sshd.conf 파일의 내용 ]
본인의 환경과 원하는 규칙에 맞게 수정해서 사용하세요. sshd.conf 파일 편집 후 저장 및 종료. ignoreip로 본인이 접속하는 환경의 IP를 반드시 넣어두셔야 추후에 암호가 생각나지 않을 때 차단당하는 불상사를 막을 수 있습니다. 차단 당한 놈들은 감옥(jail)에 기록됩니다.
[DEFAULT]
# 차단 예외 IPs, 추가 시 스페이스로 구분. 암호 잊었을 때 차단당하지 않도록 주의.
ignoreip = 127.0.0.1/8 10.13.13.1
# 접속 차단 시간, 1분 = 60, 아래 예제는 1일, -1 설정 시 영구 차단
bantime = 86400
# findtime 시간동안 maxretry만큼 접속 실패 시 차단함
findtime = 86400
# 최대 허용 횟수
maxretry = 5
# 차단 방법, firewalld 사용 시 'firewallcmd-new', iptables 사용 시 'iptables-multiport'
banaction = iptables-multiport
[sshd]
enabled = true
03. sshd.conf 파일 편집이 끝났으면 도커를 재시작합니다.
docker restart fail2ban
Fail2ban 이 잘 작동하는지 확인
차단된 IP들이 기록되려면 시간이 필요합니다. 몇 시간 후에 해보시든지 일부러 차단당해서 테스트해보시면 됩니다.
01. 도커 내부의 명령어 실행해서 확인
docker exec -t fail2ban fail2ban-client status sshd
위 명령어를 실행하면 감옥에 갇혀있는 놈들의 목록이 나옵니다.
02. 도커 관리자 portainer를 사용하는 경우
portainer 웹으로 접속
fail2ban 도커에 root로 접속 (아래 그림 참고)

아래 명령어 실행
fail2ban fail2ban-client status sshd
제 서버에는 요로코롬 많은 강아지들이 갇혀 있습니다. 일부만 표시한겁니다. 저는 기본적인 ssh접속만 차단하고 쓰고 있습니다. 만약 DB나 다른 서버에 중요한 자료가 있는 분들은 용도에 맞게 제일을 추가해서 관리하시면 됩니다.

#우분투 서버 #해킹시도 #fail2ban #ssh접속 시도