03.05 ModSecurity應用防火牆使用詳解

一、介紹

ModSecurity是一個Web應用防火牆(WAF)。當前已經有超過70%的攻擊發生在網絡應用層,各級組織急需要能夠保證他們的系統安全性的幫助。WAF系統的部署,可以為web應用增加一個外部安全層來檢測或防止攻擊。針對一系列的攻擊,ModSecurity為web應用提供了強大的保護,並對HTTP流量進行監測和實時分析,這些都只是很少或是根本沒有影響系統的基礎設施。

HTTP流量記錄

web服務器已有的日誌功能已經足夠進行訪問請求分析,但是就web的應用分析還有些不足,特別是大多情況下沒辦法記錄下請求體。你的對手很清楚這一點,所以很多時候的攻擊是通過POST請求產生,並導致您的系統失明。ModSecurity充分的獲取HTTP交互中的所以內容,並記錄完整的請求和響應。其日誌功能可以允許您更細緻的做出判斷究竟什麼是登錄的時候,並確保相關的數據都被記錄下來。一些請求和響應中的某些關鍵字段可能包含敏感數據,ModSecurity可以被配置成在記錄這些審計日誌前隱藏它。

實時監控和攻擊檢測

除了提供記錄日誌功能外,ModSecurity還能實時的監控HTTP的流量以檢測攻擊。在某些時候,ModSecurity做為一個WEB入侵檢測工具,可以讓你對發生在WEB系統上的一些可疑事件做出響應。

攻擊防禦和及時修補

ModSecurity能夠立即針對你的WEB應用系統進行攻擊防禦,有三種通用的方法:

1、消極(negative)安全模型:消極安全模型監控那些異常的、不常用的和通用的WEB攻擊類請求。它統計每個請求的有關IP地址、應該連接、和用戶帳戶的異常分數,當出現較高的異常分數時,會記錄日誌並完全的阻止訪問。

2、積極安全模開型:部署積極安全模型後,只有那些明確的請求被允許通過,其它的一律禁止。這個模式要求你對需要保護的WEB應用要非常的瞭解。因此積極安全模式最好是用於那種大量訪問卻很少更新的系統,這樣才能使這種模型的維護工作量降到最低。

3、已知漏洞攻擊:其規則語言使ModSecurity成為一個理想的外部修補工具,外部修補(有時是指虛擬修補)可以減少機會之窗。一些組織修補這些應用的漏洞通常需要幾周的時間,使用ModSecurity,應用系統可以從外部修補,根本不用改應用的源碼(甚至時不用去管它),可以保證你的系統安全直到有一個合適的補丁來應用到系統中。

靈活的規則引擎

靈活的規則引擎是ModSecurity的核心,其實現了ModSecurity的規則語言,這是一個專用的程序語言設計的用於處理HTTP的傳輸數據。ModSecurity規則語言被設計的簡單易用,非常的靈活:通用的操作是簡單的,而複雜的操作也是可以實現的。經過認證的ModSecurity規則,放在ModSecurity中,包含了一整套規則,它實現了通用目的強化、協議正規化和對一些通用web應用安全問題的檢測。大量評論認為,這些規則可以用於學習研究使用。

嵌入式模式部署

ModSecurity是一個可嵌入式的WEB應用防火牆,意思就是它可以做為以apache為基礎的已經提供WEB服務的WEB服務器的一部分。這樣的部署譯意風一些特殊的優勢:

1、不改變已有的網絡結構。只需要花幾分鐘就可以為你的WEB服務器添加ModSecurity,而且由於它默認被設計為完全的被動方式,你可以自由的逐步部署並且只使用你需要的特性。同樣也可以根據你的需要輕鬆的刪除或停用它。

2、不存在單點故障。與網絡設備部署方式不同,你不會給你的系統帶來新的故障點。

3、絕對支持負載均衡。因為它以嵌入方式運行在WEB服務器上,ModSecurity會自動的利用附加的負載均衡特性。你不需要考慮負載均衡,除非你的系統本來就需要它。

4、極少開銷。因為它在WEB服務器進程內工作,不會帶來網絡間接通信的負載,而且只進行最小的分析和數據交換開銷。

5、加密或壓縮內容沒問題。許多IDS系統分析SSL流量的時候很困難,但對於ModSecurity沒有麻煩,因為它工作於已解密和解壓的數據環節。

基於網絡的部署

在基於apache的反向代理模式上ModSecurity同樣能工作的很好,我們很多客戶選擇這樣做。在這種情形下,裝了ModSecurity的可以保護任一一種WEB服務器(即使它不是apache的)。

可移植性

眾所周知,ModSecurity可以很好的工作在眾多操作系統上,我們的用戶已經將它成功運行在Linux, Windows, Solaris, FreeBSD, OpenBSD, NetBSD, AIX, Mac OS X, 和HP-UX等系統上。

許可

ModSecurity有兩種許可方式。用戶可以選擇在GNU許可第二版(本發佈中包含這個許可文本)下免費的使用這個軟件產品。還有一系列的商業許可可供選擇,同時會有一些商業支持合同。有關更詳細的商業許可信息請聯繫Breach Security。

注意

ModSecurity, mod_security, ModSecurity Pro, 和 ModSecurity Core Rules等都是Breach Security, Inc.的商標或註冊商標。

二、ModSecurity Core Rules

概述

ModSecurity是一個WEB應用防火牆引擎,自身所提供的保護非常少。為了變得更有用些,ModSecurity必須啟用規則配置。為了讓用戶能夠充分利用ModSecurity離開方塊,Breach Security, Inc.為ModSecurity 2.x提供了一套免費的認證規則集。和入侵檢測及防禦系統不一樣,它們依賴於具體的簽名過的已知漏洞,而這一核心規則卻是為從網絡應用中發現的不知名的漏洞提供一般的保護,通常這些漏洞大多數情況下都是自定義編碼的。這一核心規則有了大量的評論,從而使得這些能夠被用來做ModSecurity的部署嚮導。最新的核心規則可能通過ModeSecurity的站點找到-http://www.modsecurity.org/projects/rules。

核心規則內容

為了提供一般WEB應用保護,核心規則使用以下技術:

· HTTP保護 - HTTP協議正規劃檢測,並啟用本地有效策略

· 一般WEB攻擊保護 - 檢測一般WEB應用的安全攻擊

· 自動檢測 - 檢測機器人、爬蟲、掃描器和其他的表面惡意行動

· 木馬檢測 - 檢測木馬程序進入

· 過失隱藏 - 偽裝服務器發出錯誤消息

三、安裝

安裝

ModSecurity安裝過程包含以下幾步:

1、ModSecurity 2.x工作於Apache 2.0.x或者更高版本

2、確認您已經安裝了mod_unique_id。

mod_unique_id是apache的httpd中的一個包

3、服務器中還沒有libxml2的話,請安裝它的最新版.

http://xmlsoft.org/downloads.html

4、如果服務中還沒有安裝Lua,而且你將需要使用的話,請安裝5.1.x分支的最新版

http://www.lua.org/download.html

注意ModSecurity需要的是動態庫,而採用源代碼編譯時默認得不到這些,所以最好採用二進制發佈版本。

5、停止apache的httpd服務

6、解開ModSecurity安裝包

7、Unix(或者類Unix)操作系統和Windows上進行不同的構建

Unix

a、運行configure腳本生成Makefile文件,通常不需要設置選項

./configure

更多的定製使用配置選項(使用./configure --help可以得到完整列表),但通常你只需要使用--with-apxs選項指定apache的httpd安裝時的apxs的位置即可。

./configure --with-apxs=/path/to/httpd-2.x.y/bin/apxs

b、編譯:make

c、可選的測試:make test

