Fail2Ban을 이용한 SSH 공격 방어하기

코코블루·2021년 9월 2일
0

Server

목록 보기
1/14
post-thumbnail

시작하며

SSH 접속 통제를 할 수 있는 베스트는 VPN을 사용하고 내부 IP 대역만 허용하는 것이겠지만, 실습용 서버라거나 자주 IP가 변경되는 환경에서는 어쩔 수 없이 SSH를 외부에 공개합니다. 이러면 해외 IP, 퍼블릭 클라우드 IP 등을 이용해서 Brute-force Attack이 계속 들어옵니다. 8월 초에 세팅한 서버가 있는데 로그를 따보니 거의 한 달 내내 공격 받고 있고, 로그를 딴 당시에도 계속 공격을 받고 있었습니다. 로그를 텍스트 파일로 추출해봤는데 텍스트로만 100MB가 넘어버립니다. 대부분이 공격 로그라니 무섭습니다.

로그를 보면서 정말 다양한 사용자명과 IP를 목격했는데요. 가만보면 뚫릴만한 사용자명이기 때문에 SSH를 외부에 오픈한 경우에 사용자 명, 비밀번호 관리에 주의를 요합니다. 사용자명만 못 맞춰도 절반은 먹고 가는 것이니깐요.

"혹시, 내 서버는!?" 하실 분들을 위해 제가 사용한 명령어도 공유해드립니다.

last -(line num) -f /var/log/btmp
ex) last -10 -f /var/log/btmp

Fail2Ban을 사용하면 막을 수 있어요.

저와 같은 상황이신 분이 많았는지 Fail2Ban이라는 프로그램이 있습니다. 이를 설치하고 규칙을 설정하면, iptables를 이용하여 규칙에 해당하는 IP의 요청을 Drop 합니다. 이번 테스트에서는 24시간 내로, 3번 이상 틀리면, 영구 밴으로 설정하겠습니다.

알립니다!

이번 테스트 환경은 Ubuntu 18.04로 진행하였습니다.
최대한 다른 프로그램을 설치하지 않는 방향으로 진행하였습니다.
Fail2Ban은 Python 베이스로 되어 있기 때문에 Python 2.6 또는 3.2 이상이 필요합니다. 하지만, 요즘 리눅스에는 Python 3이 기본적으로 깔려있기 때문에 큰 제약사항은 아닌 것 같습니다.

Fail2Ban을 구성해보자!

이제 본격적으로 Fail2Ban을 구성하고 작동시켜보겠습니다.

1. 설치하기

Fail2Ban은 아래 명령어를 통해 간편하게 설치할 수 있습니다.

# apt-get install fail2ban

2. 규칙 구성하기

Fail2Ban을 구성하기 위해 기본 구성 파일을 복사하고 수정하여 사용하겠습니다.

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

이렇게 복사하고, vi로 열면 아래와 같이 템플릿이 나오는데요. 간단하게 내용을 소개해보겠습니다.

[DEFAULT]

ignorself: local을 차단하지 않을지 여부 (기본 값이 True)
ignoreip: 차단하지 않을 IP
findtime: 기록을 확인 할 시간
ex) 10m = 10분, 1h = 1시간, 3600 = 3600초(1시간)
bantime: 규칙에 해당하는 경우 차단할 시간
ex) 10m = 10분, 1h = 1시간, 3600 = 3600초(1시간), -1 = 영구
maxretry: 시도할 수 있는 횟수

즉, 테스트 케이스와 같이 설정할려면 아래와 같이 설정하면 되겠죠.

만일, ssh 포트가 여러 개인 경우 아래 설정에서 port를 추가해줘야합니다.

[sshd] 부분을 찾으시고, port 라인 끝 줄에 컴마(,) 추가하고 포트 번호 적고, 개행하고, enabled=true를 기재하시면 되겠습니다.

3. 활성화하기

규칙 구성이 완료되었다면, 서비스를 시작할 차례입니다. 아래 명령어로 시작합니다.

# systemctl start fail2ban

이제 테스트를 해봐야겠죠?

계속 시도를 하면, 어느 순간부터 서버에서 응답이 없음을 볼 수 있습니다. 그럼 실제로 차단이 된걸까요?

로그를 보니 실제로 차단이 이루어졌음을 볼 수 있습니다.

4. 자동 시작 설정

fail2ban이 시스템이 시작 될 때 자동으로 시작하게 할려면 아래 명령어를 입력하세요.

# systemctl enable fail2ban

차단 해제는?

캡스락이 켜져있었던 등 실수로 인한 Ban이 이루어질 수도 있는데요. 이 경우에는 아래 명령어로 해제가 가능합니다.

# fail2ban-client set sshd unbanip (IP)
ex) # fail2ban-client set sshd unbanip 10.0.2.2

규칙을 바꿨는데 적용이 안 돼요!

규칙을 바꿨다면 Service를 재시작해주셔야 적용됩니다!! 아래 명령어를 통해 재시작해줍시다.

# systemctl restart fail2ban

iptables의 rule은 저장이 안되지 않나요? 걱정 마시라~

헐, 생각해보니 iptables로 규칙을 만든 것은 저장이 안 됩니다. 그래서 iptables-persistent를 설치하는 등의 작업을 하시는 분도 계시는데요. fail2ban이 재실행 될 때 저장된 ban 데이터를 보면서 다시 규칙을 할당하기 때문에 ban이 된 IP들은 계속 차단되니 괜찮습니다.

마무리

이를 통해 어느정도 공격을 막을 수 있게 되었습니다. 도입에서 소개했던 서버는 적용한지 일주일이 되어 가는데 3,000개 이상의 IP를 차단한 것으로 나오고 있습니다. 데모 시나리오를 기준으로 해도 2~3회까지는 공격이 가능한 것이기 때문에 로또 맞을 확률로 뚫릴 수도 있는데요. SSH 인증키 생성 등을 통해 추가적으로 보안을 향상해보는 것도 방법일 것 같습니다. 감사합니다!

profile
Have A Happy Coding Time!

0개의 댓글