我的一臺公網(wǎng)服務(wù)器,由于網(wǎng)站采取的是雙備份策略,所以開放了vsftpd的21端口,近來發(fā)現(xiàn)許多人在嘗試暴力破解vsftpd和ssh,我隨便看了看/var/log/secure日志,顯示如下:
118.33.110.52=2834 119.145.254.77=37 121.254.179.199=226 121.88.250.243=35 200.29.110.104=168 202.78.173.199=250 222.221.2.210=373這里面除了119.145.254.77和121.88.250.243是正常的外,其它的基本都是惡意IP.
由于我的服務(wù)器是置于LVS集群后面,所以我原來想用iptables的recent模塊解決這個問題的方法估計是行不通的。而且,服務(wù)器的系統(tǒng)安裝的是CentOS 5.5 x86_64,iptables還暫時不支持此模塊,報錯如下:
iptables: Unknown error 18446744073709551615而由于機器已經(jīng)在跑重要的業(yè)務(wù),我又不想去升級內(nèi)核,免得影響正常的網(wǎng)站運營,所以iptables的想法暫時告一段落;后來我又想到用HostsDeny的方法來解決這個問題,感覺這個方法還是比較繁瑣,還不如自己手動寫腳本來解決這個麻煩,腳本內(nèi)容如下:
#! /bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /root/black.txt DEFINE="100" for i in `cat /root/black.txt` do IP=`echo $i |awk -F= '{print $1}'` NUM=`echo $i|awk -F= '{print $2}'` if [ $NUM -gt $DEFINE ];then grep $IP /etc/hosts.deny > /dev/null if [ $? -gt 0 ];then echo "sshd:$IP" >> /etc/hosts.deny echo "vsftpd:$IP" >> /etc/hosts.deny fi done腳本思路如下:
由于/var/log/secure是以星期為輪詢的,所以我們每次可以查看這個文件,利用SHELL腳本統(tǒng)計出其中訪問失敗比較頻繁的IP,并定義一個閥值為100,如果大于100的話就將其放進/etc/hosts.deny文件,阻止其繼續(xù)訪問vsftpd和ssh;然后將其寫進crontab計劃列表里,每隔一段時間進行一次排查,如果下次排查的某IP次數(shù)又大于100,首先檢查它在不在我們的黑名單,如果在的話就無視過去;如果不在,就繼續(xù)添加進/etc/hosts.deny文件。
我的/etc/crontab文件最后一行為
* */1 * * * root sh /root/hosts_deny.sh即每隔1小時就重復(fù)執(zhí)行一次這個腳本,這里也有一個情況要說明下,/var/log/secure是每隔一個星期輪詢一次的,所以我們這里可以根據(jù)服務(wù)器的具體情況來配置多少時間執(zhí)行一次此腳本,暴力破解頻繁的機器可適當縮小這個周期。
我的公網(wǎng)機器運行腳本一段時間后,/etc/hosts.deny文件如下:
sshd:119.145.254.77 vsftpd:119.145.254.77 sshd:222.221.2.210 vsftpd:222.221.2.210 sshd:118.218.136.25 vsftpd:118.218.136.25 sshd:118.33.110.52 vsftpd:118.33.110.52 sshd:123.196.113.11 vsftpd:123.196.113.11 sshd:14.140.172.74 vsftpd:14.140.172.74 sshd:200.29.110.104 vsftpd:200.29.110.104 sshd:202.102.89.81 vsftpd:202.102.89.81 sshd:202.78.173.199 vsftpd:202.78.173.199