Apache-2.2

從 Apache 日誌中檢索惡意 IP 地址並使用 iptables 阻止它們

  • March 30, 2015

我試圖阻止一些試圖從我的網站利用 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 的過度訪問。我一起執行了幾個腳本:

  1. 檢查access.log並列出按對伺服器的點擊次數排列的前 10 個 IP
  2. 將結果轉儲到日誌文件中
  3. 讓另一個腳本查看該日誌文件並禁止在過去 X 小時內訪問伺服器超過 X 次的任何 IP
  4. 保存我的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 發生變化,您忘記更新然後被鎖定出你自己的伺服器。

無論如何,希望有幫助。

引用自:https://serverfault.com/questions/550356