SSH 무차별 로그인 시도를 막자(+해외 ip차단)

Alex·2025년 1월 27일
0

Plaything

목록 보기
89/118

EC2의 auth.log를 보면서 알게된 사실인데
서버에 무차별 로그인 시도를 하려는 ip들이 계속 로그에 남았다.

sudo last -f /var/log/btmp //접속 실패 ip

sudo last -f /var/log/wtmp //접속 성공 ip

로그인 접속 실패/성공 로그를 확인해보니

이렇게 접속 실패 ip들이 보였다.

invalid user인 것으로 보아 로그인은 실패했지만 이에 대응하는 전략이 필요하다.

보안 시스템을 구축하자

1. root 계정 패스워드 접근 막기

/etc/ssh/sshd_config 파일을 열어서
PermitRootLogin prohibit-password
PasswordAuthentication no

sudo systemctl restart ssh //재시작

그러면 이제 cmd에서 ssh username@ip주소 이렇게 입력했을 때

Permission denied 경고문이 뜬다.

sudo sshd -T | grep password

이렇게 입력하면 현재 설정이 어떻게 돼있는지도 볼 수 있다.

2.보안그룹 ssh 포트를 내 ip에만 열어주자

이렇게 내 ip에서만 연결이 가능하게끔 설정해줘야 한다.

3. fail2ban으로 수상한 ip를 차단하자.

관련내용은

서버 무차별 대입 공격을 막자(NGINX+Fail2ban)

여기에 정리해두었다.

현재 이를 통해 160개의 악성 ip를 차단한 상태다.
덕분에 하루에 10건 이상씩 오던 어뷰징이 일 1건이하로 줄었다.

이번에는 sshd관련 filter를 사용해보자.


jail.local 파일에 들어가서 enable=true를 해주면 된다.

sudo fail2ban-client status sshd //상태 확인
sudo fail2ban-client get sshd banip //차단된 ip확인

4. 해외 IP를 차단해버리자

해외 IP가 ssh 접근할 일은 없다.
그러니 차단을 해버리자.

sudo apt-get install geoip-bin geoip-database
//해외 ip 데이터베이스 설치

geoiplookup 8.8.8.8 // 작동하는지 확인
/usr/local/bin/sshfilter.sh에 아래 내용을 입력

#!/bin/bash

ALLOW_COUNTRIES="KR"

if [ $# -ne 1 ]; then
  echo "Usage: `basename $0` <ip>" 1>&2
  exit 1
fi

IP=$1

# IPv6 주소 IPv4 주소로 변환
if [[ $IP =~ ^::ffff: ]]; then
  IP=$(echo $IP | sed 's/^::ffff://')
fi

COUNTRY=$(/usr/bin/geoiplookup $IP | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1)

if [ "$COUNTRY" = "IP Address not found" ] || [[ $ALLOW_COUNTRIES =~ $COUNTRY ]]; then
  exit 0
else
  logger "DENY sshd connection from $IP ($COUNTRY)"
  exit 1
fi
sudo chown root:root /usr/local/bin/sshfilter.sh //파일의 소유자와 그룹을 root로 변경
sudo chmod 755 /usr/local/bin/sshfilter.sh
//권한을 755로 설정

7(소유자/root): 읽기(4) + 쓰기(2) + 실행(1)
7(그룹/root): 읽기(4) + 실행(1)
5(기타 사용자): 읽기(4) + 실행(1)

소유권과 실행권한을 변환해준다.

이제 마지막으로 ssh 잠금 설정을 해주자.

sudo nano /etc/hosts.deny 
sshd: ALL 추가 

sudo nano /etc/hosts.allow
sshd: ALL: aclexec /usr/local/bin/sshfilter.sh %a 추가

hosts.deny로 모든 접속을 막으면서
hosts.allow로 가능한 ip만 접속을 허용한다.
(앞에서 만든 국가 필터링 시스템으로 허용하는 방식이다)

/usr/local/bin/sshfilter.sh 8.8.8.8 

를 하고서 syslog를 다시 봐보자.

해당 ip를 차단하고, 끝에 국가표기가 뜬다.

해외 ip를 자동 업데이트 하는 스크립트도 작성해보자.

sudo nano /etc/cron.monthly/updatingGeoIP

#!/bin/bash



cd /tmp

wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

if [ -f GeoIP.dat.gz ]

then

    gzip -d GeoIP.dat.gz

    rm -f /usr/share/GeoIP/GeoIP.dat

    mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat

else

    echo "The GeoIP library could not be downloaded and updated"

fi

5. 사용하지 않는 디폴트 계정을 제거해라

레거시 시스템의 계정들을 지워버리자.

cat /etc/passwd | egrep "lp|uucp|nuucp" //확인

ps aux | grep -E "lp|uucp"
systemctl list-units | grep -E "lp|uucp"

sudo userdel lp
sudo userdel uucp 

//삭제

추가하면 좋을것들

umask //새로 생성되는 파일과 디렉토리의 권한 제한
아마존은 기본으로 22로 돼 있다고 한다.

소유자: 모든 권한 허용
그룹: 쓰기 권한 제한
기타 사용자: 쓰기 권한 제한

ls -ld /home/ubuntu //홈디렉토리 권한이 750이 돼 있음 이렇게 엄격하게 하는 게 좋음

sudo chmod o-w /home/<user>/ //이렇게 하면 자기 자신만 쓸 수 있게 할 수 있다.
profile
답을 찾기 위해서 노력하는 사람

0개의 댓글