我會這樣設計WAF系統
原文鏈接:我會這樣設計WAF系統
由於以前寫過一篇介紹WAF(Web Application Firewall)的文章,陸陸續續有不少同學跟我諮詢是否方便開源WAF模塊代碼。對此,我個人是認為可以開源的。當然,開源的部分不可包含具體規則。但是,從公司角度來看,這份代碼並非個人財產,且和安全相關,我也就不便將其分享出來了。只是考慮到大家的訴求,加之我也有了更多的相關設想,於是就有了這篇文章。基於踩過的各種坑,重新思考和設計WAF系統,希望能有一點參考價值。
系統拆分
規則處理引擎:載入規則並實時分析處理請求
數據收集模塊:統計業務metrics,收集結構化日誌
數據分析模塊:分析並確定關鍵指標
數據展示模塊:圖形展示關鍵指標
原有痛點
Nginx C模塊開發維護有一定難度
收集的日誌且未結構化,難以分析
日誌存儲是基於MySQL的,查詢不友好
缺少metrics統計,不知系統整體運行狀態
技術選型
規則處理引擎
基於lua-nginx-module模塊實現相關業務邏輯與統計功能,最好能做到引擎框架與安全規則分離。事實上,Github已經有不少相關開源項目可以參考,安全規則可參考ModSecurity的OWASP核心規則。順便提一下,據說章亦春準備開源一套WAF框架,值得期待。
利用這個模塊,介入到Nginx處理HTTP請求或相應的各個階段(如access及log等Phase),首先將Nginx相關信息記錄到Lua虛擬機中(或以庫的形式提供API給Lua調用),再通過Lua虛擬機來執行Nginx配置中的Lua腳本。簡單介紹一下它的特點:
一個worker進程對應一個Lua虛擬機
利用Lua的coroutine實現用戶態協程調度
能夠高效構建完整複雜的業務邏輯
可通過LuaJit大幅提升性能,接近C++
數據收集模塊
利用Prometheus client庫統計相關metrics,Prometheus可考慮通過Concul等實現服務自動發現;Logstash/Rsyslog收集結構化日誌,可靈活調整日誌欄位。
Prometheus是一個開源的系統監控框架,實現上參考了Google內部的監控系統。主要具有以下三個特點:
多維數據模型,靈活的查詢語言
通過pull方式採集metrics,對線上服務無影響
不依賴分散式存儲,基於LevelDB,單機即可監控上千台伺服器
數據分析模塊
利用Prometheus抓取metrics進行歸併整合,分析需要關注的重要指標並在規則處理引擎中埋點;結構化日誌則存儲於Elasticsearch以便查詢。
數據展示模塊
可自研。開始最好先基於Grafana展示metrics趨勢圖,Kibana則用於分析展示日誌數據;周報,月報或年報等則可通過自寫腳本導出。
以上僅供參考,歡迎交流。最後,感謝韓哥,感謝開源~
推薦閱讀:
※HTTP2 折騰記
※如何配置nginx+uwsgi+django?
※Nginx的https配置記錄以及http強制跳轉到https的方法梳理
※Nginx 多進程模型是如何實現高並發的?