서버 점검 중 pop3로 접속시도를 하는 로그를 발견했다.
없는 아이디로 계속 시도하는 것과 계정은 있지만 패스워드를 계속 틀리게 입력하는 유형 2가지.
Oct 11 11:27:54 mail vpopmail[27836]: vchkpw-pop3: vpopmail user not found admin12@domain.com:109.104.203.62
Oct 11 15:02:11 mail vpopmail[15277]: vchkpw-pop3: password fail (pass: 'e603f6c507b3993651f0439553584c50') acount@domain.com:110.70.15.59
한두개가 아니라 같은 아이피가 계정만 바꿔서 계속 시도하고 있다.
fail2ban으로 vpopmail 차단을설정하면 좋은데, 실 운영서버라 fail2ban 설치하기가 쉽지 않다.
그래서 스크립트 작성.
#/bin/bashhelp(){ echo "" echo "/var/log/maillog is default" echo "iptable apply is not default" echo "banCount 100 is default" echo "-a : iptable applied" echo "-f : maillog FILE PATH" echo "-c : ban count" echo "" echo "Usae : $0 -a -c 100 -f /var/log/maillog " exit 0}ignoreIPs=("222.222.222.222" "111.111.111.111")maillog="/var/log/maillog"banCount=100fw=falsewhile getopts ac:f: optdo case $opt in a) fw=true ;; c) banCount=$OPTARG ;; f) maillog=$OPTARG ;; *) help exit 0 ;; esacdonebanIPs=`grep -E 'user not found|password fail' ${maillog} | awk -F: '{print $NF}' | sort | uniq -dc | awk '{if ($1 > '"${banCount}"') print $NF}'`for banIP in $banIPsdo for ignoreIP in ${ignoreIPs[@]} do if [ $ignoreIP == $banIP ] then # echo "ignore IP: ${ignoreIP}" # echo "ban IP : $banIP" break fi done echo "ban IP : $banIP ,whois : $(geoiplookup $banIP)" if [ $fw = true ] ; then iptables -A INPUT -s ${banIP}/24 -j DROP fi doneif [ $fw = true ] ; then #remove duplicate iptables rules #http://www.krazyworks.com/remove-duplicate-iptables-rules/ /sbin/service iptables save /sbin/iptables-save | awk '!x[$0]++' > /tmp/iptables.conf /sbin/iptables -F /sbin/iptables-restore < /tmp/iptables.conf /sbin/service iptables save /sbin/service iptables restart if [ -f /tmp/iptables.conf ] ; then /bin/rm -f /tmp/iptables.conf ; fifi
1. banCount 는 같은 IP가 해당 값이상일 경우만 가져온다.
실제사용자가 실패할 경우도 있기 때문에 100정도면 적당한 것 같다.
2. ignoreIPs는 차단하지 않을 IP를 적어준다.
3. iptable에 적용하는 데, 중복으로 계속 적용된다.
마지막 부분이 중복을 없애고 다시 설정하는 부분이다.
maillog 파일의 생성을 살펴보면 매일 오전 4시 마다 rotate 되고 있다
cron으로 4시 30분 부터 실행되게끔 걸어주면 되겠다.