分析Apache log,5秒內抓出惡意網路爬蟲的方法

不論是用 XAMPP 安裝在 Windows 個人電腦上,或使用 VPS 主機 / 共享主機來架設網站,難免都要考慮網站資安的問題。而 Apache log 是什麼?簡單說,就是將所有連入網站的紀錄都儲存在 access.log 這個檔案中;同時也會把錯誤紀錄儲存在 error.log。所以, Apache log分析可以讓你在看完數據後,採取適當的保護措施,提高網站安全。

這篇文章中,以 XAMPP 安裝在 Windows 系統上的自架網站為例子,使用兩種免費的方法來分析Apache log(access.log),並將惡意連線 IP 抓出來,然後把這些 IP 輸入到防火牆的封鎖名單中,或著是利用 WordPress 外掛來封鎖 IP 。同時也會分享如何客製化 Apache log ,不會因為檔案容量過大,而拖慢主機速度。在最後,會提供程式碼範例方便大家直接使用或修改。

Apache log位置在哪裡?

在安裝 XAMPP 之後,預設的 access.log 與 error.log 檔案會儲存在:Z:\xampp\apache\logs\。假使沒有看到這兩個 log 檔案的話,就要檢查 Apache log 的功能是否有正常被啟動。檢查 1). httpd.conf 的內容;假使想要客製化 log 格式的話,可以在 2). httpd-ssl.conf 裡面修改。

1)、檔案 httpd.conf
預設路徑: Z:\xampp\apache\conf\
2)、檔案 httpd-ssl.conf
預設路徑: Z:\xampp\apache\conf\extra\

打開 1). httpd.conf 之後,搜尋【LoadModule log_config_module modules/mod_log_config.so】將最前面的【#】刪除,表示啟動的意思。接著再找到【CustomLog “logs/access.log” combined】這一行,把前面的【#】刪除。完整範例如下:

<IfModule log_config_module> # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined	LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a <VirtualHost> # container, they will be logged here. Contrariwise, if you *do* # define per-<VirtualHost> access logfiles, transactions will be # logged therein and *not* in this file. # #CustomLog "logs/access.log" common # # If you prefer a logfile with access, agent, and referer information # (Combined Logfile Format) you can use the following directive. # CustomLog "logs/access.log" combined</IfModule>

Apache log格式客製化設定

強烈建議要針對Apache log格式做客製化設定,原因是:

  1. 限制每份 log 的檔案大小,避免檔案太大拖慢主機速度,或開啟 log 時造成程式或電腦當機
  2. 方便程式對 log 做分析,例如:以日為單位,這樣子 log 的檔名會以日期呈現,而程式就可以利用這種規律性進行 Apache log分析

開啟 httpd-ssl.conf ,在【<VirtualHost _default_:443>】區域內找到以下兩行,而這兩行就是預設的 log 儲存路徑與格式,要關閉它們的話,直接在最前面加上【#】:

#ErrorLog “C:/xampp/apache/logs/error.log”
#TransferLog “C:/xampp/apache/logs/access.log”

接著新增兩行客製化 log 的格式,範例如下:

ErrorLog "|bin/rotatelogs.exe -l D:/Apache_logs/error/error_MainSite-%Y-%m-%d.log 86400"
CustomLog "|bin/rotatelogs.exe -l D:/Apache_logs/access/access_MainSite-%Y-%m-%d.log 86400" combined

Apache log格式客製化說明

這樣子 log 紀錄會每 86400 秒(一天)就做檔案分割的動作,並且會儲存到 D:/Apache_logs/error/ 與 D:/Apache_logs/access/ 下的路徑,而檔名會依日期命名(%Y-%m-%d)。假使想要使用指定的檔案大小來分割的話,就把 【86400】換成【100M】,這樣子 log 每次最大紀錄的容量是 100MB,檔名會依日期命名。

找出惡意爬蟲 IP 的方法#1

大約在 2020 年左右,看到這一篇文章(3 Steps To Find And Block Bad Bots),就跟著作者的方法來分析 log。但是一直以來都無法搞懂 Excel 樞紐分析的功能,所以改用 Excel 巨集錄製器來達到相同結果。就這樣子,也使用了一年多。但是缺點是什麼呢?就是:

  1. 屬於半自動化的分析工具
  2. 開啟 log、匯入 Excel、執行巨集…等重複的動作,通常也要 1 – 3 分鐘才能完成一份(也就是一天的紀錄) log 分析
  3. 專注力要高,不然很容易忘記做到哪個階段,導致這一份 log 分析又做了白工
  4. 電腦資源要夠,否則做了幾份 log 分析後,電腦會變得相當慢,需要重新開機

