본문으로 바로가기
반응형

[AWS] 9-2.EC2 SSH 무작위 로그인 시도 막기(무차별 대입 공격 방어)

 

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [AWS] EC2 SSH 무차별 대입 공격 방어 ] 입니다. : ) 

 

0.들어가기 앞서

1. 이전 포스팅에서 특수한 목적 으로 인해 공개키 없이 ssh접속 가능하도록 설정 하였었다.

 - 사실 이는 매우 위험한 일이며 이로인해 본인의 SSH 접속인증이 뚫릴수 있는 가능성을 열어 둔 것과 같다.

 

 - Linux 서버를 공개망에서 사용하면서 방화벽을 사용하지 않는 경우 ssh 로그인을 지속적으로 시도하는 ip, 로그를 볼 수 있는데, 이는 무차별 대입 공격을 받고 있일 확률이 크다.
대부분 외국 IP 대역에서 지속적으로 ssh 로그인을 시도하는데 무작위 비밀번호를 대입하여 공격을 하고 있는 것이다.

실제로 테스트 해보면 중국, 싱가폴등 다양한 나라에서 ssh 로그인 시도 공격을 확인하는걸 볼 수 있다.

 

 - VPN을 통해 ssh를 접속하게 한다던지 등의 조치를 취할 수도 있지만, 여러 가지 이유로 인해 다양한 장소에서 SSH 접속을 통해 작업해야 할 일이 생긴다면 SSH 서비스를 공용으로 열수 밖에 없다.
이런 경우에 보안을 조금이나마 강화하기 위해 사용할 수 있는 것이 fail2ban 이다.


일단 먼저 해당 현상을 확인 하는 방법들 부터 알아보자.

 

※ 참고

▶ 무차별 대입 공격 (brute force attack) 
특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것을 의미한다. 
대부분의 암호화 방식은 이론적으로 무차별 대입 공격에 대해 안전하지 못하며, 충분한 시간이 존재한다면 암호화된 정보를 해독할 수 있다. 
하지만 대부분의 경우 모든 계산을 마치려면 실용적이지 못한 비용이나 시간을 소요하게 되어, 공격을 방지하게 한다. 
암호의 '취약점'이라는 의미에는 무차별 대입 공격보다 더 빠른 공격 방법이 존재한다는 것을 의미한다.

 

1. 공격 확인 방법들

- 참고로 나와 같은 경우 Amazon Linux AMI 이미지를 사용하고 있기 때문에, 우분투, centos 버전에 따라 본인의 os 종류, 버전에 따라 확인 불가능한 방법도 있을 수 있다.

 

1. 로그 확인

 

1.1 /var/log/secure

- redhat 계엘에서 접근 로그 파일 (centos7부터는 systemd에서 통합 관리)

 

- 확인 방법

 cat /var/log/secure | grep "Invalid user"

last -f /var/log/secure | grep "Failed password"

 - ssh 로그인을 시도한 ip 확인 방법

cat /var/log/secure | xargs grep -E "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" -o | sort | uniq

cat /var/log/secure | grep 'sshd.*Failed' | grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c

 - 수많은 접속 실패 횟수와, ip를 확인 할 수 있었다.

 

1.2 /var/log/btmp

 - 확인 방법

last -f /var/log/btmp | more

 

- 엄청난 접속 시도로 로그파일 용량이 몇기가나 쌓인것도 볼 수 있다.

 

2. 공격 대응 보안 설정

0. 접속 포트 변경

 - 사실 접속 포트부터 변경하는걸 추천하지만, fail2ban으로 얼만큼 공격ip를 찾아내어 차단하는지 확인 하기위해 port변경 방법은 간단하니 pass 하도록 하겠다.

 

1. fail2ban 설치

 - 일정 시도 이상을 실패하면 해당 IP 를 차단 한다. - ssh, ftp, smtp 등 무작위로 로그인 시도를 할 경우 서비스를 보호하기 위하여 설치 한다. - fail2ban 은 파이썬으로 개발 되었으므로 2.6 또는 3.2 이상 파이썬이 설치되어 있어야 한다.

 - 자세한 내용은 매뉴얼 참고 (www.fail2ban.org/wiki/index.php/MANUAL_0_8#Usage)

 

2. 설치 하기

 - 추가 저장소인 EPEL(Extra Packages for Enterprise Linux yum) 를 설치 한다.

sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

 

 - fail2ban 설치, ip 확인을 위해 jwhois도 같이 설치

sudo yum install -y fail2ban-firewalld fail2ban-systemd jwhois

※ fail2ban은 로그파일이 없으면 동작 불가하다.

내가 쓰는 Amazon Linux AMI는 /var/log/secure 로그파일이 존재하지만,  레드햇 CentOS 7부터 시스템 로그를 systemd에서 통합관리 하여 없는 경우엔 fail2ban-systemd를 같이 설치 하여 주도록 하자.

 

 - 부팅시 자동으로 시작되도록 설정 및 재시작

 

3. 설정

3.1) 설치된 파일 리스트

