因而查看了以前的日誌,無奈鄙站被攻擊者盯上了,不斷的有不一樣的IP試圖上傳木馬。看來壞人仍是有的。因爲不想讓鄙站淪爲肉雞,因此就想寫個簡單的腳本,來阻止攻擊者的IP訪問。php
攻擊者:html
195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentyten/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentythirteen/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentytwelve/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/uploads/phptest.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /xyr/confings.asp HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /xz.asp;.jpg HTTP/1.1" 404 564 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /yanyu/?q={${eval%28$_POST[u]%29}} HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:42 +0800] "POST /ztxxw/Images/images.asp HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-"
[root@z-dig www]# grep '195.154.216.165' 2015-11-28.access.log|wc -l [root@z-dig www]#
[root@z-dig www]# curl ipinfo.io/195.154.216.165;echo'' { "ip": "195.154.216.165", "hostname": "fr.07.gs", "city": "", "region": "", "country": "FR", "loc": "48.8600,2.3500", "org": "AS12876 ONLINE S.A.S." } [root@z-dig www]#
法國的哥們居然試了180屢次!辛苦了。linux
用 shell 和定時任務來實現吧。>_<nginx
網站跑在 Nginx 上,因此能夠使用 Nginx 的 Deny 來拒絕攻擊者的IP訪問。web
那麼思路就出來了,按期(五分鐘或十分鐘)獲取攻擊者的IP,將IP放入到黑名單(Nginx 配置文件),並 reload 使其生效。shell
因爲前期規劃的比較好,網站的訪問日誌放在了一個指定的目錄,Nginx 的錯誤日誌也放在了一個指定的目錄。網站的訪問日誌每日進行切割。Nginx 的錯誤日誌沒有進行切割。bash
下面就是個人思路和操做步驟:app
經過 Nginx 的錯誤日誌(爲何不使用訪問日誌)來獲取攻擊者的IP。以前沒有對 Nginx 的錯誤日誌進行定時切割,爲了方便統計攻擊者的IP因此,編寫腳本並加入定時任務,使錯誤日誌每小時切割一次,而且每小時對黑名單文件進行清空。curl
錯誤日誌切割、清空黑名單腳本:網站
[root@z-dig scripts]# cat rotate-nginx-error-logs.sh #!/bin/bash # Rotate nginx error logs and clean block ip 's configure file # Nginx pid file : /application/nginx/logs/nginx.pid # Nginx error logs directory : /data/logs/nginx # Block Ip 's configure file : /application/nginx/conf/website/blockip.conf # Default log name : error.log # Author : Mr.Zhou # E-mail : zhou@z-dig.com NGX_PID=/application/nginx/logs/nginx.pid NGINX_CMD=/application/nginx/sbin/nginx LOGS_DIR=/data/logs/nginx LOG_NAME=error.log BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf cd $LOGS_DIR && /usr/bin/rename $LOG_NAME $(/bin/date +%F-%H -d "last hour").$LOG_NAME $LOG_NAME && /bin/kill -USR1 $(cat $NGX_PID) >$BLOCK_IP_FILE && $($NGINX_CMD -s reload) [root@z-dig scripts]#
獲取攻擊者IP腳本:
該腳本從 Nginx 的錯誤日誌中統計出超過20次試圖猜想路徑或上傳文件的IP,並將這些IP加入到 Nginx 的配置文件。如有新增長的IP則 reload Nginx 使配置文件生效,若沒有新增IP則不進行reload。
[root@z-dig scripts]# cat block-ip.sh #!/bin/bash # Author : Mr.Zhou # Email : zhou@z-dig.com # Website : http://www.z-dig.com # block ip ERR_LOG=/data/logs/nginx/error.log BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf BLOCKED_IP=/dev/shm/blocked-ip.txt BLOCK_IP=/dev/shm/block-ip.txt NGINX_CMD=/application/nginx/sbin/nginx /bin/cp $BLOCK_IP_FILE $BLOCKED_IP && /bin/sed -nr 's#.*[^0-9](([0-9]+\.){3}[0-9]+).*#\1#p' $ERR_LOG |/bin/awk '{IP[$1]++}END{for (i in IP) print IP[i],i}'|/bin/awk '{if($1>20)print "deny "$2";"}' >$BLOCK_IP && /bin/grep -v -f $BLOCK_IP_FILE $BLOCK_IP >>$BLOCK_IP_FILE && $($NGINX_CMD -s reload) [root@z-dig scripts]#
將拒絕指定IP訪問的配置文件(黑名單)單獨存放,並在 nginx 主配置文件中 include 進去。
[root@z-dig conf]# grep blockip.conf nginx.conf include website/blockip.conf; [root@z-dig conf]#
blockip.conf 文件格式以下:
[root@z-dig website]# cat blockip.conf deny 195.154.211.220; deny 195.154.188.28; deny 195.154.188.186; deny 180.97.106.161; deny 180.97.106.162; deny 180.97.106.36; deny 195.154.180.69; deny 195.154.211.26; deny 221.229.166.247; deny 180.97.106.37; deny 195.154.216.164; deny 195.154.216.165; [root@z-dig website]#
將腳本放入定時任務執行:
每小時對 Nginx 的錯誤日誌進行切割而且清空一次被拒絕訪問IP的配置文件,若不清空的話,此IP將終生不能訪問,若它再次攻擊則會再次進入黑名單,>_<。 清空命令放在了切割腳本的尾部。
能夠本身決定統計頻率,根據指定的頻率執行腳本,獲取攻擊者的IP,若此IP已經在黑名單中,則會忽略掉(因爲錯誤日誌一小時切割一次,因此在一小時內會出現重複的IP)。而後把剩下的新攻擊者的IP追加到黑名單。並 reload Nginx 。若沒有新增的攻擊者IP則什麼都不作。
[root@z-dig ~]# crontab -l # rotate nginx log everyday 00 00 * * * /bin/bash /application/scripts/rotate-nginx-logs.sh &>/dev/null # rotate nginx error log every hour and clean the block ip file 00 */1 * * * /bin/bash /application/scripts/rotate-nginx-error-logs.sh &>/dev/null # check hacker's ip every ten minutes */10 * * * * /bin/bash /application/scripts/block-ip.sh &>/dev/null [root@z-dig ~]#
如下是腳本運行一段時間的攻擊者IP
[root@z-dig ~]# cat /application/nginx/conf/website/blockip.conf deny 195.154.211.220; deny 195.154.188.28; deny 195.154.188.186; deny 180.97.106.161; deny 180.97.106.162; deny 180.97.106.36; deny 195.154.180.69; deny 195.154.211.26; deny 221.229.166.247; deny 180.97.106.37; deny 195.154.216.164; deny 195.154.216.165; [root@z-dig ~]#
過段時間,再列出一份黑名單IP,看是否有變化。
[root@z-dig ~]# cat /application/nginx/conf/website/blockip.conf deny 195.154.188.224; [root@z-dig ~]# curl ipinfo.io/195.154.188.224;echo '' { "ip": "195.154.188.224", "hostname": "195-154-188-224.rev.poneytelecom.eu", "city": "", "region": "", "country": "FR", "loc": "48.8600,2.3500", "org": "AS12876 ONLINE S.A.S." } [root@z-dig ~]# grep '195.154.188.224' /data/logs/nginx/error.log |wc -l [root@z-dig ~]# grep '195.154.188.224' /data/logs/nginx/error.log |grep -v 'access forbidden' |wc -l [root@z-dig ~]# [root@z-dig ~]# tail -n 1 /data/logs/nginx/error.log 2015/11/30 10:47:53 [error] 30754#0: *37828 access forbidden by rule, client: 195.154.188.224, server: www.z-dig.com, request: "GET / HTTP/1.1", host: "www.z-dig.com", referrer: "http://www.z-dig.com" [root@z-dig ~]#
看來多少仍是管點用的。一共 access forbidden by rule 了 102-24=78 次。
適當的改改腳本,保存黑名單的歷史數據,按期將大於1000的IP直接放入iptables!