假使不排斥使用巨集的話,可以到 Google雲端硬碟下載我錄製好的 Excel 巨集來使用。
連結:https://drive.google.com/drive/folders/1aj5hHP-0u5VqAmjJ-x3Iy5rlx3OktEtn?usp=sharing

操作流程:
Step 1
:用 Excel 開啟 log,選擇【分隔符號】–>【空格】,然後複製【A欄位】也就是連線【IP】的紀錄
Step 2:將【IP】貼到 Excel 巨集【01_輸入完整IP】分頁中的【A】欄

01 分析Apache log,方法 1 excel 巨集找出惡意連線IP
複製【IP】連線紀錄到Excel 巨集

Step 3:在 Excel 巨集中的【Summary】分頁,按下【開始】,等待的時間取決於你的電腦效能。以我的電腦(AMD Ryzen 3600 + DDR-4 32GB)為例子的話,大約在 60 秒內可以完成。

02 分析Apache log,方法 1 excel 巨集 分析IP連線紀錄 找出惡意IP
分析【IP】連線紀錄

Step 4:在 Excel 巨集中的【04_排序】分頁,就是每一個 IP 連線總次數。
【A】欄: IP
【B】欄: 統計次數

03 分析Apache log,方法 1 excel 巨集 統計IP連線次數
統計 IP 連線次數

Step 5:判斷 IP 是否為惡意爬蟲、具威脅的連線
通常根據你的網站規模,來訂一個門檻值,假使總次數超過這個門檻的話,才需要回到 access.log 當中,查詢該 IP 的連線狀態是否有異常的地方。
例如: IP – 72.14.199.220 ; 出現次數 – 323次
明顯多於其他連線 IP 的次數,所以我們就回到 access.log 來查詢它的連線紀錄是否有異常的地方。

剛開始看到【I】欄中並無連線網址的資料,以為是惡意爬蟲或其他未知的威脅連線,但是多查詢幾筆紀錄後,會發現它應該是 google bot ,所以就不用加入封鎖名單了。

04 分析Apache log,方法 1 excel 巨集 IP連線紀錄
在 access.log 中,檢查 IP 連線紀錄

假使以上圖文描述還是感到困惑的話,不妨觀看我錄製的一段操作影片,也許會讓大家更清楚整個操作流程。假使這篇文章對您有幫助的話,麻煩幫忙【訂閱】我的頻道,也歡迎分享給有需要的朋友,我們會非常感謝您的支持!

找出惡意爬蟲 IP 的方法#2

發法#2 是這篇文章中的重點分享,也是目前找到最節省時間的方法。

Step 1:下載、安裝 Anaconda 3 到電腦上
下載網址:https://www.anaconda.com/products/individual

05 Anaconda 3 installer
安裝 Anaconda 3

Step 2:在電腦左下角,開啟 Anaconda 3 程式

06 open Anaconda 3
開啟 Anaconda 3

Step 3:第一次執行的話,要先安裝 Spyder;之後可以直接按下【Launch】直接開啟程式

07 open Spyder
開啟 Spyder

Step 4:第一次開啟 Spyder 需要先建立新專案(New Project),之後的程式編輯與執行,都會在這個專案中運作

08 new project in spyder
建立新專案

Step 5:建立專案名稱與路徑
– 在下圖【1】的欄位,輸入專案名稱
– 在下圖【2】的欄位,指定專案儲存的路徑。例如:D:\Test\,接著 Spyder 會在這個路徑下,自動產生與專案名稱相同的資料夾,未來程式的執行與檔案的讀取/輸出,都會在這個資料夾下面完成
– 在下圖【3】的欄位,按下【Create】就完成專案的建立流程了

09 project name and path in Spyder
在 Spyder 建立專案名稱與路徑

