如何做 Nginx 安全日誌分析可視化

之前介紹過 ModSecurity 這款優秀的開源 WAF,它是一個入侵檢測與阻止的引擎,原本是 Apache 的一個模塊,現在可作爲單獨模塊編譯添加到 Nginx 服務中

雖然這款 WAF 很優秀,但是使用起來並沒有那麼容易,之前也整理了文章介紹它的原理和規則,然而還有一個問題,就是它的日誌分析,之前介紹原理規則的時候,也介紹了它的日誌規則,但是在使用過程中,純文本的記錄方式,對於入侵分析太不友好了

所以今天介紹一款管理 ModSecurity 日誌的開源項目 WAF-FLE

WAF-FLE 是專門用來處理 ModSecurity 日誌和事件的控制檯,管理員可以通過 WAF-FLE 查看和搜索 ModSecurity 記錄的日誌

WAF-FLE 是 PHP 寫的開源項目,搭建需要 LNMP/LAMP 環境

環境需求:

安裝環境不贅述,只說一個 GeoIP 庫的安裝,這裏要通過 GeoIP 庫去展示入侵 IP 信息,所以需要用到這個庫,安裝很簡單,其實就是下載一個 dat 數據庫,從 https://www.maxmind.com/en/geoip-demo 下載

下載後解壓出 dat 文件即可

環境準備好之後,從 github 下載 WAF-FLE:https://github.com/klaubert/waf-fle

在 waf-fle 的 extra 目錄下,存放了數據庫 sql 文件,以及 Apache 的配置文件,如果是用的 Apache,直接將這個配置複製到 apache 配置目錄下即可,如果用 Nginx,參考下面的配置

修改 config.php 的時候,因爲我沒有安裝 apc 的緩存擴展,這擴展很老了,所以直接設置 APC_ON=false,關閉這個緩存

完成上面之後,通過域名訪問,即可訪問到安裝界面

這裏檢查 php 擴展的時候,如果你不是 Apache 的話,會有個問題,就是在 setup.php 的 499 行,它用 apache_getenv 檢測是否用 Apache 運行的,如果沒運行 Apache,這裏過不去,我這裏是 Nginx 運行的,所以打開 setup.php 文件 499 行,把這部分代碼註釋掉即可

接着點擊運行創建數據庫

這裏創建數據庫的時候又有個問題,在 setup.php 代碼 28 行的地方,執行創建函數的時候,引用一個 $databaseSchema,這裏修改定義了一個位置,但是我放置的是我的位置,所以這裏需要根據自己情況進行修改

修改完成後,繼續通過頁面執行創建數據庫操作,創建完成如下:

安裝完成,默認用戶名密碼是 admin/admin,之後,在 config.php 中配置 $SETUP=false,關閉安裝之後,重新訪問

默認用戶密碼登錄之後,就需要修改用戶名密碼

設置完新密碼之後,就會跳轉到主界面了

目前沒有數據,現在開始接入日誌數據,點擊菜單欄的 management,添加 sensor

保存後,即創建好一個 sensor,用來接收日誌

創建好之後,在這個 sensor 上面,開始配置事件接收器

這裏選着用 mlog2waffle 的方式接收日誌,然後選着 service deamon 的方式查詢日誌,這種是實時查詢,WAF-FLE controller URL 是配置 waf-fle 的控制器地址,mlog2waffle 是通過 put 請求發送數據到這個接口地址,下面就是配置 ModSecurity 日誌的配置路徑,配置完成後,點擊 Next

系統會給出提示配置,需要按照給出的配置,配置這幾個配置文件,這裏按照提示的配置操作即可,需要的 mlog2waffle 配置文件及啓動腳本都在 extra 目錄下

配置完成後,啓動 mlog2waffle

mlog2waffle,是通過 put 方法發送日誌到 waf-fle 的,但是默認 Nginx 是不允許 put 請求的,所以啓動會報錯,需要在 nginx 中,通過 dav 方法,允許 put 請求

啓動 mlog2waffle 過程中,遇到不少問題,記錄如下:

這裏通過 PUT 方法,發送了一個檢測請求,這裏比較坑的是,發送 PUT 請求,沒有 URI,但是 Nginx 在檢測到 PUT 請求沒有 URI 的時候,會報 409,認爲資源有衝突

所以,不管怎麼做,這裏檢測就不會通過,兩種方法處理,一種是直接關閉這個檢測,mlog2waffle 就可以正常啓動,另外一種方法就是修改這個檢測的方法,將 uri 帶上,mlog2waffle 是 perl 腳本,很簡單

這裏需要手動替換下,通過 $_SERVER 去獲取客戶端 IP,而 getallheaders() 方法,需要手動寫一個,如下:

另外在 index.php 中,65 行的位置,原本是通過 apache_setenv() 將獲取到的 sensor 的名稱,複製給 Apache 的 "REMOTE_USER",這裏不用 Apache,所以直接註釋掉即可

修改完這些,就可以通過腳本啓動 mlog2waffle 了

啓動後,通過 waf 的 access 日誌就可以看到 mlog2waffle 已經開始通過 put 方法將日誌解析成 event,傳輸到 waf-fle

在 mlog2waffle 的 readIndex 方法中,因爲要讀取並解析日誌索引文件,所以有一個正則匹配如圖:

這裏需要你更具自己記錄的日誌格式進行修改匹配,完全匹配後,才能正確讀取到日誌,並解析後通過 send_event 方法將解析後的內容通過 PUT 方法傳輸到 waf-fle 進行展示

waf-fle 的接收文件就一個 index.php,它將所有步驟通過正則解析,有興趣的可以看下源碼,到此 waf-fle 就部署完成了,看下效果

雖然 waf-fle 是比較老的開源項目,但是對於 modsecurity 的日誌分析完全夠用

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/TFcnOm63vCIy7weI5_3l4A