Motive

수십 대의 서버를 관리하면서 서버의 상태를 체크하기 위해 몇 가지 요소를 모니터링하는 와중에 이상한 점을 발견하게 되었다. 연결이 성립된 세션 수를 카운트를 하고 있는데 이상하게 ssh 세션의 카운트가 들쑥날쑥한 것이 아닌가. 분명 아무도 서버에 접속을 하지 않은 상태임에도.

서버에 접속은 아무도 안하고 있는데… 누구시죠?

이 정체불명의 연결들의 정체를 확인하기 위해서 /var/log/auth.log 파일을 열어보자. (우분투 같은 데비안 계열의 경우이다. 레드햇 계열에서의 로그 파일은 이름이 다를 수 있음) 이 파일은 컴퓨터로의 모든 인증 관련 이벤트를 기록하는 로그 파일이다.

sudo vi /var/log/auth.log

아니나 다를까, 전세계의 불특정 다수의 아이피로부터 서버로 랜덤하게 ssh 로그인을 시도하고 있었다. 계정명과 비밀번호를 무작위로 대입해보는 봇들이 24시간 돌아가고 있는 듯 하다. 국내 뿐만 아니라 호주, 독일, 미국 등 전세계 어디서든 이런 접속이 시도되고 있으며 특히 중국 아이피가 굉장히 많다. 국내에서의 해킹 시도는 아무래도 이미 중국에게 당한 터미널인듯. (물론 국내의 해커일 가능성도 있다) 계정명은 molly, doctor, pi, doris 같은 아이디가 무작위로 대입되고 있었고 심지어 root 계정으로 로그인이 시도된 기록이 많다. 비밀번호도 뭐 크게 다르지 않을듯. 공개된 ssh 서버의 숙명인 것인가.

(여담: 혹자는 이런 식의 해킹 공격에 두려움을 떨 수도 있겠으나, 절대다수가 사용하는 윈도우 같은 경우 자동으로 모든 접속을 차단하고 있다. 물론 유저가 원격 데스크톱 기능을 활성화 하는 경우 3389번 포트로의 접근 공격은 일어날 수 있다. 윈도우든 리눅스든 간에 비밀번호를 계정에 안걸어놓고 쓰는 미친짓만 안하면 웬만해서는 안전함.)

말이 무작위이지 사실상 기존의 단어나 통계적으로 많이 쓰이는 이름 등을 대입해 보는 것일게 뻔하다. (혹시나 하고 brute force list를 구글에 검색해보니 역시나 password list와 word list가 수두룩하게 나온다) 현재까지의 모든 시도가 실패했고 앞으로도 이런 방식의 로그인 시도가 성공할 가능성은 우리 은하와 안드로메다 은하가 만나는 날이 와도 일어날 일 없어 보인다, 만…… 무엇보다도 거슬린다. 특히 짱깨들이 지금 이 순간에도 내 컴퓨터에 해킹을 시도하고 있다는 것 자체가 매우 불쾌하다. 이것들을 자동으로 차단해버려야 속이 시원할 것 같다. /etc/hosts.allow 파일과 /etc/hosts.deny 파일 수정을 통해 싹다 막아버리는 방법도 있겠으나, 내가 언제 어디에서 서버에 접속할지 앞날은 모를 일이므로 화이트 리스트 방식의 차단은 좀 번거로울 수 있다. 나쁜놈만 골라서 차단하고 싶을 때 사용되는 적절한 서비스가 fail2ban이다.

환경

– 작업 노드: 그냥 평범한 서버 컴퓨터
– OS: Ubuntu 18.04

Procedure

참고 링크: https://www.lesstif.com/pages/viewpage.action?pageId=43843899

i) 설치

apt를 사용하면 간단하게 설치할 수 있다.

sudo apt install -y fail2ban

fail2banpython으로 개발되었으므로 python이 일단 설치가 되어있어야 하고 python 관련 몇몇 패키지도 더 필요한 게 있을 것이다. 물론 python이 없는 컴퓨터는 전세계 어디에도 없을 것이며, (그런가…?) 설마 없는게 있어도 우리의 yum, apt 같은 패키지 매니저들이 지가 알아서 다 자동으로 의존성 패키지들을 설치해준다. 설치가 끝난 후에는 기본 설정으로 서비스가 자동으로 시작되어 있을 것이다.

sudo systemctl status fail2ban

을 실행해보면 작동 상태를 확인할 수 있다.

ii) 기본 설정 확인

패키지 매니저를 통해 설치된 fail2ban의 설정 파일은 보통 /etc/fail2ban 디렉토리에 있다. 어느 놈을 엄벌에 처할 것인가는 jail.conf 파일로 정해줄 수 있다. 내용물을 읽어보자. 몇 가지 대표적인 설정으로는 다음과 같다.

...
[DEFAULT]
...
bantime = 10m
...
findtime = 10m
...
maxretry = 5
...

다른 설정값들도 많지만 이 세 가지가 핵심이라고 할 수 있겠는데, 그 의미는 10분 안에 (findtime) 5번을 접속 실패하면, (maxretry) 그놈은 나쁜놈으로 간주하여 10분간 차단을 해버린다. (bantime)