注意:這一步還是帶有一點點試驗性質,如果發現問題,請把構建過程中的所有輸出發送到支持列表,大部分常見問題是找不到所需要的頭和庫文件。

d、可選構建ModSecurity的日誌收集器:make mlogc

e、可選安裝mlogc:查檢發佈版本包含在apache2/mlogc-src目錄下的INSTALL文件

f、安裝ModSecurity模塊:make install

Windows(MS VC++ 8)

a、編輯Makefile.win文件,配置apache主目錄和二進制目錄

b、編譯:nmake -f Makefile.win

c、安裝ModSecurity模塊:nmake -f Makefile.win install

d、拷貝libxml2.dll和lua5.1.dll到apache的二進制目錄,當然也可以象下面的操作那樣使用LoadFile命令加載那些庫文件。

8、編輯apache httpd的主配置文件(通常是httpd.conf)

On UNIX(在Windows上,如果你沒有按上述規定拷貝DLL文件話也可以)上你必須在ModSecurity之前加載libxml2和lua5.1,參考如下操作:

LoadFile /usr/lib/libxml2.so

LoadFile /usr/lib/liblua5.1.so

按如下加載ModSecurity

LoadModule security2_modules modules/mod_security2.so

9、配置ModSecurity

10、啟動apache httpd

11、到目前為止,你應該已經裝好ModSecurity 2.x並且運行它了。

注意:

如果你是自己編譯的apache,那你或許經歷了在PCRE上編譯ModSecurity的問題,這是因為apache帶上了PCRE,但通常PCRE的庫文件又是由系統提供的,我希望絕大多數的供應商打包apache發佈版本時配置使用外部PCRE的庫文件(所以這不應成為問題)

您想避免使用apache捆綁的PCRE庫和ModSecurity使用的是系統提供的庫,很簡單的方法就是重新編譯apach,並使用系統提供的PCRE庫(或者你可以下載個最新版本的PCRE編譯一下),你也可以在編譯的時候使用--with-pcre開關。如果你不能重新編譯apache,那麼為了獲得ModSecurity的編譯成功,你還是需要獲得捆綁的PCRE頭文件(這可以在apache的代碼中找到)並修改INCLUDE路徑(在上述第7步中做)來指向它(通過ModSecurity的--with-pcre配置選項)。

你注意,如果你的apache使用的是外部PCRE,那你可以在編譯ModSecurity時使用WITH_PCRE_STUDY定義,這將給你的服務器處理正則表達式時有一個輕微的性能提高。

四、配置指令(一)

以下章節列出ModSecurity指令的綱要,大部分的ModSecurity指令可以用於Apache帶有範圍的指令中,如VirtualHost, Location, LocationMatch, Directory等。當然也還有其他的,只能在主配置文件中使用一次。這些信息在下述範圍章節中指定,下述的版本指令章節中給出第一個版本可用給定的指令。

這些規則除了核心規則文件之外 ,應當做為一個獨立的於httpd.conf之外的配置文件,通過apache的include指定包含在其中。如此可以方便更新或遷移規則,如果你要創建自己的規則,作為核心規則使用,你應該創建一個文件叫modsecurity_crs_15_customrules.conf 當作核心規則放在相同的目錄下。使用這個文件名,你的自定義規則會在標準的ModSecurity規則之後被加載,但會在其他規則之前,這可以使得您的規則在您需要實施具體的“允許”規則或糾正任務誤報的核規則時得到優先評估,從而使其真正用到你的網站系統上。

注意:

我們鼓勵您不要去修改核心規則文件,但你可以把所有的改動(就象SecRuleRemoveByID等)放到自己定義的文件中,這樣可以讓您很方便的從ModSecurity站點升級新的核心規則文件。

SecAction

描述:無條件執行動作列表中的第一個也是唯一的一個參數,只接受一個參數,其句法規則與SecRule的第三個參數相同

語法:SecAction action1,action2,action3

示例:SecAction nolog,initcol:RESOURCE=%{REQUEST_FILENAME}

階段:所有

範圍:所有

版本:2.0.0

備註:無

SecAction是您想無條件執行一個動作時的最好選擇,這是有條件基於對請求/響應數據的檢查導致明確的控制產生的一般動作,當你想運行一些特定的動作如initcol來初始化蒐集時這是一個很有用的指令。

SecArgumentSeparator

描述:指定的字符做為application/x-www-form-urlencoded內容的分隔符,默認是&,非常少的情況下應用會使用分號(;)。

語法:SecArgumentSeparator character

示例:SecArgumentSeparator ;

階段:所有

範圍:Main

版本:2.0.0

備註:無

這個指令用於後臺WEB應用在使用非標準的參數分隔符,如果沒有在每一個WEB應用中合理設置這個指令,那麼ModSecurity可能無法適當的分析所有的參數,並且規則匹配的效果可能會顯著的降低。

SecAuditEngine

描述:配置審計日誌引擎的開啟與否

語法:SecAuditEngine On|Off|RelevantOnly

示例:SecAuditEngine On

階段:N/A

範圍:任意

版本:2.0.0

備註:在當前事務可以通過ctl操作進行設置或修改

舉例:以下例子說明不同的審計指令一起使用

SecAuditEngine RelevantOnly

SecAuditLog logs/audit/audit.log

SecAuditLogParts ABCFHZ

SecAuditLogType concurrent

SecAuditLogStorageDir logs/audit

SecAuditLogRelevantStatus ^(?:5|4\\d[^4])

允許值如下:

On - 默認情況下記錄所有事務的日誌

Off-默認情況下不記錄所有事務的日誌

RelevantOnly - 默認只記錄事務中由warning或error觸發的日誌,或者記錄一些特意考慮過的狀態碼

SecAuditLog

描述:定義主審計日誌文件路徑

語法:SecAuditLog /path/to/auditlog

示例:SecAuditLog /usr/local/apache/logs/audit.log

階段:N/A

範圍:Any

版本:2.0.0

備註:伴隨服務器運行開時,這個文件會以root打開,你不能為非root權限的用戶對這個文件或存儲這個文件的目錄有可寫權限。

如果串行審計日誌格式使用後,這個文件將被用作審計日誌條目的存儲。如果同時審計日誌格式使用這個文件那將被當作索引,幷包含所有的審計日誌文件創建信息。如果你計劃使用同時審計日誌併發送審計日誌數據到遠程主機或商業ModSecurity管理平臺,那麼你需要配置和使用ModSecurity日誌蒐集器(mlogc)並使用下述格式去得到審計日誌。

SecAuditLog "|/path/to/mlogc /path/to/mlogc.conf"

五、配置指令(二)

SecAuditLog2

描述:定義同時日誌啟用下的第二審計日誌索引文件路徑

語法:SecAuditLog2 /path/to/auditlog2

示例:SecAuditLog2 /usr/local/apache/logs/audit2.log

階段:N/A

範圍:Any

版本:2.1.2

備註:在本指令使用之前必須通過SecAuditLog定義主審計日誌,另外這個文件僅用於當同時審計日誌使用時複製主審計索引文件,不能用於非同時審計日誌的情況。


SecAuditLogParts

描述:定義每個事務中記錄到審計日誌中的部分。每部分以一個獨立的字母表示,當某個字母出現在列表中,也就是指每個事務中的相同部分會被記錄,全部列表見下文。

語法:SecAuditLogParts PARTS

示例:SecAuditLogParts ABCFHZ

階段:N/A

範圍:Any

版本:2.0.0

備註:在這個時候ModSecurity不記錄apache的見用響應內容(如404),或者服務器和日期的響應頭。

默認:ABCFHZ.

可用的審計日誌部分:

A - 審計日誌標題(強制的)

