2021年6月30日 星期三

[經驗分享] Apache Web 記錄檔傳輸至 Syslog/Graylog 伺服器保存

 



Apache Web 伺服器會將所有網站的連線記錄存在於本機的記錄檔裡面,當中具有許多分析問題或入侵事件的重要證據。

因此,將這些記錄丟到集中的記錄伺服器就是一件相當重要的事,但要怎麼做呢?





問題狀況

雖然 Apache Web 伺服器會將記錄寫至 /var/log/apache2/ 的檔案裡,但是我在 rsyslog.conf 裡設定丟至遠端 Syslog 伺服器卻不會把它也丟過去。

我想起之前介紹過的另一款記錄檔轉送超強工具 NXLog CE,它可以將文字記錄檔吃進來再丟給 Syslog 伺服器,兩三下就能簡單搞定。

可是....


NXLog CE 官網下載頁


唉呀,我所使用的 Linux 發行版本是 Debian 10 Buster,NXLog CE 社群版還沒有釋出安裝包(企業版已經有),嗚嗚。











解決方案一

在 Linux 裡面,我們可以將 apache2、logger、rsyslog 搭配起來用,達到將 Apache Web 伺服器記錄檔都出去的效果。
# 修改 Apache2 Web 伺服器設定檔
nano /etc/apache2/apache2.conf

# 加入這行
CustomLog "| /usr/bin/logger -p local5.info" combined

# 修改 Rsyslog 設定檔
nano /etc/rsyslog.conf

# 加入傳輸至遠端記錄伺服器
local5.info @192.168.100.10:514

# 重新啟動服務
systemctl restart apache2
systemctl restart rsyslog

重新啟動完成後,確實可以將記錄檔丟至遠端 Syslog 伺服器。









解決方案二

改著改著,覺得機器一多後,這種改法要一次改兩個設定檔,有沒有更方便的作法?另外這種內容丟給 Graylog 的話,內容還要自己寫 Extractor 解析,又多一件工作了,怎麼辦呢?

山不轉路轉,路不轉人轉,採用開源軟體你想怎麼轉就怎麼轉。

既然前一個方法是用本機的 logger 丟給 rsyslog,那我把它換成 nc,讓 apache2 直接把記錄轉出去丟給 Graylog,而且在丟出去之前先把格式組裝為 Graylog 專用的 GELF 格式,這樣 Graylog 收到後就可以直接把欄位拆好索引。

# 修改 Apache2 Web 伺服器設定檔
nano /etc/apache2/apache2.conf

# 加入這兩行
LogFormat "{ \"version\": \"1.1\", \"host\": \"%V\", \"short__message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"__user__agent\": \"%{User-Agent}i\", \"__source__ip\": \"%h\", \"__duration__usec\": %D, \"__duration__sec\": %T, \"__request__size__byte\": %O, \"__http__status__orig\": %s, \"__http__status\": %>s, \"__http__request__path\": \"%U\", \"__http__request\": \"%U%q\", \"__http__method\": \"%m\", \"__http__referer\": \"%{Referer}i\", \"__from__apache\": \"true\" }" graylog__access
CustomLog "|/bin/nc -u 192.168.100.21 12201" graylog__access

# 重新啟動服務
systemctl restart apache2

注意,因為網頁格式問題,我把上面程式區塊裡的底線都換成兩個底線,請自行替換回來。


只要修改上面的部份即可,方便太多啦!而且 Graylog 裡就可以自動看到分拆索引的欄位,非常省事,接著就可以在 Graylog 上方便的製成各種看板。



Graylog 收取 Apache Web 伺服器記錄欄位一




Graylog 收取 Apache Web 伺服器記錄欄位二




Graylog 製作 Apache Web 伺服器資訊看板










參考資料