我會這樣設計WAF系統

原文鏈接:我會這樣設計WAF系統

由於以前寫過一篇介紹WAF(Web Application Firewall)的文章,陸陸續續有不少同學跟我諮詢是否方便開源WAF模塊代碼。對此,我個人是認為可以開源的。當然,開源的部分不可包含具體規則。但是,從公司角度來看,這份代碼並非個人財產,且和安全相關,我也就不便將其分享出來了。只是考慮到大家的訴求,加之我也有了更多的相關設想,於是就有了這篇文章。基於踩過的各種坑,重新思考和設計WAF系統,希望能有一點參考價值。

系統拆分

  1. 規則處理引擎:載入規則並實時分析處理請求

  2. 數據收集模塊:統計業務metrics,收集結構化日誌

  3. 數據分析模塊:分析並確定關鍵指標

  4. 數據展示模塊:圖形展示關鍵指標

原有痛點

  1. Nginx C模塊開發維護有一定難度

  2. 收集的日誌且未結構化,難以分析

  3. 日誌存儲是基於MySQL的,查詢不友好

  4. 缺少metrics統計,不知系統整體運行狀態

技術選型

  • 規則處理引擎

    基於lua-nginx-module模塊實現相關業務邏輯與統計功能,最好能做到引擎框架與安全規則分離。事實上,Github已經有不少相關開源項目可以參考,安全規則可參考ModSecurity的OWASP核心規則。順便提一下,據說章亦春準備開源一套WAF框架,值得期待。

    利用這個模塊,介入到Nginx處理HTTP請求或相應的各個階段(如access及log等Phase),首先將Nginx相關信息記錄到Lua虛擬機中(或以庫的形式提供API給Lua調用),再通過Lua虛擬機來執行Nginx配置中的Lua腳本。簡單介紹一下它的特點:

    1. 一個worker進程對應一個Lua虛擬機

    2. 利用Lua的coroutine實現用戶態協程調度

    3. 能夠高效構建完整複雜的業務邏輯

    4. 可通過LuaJit大幅提升性能,接近C++

  • 數據收集模塊

    利用Prometheus client庫統計相關metrics,Prometheus可考慮通過Concul等實現服務自動發現;Logstash/Rsyslog收集結構化日誌,可靈活調整日誌欄位。

    Prometheus是一個開源的系統監控框架,實現上參考了Google內部的監控系統。主要具有以下三個特點:

    1. 多維數據模型,靈活的查詢語言

    2. 通過pull方式採集metrics,對線上服務無影響

    3. 不依賴分散式存儲,基於LevelDB,單機即可監控上千台伺服器

  • 數據分析模塊

    利用Prometheus抓取metrics進行歸併整合,分析需要關注的重要指標並在規則處理引擎中埋點;結構化日誌則存儲於Elasticsearch以便查詢。

  • 數據展示模塊

    可自研。開始最好先基於Grafana展示metrics趨勢圖,Kibana則用於分析展示日誌數據;周報,月報或年報等則可通過自寫腳本導出。

以上僅供參考,歡迎交流。最後,感謝韓哥,感謝開源~


推薦閱讀:

HTTP2 折騰記
如何配置nginx+uwsgi+django?
Nginx的https配置記錄以及http強制跳轉到https的方法梳理
Nginx 多進程模型是如何實現高並發的?

TAG:网络安全 | Nginx | 系统架构 |