B - 請求標題

C - 請求體(目前僅針對請求體存在,並且ModSecurity已經配置成攔截)

D - 為中間人響應頭保留,暫未實現

E - 中間人響應體(目前僅對配置了攔截響應體和配置審計日誌引擎記錄有效)。中間人響應體和實際的響應體相同,除非ModSecurity攔截了中間人響應體,這種情況下,實際響應體會包含出錯信息(可能是apache的默認錯誤信息,也可能是出錯文檔頁面)。

F - 最終響應頭(除了日期和服務器標題以外的被apache添加的近期內容傳遞信息)。

G - 為實際響應體保留,暫未實現。

H - 審計日誌索引

I - 這C部分的替換,使用multipart/form-data編碼時,在所有的異常情形下會記錄與C相同的數據,在這種情況下,會記錄假的application/x-www-form-urlencoded內容,這包含參數的相關信息,但不是這個文件的。如果你不想用文件(通常很大)來存儲你的審計日誌,這是很方便的。

J - 保留。實現後,這部分會包含文件使用multipart/form-data編碼上傳的信息。

K - 這部分包含一個完整的列表,按順序匹配(每行一個),這些規則是完全合格的,從而表明繼承默認的動作和操作,從2.5.0開始支持。

Z - 最終分界,意味著是條目的最後(強制的)


SecAuditLogRelevantStatus

描述:配置哪些響應狀態碼與審計日誌的目的密切相關

語法:SecAuditLogRelevantStatus REGEX

示例:SecAuditLogRelevantStatus ^(?:5|4\\d[^4])

階段:N/A

範圍:Any

版本:2.0.0

備註:必須將SecAuditEngine設置為RelevantOnly,其參數是個正則表達式。

這個指令最主要的目的是允許你配置審計產生特殊HTTP響應狀態碼的唯一事務,這個指令通常用於減少審計日誌文件的總體大小。記住一點,如果使用了這個參數,那麼返回狀態碼是200的成功攻擊事件不會記錄。

SecAuditLogStorageDir

描述:配置同時審計日誌條目存儲時的路徑

語法:SecAuditLogStorageDir /path/to/storage/dir

示例:SecAuditLogStorageDir /usr/local/apache/logs/audit

階段:N/A

範圍:Any

版本:2.0.0

備註:必須同時設置SecAuditLogType,啟動apache前,需要先創建目錄,而且必須讓服務器用戶運行時可以新建文件。

儘管有了記錄日誌的機制,還需要確保指定的本地文件系統上有足夠的磁盤究竟,並且不是在根分區上。

SecAuditLogType

描述:配置使用審計日誌記錄機制的類型

語法:SecAuditLogType Serial|Concurrent

示例:SecAuditLogType Serial

階段:N/A

範圍:Any

版本:2.0.0

備註:如果使用Concurrent類型必須指定SecAuditLogStorageDir

可用的值:

Serial - 所有的審計日誌條目都被存儲在主審計日誌記錄文件中,隨意使用是很方便,但是它很慢,因為任何時候只有一個文件被打開也只能寫入一條審計日誌條目。

Concurrent - 審計日誌條目被存儲於不同的文件中,每個事務一個,如果你要把審計日誌數據發送到遠程ModSecurity控制主機上就使用Concurrent日誌模式。

六、配置指令(三)

SecCacheTransformations (Deprecated/Experimental)

描述:控制transformations的緩存,2.5.6開始,緩存是默認關閉的,當時都不贊成開啟並降低為實驗性。

語法:SecCacheTransformations On|Off [options]

示例:SecCacheTransformations On "minlen:64,maxlen:0"

階段:N/A

範圍:Any

版本:2.5.0

備註:N/A

第一個參數:

On - 緩存變化(每階段,每次變化)允許相同的變化只執行一次(默認的)

Off - 不緩存任務變化,強制所有的變化都被每一條規則實行生效

有以下可選項(逗號分隔)

incremental:on|off - 啟用這個選項後,緩存每一個變化,而不只是最後一個變化(默認:off)

maxitems:N - 緩存N個以內的變化,超過時不再緩存,為0時表示unlimited,對於限制緩存一個使用大數字的ARGS表單這個選項是有用的。(默認:512)

minlen:N - 緩存變化的值的最小長度(默認:32)

maxlen:N - 緩存變化的值的最大長度,為0時表示unlimited (默認:1024)

七、配置指令(四)

SecChrootDir

描述:配置WEB服務器工作的安全目錄

語法:SecChrootDir /path/to/chroot/dir

示例:SecChrootDir /chroot

階段:N/A

範圍:Main

版本:2.0.0

備註:這個功能在Windows系統的版本上不可用,ModSecurity提供的內部chroot功能在簡單配置上工作的很好,舉個最簡單的配置例子,apache只提供靜態頁面服務或使用模塊提供腳本運行功能。在一些複雜設置時你會遇到一些問題:

1、DNS查詢無法工作(這是因為這一功能在chroot操作後,一經查詢就要求加載一個共享庫)
2、你不能使用PHP發送郵件,因為PHP使用sendmail但sendmail在安全目錄之外

3、某些情況下apache會莫名其妙的不幹活了(重載)

你需要小心,這個內部chroot功能可能不是100%可用。由於大量默認的或是第三方為apache web服務器提供的模塊,它們不可能去校驗在內部chroot下是否可用,在沒有被限制在安全目錄中時,一個apache的模塊,工作的很正常。特別是如果你正使用的模塊在模塊初始化階段進行fork的(如mod_fastcgi,mod_fcgid,mod_cgid),建議你測試每個apache進程和觀察其工作目錄,進程根目錄,以及所打開的文件列表。考慮一下你的選擇,並做出自己的決定。

SecComponentSignature

描述:擴展組件簽名為ModSecurity簽名

語法:SecComponentSignature "COMPONENT_NAME/X.Y.Z (COMMENT)"

示例:SecComponentSignature "Core Rules/1.2.3"

階段:N/A

範圍:Main

版本:2.5.0

備註:這個指令可以讓ModSecurity增加很多有意義的已知組件,完整的簽名被記錄在事務審計記錄中,應該讓ModSecurity模塊和規則集作家使用,使調試更加容易。

SecContentInjection

描述:啟用內容注入使用行為附加並加在前面

語法:SecContentInjection (On|Off)

示例:SecContentInjection On

階段:N/A

範圍:Any

版本:2.5.0

備註:N/A


SecCookieFormat

描述:選擇當前配置文本中使用的cookie格式

語法:SecCookieFormat 0|1

示例:SecCookieFormat 0

階段:N/A

範圍:Any

版本:2.0.0

備註:None

可選值如下:

0 - 使用version 0 (Netscape) cookies,這是大部分應用使用的,也是默認值

1 - 使用version 1 cookies

八、配置指令(五)

SecDataDir

描述:指定連續數據(如ip地址數據,session數據等)存儲的路徑

語法:SecDataDir /path/to/dir

示例:SecDataDir /usr/local/apache/logs/data

階段:N/A

範圍:Main

備註:initcol、setsid和setuid需要用到這個指令,必須讓服務器用戶對這個目錄可寫

SecDebugLog

描述:指定ModSecurity調試日誌文件的路徑

語法:SecDebugLog /path/to/modsec-debug.log

示例:SecDebugLog /usr/local/apache/logs/modsec-debug.log

階段:N/A

範圍:Any

版本:2.0.0

備註:None

SecDebugLogLevel

描述:配置冗長的調試日誌數據

語法:SecDebugLogLevel 0|1|2|3|4|5|6|7|8|9

示例:SecDebugLogLevel 4

階段:N/A

範圍:Any

版本:2.0.0