1) fail2ban의 기본 설정파일은 /etc/fail2ban/jail.conf 2) action.d -  계정 접속에 실패할 경우 사용할 수 있는 action 파일, .방화벽으로 ip차단을 할 수 있는 firewall.cmd-newconf 파일 등이 있다.3) fail2ban.conf :  fail2ban 로그파일에 대한 설정을 할 수 있다. (loglevel, logtarget 등)4) fail2ban.d : 사용자 설정 디렉토리.5) jail.d : fail2ban 사용자 설정을 넣을 수 있는 디렉토리. fail2ban은 실행 시 해당 디렉토리에 있는 모든 설정내용을 적용한다.

 

 ※ 기본 설정파일에 설정내용 작성시 추후 업데이트시 모두 초기화 된다. 이에 개인화 설정 파일인 /etc/fail2ban/jail.local 파일을 만들어 설정해주는 것이 좋다. 

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

 

3.2) 설정 항목

▶1. ignoreip

 - 해당 ip, ip 대역은 로그인 실패시에도 fail2ban에서 차단하지 않고 무시 한다. 공백이나, 로 구분지어 작성한다. 

 - default : localhost (127.0.0.1)

ex2) 로컬호스트 + 192.168.17.x 대역은 무시 

ignoreip = 127.0.0.1/8 192.168.17.0/24

 

▶2. bantime

 - 지정 조건(findtime, maxretry)에 따라 인증 실패한 클라이 언트를 차단할 시간을 설정 (초단위)

 - -1로 지정시 영구 차단.

ex) 600초(10분)

bantime = 600

 

▶3. findtime, maxretry

 - 클라이언트 차단 조건

 - findtime(지정한 시간(초 단위)) 내에 maxtry 설정 횟수만큼 인증 실패시 차단된다.

ex) 

findtime = 600
maxretry = 5

 

▶4. 서비스 enabled

 - 기본적으로 사용 안함으로 되어있다. DEFAULT 에 기본 설정을 지정하고 적용하고자하는 서비스에 enabled = true 를 추가 한다.

ex) sshd, postfix-sasl

[sshd]
enabled = true

[postfix-sasl]
enabeld = true

ex) 혹시 sshd 포트가 여러개인 경우

[sshd]
enabled = true
port = ssh,10022

 

▶5. 메일 알림 설정

 - destemail : 메일수신자, 다중 수신지원 안함

 - sender : 메일 보내는 사람

 - mta : 메일 전송 프로그램

 - action : 차단시 whois 정보와 관련 로그를 첨부하여 메일 전송 기능 추가 가능

ex) action_mw : 메일을 전송하고 whois 로 IP 정보를 조회한 결과를 첨부

action = %(action_mw)s

ex) action_mwl : 메일을 전송하고 whois 로 IP 정보를 조회한 결과와 관련된 로그를 첨부

action = %(action_mwl)s

 

 

5. 서비스 적용

 - 설정이 완료 되었다면 서비스 재시작하여 변경사항 적용 하자.

sudo systemctl restart fail2ban

 - fail2ban 동작 로그는 /var/log/fail2ban.log 에 기록되므로 tail -f /var/log/fail2ban.log 명령어로 확인해 볼 수 있습니다.

 

 - 전체 차단 정보는 fail2ban 의 클라이언트 유틸리티인 fail2ban-client 명령어를 통해서 확인해 볼 수 있다.

sudo fail2ban-client status sshd

방금전까지 Total banned 2로 2건이었지만, 20분후 조회 해보니 엄청 많이 증가하는 것을 볼 수 있었다.

 

 - fail2ban 로그 확인

cat /var/log/fail2ban.log | more

 - 차단되었던 ip확인

awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n

 - 차단된 ip 위치 확인

whois ip주소

 - 계속 ip를 조회하다보면 다양한 국가에서 시도하는 것을 볼 수 있다.

 

※ 혹시 로그인 실패 로그 용량이 너무 커진 경우 다음 명령어를 실행하여 용량을 비워주도록 하자.

cat /dev/null > /var/log/btmp

 

※ 나와 같은 경우 얼마나 차단 효과가 있었는지 보기 위해 22번 포트로 ssh 설정을 그대로 유지 하였고, 차단 주기는 영구 차단으로 설정하였다. 이런 정책 설정에 의해 30시간여만에 수백개의 ip가 차단 된 것을 볼 수 있었다.

 

 - 약 한달여 기간을 ban ip를 모아 보았더니 3천개가 넘는 ip가 ban 처리된 것을 볼 수 있었다.

반응형

댓글을 달아 주세요

  1. peacestrokes@gmail.com 2021.04.26 15:48

    정말 좋은 글입니다. ec2 인바운드 22번 포트를 anywhere로 설정해놨다가 된통 당했네요. 인스턴스에 pem으로 액세스 하는데 전에는 없던 비번이 걸려있더군요. 비밀번호를 단순하게 설정해놔서 또 당했나봐요ㅠㅠ 왜 이렇게 안일했는지ㅠㅠ 앱의 기능에는 손대지 않은 것 같아서 인스턴스를 폐기하지 않고 그냥 계속 쓸까 생각 중인데, 그래도 되려나요? 오래 쓰진 않을거라서요. 확인해야 한다면 어떤 부분을 확인하면 좋을지 궁금합니다.