從 Apache 日誌中檢索惡意 IP 地址並使用 iptables 阻止它們
我試圖阻止一些試圖從我的網站利用 XSS 漏洞的攻擊者,我發現大多數惡意嘗試都是從經典的“alert(document.cookie);\”測試開始的。該站點不易受到 XSS 攻擊,但我想在有問題的 IP 地址發現真正的漏洞之前阻止它們,同時保持日誌乾淨。
我的第一個想法是讓腳本不斷檢查 Apache 日誌中所有以該探測開頭的 IP 地址,並將這些地址發送到 iptables 丟棄規則。像這樣:
cat /var/log/httpd/-access_log | grep“警報(document.cookie);” | awk ‘{列印 $1}’ | 獨特的
為什麼將該命令的輸出發送到 iptables 是一種有效的方法?
提前感謝您的任何意見!
您會很高興知道您不必編寫程序。fail2ban已經這樣做了。
我所做的事情,主要是因為我對更優雅的解決方案一無所知,就是每 4 小時手動檢查一次我的 Nginx 日誌,並且每 2 分鐘檢查一次郵件伺服器日誌,以檢查單個 IP 的過度訪問。我一起執行了幾個腳本:
- 檢查
access.log
並列出按對伺服器的點擊次數排列的前 10 個 IP- 將結果轉儲到日誌文件中
- 讓另一個腳本查看該日誌文件並禁止在過去 X 小時內訪問伺服器超過 X 次的任何 IP
- 保存我的
iptables.save
這是它的樣子:
autoBanIPs_mail.sh
#!/bin/bash # This script checks the last 2 minutes of log entries to see if any # IP has made over 99 connections now=$(date +"%m_%d_%Y") /root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt cat /home/ipChecker/ipcheckMAIL_$now.txt | \ grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \ awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh /bin/bash /home/ipChecker/badMailIPs_$now.sh cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log rm /home/ipChecker/ipcheckMAIL_$now.txt rm /home/ipChecker/badMailIPs_$now.sh
checkBadIPs_mail.sh 這裡需要注意的一件非常重要的事情是,您需要設置一個白名單,否則您將開始阻止來自伺服器的大量真實 IP,您剛剛從這些伺服器收到大量電子郵件,或者在其他日誌的情況下,IP 是只是出於正當理由經常訪問您的伺服器。通過在|之後添加 grep 管道,我的白名單只是內置到此腳本中。grep ‘]’ | 看起來像這樣的“grep -v 127.0 |” .
您需要花時間教您的伺服器哪些高流量 IP 是合法的,哪些不是。對我來說,這意味著我必須在第一周左右每隔幾個小時手動檢查一次日誌,在 iplocation.net 上查找高流量 ip,然後添加像 amazon、box.com 甚至我的家/辦公室這樣的合法 IP此白名單的 IP 範圍。如果您不這樣做,您可能會被自己的伺服器阻止,或者您將開始阻止合法的郵件/網路伺服器並導致電子郵件或流量中斷。
cat /var/log/mail.log | awk \ -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \ -v d2="$(date "+%b %_d %H:%M")" \ '$0 > d1 && $0 < d2 || $0 ~ d2' | \ grep '\[' | grep '\]' | \ grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \ awk '{print $1}' | sort | uniq -c | sort -n | tail -10
區塊IP
#!/bin/bash sudo iptables -I INPUT -s $1 -j DROP sudo bash -c "iptables-save > /etc/network/iptables.save"
我每 2 分鐘檢查一次日誌,主要是我的 ssh 身份驗證日誌和郵件日誌,因為它們受到了衝擊:(。
我為每個日誌文件設置了特定的腳本,儘管在我想要檢查日誌時使用我自己使用的手動腳本很容易。看起來像這樣:
#!/bin/bash log=$1 time=$2 cat /var/log/${log} | awk \ -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \ -v d2="$(date "+%b %_d %H:%M")" \ '$0 > d1 && $0 < d2 || $0 ~ d2' | \ grep '\[' | grep '\]' | \ grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \ sort | uniq -c | sort -n | tail -10
這在執行時需要 2 個輸入,即要掃描的日誌文件以及要掃描的過去多遠。
因此,如果我想檢查 mail.log 的 ip 計數,比如過去 75 分鐘,我會執行:
$ sudo script.sh mail.log 75
我再次知道這很粗糙,可能有一個乾淨高效的協議可以完成所有這些,但我不知道,這件事已經持續了一兩年,讓壞人遠離。我會非常認真地推薦的一件事是你有一個代理或另一台伺服器,你可以用來訪問你的主伺服器。原因是,如果你有一天突然做 Web 開發,而你在 5 小時內 ping 自己 2000 次以進行一些測試,除了代理之外,您可能會被阻止而無法返回。
您可以看到,在
checkBadIPs.sh
我放置了 grep -v 127.0 並且在我的實際文件中,我對自己的 IP 和其他受信任的 IP 範圍有大量忽略規則,但有時您的 IP 發生變化,您忘記更新然後被鎖定出你自己的伺服器。無論如何,希望有幫助。