본문 바로가기

Server Story..../ubuntu

ssh ssh brute force attack ssh 임의 암호로 인한 공격방지 기본.

ssh brute force attack이란 흔한 사용자 이름과 암호로 ssh를 계속 접속해서 해킹을 시도하는 방법으로, 여러가지 피해를 끼칩니다.

1. 정말로 약한 암호를 사용하는 사용자가 있을 경우 해당 계정이 해킹당할 수 있으며, 이 해킹당한 계정으로 로컬 커널 익스플로잇 등을 사용해서 루트를 빼앗길 수도 있습니다.

2. 그렇지 않더라도, 사용자 인증 로그(auth.log)에 짧은 시간 내에 수많은 실패 로그가 쌓여 다른 로그를 보는 데 방해가 될 수 있습니다.

3. 접속을 받는 동안 ssh 대몬이 암호학적 계산을 해야 하므로 시스템 자원을 소모합니다.

iptables 는 리눅스 커널에 기본적으로 포함되어 있는 방화벽으로, 아주 다양한 방화벽 규칙을 만들 수 있으며, iptables 모듈을 사용해서 기능을 확장할 수도 있습니다. 다음은 iptables로 ssh brute force attack을 막는 간단한 규칙입니다. 이 규칙은 iptables 기본 모듈인 state와 recent를 사용합니다.

state 모듈과 recent 모듈은 man 페이지에 자세하게 문서화되어 있습니다. state 모듈은 언제 접속이 시작되고 끝나는지 추적할 수 있게 하고, recent 모듈은 IP 주소의 목록을 만들고 최근 접속 시간을 기록할 수 있게 합니다.

규칙은 ssh 포트로 20초간 5회 이상 접속을 시도하면 10분간 접속을 차단합니다.

우선 blacklist와 ssh 체인을 만듭니다.

iptables -N blacklist
iptables -N ssh

INPUT 체인에서 state 모듈로 ssh 포트인 22번 포트에 접속이 시작되면 ssh 체인으로 보냅니다.

iptables -A INPUT -m state --state NEW -p tcp --dport ssh -j ssh

blacklist 체인에서는 recent 모듈로 "blacklist"라는 목록에 접속 주소를 기록하고 접속을 거부합니다.

iptables -A blacklist -m recent --set --name blacklist
iptables -A blacklist -j REJECT

규칙의 핵심인 ssh 체인은 다음과 같습니다.

iptables -A ssh -m recent --update --seconds 600 --hitcount 1 --name blacklist -j REJECT
iptables -A ssh -m recent --set --name ssh
iptables -A ssh -m recent --update --seconds 20 --hitcount 5 --name ssh -j blacklist
iptables -A ssh -j ACCEPT

첫 번째 규칙은 접속 주소가 이미 "blacklist"에 들어 있고, 지난 10분간 1회 이상 접속이 있었으면 접속을 거부합니다.

두 번째 규칙은 접속 주소를 "ssh" 목록에 기록합니다.

세 번째 규칙은 접속 주소가 이미 "ssh" 목록에 들어 있고, 지난 20초간 5회 이상 접속이 있었으면 blacklist 체인으로 보냅니다.

네 번째 규칙은 여기까지 통과한 경우 ssh 접속을 허락합니다.

따라서 전체 스크립트는 다음과 같이 됩니다.

iptables -N blacklist
iptables -N ssh
iptables -A INPUT -m state --state NEW -p tcp --dport ssh -j ssh
iptables -A blacklist -m recent --set --name blacklist
iptables -A blacklist -j REJECT
iptables -A ssh -m recent --update --seconds 600 --hitcount 1 --name blacklist -j REJECT
iptables -A ssh -m recent --set --name ssh
iptables -A ssh -m recent --update --seconds 20 --hitcount 5 --name ssh -j blacklist
iptables -A ssh -j ACCEPT