EC2의 auth.log를 보면서 알게된 사실인데
서버에 무차별 로그인 시도를 하려는 ip들이 계속 로그에 남았다.
sudo last -f /var/log/btmp //접속 실패 ip
sudo last -f /var/log/wtmp //접속 성공 ip
로그인 접속 실패/성공 로그를 확인해보니
이렇게 접속 실패 ip들이 보였다.
invalid user인 것으로 보아 로그인은 실패했지만 이에 대응하는 전략이 필요하다.
/etc/ssh/sshd_config 파일을 열어서
PermitRootLogin prohibit-password
PasswordAuthentication no
sudo systemctl restart ssh //재시작
그러면 이제 cmd에서 ssh username@ip주소 이렇게 입력했을 때
Permission denied 경고문이 뜬다.
sudo sshd -T | grep password
이렇게 입력하면 현재 설정이 어떻게 돼있는지도 볼 수 있다.
이렇게 내 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확인
해외 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
레거시 시스템의 계정들을 지워버리자.
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>/ //이렇게 하면 자기 자신만 쓸 수 있게 할 수 있다.