Step 6:執行程式
– 在下圖【1】先確認程式碼是不是儲存在專案的資料夾當中
– 在下圖【2】分成兩部分來說明,
1). 在左手邊的視窗中,可以看到已經放入 3 份 access-年-月-日.log
2). 在右手邊的編輯視窗中,只需要更改讀取 log 的檔案名稱就可以了。例如將
df = pd.read_csv(‘access-2021-10-02.log‘, sep=” “)
改成
df = pd.read_csv(‘access-2021-10-28.log‘, sep=” “)
– 在下圖【3】的地方按下綠色三角形來執行程式,接著就會在專案資料夾中,產生 Bad_Bot_access-2021-10-30.xlsx

10 Bad bot code in Python
執行程式

Step 7:找出疑似的惡意爬蟲 IP
這個結果跟方法#1一致,不過所花費的時間更少,而且人工重複性的動作也減少許多!!!
– A 欄:原始 access.log 的 IP 資料
– B 欄:整理後不重複的 IP
– C 欄:不重複 IP 統計次數,由數字高的往數字低的方式排序
也就是 B2 的 IP 出現 602 次;B3的 IP 出現 323 次;B4的 IP 出現 135 次
– D 欄:這份 access.log 當中,出現不重複 IP 的個數有 647 次

11 分析Apache log,方法 2 Python Spyder 程式碼找出惡意連線IP
IP 出現次數統計表

假使以上圖文描述還是感到困惑的話,不妨觀看我錄製的一段操作影片,也許會讓大家更清楚整個操作流程。假使這篇文章對您有幫助的話,麻煩幫忙【訂閱】我的頻道,也歡迎分享給有需要的朋友,我們會非常感謝您的支持!

最後,Python 的程式碼放在下面的連結,有需要的朋友可以自行下載來修改與使用。
假如需要引用程式碼或內容的話,麻煩註明本篇網址,我們會非常感謝您的幫忙!
Google雲端硬碟:https://drive.google.com/drive/folders/1fluTGVAiLhMSEZjO8Ziyh_HRTxk4ybP6?usp=sharing
下載有遇到問題的話,可以利用信箱(support@hipay0.com)反映。

常見問題

分析 Apache log 找出惡意連線有什麼缺點嗎?

有。因為這種方式屬於【事後補救】,也就是要等連線紀錄存在後,才能知道惡意爬蟲或惡意連線已經連上網站了。

只使用 WordPress 外掛可以提高網站資安嗎?

想要提高網站資安的話,任何防護措施都不會嫌太多。相對的,太多的防護外掛、軟體、防火牆、CDN….等功能,難免會影響網站連線速度,所以要根據自己的狀況來做取捨。
對於 XAMPP 自架網站的用戶而言,在網站前端安裝入門款的硬體防火牆軟路由防火牆,再搭配 WordPress 安全外掛,得到的防護等級應該不會太差,而且整個建置幾乎零成本。

如何辨別惡意連線 IP 呢?

提供幾個個人心得跟大家分享:
1). 是否連線到【不存在】的檔案或網址
2). 假使是 xyz-bot 的連線紀錄,可以在 Google 查詢大家對於 xyz-bot 的評論如何
3). 極短時間內,存在太多筆連線紀錄
4). 無法從連線紀錄上做出判斷的話,查詢該 IP 屬於哪個國家。假使網站受眾幾乎不會來自那個國家 IP 的話,可考慮直接加入封鎖清單
5). 上社團請教專家

只能使用 python spyder 來執行程式嗎?

不需要。可以自由選擇任何 Python 的編輯器來撰寫與執行程式。之所以使用 Anaconda 懶人包,就是在網路上可以很容易找到相關文章,也發現 spyder 比較容易保存完整程式碼。這幾點原因對於非軟體背景的人而言,非常具有吸引力。剩下的就是花時間自學 Python 函數、剪貼程式碼,外行人也可以實現簡單的程式。

靠零成本提高網站資安的推薦方法

方法#1方法#2
花費時間60秒 – 180秒3 秒 – 5 秒
成本零成本零成本
困難度普通
電腦等級普通
專注力普通
尋找惡意爬蟲 IP 方法的比較表

假使本身對於 Excel 很熟練的話,其實不見得要使用方法#2(Python)來分析 log,畢竟操作的工具還是要選擇自己熟練的來使用,這樣子遇到問題時,才能夠自己解決。假如對於 Excel 與 Python 都不熟悉的話,建議可以把時間花在 Python ,因為它的功能太強大了,網路上的資源也很齊全,適合有興趣的外行人,拼湊出屬於自己的應用程式。