GSS API를 이용하여 접근 시도를 할 때 나오는 메시지라고 GSS를 사용하지 않도록 변경하면 public key로만 인증을 하게 되어 서버에 빠르게 접속을 할 수 있게 됩니다.

GSS를 사용하지 않기 위해서는 /etc/ssh/ssh_config에서 GSSAPIAuthentication 부분을 찾아 주석을 풀어주고 다음과 같이 no 값을 주면 됩니다.

#   HostbasedAuthentication no
GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no

이렇게 바꿔주니 대략 접속하는데 15초 걸리던 것이 zero wait으로 바뀌더군요.
Posted by Sumin Family

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
Posted by Sumin Family


티스토리 툴바