一 實驗環境
鄙人使用的是centos 6.8操作系統 需要安裝iptables(常見的linux系統貌似都會自動安裝iptables)這條可以忽略 awk也需要安裝沒有的話就用yum裝下吧
當然最重要的是web服務 我這里使用的是apache 對日志進行分析 當然你也可以分析其他的日志嘛 只是拿web服務來當例子而已
二 腳本介紹
使用的機制主要是對日志進行切片 對日志段進行分析 并寫進防火墻規則中
為什么使用awk awk對文本處理速度比較快 而且語法相對簡單
#!/bin/bash (1)
while true (2)
do
echo “`awk -v dateTime=”$datetimes” ‘{if($1==dateTime){i=1}if(i==1){dateArry[$1]++}} \
END{for(j in dateArry){printf “%s %s\n”,j,dateArry[j]}}’ /var/log/httpd/access_log`” \
| awk ‘{if($2>=20){system(“iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1)}}’
datetimes=`date +%y-%m-%d-%H-%M-%s` (3)
echo “$datetimes” >> /var/log/httpd/access_log (4)
sleep 30 (5)
done
(1)聲明使用bash
(2)使用while循環
(3)datetimes=`date +%y-%m-%d-%H-%M-%s` 生成時間1.便于查看是什么時候產生的攻擊2.相當于隨機數避免產生重復
(4)將產生偽隨機數寫入到web服務的日志中
(5)這里可以自定義時間當然你也可以寫到計劃里邊當然這一行也可以注釋掉 (當然while循環也得注釋掉如果你使用計劃任務)當然我這里的30有點小你可以自己定制一下我主要是進行快速的測試
下面對awk部分進行分段分析
echo “`awk -v dateTime=”$datetimes
“‘{if($1==dateTime){i=1}if(i==1){dateArry[$1]++}} \ awk對日志文件進行分析 “↓” 對就是對小箭頭指的這個文件如果第一個字段等于dateTime則開始計數 并賦予i一個值1 如果i=1 則對數組下標為dateArry[$1]的值進行+1
END{for(j in dateArry){printf “%s %s\n”,j,dateArry[j]}}’ /var/log/httpd/access_log`” \
END看到沒有就在上邊 等awk處理結束后 對處理的字段進行輸出操作 遍歷dateArry數組 輸出IP地址(j 的值)和IP出現的次數( dateArry[j] 的值)
| awk ‘{if($2>=20){system(“iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1)}}’
看到最上邊的echo沒有 使用echo輸出awk的值傳遞給另一個awk進行iptables的寫規則操作
當然我這里是測試20這個值也是太小了 你可以根據實際環境進行修改 如果 IP出現的次數( dateArry[j] 的值)這個值大于20就講這個所對應的ip寫入到防火墻的規則里 使用system()函數” iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1 最后的 $1 輸出IP地址(j 的值)就是將這個ip添加到拒絕的規則中
三 測試
運行腳本
瘋狂刷新頁面
查看日志
我剛開始故意等了一個療程的
后邊是幾百條的日志信息
然后后查看防火墻規則
當我打開瀏覽器的時候他就這樣了
原創文章,作者:wode,如若轉載,請注明出處:http://www.www58058.com/74076