雖然這幾年 GA (Google Analytics) 等網站流量分析機制逐漸取代了傳統上利用網站日誌來分析網站流量的作法,但是分析網站日誌依舊是系統/網站管理員不可忽視的一個重要工作。以一般的網站服務器而言,主要會提供兩種日誌,一種是存取日誌 (Access Log),另外一種是錯誤日誌 (Error Log)。除了分析網站流量,
系統/網站管理員還可以透過分析網站日誌來了解是否發生過攻擊網站的行為 (像是SQL 注入攻擊) 。儘管這些日誌有很大的用處,但是因為這些日誌一直以來都是網站流量分析工具所依賴的資料來源,所以其能儲存的格式與資料也就不太容易改變,也就是說不能應付其他較為特殊的應用。
Apache HTTP 服務器除了上述兩種日誌,另外還提供了一種稱之為 Forensic 的日誌,只是在預設的情況下這個功能是被關閉的。跟原本的日誌相比, Forensic 日誌有下列特點:
- 每一個請求 (Request) 會有兩筆記錄,一筆是在開始處理請求前,另外一筆則是請求處理結束後。此一特點可以用來分析是否有不正常中斷的請求,這類不正常的請求可能是因為程式或設定的錯誤,也有可能是因為遭受到有心份子的攻擊。如果沒有開啟 Forensic 日誌,這類行為往往僅會在錯誤日誌留下類似 Segement Fault 的訊息,對於釐清問題並沒有太大的幫助。
- Forensic 日誌的格式是固定的,不像存取日誌或錯誤日記可以自定需要記錄的格式與欄位。
- Forensic 記錄的內容比原本的存取日誌還要詳細,包含標頭的內容也會一併予以記錄,其中甚至包含 Cookie 等可能包含機密資料的標頭。因此對於 Forensic 日誌檔必須予以嚴加保護,以避免有心份子取得不適當的資料。
接下來,我們先看一下在 CentOS 6 的環境下,如何開啟 Forensic 日誌的功能:
- 修改 Apache 設定檔,預設為 /etc/httpd/conf/httpd.conf
載入 mod_log_forensic 模組,也就是將
#LoadModule log_forensic_module modules/mod_log_forensic.so
這行改成
LoadModule log_forensic_module modules/mod_log_forensic.so
並設定 Forensic 日誌檔所在位置
加上下列設定
ForensicLog logs/forensic_log
其中 logs/forensic_log 表示儲存的檔案路徑。
- 重新載入 Apache 的設定
指令是
service httpd reload
設定完成後,我們可以試著讀取網站上的網頁,如果一切正確的話應該可以在 logs/forensic_log 這個檔案內看到類似下列的資訊:
+24178:52ba84d3:0|GET /wordpress/ HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
+24179:52ba84d3:0|GET /wordpress/wp-includes/css/admin-bar.min.css?ver=3.7.1 HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/css,*/*;q=0.1|If-None-Match:"30e3-3220-4e95d2605fe80"|If-Modified-Since:Tue, 22 Oct 2013 23%3a56%3a26 GMT|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Referer:http%3a//192.168.0.119/wordpress/|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
-24179:52ba84d3:0
-24178:52ba84d3:0
我們可以發現
每一行記錄的開頭都是一串數字,這是用來識別每一個請求的代號。而每一個代號應該會有兩筆記錄,前面分別加上符號 + 或
–。+ 號表示請求開始處理前的紀錄,而 - 號表示請求處理結束後的紀錄。
如果我們發現特定的請求代號只有 + 號的紀錄,而沒有 - 號的記錄,表示此一請求為不正常的中斷。此時,我們就可以透過日誌內的完整資訊來分析此一請求的各項資訊。
雖然找出不正常中斷請求的原理很簡單,但是如果要靠人工來找出 Forensic 日誌檔中有問題的紀錄,實在是一個不可能的任務。好在 Apache HTTP 服務器提供了一個簡單的
腳本 check_forensic,可以用來幫助我們找出 Forensic 日誌檔中有問題的紀錄。不過在 CentOS 6 Apache HTTP 服務器的 RPM 安裝檔當中,並沒有包含此一腳本,所以我們需要自行下載 tarball 並取得當中的腳本 check_forensic 腳本。如果 Forensic 日誌檔沒有任何錯誤,執行腳本 check_forensic 並不會顯現任何資訊。反之,如果有任何不正常中斷的請求,check_forensic 將會列出有問題的紀錄,類似下列結果:
[root@web httpd]# ./check_forensic forensic_log
+24177:52ba84d3:0|GET /wordpress/wp-content/themes/twentythirteen/fonts/genericons.css?ver=2.09 HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/css,*/*;q=0.1|If-None-Match:"3087-57d7-4e001b3bdeb80"|If-Modified-Since:Tue, 25 Jun 2013 22%3a03%3a42 GMT|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Referer:http%3a//192.168.0.119/wordpress/|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
[root@web httpd]#
Apache 的 Forensic 日誌檔提供系統/網站管理員有別於標準存取與錯誤日誌的資訊,不管在面對有心或是無意的異常存取行為,都是一項有力的工具。