類編程的WAF(下)
一、編程語言的要素
天存信息的iWall3應用防火墻是一種創新式的類編程 WAF,它包含了編程語言的一些基本要素。
1. 變量
iWall3 中廣義的變量包括報文變量、環境變量和用戶變量:報文變量和環境變量相當于編程語言中的常量或傳入的參數,用戶變量則是真正編程語言意義上的變量,即用戶可以自行創建、使用和維護變量。
2. 條件判斷
iWall3 支持編程語言標準的條件判斷:即可以包含無限嵌套的 if - then - else 條件,每個 if 條件又可以使用 and - or - not 邏輯運算符連接多個子條件。
3. 表達式
iWall3 支持與通用編程語言一致的表達式:表達式由常量、變量、運算符和內置函數組成,以模板字符串方式內嵌書寫,可在條件判斷、變量賦值、模式匹配、日志輸出等任意位置使用。
4. 語句
條件執行部分,iWall3 允許用戶書寫任意語句:這些語句不限于 WAF 常規的阻止訪問和記錄日志,它可以實現更復雜的功能,如:改變其他規則的行為,修改 HTTP 報文的特定部分,輸出指定變量等。
二、數據方式的語言表達
天存信息的 iWall3 包含了編程語言的設計思想,但獨創性地以數據方式呈現。
1. JSON格式
安全產品的使用者通常是非程序員,他們習慣于面對配置文件而非一段代碼。因此,iWall3 的配置依舊以規則文件的形式出現,只是這里的規則不是純文本格式,而是可以體現出層次結構的 JSON 格式。
充分利用 JSON 格式的名-值對 (對象) 和序列表 (數組) 結構,將語言要素和業務邏輯用 JSON 格式表達出來,兼顧規則的人機可讀性和高度靈活性。
JSON 格式的每個元素都具有明確的名 (name),這就給了書寫者一個基本的框架和自說明的參數指引,既方便了自己書寫規則,也便于其他人對規則的維護。
iWall3 規則具有明確細致的語法定義,從而能夠使用成熟的 JSON schema 方式來校驗 (validate) 規則的正確性,例如可以細致檢查動作的必選參數、可選參數以及拼寫錯誤。
2. 規則結構
一個規則即為一個 if-then-else 結構,在 JSON 格式中表現為一個名為 if 的對象和一個名為 then 的對象,以及可選的一個名為 else 的對象——
if - 變量經選擇和整形后,與表達式模式的運算進行匹配。支持用邏輯運算符連接多個條件。
then - 匹配后執行的一般語句和裁決語句,還可以包含子 if-then 結構。
else - 不匹配時執行的語句和可選的子 if-then 結構。
以下是規則的一個舉例:
{ "if": { "variable": "REQUEST_FILENAME_EXT", "operator": "inFromFile", "pattern": "restricted_file_exts.lst" }, "then": { "if": { "variable": "REMOTE_ADDR", "operator": "begin", "pattern": "192.168" }, "then": { "verdict": { "log": true, "action": "pass" }, "actions": [{ "action": "alterArgGet", "op": "set", "name": "iwall_rule_id", "value": "${RULE.id}" }], }, "else": { "verdict": { "log": true, "action": "deny" } } } }
上述規則實現的功能為: 遇到訪問敏感文件類型時,記錄日志,并對不同訪問來源作不同響應:來自內網的,放行且將規則 id 作為參數傳給后端應用;來自外網的,則拒絕。
3. 自動循環
一般編程語言中都有名為 for 的循環語句,用來對可迭代數據進行逐個元素處理。HTTP 協議中的請求參數 (args)、頭 (header) 都是可迭代數據,在 iWall3 中表現為集合或者數組的數據類型。如果按照編程語言的慣例,用 for 循環去顯式地獲取數據,會讓規則寫得很繁瑣。
iWall3 則實現了對可迭代變量類型的自動循環,只需列出變量名,即可自動進行循環迭代,簡化了書寫。而對于不需要參與循環的元素,也提供了成員篩選的手段,直接在變量名后列出白名單或黑名單成員即可。
{ "if": { "variable": "REQUEST_COOKIES:!cnzz_*", "transform": "urlDecodeUni", "operator": "detectSQLi" } }
上述規則對請求 cookie 中的每個成員進行 SQL 注入檢查,但排除掉 cnzz_ 開頭的成員。
4. 動態修改
規則并非是靜態孤立的,它不僅可以自身執行動作,還可以在 HTTP 會話過程中去改變其他規則的屬性,稱為元屬性覆寫。元屬性覆寫功能實現了運行時的檢測和動作分離,通過動態調整其他規則的輸入和響應,滿足用戶復雜的需求。
{ "if": [{ "variable": "REQUEST_FILENAME", "operator": "=", "pattern": "admin.php" }, { "variable": "TIME.hour", "operator": "<", "pattern": "8" }], "then": { "actions": [{ "action": "alterRuleMeta", "rules": "10001,30001-30999", "meta": { "severity": "warning", "abnormal_weight": 15 } }] } }
上述規則的功能是: 在 0:00am-8:00am 這一時間段內訪問 admin.php 時,部分規則的緊急度將被設為 critical,異常權值則被設為 15。
三、針對HTTP協議的定制
天存信息的 iWall3 的目標是實現 Web 應用防護,因此在語言設計上也有與 HTTP 協議密切相關的因素。
1. 數據類型
與編程語言中的變量一樣,iWall3 的變量也具有多種數據類型。其中有些數據類型是專門針對 HTTP 協議而設計的,如:
2. 持久變量
iWall3 的用戶變量具有自己的生命期。在語言層面,iWall3 不僅提供了 HTTP 會話期內有效的事務內變量,也提供了跨越 HTTP 會話的持久變量。
持久變量提供了跨越 HTTP 事務的保存、計算和讀取數據的機制。這樣,Web 應用防護的邏輯就不局限于單個 HTTP 會話,而是可以在多個 HTTP 會話間建立聯系。
3. 狀態維護
HTTP 協議本身是無狀態的,這意味著沒有“用戶”的概念。但在防護功能上,我們又需要有一個“用戶”的概念,這樣才能將多個 HTTP 事務關聯起來,制定針對“用戶”的防護措施。
iWall3 提供了主體的概念,它是 HTTP 事務的發起端和訪問者。對于每個 HTTP 事務,可以從設備、網絡和報文等不同層面采集信息,得到多個類型的主體。如此,書寫者能夠對多個 HTTP 事務中的同一主體應用規則 (如長時間攔截) 和共享數據 (如權重計算)。
四、有什么用
使用類編程 WAF,安全人員不再是規則的使用者,而變成了規則的生產者。針對應用的細致和獨立的安全需求,基本上都可以用編程的方式實現出來,不再受限于 WAF 產品提供的內置功能。
如本文開頭所述的功能需求,即使僅僅在防范注入方面:
某個域名或某些特定的 URL 不需要注入檢查;
對來自外網的注入訪問進行攔截,來自內網的注入訪問只記錄,不攔截;
對特定的請求參數名或特定特征的請求參數不進行注入檢查;
非工作時段不僅攔截還阻止該用戶一段時間訪問;
對 admin 等管理賬號登錄后的訪問不進行注入檢查;
對于只記錄不攔截的請求,附加一個特別的請求頭發往應用;
對某些 URL 的注入訪問,記錄下 HTTP 請求的全部報文;
HTTP 響應碼為 500 的注入的日志緊急度設為 alert;
對疑似的注入企圖不做一次攔截,而是進行加權計算。
無論是上述某一條還是更復雜的組合,安全人員都可以在用戶現場通過高度靈活的類編程 iWall3 來實現。
HTTP Web應用防火墻 WAF 網絡 運維 通用安全
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。