iii) 나만의 설정

기본 설정이 마음에 안들 경우 내가 직접 설정을 바꿔서 적용할 수도 있다. 물론 jail.conf 파일을 수정하면 수정된 사항이 반영이 될 것이다. 하지만 jail.conf 파일을 읽다보면, 이 파일을 고치는 것은 별로 좋은 생각이 아니라는 말이 나온다.

YOU SHOULD NOT MODIFY THIS FILE.


It will probably be overwritten or improved in a distribution update.


Provide customizations in a jail.local file or a jail.d/customisation.local. For example to change the default bantime for all jails and to enable the ssh-iptables jail the following (uncommented) would appear in the .local file. See man 5 jail.conf for details.

뭔 소린고 하니, 프로그램 업데이트 하다가 이 파일을 새로 덮어쓰면 니가 고쳐놓은 부분들은 다 날아갈거임, 이 되겠다. (더 자세한 설명은 man jail.conf를 하면 확인할 수 있다.) 대신에 jail.local 파일을 새로 만들어서 거기에 내 설정을 적어두면 적용이 될거라고 한다. 패키지 매니저가 만든 파일이 아니라 유저가 직접 생성한 파일이므로 패키지 매니저에 의해 덮어씌워질 일도 없으며 패키지를 삭제해도 그대로 이 파일은 남아있을 것이다. 오케이, 시키는대로 파일 추가를 해보자.

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 xxx.xxx.xxx.0/24 192.168.1.0/24 xxx.xxx.xxx.0/24
bantime  = -1
findtime  = 1h

[sshd]
enable = true
prot = ssh

위의 설정은 나의 jail.local 파일 안의 내용물이다. 물론 경로는 /etc/fail2ban에 위치한다. 해킹 시도는 가차없이 처단하기 위해 findtime을 1시간로 대폭 늘렸다. -1bantime은 네놈을 영원히 차단하겠다는 뜻이다. 나도 사람인지라 내가 실수로 5번까지 틀릴 가능성도 있으므로 ignoreip에 내가 자주 쓰는 주소를 적어넣었다. 물론 내 프라이버시 보호를 위해 일부 IP 주소를 xxx와 같이 가려놓았다. 그 자리에 자신에게 필요한 주소를 넣어주면 된다.

파일을 저장하고 fail2ban 서비스를 재시작하면 변경된 설정이 적용된다. 잘 적용되었는지 확인하고 싶다면 서비스 로그 파일을 체크한다.

sudo systemctl restart fail2ban
sudo cat /var/log/fail2ban.log | grep INFO | tail -n 30

iv) 차단 IP 확인

fail2ban 서비스를 실행한지 며칠만에 무수한 아이피들이 차단을 당했고 서버는 클린해졌다.

클-린한 모습

어떤 아이피들이 차단되어 있는지 확인하고 싶다면 몇 가지 방법이 있다.

sudo fail2ban-client status

어느 블로그에서는 위의 커맨드가 차단 IP 개수를 확인한다고 되어 있는데 그건 틀린 말이고, 감옥의 개수만을 확인해 주고 그 감옥 안에 죄수가 몇명이 들어있는지는 확인이 안된다. 차단된 IP 정보를 직접적으로 보고 싶다면 다음과 같은 명령어를 쓸 수 있다.

sudo cat /var/log/fail2ban.log* | grep "] Ban" | awk '{print $NF}' | sort | uniq -c | sort -n

그냥 로그 파일을 읽어봐서 Ban이라는 단어가 있는 줄을 찾아 출력해주는 쉘 커맨드이다. 사실 fail2ban의 작동 원리는, 로그 파일을 읽고 거기에서 불량한 끼가 있는 아이피들을 OS의 방화벽 규칙에 추가하는 역할만을 할 뿐이다. 고로 방화벽 규칙을 출력해봐도 차단 목록을 알 수 있다.

sudo iptables -L -n

fail2ban 프로그램 자체에서 차단 목록을 읽어내는 기능을 안만들어 놨는지 이해가 잘 안간다.

v) 차단을 해제하고 싶을 때

 sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

이렇게 하면 fail2ban 서비스 재시작 없이 바로 접속이 가능하다고 하는데 난 해본 적이 없는 기능이다. 한번 차단은 영원한 차단이다 짱깨들아.


지금 이 순간에도 수많은 봇들이 포트 스캔, 브루트 포스 등의 공격을 날려대고 있다. 유무선공유기 자체로 외부 인터넷과 물리적인 차단을 해두는 경우면 모를까, 공인 아이피로 네트워크에 물려있는 시스템의 경우엔 늘 이렇게 보안을 강화해 두어야 겠다. (물론 요즘 윈도우는 알아서 다 막혀 있으니 안심)

카테고리: Linux

2개의 댓글

와우 · 2020-08-26 12:00

정말 감사합니다 짱개들을 막는데 매우 큰도움이 되었씁니다…

답글 남기기

Avatar placeholder