備註:1~3級別一直用於產生apache的錯誤日誌,因為你可以在產品中一直使用0級別做為默認的日誌級別,級別5用於調試,不建議在產品中使用這麼高級別的日誌,過度的日誌記錄會顯著服務器的性能。

可用的值如下:

0 - 不記錄.

1 - 僅僅錯誤日誌(攔截請求)

2 - 警告

3 - 注意

4 - 事務控制的細節

5 - 同上,但包含每一個信息控制的信息

9 - 記錄所有,包括每一個調試細節信息

九、配置指令(六)

SecDefaultAction

描述:定義匹配規則後的默認動作

語法:SecDefaultAction action1,action2,action3

示例:SecDefaultAction log,auditlog,deny,status:403,phase:2

階段:Any

範圍:Any

版本:2.0.0

備註:SecDefaultAction指令後的規則都繼承這一設置,除非為某條規則指定了一個特定的動作,或者指定了新的SecDefaultAction。特別注意到,未經處理的disruptive動作是不允許的,但是在SecDefautlAction中一不小心就會繼承了使用disruptive動作。

默認值勤是minimal(和以前的版本不同)

SecDefaultAction phase:2,log,auditlog,pass

注意:

SecDefaultAction必須指定一個disruptive動作和處理階段,而且不能包含元數據動作。

警告:

SecDefaultAction不繼承交叉配置的內容。(舉個例子,這或許讓你感到疑惑,請閱讀ModSecurity Blog條目:http://blog.modsecurity.org/2008/07/modsecurity-tri.html)。

SecGeoLookupDb

描述:定義地理數據文件路徑

語法:SecGeoLookupDb /path/to/db

示例:SecGeoLookupDb /usr/local/geo/data/GeoLiteCity.dat

階段:N/A

範圍:Any

版本:2.5.0

備註:從maxmind.com提取的免費數據文件

SecGuardianLog

描述:配置使用httpd-guardian腳本來監視拒絕服務攻擊(DoS)的指令

語法:SecGuardianLog |/path/to/httpd-guardian

示例:SecGuardianLog |/usr/local/apache/bin/httpd-guardian

階段:N/A

範圍:Main

版本:2.0.0

備註:使用默認的httpd-guardian可以防止客戶端在1分鐘內請求120次或5分鐘內請求360次。

從1.9版本後,ModSecurity支持一個新的指令,SecGuardianLog,設計此指令用於把所有允許數據通過管理日誌功能發送到另一個程序。自從apache部署成典型的多進程方式,信息共享變得困難了,這一想法就是部署一個獨立的外部進程使用狀態機的方式去觀察所有的請求,提供額外的保護。

隨著ModSecurity發佈,開發一個先進的外部保護工具將是一個重點。然而一個完整功能的工具已經可以做為apache httpd工具項目的一部分,工具名為httpd-guardian,它能用於防禦DoS,使用黑名單列表(同一個項目中)和基於iptables(linux)或者基於pf(*BSD)的防火牆協同工作,動態的過濾黑名單中的惡意IP地址。也可以和SnortSam協同工作(http://www.snortsam.net)。如果已經配置過httpd-guardian(具體介紹請查看源代碼)你只需要在apache配置中添加一行就可以部署它:

SecGuardianLog |/path/to/httpd-guardian

SecMarker

描述:在規則集中增加一個固定規則marker,可用於skipAfter動作。SecMarker指令本質上是創建了一條規則,這條規則什麼也不做,其目的只是佔用一個ID號

語法:SecMarker ID

示例:SecMarker 9999

階段:Any

範圍:Any

版本:2.5.0

備註:None


十、配置指令(七)

SecPdfProtect

描述:啟用PDF XSS保護功能,一量啟用訪問PDF文件的跟蹤,直接訪問嘗試被轉到包含一次性令牌的鏈接,只有提供有效令牌的請被無條件允許,無效令牌的請求也被允許,但被強制下載PDF文件。本實現用響應頭去檢測PDF文件,因此可以對一些URI請求中不含有.pdf擴展名卻能動態生成PDF文件。

語法:SecPdfProtect On|Off

示例:SecPdfProtect On

階段:N/A

範圍:Any

版本:2.5.0

備註:None

SecPdfProtectMethod

描述:配置理想的保護方法用於請求的PDF文件進行保護。可有的選項有TokenRedirection和ForcedDownload。令牌重定向方式會嘗試轉到可有的令牌上,這允許PDF文件仍舊能使用內聯方式打開,但僅用於GET請求方式。強制下載總是導致PDF文件使用二進制或附件方式傳遞,後者常用於非GET請求,強制下載方式被認為更安全,但對用戶來說可能會導致可用性問題("這個PDF無法再打開了")。

語法:SecPdfProtectMethod method

示例:SecPdfProtectMethod TokenRedirection

階段:N/A

範圍:Any

版本:2.5.0

備註:None

默認:TokenRedirection

SecPdfProtectSecret

描述:定義用於產生一次性令牌的密鑰,你應該設置一個足夠長的串作為密鑰(16個字符較好),一旦定下密鑰,最好不要修改可能會破壞修改前發出的令牌。但即使你修改了也不是大問題,導致過去的幾秒鐘變成使用令牌強制下載PDF文件。

語法:SecPdfProtectSecret secret

示例:SecPdfProtectSecret MyRandomSecretString

階段:N/A

範圍:Any

版本:2.5.0

備註:None

SecPdfProtectTimeout

描述:定義令牌超時,令牌過期後,不能再用於允許訪問PDF文件,請求仍舊被允許,但PDF文件會以附件方式傳送。

語法:SecPdfProtectTimeout timeout

示例:SecPdfProtectTimeout 10

階段:N/A

範圍:Any

版本:2.5.0

備註:None

默認:10

SecPdfProtectTokenName

描述:定義令牌名,你想改變令牌的名字的唯一原因應是你想隱藏你正使用ModSecurity這一事實,這是一個好的理由,但這並不能提供幫助,因為敵人能找到保護PDF的算法並能計算出來,這樹立了新的標誌,所以如果你想就去試吧。

語法:SecPdfProtectTokenName name

示例:SecPdfProtectTokenName PDFTOKEN

階段:N/A

範圍:Any

版本:2.5.0

備註:None

默認:PDFTOKEN

十一、配置指令(八)

SecRequestBodyAccess

描述:配置是否讓ModSecurity默認處理或緩衝請求體

語法:SecRequestBodyAccess On|Off

示例:SecRequestBodyAccess On

階段:N/A

範圍:Any

版本:2.0.0

備註:如果你計劃檢查POST_PAYLOAD就使用這個指令,這個指令必須和"phase:2"處理階段動作和REQUEST_BODY變量/位置一起使用,這三部分任一一個沒有配置,你就無法檢查請求體。

ModSecurity應用防火牆使用詳解

可選值有:

On - 訪問請求體

Off - 不嘗試訪問請求體

SecRequestBodyLimit

描述:配置ModSecurity允許的最大請求體的緩存區大小

語法:SecRequestBodyLimit NUMBER_IN_BYTES

示例:SecRequestBodyLimit 134217728

範圍:Any

版本:2.0.0

備註:默認值是131072 KB (134217728 bytes)。任何超過此限制的都會被拒絕,提示413,請求體太大。還有一個硬限制,1GB。

SecRequestBodyNoFilesLimit

描述:配置ModSecurity允許的最大請求體的緩存區大小,除了請求中正在傳送的文件大小。這項指令便於在受到某些使用大尺寸請求進行DoS攻擊時減少影響。提供上傳文件服務的WEB應用必須配置SecRequestBodyLimit為一個很大的值。由於大文件直接進行磁盤文件存取,不會加大內存的消耗。但是,仍然有可能有人利用超大請求體限制和發送大量大小的非上傳請求。該指令消除這一漏洞。

語法:SecRequestBodyNoFilesLimit NUMBER_IN_BYTES

示例:SecRequestBodyLimit 131072

範圍:Any

版本:2.5.0

備註:默認為1 MB (1048576 bytes)。這個值比較古老了,大部分應用應該到128KB或是更低,任何超過此限制的都會被拒絕,提示413,請求體太大。還有一個硬限制,1GB。


SecRequestBodyInMemoryLimit

描述:配置ModSecurity使用內存保存的最大請求體大小

語法:SecRequestBodyInMemoryLimit NUMBER_IN_BYTES

示例:SecRequestBodyInMemoryLimit 131072

階段:N/A

範圍:Any

版本:2.0.0

備註:None

默認的限制是128 KB,在內存中最多存儲128KB

SecRequestBodyInMemoryLimit 131072


SecResponseBodyLimit

描述:配置允許緩存的最大響應體大小

語法:SecResponseBodyLimit NUMBER_IN_BYTES

示例:SecResponseBodyLimit 524228

階段:N/A

範圍:Any

版本:2.0.0

備註:任何超過此限制的都會被拒絕,提示500,內部服務器錯誤。這一設置不影響使用MIME類型的響應,緩存不為此做標記,有一個硬限制,1GB。

默認配置成 512 KB:

# Buffer response bodies of up to 512 KB in length

SecResponseBodyLimit 524288


SecResponseBodyLimitAction

描述:配置SecResponseBodyLimit控制碰到響應體限制的情況,默認時ModSecurity拒絕超過指定長度的響應體,然而一些WEB站點,會產生一些非常長的響應為適當限制帶來難度。這類網站不得不極大的提高關注度,把限制放到了首位(控制內存消耗)。有能力選擇的是發生站點限制時,管理員能選擇僅僅檢查響應的第一部分,這部分可融入理想的限制,並讓其通過。可以證明未經檢查就允許部分響應是個漏洞,理論上這是對的,但僅適用於攻擊者控制輸出的案例(如它可以任意的長)。不管怎樣,在這種情況下,無論如何是阻止不了漏洞的。攻擊者在數據回送前可以壓縮,打亂或者甚至是加密,因為可以穿越任意監控設備。

語法:SecResponseBodyLimitAction Reject|ProcessPartial

示例:SecResponseBodyLimitAction ProcessPartial

階段:N/A

範圍:Any

版本:2.5.0

備註:None


SecResponseBodyMimeType

描述:為響應數據緩存配置推薦的MIME類型

語法:SecResponseBodyMimeType mime/type

示例:SecResponseBodyMimeType text/plain text/html

階段:N/A

範圍:Any

版本:2.0.0

備註:可以使用多個SecResponseBodyMimeType指令來增加MIME類型

默認值是text/plain text/html:

SecResponseBodyMimeType text/plain text/html


SecResponseBodyMimeTypesClear

描述:清除推薦的響應體緩存MIME類型,允許你重新開始配置。

語法:SecResponseBodyMimeTypesClear

示例:SecResponseBodyMimeTypesClear

階段:N/A

範圍:Any

版本:2.0.0

備註:None


SecResponseBodyAccess

描述:配置響應體是否被緩存並被分析

語法:SecResponseBodyAccess On|Off

示例:SecResponseBodyAccess On

階段:N/A

範圍:Any

版本:2.0.0

備註:如果你計劃檢查HTML的響應,需要使用這個指令。這個指令必須和"phase:4"處理階段動作和REQUEST_BODY變量/位置一起使用,這三部分任一一個沒有配置,你就無法檢查請求體。

可選值如下:

On - 訪問響應體 (僅支持使用MIME類型,具體見上述).

Off - 不嘗試訪問響應體

十二、配置指令(九)

SecRule

描述:SecRule是ModSecurity主要的指令,用於分析數據並根據結果執行動作。

語法:SecRule VARIABLES OPERATOR [ACTIONS]

示例:SecRule REQUEST_URI "attack" \\

"phase:1,t:none,t:urlDecode,t:lowercase,t:normalisePath"

階段:Any

範圍:Any

版本:2.0.0

備註:None

通常規則的格式如下:

SecRule VARIABLES OPERATOR [ACTIONS]

第二部分,OPERATOR描述如何進行檢查,第三部分可選的,ACTIONS,描述當操作進行成功的匹配一個變量時具體怎麼做。

規則中的變量

第一部分,VARIABLES描述哪個變量被檢查,舉個例子,下述規則會拒絕URI中含有單詞dirty的事務。

SecRule ARGS dirty

每條規則可以指定一個或多個變量

SecRule ARGS|REQUEST_HEADERS:User-Agent dirty

XPath格式是選擇操作的第三方支持格式。XPath格式僅能針對特殊變量XML使用,只有請求體使用XML格式時可用。

SecRule XML:/xPath/Expression dirty

注意:

不是所有的集合支持選擇操作格式類型,你需要參考各個集合的文檔來決定是否支持。

Collections

一個變量可以包含一個或多個片斷的數據,根據變量的性質和方法進行使用,前一節我們看到了這兩種方法的例子,當一個變量可以包含一個以上的值,我們把它稱為集合。

集合在規則運行前都是可以擴展的。舉例如下:

SecRule ARGS dirty

可以進行如下擴展:

SecRule ARGS:p dirty

SecRule ARGS:q dirty

請求中有兩個參數,名為p和q。

集合有幾個特色:

只讀

在運行時創建事務數據,如:ARGS (包含所有請求參數列表)和REQUEST_HEADERS (包含所有的請求頭列表).

短暫的讀/寫

每個事備創建一個空的TX集合,規則能讀也能寫(如使用setvar動作),但信息存儲在這個集合中直到事務結束。

連續的讀/寫

有幾個集合可寫,但是為連續的後臺存儲。這些集合被用於跟蹤客戶端的交互事務,例如分成IP、SESSION和USER等類型的集合。

操作的規則

一種很簡單的情況下,你可能會用一個正則表達式作為規則的第二個參數,我們已經在上面舉過這樣的例子,如果你這樣做,ModSecurity假設你會使用rx(正則表達式)操作符,你也可以很明確的通過使用@來指定你想要的操作符,緊跟之後的是操作符的名字,在規則第二個參數的開始。

SecRule ARGS "@rx dirty"

注意我們為什麼必須使用雙引號把第二個規則參數括起來呢,這是因為第二個參數可能包含空格。一些帶空格字符和數字會跟在操作符名字後面,如果出現非空格的字符,所有的這些都會被當作操作符的參數。這種情況下指定的參數中的正則表達式被作為模式進行匹配。

如果你使用取非操作符取反操作符返回的結果,可以讓@處於第二個字符。

SecRule &ARGS "!@rx ^0$"

取非操作符

操作符的結果可以通過在第二個字符前使用感嘆號來取反,下述規則匹配在User-Agent請求頭中找不到dirty單詞:

SecRule REQUEST_HEADERS:User-Agent !dirty

你能用感嘆號與任一個參數聯合使用,這樣做,感嘆號優先,後面跟上明確的操作符說明,下述規則與前面的例子有相同的效果。

SecRule REQUEST_HEADERS:User-Agent "!@rx dirty"

如果你在多個變量中使用取非操作符,這可能無法立即清楚將會發生什麼情況,考慮下述例子:

SecRule ARGS:p|ARGS:q !dirty

這個規則與下面意思相同

SecRule ARGS:p !dirty

SecRule ARGS:q !dirty

警告:

取非用於單個操作符,而不要在整體的變量列表中使用。

規則中的動作

第三個參數,ACTIONS可以忽略,因為有個輔助功能,即指定的默認動作列表。如果這個參數沒有被省略,當規則匹配時,這個參數指定的動作會聯合默認的動作列表創建一個實際的動作列表被執行。


SecRuleInheritance

描述:配置當前環境是否繼承父節點環境(大部分情況下都配置成可繼承,你應當查一下文檔的每一個指令,以明確它繼承與否)

語法:SecRuleInheritance On|Off

示例:SecRuleInheritance Off

階段:Any

範圍:Any

版本:2.0.0

備註:指定資源的環境(如:Location, Directory,等)不能覆蓋主服務器或虛擬服務器上配置的phase1規則。這是因為phase1在請求處理進程之前運行,早於apache分發請求的資源,虛擬服務環境可以覆蓋主服務器配置的phase1規則。

例如:下面的例子顯示了在主apache配置範圍的哪個地方啟用ModSecurity,不過,你可以為你的虛擬主機做不同的配置。第一個例子中,頭一個虛擬主機沒有繼承ModSecurity的主配置指令,而第二做到了。

SecRuleEnine On

SecDefaultAction log,pass,phase:2

...

<virtualhost>

ServerName app1.com

ServerAlias www.app1.com

SecRuleInheritance Off

SecDefaultAction log,deny,phase:1,redirect:http://www.site2.com

...

<virtualhost> /<virtualhost>

ServerName app2.com

ServerAlias www.app2.com

SecRuleInheritance On SecRule ARGS "attack"

...

可選的值如下:

On - 從父環境下繼承規則

Off - 不從父環境下繼承規則

注意:

Configuration Sections是apache的一個概念,指令 <directory>, <files>, <location> 和 <virtualhost> 都是用於創建Configuration Sections的,更多的信息請看apache的文檔部分中的Configuration Sections。/<virtualhost>/<location>/<files>/<directory>

SecRuleEngine

描述:配置規則引擎

語法:SecRuleEngine On|Off|DetectionOnly

示例:SecRuleEngine On

階段:Any

範圍:Any

版本:2.0.0

備註:這個指令針對每一條規則處理也可以通過ctl動作進行控制(ctl:ruleEngine=off)

可選的值:

On - 處理規則

Off - 不處理規則

DetectionOnly - 處理規則但不中斷事務,即使規則配置了也不做。

十三、配置指令(十)

SecRuleRemoveById

描述:使用ID方式從上級環境中刪除規則

語法:SecRuleUpdateActionById RULEID ACTIONLIST

示例:SecRuleRemoveByID 1 2 "9000-9010"

階段:Any

範圍:Any

版本:2.0.0

備註:這個指令支持多個參數,每個參數可以是一個規則ID,也可以是範圍。帶有空格的參數必須使用雙引號括起來。

SecRuleRemoveById 1 2 5 10-20 "400-556" 673


SecRuleRemoveByMsg

描述:使用規則方式從上級環境中刪除規則

語法:SecRuleRemoveByMsg REGEX

示例:SecRuleRemoveByMsg "FAIL"

階段:Any

範圍:Any

版本:2.0.0

備註:這個指令支持多個參數,每個指令是一個應用於消息的正則表達式(指定使用的消息動作)。


SecRuleScript (試驗性的)

描述:這個指令創建一個特殊的規則,執行Lua腳本來決定是否匹配,和SecRule主要的不同是這個沒有目的也沒有操作符,這個腳本可以從ModSecurity環境中取到所有的變量,並使用(Lua)操作符來進行測試,第二個參數可選,與SecRule相同,是一些動作列表。

語法:SecRuleScript /path/to/script.lua [ACTIONS]

示例:SecRuleScript "/path/to/file.lua" "block"

階段:Any

範圍:Any

版本:2.5.0

備註:None

注意

所有的Lua腳本在配置時進行編譯並存入內存,要重載腳本,你必須通過apache重啟來重載整個ModSecurity配置。

示例腳本:

-- Your>

-- point, as below.

function main()

-- Log something at level 1. Normally you shouldn't be

-- logging anything, especially not at level 1, but this is

-- just to show you can. Useful for debugging.

m.log(1, "Hello world!");

-- Retrieve one variable.

local var1 = m.getvar("REMOTE_ADDR");

-- Retrieve one variable, applying one transformation function.

-- The second parameter is a string.

local var2 = m.getvar("ARGS", "lowercase");

-- Retrieve one variable, applying several transformation functions.

-- The second parameter is now a list. You should note that m.getvar()

-- requires the use of comma to separate collection names from

-- variable names. This is because only one variable is returned.

local var3 = m.getvar("ARGS.p", { "lowercase", "compressWhitespace" } );

-- If you want this rule to match return a string

-- containing the error message. The message must contain the name

-- of the variable where the problem is located.

-- return "Variable ARGS:p looks suspicious!"

-- Otherwise, simply return nil.

return nil;

end

第一個例子,我僅每次提取一個變量,這種情況下,你需要事先知道變量,然而很多時候,你想檢查一些事先不知道的變量名字,就象下面這個例子。

Example showing use of m.getvars() to retrieve many variables at once:

function main()

-- Retrieve>

local d = m.getvars("ARGS", { "lowercase", "htmlEntityDecode" } );

-- Loop through the paramters.

for i = 1, #d do

-- Examine parameter value.

if (string.find(d[i].value, "<script><p> -- Always specify the name of the variable where the</p><p> -- problem is located in the error message.</p><p> return ("Suspected XSS in variable " .. d[i].name .. ".");</p><p> end</p><p> end</p><p> </p><p> -- Nothing wrong found.</p><p> return nil;</p><p>end</p><p>注意</p><p>到http://www.lua.org/瞭解更多有關Lua程序語言,參考手冊在http://www.lua.org/manual/5.1/能在線閱讀</p><p> 注意</p><p>Lua支持被標示試驗方式的編程接口可以繼續發展,同時我們努力讓其最佳方式運行,感謝任何人為些提供編程接口。</p><p><br></p><p>SecRuleUpdateActionById</p><p>描述:按ID方式更新指定規則的動作列表</p><p>語法:SecRuleRemoveById RULEID ACTIONLIST</p><p>示例:SecRuleUpdateActionById 12345 deny,status:403</p><p>階段:Any</p><p>範圍:Any</p><p>版本:2.5.0</p><p>備註:本指令合併指定的動作列表和規則的動作列表,存在兩個限制,一是規則ID不能被改變,也不能換階段。另外還需要注意的是動作可以多次被附加到原來的。</p><p> </p><p>SecAction \\</p><p> "t:lowercase,phase:2,id:12345,pass,msg:'The Message',log,auditlog"</p><p>SecRuleUpdateActionById 12345 "t:compressWhitespace,deny,status:403,msg:'A new message'</p><p>The example above will cause the rule to be executed as if it was specified as follows:</p><p> </p><p>SecAction \\</p><p> "t:lowercase,phase:2,id:12345,log,auditlog,t:compressWhitespace,deny,status:403,msg:'A new message'"</p><p><br></p><p>SecServerSignature</p><p>描述:通知ModSecurity改變響應頭令牌數據中當前使用的"Server:" </p><p>語法:SecServerSignature "WEB SERVER SOFTWARE"</p><p>示例:SecServerSignature "Netscape-Enterprise/6.0"</p><p>階段:N/A</p><p>範圍:Main</p><p>版本:2.0.0</p><p>備註:按指令的先後順序執行,你必須完整的配置apache ServerTokens指令。通過該指令,ModSecurity會改寫服務器簽名數據並存入內存空間的數據集中。如果ServerTokens沒有完整設置,那麼內存空間就沒有希望的足夠大來存入我們看到的新數據。</p><p><br></p><p>SecTmpDir</p><p>描述:配置臨時文件創建的路徑</p><p>語法:SecTmpDir /path/to/dir</p><p>示例:SecTmpDir /tmp</p><p>階段:N/A</p><p>範圍:Any</p><p>版本:2.0.0</p><p>備註:需要提供apache用戶進程的可寫權限,這個目錄的位置也是當apache檢查數據用完內存時(比SecRequestBodyInMemoryLimit指令指定的還多的數據)會將數據交換到磁盤上的位置。</p><p><br></p><p>SecUploadDir</p><p>描述:配置攔截文件存儲的目錄</p><p>語法:SecUploadDir /path/to/dir</p><p>示例:SecUploadDir /tmp</p><p>階段:N/A</p><p>範圍:Any</p><p>版本:2.0.0</p><p>備註:This directory must be on the same filesystem as the temporary directory defined with SecTmpDir. This directive is used with SecUploadKeepFiles.</p><p> SecUploadFileMode</p><p>描述:用8進制數(和chmod一樣)配置所有上傳文件的模式(權限)</p><p>語法:SecUploadFileMode octal_mode|"default"</p><p>示例:SecUploadFileMode 0640</p><p>階段:N/A</p><p>範圍:Any</p><p>版本:2.1.6</p><p>備註:這個功能在不支持8進制文件模式的操作系統上不可用。默認模式(0600)僅允許有讀寫許可的帳號修改這個文件,如果其他帳號也需要訪問(使用clamd是個好例子),那麼這個指令是必須的。不管怎樣,要慎用這個指令,避免將敏感數據顯露給未授權用戶,使用"default"值時,還原默認設置。</p><p> SecUploadKeepFiles</p><p>描述:配置是否保存事務處理後的攔截文件</p><p>語法:SecUploadKeepFiles On|Off|RelevantOnly</p><p>示例:SecUploadKeepFiles On</p><p>階段:N/A</p><p>範圍:Any</p><p>版本:2.0.0</p><p>備註:該指令要求已經定義存儲目錄(使用SecUploadDir).</p><p> 可選值:</p><p>On - 保存上載文件</p><p>Off - 不保存上載文件</p><p>RelevantOnly - 只保存被確認與請求有關的文件</p><p> SecWebAppId</p><p>描述:創建服務器上的一個分區只屬於一個WEB應用</p><p>語法:SecWebAppId "NAME"</p><p>示例:SecWebAppId "WebApp1"</p><p>階段:N/A</p><p>範圍:Any</p><p>版本:2.0.0</p><p>備註:通過使用分區來避免會話ID和用戶UD之間的衝突,在同一臺服務器上部署多個應用時一定要使用這個指令,如果不使用,會話ID之間的衝突可能發生,默認值是default,如:</p><p><VirtualHost *:80> </p><p>ServerName app1.com </p><p>ServerAlias www.app1.com</p><p>SecWebAppId "App1"</p><p>SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass </p><p>SecAction setsid:%{REQUEST_COOKIES.PHPSESSID} </p><p>... </p><p></VirtualHost> </p><p> </p><p><VirtualHost *:80> </p><p>ServerName app2.com </p><p>ServerAlias www.app2.com</p><p>SecWebAppId "App2"</p><p>SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass </p><p>SecAction setsid:%{REQUEST_COOKIES.PHPSESSID} </p><p>... </p><p></VirtualHost></p><p>配置顯示了兩個例子,SecWebAppId與apache的VirtualHost指令協同工作,在一臺服務器上應創建各自獨特的集合名稱,一般情況下,當啟用setsid時,ModSecurity會使用"SESSION"的錅來創建集合,這可以保存專用值,然而象上述例子一樣使用SecWebAppId,集合的名字會變成"App1_SESSION"和"App2_SESSION"。</p><p> SecWebAppId相關的兩個情況:</p><p>你正把事務和報警記錄到ModSecurity控制檯上,並且你想用WEB應用ID來搜索僅屬於那些應用的事務。你正使用數據留存設施(SESSION和USER集合)並且你需要在屬於不同的應用之間的會話和用戶的衝突。</p><p> </p><p> </p><p>十四、處理階段</p><p> ModSecurity 2.x允許把規則置於下述五個階段之一:</p><p>請求頭(REQUEST_HEADERS)</p><p>請求體(REQUEST_BODY)</p><p>響應頭(RESPONSE_HEADERS)</p><p>響應體(RESPONSE_BODY)</p><p>記錄(LOGGING)</p><p> 下圖是標準的apache請求流程,5個ModSecurity處理階段顯示其中。</p><p>為了在規則執行時選擇階段,需要使用階段命令,可以通過規則中直接使用,也可以通過SecDefaultAction指令。</p><p>SecDefaultAction "log,pass,phase:2"</p><p>SecRule REQUEST_HEADERS:Host "!^$" "deny,phase:1"</p><p>注意:</p><p> 要注意規則的執行是依賴於階段,即使是一個配置文件中的兩條鄰近的規則,只要是設置了在不同的階段中執行,它們就不會是一個接一個的生效。配置文件中的規則順序僅僅是在規則各自的階段中是重要的。在使用Skip和SkipAfter動作時尤為重要。</p><p> </p><p>注意:</p><p> LOGGING階段比較特別,無論前面的各個階段發生了什麼事,都會每個事務的最後被執行。這就意味著哪怕是請求被中斷或是放行事務時都會被執行。</p><p> </p><p>請求頭階段</p><p> 這個階段的規則會在apache完成請求頭的讀取後立即被執行(post-read-request階段),這時,還沒有讀取請求體,意味著不是所有的參數都可用。如果你必須讓規則儘早運行,應把規則放在這個階段(在apache使用這個請求做某些事前),在請求體被讀取前做些事情,從而決定是否緩存這個請求體,或者決定你將希望這個請求體如何被處理(如是否以XML格式解析或不解析)。</p><p> </p><p>注意:</p><p> 這個階段的規則無法影響apache的範圍指令(Directory, Location, LocationMatch等)像post-read-request鉤子一樣還無法得到信息。VirualHost指令有些例外,如果想在apache的locations使用ModSecurity規則,那麼他們應該運行在階段2,參考apache請求環/ModSecurity處理階段圖表。</p><p> </p><p>請求體階段</p><p> 這是通用輸入分析階段,大部分傳統的應用規則不在這兒,這個階段你肯定能收到參數(只有讀取過請求體後),在請求體階段,ModSecurity支持三種編碼類型。</p><p>application/x-www-form-urlencoded - used to transfer form data</p><p>multipart/form-data - used for file transfers</p><p>text/xml - used for passing XML data</p><p> 大部分WEB應用還沒有使用其他的編碼方法。</p><p> </p><p>響應頭階段</p><p> 發生在響應頭被髮送到客戶端之前,如果你想觀察響應發生前就在這兒運行,如果你想使用響應頭來決定你是否想緩存響應體也行。注意一些響應狀態碼(如404)在請求環的早期就被apache管理著,我也無法觸發預期。加上apache在後面的勾子上雙增加了一些響應頭(如日期、服務器和連接信息等),這些我們無法觸發和審查。在代理配置模式下或使用phase:5(logging)工作的較好。</p><p> </p><p>響應體階段</p><p> 這是通用輸出分析階段,這裡你能運行規則截斷響應體(當然提供緩存)。這個階段你想檢查輸出的HTML信息公佈、錯誤消息和失敗的驗證文字。</p><p> </p><p>日誌階段</p><p> 在日誌發生前運行的一個階段,放在這個階段的規則只能影響日誌記錄器如何執行,這個階段可以檢測apache記錄的錯誤消息,在這個階段你不能拒絕或阻斷連接,因為太遲了,這個階段也允許檢測其他的響應頭,如那在phase:3或者phase:4階段中不可用的。注意在這個階段,你應當小心不要繼承破壞性的動作到規則中,這樣的情況在ModSecurity2.5.0及其以後的版本中被當作配置錯誤。</p><p> </p><p>十五、變量(A~E)</p><p> </p><p>Variables</p><p> 以下都是ModSecurity 2.x中支持的變量</p><p> ARGS</p><p> ARGS是一個集合,可以作為靜態參數(以名稱匹配論點)方式或以正則表達式(以正則表達式匹配的所有匹配的論點名稱)方式用於它自身(意思為POST負載中的所有論點),</p><p> 一些變量是事實上的集合,在運行時可以擴展更多的變量,下述例子會測試所有的請求論點。</p><p> SecRule ARGS dirty</p><p> 不過有些時候你只想看看集合的一部分,可以通過selection操作(colon)得到完美的幫助,下述例子僅提供查看名為p的變量(值得注意的是,通常行情況下,請求可以包含多個同名的變量)</p><p>SecRule ARGS:p dirty</p><p> </p><p> 它也可以指定排除方式,下面的例子將仔細檢查所有的請求參數是否有單詞dirty,除了名字為z的參數(再則,z參數可以為0個,也可以是多個)</p><p>SecRule ARGS|!ARGS:z dirty</p><p> </p><p> 這兒用了一個特殊的操作符,允許你統計一個集合中有多少個變量。如果一個請求中使用了0個以上的參數,下面的規則就會有效果(暫時忽視了第二個參數)。</p><p>SecRule &ARGS !^0$</p><p> 還有些時候你需要查看一個參數數組,每個名字只有稍微不同,這種情況下,你可以為集合操作符自己指定一個正則表達式,下面的規則就是查閱所有以id_打頭的參數名字。</p><p>SecRule ARGS:/^id_/ dirty</p><p><br></p><p>注意:</p><p> 如果參數p不存在,則使用ARGS:p不會對操作符調用起到任何作用。</p><p> 在ModSecurity 1.x時,ARGS變量代表 QUERY_STRING + POST_PAYLOAD,但是現在已經擴展成獨立的變量了。</p><p> ARGS_COMBINED_SIZE</p><p> 此變量相比apache的LimitRequest指令允許你更有針對性的設置Arguments的總大小。如你可以創建一條規則確保參數數據的部大小小於一個特定的閾值(幫助防止緩存溢出問題)。例:如果參數的大小超過25個字符就阻斷它。</p><p>SecRule REQUEST_FILENAME "^/cgi-bin/login\\.php" \\</p><p> "chain,log,deny,phase:2,t:none,t:lowercase,t:normalisePath"</p><p>SecRule ARGS_COMBINED_SIZE "@gt 25"</p><p>ARGS_NAMES</p><p> 是參數名的集合,你可以搜索你想阻斷的特定的參數名,在一個積極策略情況下,你也可以僅僅使用白名單(使用!可以反轉規則)來審計參數名。例:下例規則僅允許規則名為p和a的兩個參數,如果有其他參數名字在其中,就會被阻斷。</p><p>SecRule REQUEST_FILENAME "/index.php" \\</p><p> "chain,log,deny,status:403,phase:2,t:none,t:lowercase,t:normalisePath"</p><p>SecRule ARGS_NAMES "!^(p|a)$" "t:none,t:lowercase"</p><p> ARGS_GET</p><p>ARGS_GET類似於ARGS,但僅針對於查詢字符串中包含的參數。</p><p> ARGS_GET_NAMES</p><p>ARGS_GET_NAMES類似於ARGS_NAMES,但僅針對於查詢字符串中包含的參數。</p><p> ARGS_POST</p><p>ARGS_POST類似於ARGS,但僅針對於POST字符串中包含的參數。</p><p> ARGS_POST_NAMES</p><p>ARGS_POST_NAMES類似於ARGS_NAMES,但僅針對於POST字符串中包含的參數。</p><p> AUTH_TYPE</p><p> 這個變量保存認證方法用於驗證一個用戶,例:</p><p>注意</p><p> 這個數據在使用非本地認證的代理模式部署時不可用,在代理模式部署下,你需要檢查REQUEST_HEADERS認證頭。</p><p> ENV</p><p> 是個集合,規則一個單獨的參數(在colon之後),ENV變量通過setenv設置,不提供CGI環境變量的訪問,例如:</p><p>SecRule REQUEST_FILENAME "printenv" pass,setenv:tag=suspicious</p><p>SecRule ENV:tag "suspicious"</p><p> </p><p>十六、變量(F-H)</p><p>FILES</p><p> 是個集合,包含一系列的初始文件名(就如同在遠程用戶的文件系統上命名的一樣),注意:只有從請求體中提取的文件才是有用的,例:</p><p>SecRule FILES "\\.conf$" log,deny,status:403,phase:2</p><p> </p><p>FILES_COMBINED_SIZE</p><p> 單一值,所有上傳文件大小的總和,注意:只有從請求體中提取的文件才是有用的,例:</p><p>SecRule FILES_COMBINED_SIZE "@gt 1000" log,deny,status:403,phase:2</p><p> </p><p>FILES_NAMES</p><p> W/O參數集合,包含用於文件上傳的表單字段列表,注意:只有從請求體中提取的文件才是有用的,例:</p><p>SecRule FILES_NAMES "^upfile$" log,deny,status:403,phase:2</p><p> </p><p>FILES_SIZES</p><p> 集合,包含文件尺寸的列表,用於實施單獨文件上傳的大小限制。注意:只有從請求體中提取的文件才是有用的,例:</p><p>SecRule FILES_SIZES "@gt 100" log,deny,status:403,phase:2</p><p> </p><p>FILES_TMPNAMES</p><p> 集合,包含磁盤上臨時文件名的集合,和@inspecFile一起使用,注意:只有從請求體中提取的文件才是有用的,例:</p><p>SecRule FILES_TMPNAMES "@inspectFile /path/to/inspect_script.pl"</p><p> </p><p>GEO</p><p> GEO是和@geoLookups操作符一起使用的集合,可以用於匹配地理位置字段進行IP或主機名字的查詢,2.2.0以後版本可用</p><p>字段:</p><p>COUNTRY_CODE: 兩個字符的國家代號,如:US、UK等</p><p>COUNTRY_CODE3: 升級為三個字符的國家代號</p><p>COUNTRY_NAME: 完整的國家名</p><p>COUNTRY_CONTINENT: 兩個字符的國家所在洲的代號,如:EU </p><p>REGION: 兩個字符表示的區域,對美國來說是州,對加拿大來說,是省,等等</p><p>CITY: 城市名</p><p>POSTAL_CODE: 郵政編碼</p><p>LATITUDE: 緯度</p><p>LONGITUDE: 經度</p><p>DMA_CODE: 中心城區代碼(僅指美國)</p><p>AREA_CODE: 電話區號(僅指美國)</p><p>例如:</p><p>SecRule REMOTE_ADDR "@geoLookup" "chain,drop,msg:'Non-UK IP address'"</p><p>SecRule GEO:COUNTRY_CODE "!@streq UK"</p><p> </p><p>HIGHEST_SEVERITY</p><p> 這個變量是迄今為止所有規則匹配時最為嚴格的,Severities是個數值,和比較操作符一起,如@lt等</p><p>注意:更高的severities,其數值越小,255表示沒有設置severity</p><p> SecRule HIGHEST_SEVERITY "@le 2" "phase:2,deny,status:500,msg:'severity %{HIGHEST_SEVERITY}'"</p><p> </p><p> </p><p><br></p>"/<script>


分享到:


相關文章: