modsecurity配置指令学习
事務(wù)(transactions)
Console(控制臺(tái))
1 Introduction
Modsecurity是保護(hù)網(wǎng)絡(luò)應(yīng)用安全的工作。不,從零開(kāi)始。我常稱modsecurity為WAF(網(wǎng)絡(luò)應(yīng)用防火墻),這是種被廣泛接受的叫法,它指的是為保護(hù)網(wǎng)絡(luò)應(yīng)用而專門設(shè)計(jì)的產(chǎn)品族。也有些時(shí)候我稱它為HTTP入侵檢測(cè)工具,我認(rèn)為這個(gè)稱呼更好的描述了modsecurity做了什么。
?
Understanding ModSecurity
像Apache為其他模塊所做的一樣,Apache為modsecurity處理一些基礎(chǔ)任務(wù):
1、? 加密解密
2、? 破壞HTTP請(qǐng)求的入站連接流
3、? 部分性解析HTTP請(qǐng)求
4、? 引導(dǎo)modsecurity,選擇正確的配置文本(<VirtualHost>,<Location>等)
5、? De-chunks必需的請(qǐng)求體
反向代理模式時(shí)Apache會(huì)執(zhí)行幾個(gè)別的任務(wù):
1、? 請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器(SSL或者非SSL)
2、? 部分性解析HTTP響應(yīng)
3、? De-chunks必需的響應(yīng)體
?
What ModSecurity Does
Modsecurity提供的功能大概能分成四個(gè)部分:
Parsing解析:
Modsecurity會(huì)努力解析盡可能多的數(shù)據(jù)。Security-conscientious解析器會(huì)提取儲(chǔ)存數(shù)據(jù),義工在規(guī)則中使用,并支持一定的數(shù)據(jù)格式。
Buffering緩存
典型安裝時(shí),請(qǐng)求體和響應(yīng)體都會(huì)緩存。這就意味著,modsecurity在請(qǐng)求被傳到應(yīng)用服務(wù)器進(jìn)行處理之前,就見(jiàn)到完整的請(qǐng)求了。在響應(yīng)被送到客戶端之前就見(jiàn)到了響應(yīng)。緩存是一個(gè)重要的特性,因?yàn)橹挥羞@種方式才能可靠的攔截?cái)?shù)據(jù)。緩存也存在缺陷,他需要額外的RAM來(lái)存儲(chǔ)請(qǐng)求體和響應(yīng)體數(shù)據(jù)。
Logging日志
全事務(wù)日志(又稱審計(jì)日志)占據(jù)了modsecurity所做工作的很大一部分。你可以利用日志記錄完整的HTTP流量,而不是僅僅粗略的訪問(wèn)日志信息。請(qǐng)求頭、請(qǐng)求體、響應(yīng)頭、響應(yīng)體,所有這些信息你都能獲得。只有日志有這個(gè)功能
?
?
?
?
?
What Rules Look Like規(guī)則是什么樣子的
ModSecurity圍繞兩種東西:配置和規(guī)則。配置告訴modsecurity怎么處理它遇到的數(shù)據(jù)。規(guī)則決定對(duì)要處理的數(shù)據(jù)做什么。盡管現(xiàn)在看規(guī)則是怎么運(yùn)作的還太早,我將給你展示一個(gè)快速的例子,僅僅告訴你規(guī)則是什么樣子的:
SecRule ARGS “<script>” log,deny,status:404
即使沒(méi)有進(jìn)一步的幫助,你大概也能看出來(lái)規(guī)則指定了在輸入數(shù)據(jù)(<script>)中我們希望得到什么樣的數(shù)據(jù)。類似的,你很容易發(fā)現(xiàn)當(dāng)?shù)玫狡谕J?#xff08;log,deny,status:404)時(shí)會(huì)發(fā)生什么。如果我告訴你規(guī)則的一般語(yǔ)法,你將會(huì)更加清晰,例如下面:
SecRule VARIABLES OPERATOR ACTIONS
三部分的含義如下:
VARIABLES告訴ModSecurity上哪查找,例子中的ARGS變量,表示所有的請(qǐng)求參數(shù);。
OPERATOR告訴ModSecurity怎么查找,例子中,我們用一個(gè)正則表達(dá)式模式,他將和ARGS匹配。
ACTIONS告訴ModSecurity,當(dāng)匹配發(fā)生時(shí),將會(huì)做什么。例子中的規(guī)則給出了指示:記錄問(wèn)題,拒絕交互,用狀態(tài)號(hào):404拒絕。
我希望你不要對(duì)第一條規(guī)則的簡(jiǎn)單而失望,我向你保證通過(guò)組合ModSecurity提供的不同的工具,你能夠?qū)懗鲇杏玫囊?guī)則來(lái)實(shí)現(xiàn)負(fù)責(zé)的邏輯功能。
?
Transaction Lifecycle交互周期
ModSecurity中,每次交互都需要五步或五段:每一段,modSecurity都要在開(kāi)始做一些工作(例如:剖析數(shù)據(jù)),激發(fā)這一段中指定的規(guī)則,讓他起作用,或者段規(guī)則結(jié)束之后做一兩件事情。乍一看,五步很多,但是每一段的存在都有一個(gè)原因。總有一件或者幾件事情只能在交互周期的某一特定時(shí)刻發(fā)生。
請(qǐng)求頭(1)
請(qǐng)求頭段是modsecurity第一個(gè)切入點(diǎn)。這一段的首要目的是允許規(guī)則作者在代價(jià)很高的請(qǐng)求體處理過(guò)程發(fā)生之前對(duì)請(qǐng)求進(jìn)行評(píng)估。請(qǐng)求頭段會(huì)影響modsecurity怎么處理一個(gè)請(qǐng)求體。例如,modsecurity不會(huì)默認(rèn)分析XML請(qǐng)求體,但是你可以通過(guò)在第一階段指定合適的規(guī)則來(lái)指示他這么做。
請(qǐng)求體(2)
請(qǐng)求體階段是主要的請(qǐng)求分析階段并且當(dāng)接收到一個(gè)完整的請(qǐng)求體并進(jìn)行處理時(shí),這一階段立即發(fā)生。這一階段的規(guī)則可以任意處理所有的請(qǐng)求數(shù)據(jù)。
響應(yīng)頭(3)
響應(yīng)頭階段在接收到響應(yīng)頭之后,還沒(méi)有讀取響應(yīng)體之前發(fā)生。這一階段的規(guī)則將會(huì)決定是否檢查響應(yīng)體。
響應(yīng)體(4)
響應(yīng)體階段是主要的響應(yīng)分析階段。這一階段一開(kāi)始,就會(huì)讀取響應(yīng)體的數(shù)據(jù)以供規(guī)則使用。
記錄(5)
記錄階段很特殊,首先,這是唯一的一個(gè)你不能鎖定的階段。交互完成之后,這個(gè)階段才開(kāi)始運(yùn)行,所以你什么都不能做,只能記錄發(fā)生的事實(shí)。這個(gè)階段的規(guī)則將會(huì)控制怎么記錄。
?
周期實(shí)例
為了讓你更好的理解每個(gè)交互階段發(fā)生了什么,我們將研究一個(gè)POST交互的詳細(xì)調(diào)試日志。因?yàn)橄旅孢@個(gè)交互將會(huì)運(yùn)用modsecurity的大多數(shù)部分,我們特意選擇了一個(gè)使用請(qǐng)求體來(lái)發(fā)送數(shù)據(jù)的交互類型。為了使事情相對(duì)簡(jiǎn)單,我使用了一個(gè)沒(méi)有任何規(guī)則的配置,為了清晰起見(jiàn),去除了一些調(diào)試記錄行、時(shí)間戳和一些附加的元數(shù)據(jù)。
注意:不要期望在此就能理解關(guān)于日志的所有事情。只是有一個(gè)關(guān)于modsecurity如何工作的大體感覺(jué)。開(kāi)始使用modsecurity之后,你很快就會(huì)發(fā)現(xiàn)調(diào)試記錄是一個(gè)不可缺少的書(shū)寫(xiě)規(guī)則和疑難排解的工具。
我在這一段文章中使用的交互很直接。我把請(qǐng)求數(shù)據(jù)放在兩個(gè)不同的地方,參數(shù)a放在查詢字符串中,參數(shù)b放在請(qǐng)求體中,但是在這個(gè)請(qǐng)求當(dāng)中再?zèng)]有值得注意的地方了。
POST /?a=test HTTP/1.0
Content-type: application/x-www-form-urlencoded
Content-Length:6
?
B=test
?
響應(yīng)一點(diǎn)都不起眼:
HTTP/1.1 200 OK
Date:Sun,17 Jan 2010 00:13:44 GMT
Server:Apache
Content-Length:12
Connection:close
Content-Type:text/html
?
Hello World!
?
請(qǐng)求頭available之后但是請(qǐng)求體(如果有的話)未讀之前,Apache第一次啟用ModSecurity。先出現(xiàn)初始化消息,包含了mod_unique_id產(chǎn)生的獨(dú)立的交互ID號(hào)。使用這個(gè)信息你應(yīng)該能夠把調(diào)試日志里的信息和你訪問(wèn)的信息以及審計(jì)日志里的信息配對(duì)。這時(shí),modsecurity將解析請(qǐng)求行和請(qǐng)求頭上的信息。在這個(gè)例子中,查詢字符串包含了一個(gè)簡(jiǎn)單的參數(shù)a,所以你會(huì)看見(jiàn)記錄它的發(fā)現(xiàn)的消息。然后Modsecurity會(huì)創(chuàng)建一個(gè)交互語(yǔ)境,并引發(fā)REQUEST_HEADERS段:
[4]初始化交互(txid SopXW38EAAE9YbLQ)
[5]增加請(qǐng)求參數(shù)(查詢字符串QUERY_STRING):名字“a“,值“test”
[4]創(chuàng)建交互語(yǔ)境(dcfg 8121800)
[4]開(kāi)始段REQUEST_HEADERS
如果一個(gè)規(guī)則沒(méi)有鎖定交互,那么現(xiàn)在modsecurity就會(huì)給Apache返回控制,以允許其他模塊在控制返回給他之前處理請(qǐng)求。在第二階段,modsecurity先讀取然后處理請(qǐng)求體,前提是請(qǐng)求體存在。在接下來(lái)的例子中,你能看到輸入過(guò)濾器中的三個(gè)消息,告訴你讀取了什么。第四條消息告訴你,從請(qǐng)求體中獲取了一個(gè)參數(shù)。請(qǐng)求(application/x-www-form-urlcoded)中使用的內(nèi)容類型是modsecurity能識(shí)別并且自動(dòng)分析的類型。一旦處理了請(qǐng)求體,就會(huì)處理ERQUEST_BODY規(guī)則。
[4]第二階段開(kāi)始(dcfg 8121800)
[4]輸入過(guò)濾器:正在讀取請(qǐng)求體
[9]輸入過(guò)濾器:斗式HEAP包含6個(gè)字節(jié)
[9]輸入過(guò)濾器:斗式EOS包含0個(gè)字節(jié)
[5]正在增加請(qǐng)求參數(shù)(BODY):名稱“b”,值:“test”
[4]輸入過(guò)濾器:已完成接受請(qǐng)求體(長(zhǎng)度6)
[4]開(kāi)始階段REQUEST_BODY
記錄當(dāng)中一直提到的過(guò)濾器是modsecurity處理請(qǐng)求體和響應(yīng)體的部分。
[4]鉤住嵌入過(guò)濾器:增加輸入轉(zhuǎn)發(fā)過(guò)濾器(r 81d0588)
[4]鉤住嵌入過(guò)濾器:增加輸出過(guò)濾器(r 81d0588)
Modsecurity沒(méi)法送一大塊數(shù)據(jù)給請(qǐng)求處理程序,就會(huì)在調(diào)試日志里面增加一條消息,最后一條小時(shí)用來(lái)說(shuō)明緩沖區(qū)中沒(méi)有數(shù)據(jù)了。
[4]輸入過(guò)濾器:轉(zhuǎn)發(fā)輸入:mode=0,block=0,nbytes=8192(f 81d2228,r 81d0588)
[4]輸入過(guò)濾器:轉(zhuǎn)發(fā)了6個(gè)字節(jié)
[4]輸入過(guò)濾器:發(fā)送了EOS
[4]輸入過(guò)濾器:輸入轉(zhuǎn)發(fā)完成
不久之后,輸出過(guò)濾器將會(huì)開(kāi)始接收數(shù)據(jù),就在此時(shí)引發(fā)RESPONSE_HEADERS規(guī)則:
[9]輸出過(guò)濾器:接收輸出(f 81d2258,r 81d0588)
[4]開(kāi)始RESPONSE_HEADERS階段
一旦所有的規(guī)則都運(yùn)行過(guò)了,modsecurity將繼續(xù)在緩存區(qū)中儲(chǔ)存響應(yīng)體,之后運(yùn)行RESPONSE_BODY規(guī)則。
[9]輸出過(guò)濾器:斗式MMAP包含12個(gè)字節(jié)
[9]輸出過(guò)濾器:斗式EOS包含0個(gè)字節(jié)
[4]輸出過(guò)濾器:完成接收響應(yīng)體(緩沖區(qū)滿-12個(gè)字節(jié))
[4]開(kāi)始階段RESPONSE_BODY
再一次假設(shè)沒(méi)有鎖定規(guī)則,積累的響應(yīng)體將會(huì)轉(zhuǎn)發(fā)給客戶端。
[4]輸出過(guò)濾器:輸出轉(zhuǎn)發(fā)完成
最后,記錄階段開(kāi)始。先運(yùn)行LOGGING規(guī)則來(lái)影響記錄動(dòng)作,這之后如果有必要的話才會(huì)啟動(dòng)審計(jì)記錄子系統(tǒng)來(lái)記錄交互。審計(jì)記錄子系統(tǒng)發(fā)的消息將會(huì)是日志中最后一條交互消息。在這個(gè)例子中,modsecurity告訴我們他沒(méi)有發(fā)現(xiàn)交互當(dāng)中任何值得關(guān)注的事情并且沒(méi)有理由記錄:
[4]開(kāi)始記錄
[4]開(kāi)始LOGGING階段
[4]審計(jì)記錄:忽略了一個(gè)不想管的請(qǐng)求。
?
?
?
?
?
?
?
?
?
?
?
處理階段:
ModSecurity 2.x允許把規(guī)則至于下述五個(gè)階段之一:
請(qǐng)求頭(REQUEST_HEADERS)
請(qǐng)求體(REQUEST_BODY)
響應(yīng)頭(RESPONSE_HEADERS)
響應(yīng)體(RESPONSE_BODY)
記錄(LOGGING)
為了在規(guī)則執(zhí)行時(shí)選擇階段,需要使用階段命令,可以通過(guò)規(guī)則中直接使用,也可以通過(guò)SecDefaultAction指令。
SecDefaultAction “l(fā)og,pass,phase:2”
SecRule REQUEST_HEADER:Host “!^$””deny,phase:1”
注意:要注意規(guī)則的執(zhí)行時(shí)依賴于階段,即使是一個(gè)配置文件中的兩條鄰近的規(guī)則,只要是設(shè)置了在不同的階段中執(zhí)行,他們就不會(huì)是一個(gè)接一個(gè)的生效。配置文件中的規(guī)則順序僅僅是在規(guī)則各自的階段中是重要的。在使用Skip和SkipAfter動(dòng)作時(shí)尤為重要。
注意:LOGGING階段比較特別,無(wú)論前面的各個(gè)階段發(fā)生了什么事,都會(huì)每個(gè)事務(wù)的最后被執(zhí)行。這就意味著哪怕是請(qǐng)求被中斷或是放行事務(wù)時(shí)都會(huì)被執(zhí)行。
請(qǐng)求頭階段:
這個(gè)階段的規(guī)則會(huì)在apache完成請(qǐng)求頭的讀取后立即被執(zhí)行(post-read-request階段),這時(shí),還沒(méi)有讀取請(qǐng)求體,意味著不是所有的參數(shù)都可用。如果你必須讓規(guī)則盡早運(yùn)行,應(yīng)把規(guī)則放在這個(gè)階段(在apache使用這個(gè)請(qǐng)求做某些事前),在請(qǐng)求體被讀取前做些事情,從而決定是否緩存這個(gè)請(qǐng)求體,或者決定你將希望這個(gè)請(qǐng)求體如何被處理(如是否以XML格式解析或不解析)。
注意這個(gè)階段的規(guī)則無(wú)法影響apache的范圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子一樣還無(wú)法得到信息。VirtualHost指令有些例外,如果想在apache的locations使用ModSecurity規(guī)則,那么他們應(yīng)該運(yùn)行在階段2,參考apache請(qǐng)求環(huán)/ModSecurity處理階段圖標(biāo)。
請(qǐng)求體階段:
這是通用輸入分析階段,大部分傳統(tǒng)的應(yīng)用規(guī)則不在這兒,這個(gè)階段你肯定能收到參數(shù)(只有讀取過(guò)請(qǐng)求體后),在請(qǐng)求體階段,ModSecurity支持三種編碼類型。
Application/x-www-form-urlencoded – used to transfer from data
Multipart/from-data – used for file transfers
Text/xml – used for passing XML data
大部分WEB應(yīng)用還沒(méi)有使用其他的編碼方法。
響應(yīng)頭階段:
發(fā)生在響應(yīng)頭被發(fā)送到客戶端之前,如果你想觀察響應(yīng)發(fā)生前就在這兒運(yùn)行,如果你想使用響應(yīng)頭來(lái)決定你是否想緩存響應(yīng)體也行。注意一些響應(yīng)狀態(tài)碼(如404)在請(qǐng)求環(huán)的早期就被apache管理著,我也無(wú)法觸發(fā)預(yù)期。加上apache在后面的鉤子上雙增加了一些響應(yīng)頭(如日期、服務(wù)器和連接信息等),這些我們無(wú)法觸發(fā)和審查。在代理配置模式下或使用phase:5(logging)工作的較好。
響應(yīng)體階段:
這是通用輸出分析階段,這里你能運(yùn)行規(guī)則截?cái)囗憫?yīng)體(當(dāng)然提供緩存)。這個(gè)階段你想檢查輸出的HTML信息公布、錯(cuò)誤信息和失敗的驗(yàn)證文字。
日志階段:
在日志發(fā)生前運(yùn)行的一個(gè)階段,放在這個(gè)階段的規(guī)則只能影響日志記錄器如何執(zhí)行,這個(gè)階段可以檢測(cè)apache記錄的錯(cuò)誤信息,在這個(gè)階段你不能拒絕或阻斷連接,因?yàn)樘t了,這個(gè)階段也允許檢測(cè)其他的響應(yīng)頭,如那在phase:3或者phase:4階段中不可用的。注意在這個(gè)階段,你應(yīng)當(dāng)小心不要繼承破壞性的動(dòng)作到規(guī)則中,這樣的情況在ModSecurity2.5.0及其以后的版本中被當(dāng)做配置錯(cuò)誤。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
Embedded vs. Reverse Proxy Mode
嵌入式與反向代理模式
Modsecurity并不關(guān)心自己是否處于嵌入式或反向代理模式,反向代理模式時(shí),Apache負(fù)責(zé)向后端服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)并接收發(fā)回來(lái)的數(shù)據(jù),所以modsecurity不用關(guān)心。只有一點(diǎn)小區(qū)別,下面我列出來(lái)供參考:
1、? 嵌入式時(shí),通常會(huì)使用一個(gè)資源(一個(gè)script腳本或者一個(gè)file文件)來(lái)滿足每一個(gè)請(qǐng)求。Modsecurity規(guī)則會(huì)檢查這些文件(SCRIPT_*允許訪問(wèn)的變量族)的屬性。反向代理模式時(shí),實(shí)際上是由后端服務(wù)器來(lái)滿足所有的請(qǐng)求。也就是說(shuō)不使用本地資源,并且相關(guān)變量的使用一點(diǎn)意義也沒(méi)有。
2、? 嵌入式時(shí),
?
?
?
?
?
?
?
Integrating with ClamAV
結(jié)合clamav
Clamav是一個(gè)開(kāi)源防病毒軟件,如果你已經(jīng)安裝了Clamav,你可以使用下面的腳本掃描modsecurity的文件。(Clam AntiVirus是一個(gè)類UNIX系統(tǒng)上使用的反病毒軟件包。主要應(yīng)用于郵件服務(wù)器,采用多線程后臺(tái)操作,可以自動(dòng)升級(jí)病毒庫(kù)。)
?
?
?
?
3 Configuration
Modsecurity已經(jīng)編譯好并且準(zhǔn)備好運(yùn)行了,現(xiàn)在我們可以對(duì)他進(jìn)行配置。這一段落以及很多分段,會(huì)講到modsecurity配置的每一部分,并明確的配置每一個(gè)小細(xì)節(jié)。
Table 3.1. Main configuration directives
Directive ?????????????????????????Description
SecArgumentSeparator ???????????????Sets the application/x-www-form-urlencoded parameter separator
SecCookieFormat ????????????????????Sets the cookie parser version(設(shè)置cookie解析器版本)
SecDataDir ??????????????????????????Sets the folder for persistent storage(設(shè)置用于持久性存儲(chǔ)的文件夾)
SecRequestBodyAccess ??????????????Controls request body buffering
SecRequestBodyInMemoryLimit?????? ??Sets the size of the per-request memory buffer
SecRequestBodyLimit ?????????????????Sets the maximum request body size ModSecurity will accept
SecRequestBodyNoFilesLimit ??????????Sets the maximum request body size, excluding uploaded files
SecResponseBodyAccess?????? ???????Controls response body buffering
SecResponseBodyLimit ???????????????Specifies the response body buffering limit
SecResponseBodyLimitAction ?????????Controls what happens once the response body limit is reached
SecResponseBodyMimeType ??????????Specifies a list of response body MIME types to inspect
SecResponseBodyMimeTypesClear ????Clears the list of response body MIME types
SecRuleEngine ??????????????????????Controls the operation of the rule engine
SecTmpDir ??????????????????????????Sets the folder for temporary files
?
Miscellaneous Options各種各樣的選項(xiàng)
這一段落的指令幾乎不會(huì)用到,但是有了他們,我們可以完全掌握modsecurity的配置選項(xiàng)。你也應(yīng)該意識(shí)到他們的存在,并在一些罕見(jiàn)的需要使用它們的時(shí)候會(huì)使用它們。
可以使用SecArgumentSeparator指令改變application/x-www-form-urlencoded編碼的參數(shù)separator。application/x-www-form-urlencoded編碼是用來(lái)傳輸所有的GET參數(shù)和大部分POST參數(shù)的。
SecArgumentSeparator &
實(shí)際上,所有的application都使用一個(gè)&來(lái)達(dá)到這個(gè)目的,但是也有一些不會(huì)。HTML4.01說(shuō)明書(shū)建議,為了方便,application支持使用分號(hào)作為separators(參考段落B.2.2URI屬性值中的&)。PHP則可以把任何字符黨組separator。
SecCookieFormat指令會(huì)從modsecurity支持的兩個(gè)cookie解析器當(dāng)中選出一個(gè)。實(shí)際上,所有的applications都使用Netscape-style cookie(有時(shí)也當(dāng)做version 0)所以,幾乎沒(méi)有理由來(lái)改變這個(gè)設(shè)置:
SecCookieFormat 0
?
?
4 Logging
這一段落詳細(xì)的講述了modsecurity的logging能力。Modsecurity所做的工作中,Logging占了大部分。
Debug Log調(diào)試日志
調(diào)試日志是你進(jìn)行疑難排解的最基本的工具,尤其是在你剛開(kāi)始學(xué)習(xí)modsecurity怎么工作的時(shí)候。
Table 4.1. Debug log directives
Directive??????? ???Description
SecDebugLog ????????Path to the debug log file
SecDebugLogLevel?? ?Debug log level
理論上調(diào)試日志有10個(gè)等級(jí),但不是全部都使用。1-3等級(jí)的消息是有意義的,并且被復(fù)制到Apache的error log中。更高等級(jí)的消息大部分是用來(lái)解決問(wèn)題和調(diào)試的。
Table 4.2. Debug log levels
Debug log level ????Description
0 ??????????????????No logging
1 ??????????????????Errors (e.g., fatal processing errors, blocked transactions)
2 ??????????????????Warnings (e.g., non-blocking rule matches)
3???????????? ??????Notices (e.g., non-fatal processing errors)
4 ??????????????????Informational
5 ??????????????????Detailed
9?????????? ????????Everything!
你會(huì)想把調(diào)試日志的等級(jí)控制的很低(當(dāng)你想把所有的消息復(fù)制到調(diào)試日志時(shí),使用等級(jí)3;或者你只想把它們放在error log中時(shí),使用等級(jí)0)。這是因?yàn)檎{(diào)試日志的消息會(huì)超過(guò)50條(每一條消息都是一條I/O操作),并且平巨額每個(gè)交互至少有7KB的數(shù)據(jù)。為每一個(gè)交互都記錄所有的消息將會(huì)消耗大量的資源。
一個(gè)簡(jiǎn)單的調(diào)試日志行是這樣的:
[18/Aug/2009:08:18:08 +0100] [192.168.3.111/sid#80f4e40][rid#81d0588][/index.html]}
[4] Initialising transaction (txid SopVsH8AAAEAAE8-NB4AAAAD)。
這一命令行以元數(shù)據(jù)開(kāi)頭,而元數(shù)據(jù)通常比消息本身還要長(zhǎng)。
?
?
?
?
?
?
?
?
?
?
?
?
?
5 Rule Language Overview規(guī)則語(yǔ)言概述
?
Operators
截止到目前,所有的例子都是假設(shè)使用正規(guī)模式對(duì)輸入進(jìn)行匹配。盡管正則表達(dá)式非常有用,我們還是經(jīng)常想做一些其他的事情。這時(shí)候就會(huì)用到運(yùn)算符。事實(shí)是modsecurity總是使用一個(gè)運(yùn)算符,而不是你在一個(gè)規(guī)則中指定一個(gè)運(yùn)算符它才使用運(yùn)算符,不指定的話,它就使用正規(guī)模式匹配。所以作為開(kāi)始,下面的規(guī)則明確指定了一個(gè)運(yùn)算符——正規(guī)模式正在匹配一個(gè)!
SecRule ARGS:username “@rx ^(admin|root)$”
上面的規(guī)則檢查請(qǐng)求用戶名是admin還是root。你也許已經(jīng)注意到了幾件事情:
運(yùn)算符以@開(kāi)頭
運(yùn)算符總是被放在第二條SecRule token開(kāi)頭(token貌似指的是引號(hào)部分)
運(yùn)算符后面有一個(gè)空格。無(wú)論運(yùn)算符后面是不是一個(gè)簡(jiǎn)單的運(yùn)算符參數(shù)。@rx運(yùn)算符的參數(shù)是一個(gè)正則表達(dá)式
當(dāng)規(guī)則中帶有明確的運(yùn)算符的時(shí)候,你需要在token周圍使用雙引號(hào),token內(nèi)部總是有一個(gè)空格。沒(méi)有雙引號(hào),Apache將會(huì)混淆。
運(yùn)算符之所以強(qiáng)大在于它提供的廣泛的功能。表5.9中列出的字符串操作符,使用最頻繁。目前你已經(jīng)看到了足夠的使用正規(guī)模式匹配的例子。除了簡(jiǎn)單的匹配運(yùn)算符(@beginsWith,@endsWith等)之外,modsecurity還提供了類似的匹配,可以立即匹配大量的模式。@pm@pmFromFile就是這么用的。
String matching operators字符串匹配運(yùn)算符
字符串匹配運(yùn)算符從輸入提取一個(gè)字符串,然后嘗試將他和提供的參數(shù)進(jìn)行匹配。@rx和@pm是經(jīng)常使用的運(yùn)算符,因?yàn)樗麄兊膙ersatility(@rx)和速度(@pm),剩下 運(yùn)算符也有用,尤其是當(dāng)你 需要不同種類的擴(kuò)展的時(shí)候,@rx和@pm都不支持。
Table 5.9. String matching operators
Operator ??????????????????Description
@beginsWith ??????????????????Begins with
@contains ?????????????????????Contains
@endsWith???????????????????? Ends with
@rx ???????????????????????????Regular pattern match(正規(guī)模式匹配)
@pm ??????????????????????????Parallel matching(平行匹配)
@pmFromFile ?(@pmf in v2.6) ??Parallel matching, with arguments from a file(與文件中的參數(shù)進(jìn)行平行匹配)
@streq ????????????????????????String equal to
@within ???????????????????????Within
Numerical operators數(shù)字運(yùn)算符
表格5.10,使比較數(shù)字值變得很簡(jiǎn)單(previously you had to resort to使用復(fù)雜的正則表達(dá)式)
Table 5.10. Numerical operators
Operator????? ?Description
@eq ???????????Equal
@ge ???????????Greater or equal
@gt ???????????Greater than
@le ???????????Less or equal
@lt ????????????Less than
Validation operators
表格5.11,all validate input in some way.,
Table 5.11. Validation operators
Operator??????????? ?Description
@validateByteRange ????Validates that parameter consists only of allowed byte values
@validateDTD ??????????Validates XML payload against a DTD
@validateSchema ??????Validates XML payload against a Schema
@validateUrlEncoding ???Validates an URL-encoded string
@validateUtf8Encoding ??Validates an UTF-8 encoded string
Miscellaneous operators
?
?
Table 5.12. Miscellaneous operators
Operator ???????Description
@geoLookup ??????Determines the physical location of an IP address
@inspectFile ??????Invokes an external script to inspect a file
@rbl ??????????????Looks parameter against a RBL (real-time block list)
@verifyCC ????????Checks if the parameter is a valid credit card number
Actions
動(dòng)作會(huì)使modsecurity精簡(jiǎn)(tick)。
?
?
Disruptive actions
表格5.13指定了規(guī)則成功匹配時(shí)將會(huì)做什么。每一條規(guī)則都必須和一個(gè)disruptive動(dòng)作結(jié)合。Pass動(dòng)作時(shí)唯一例外,當(dāng)規(guī)則匹配時(shí)他會(huì)繼續(xù)處理規(guī)則。其他所有的動(dòng)作都會(huì)以某一指定方式進(jìn)行攔截。
Table 5.13. Disruptive actions
Action ???????Description
Allow????????? ?Stop processing of one or more remaining phases(停止一個(gè)或更多的剩下階段的處理)
Block????????? ?Indicates that a rule wants to block(規(guī)則會(huì)攔截)
Deny????????? ?Block transaction with an error page(用一個(gè)錯(cuò)誤頁(yè)面攔截交互)
drop ???????????Close network connection(關(guān)閉網(wǎng)絡(luò)連接)
pass?????????? ?Do not block, go to the next rule(不攔截,繼續(xù)下一條規(guī)則)
proxy ??????????Proxy request to a backend web server(對(duì)后端服務(wù)器進(jìn)行代理請(qǐng)求)
redirect ?????????Redirect request to some other web server()
Flow actions
表格5.14中的動(dòng)作會(huì)轉(zhuǎn)變規(guī)則在一個(gè)段中處理的方式。
?
Table 5.14. Flow actions
Action ????Description
chain ??????Connect two or more rules into a single logical rule(把兩條或更多的規(guī)則在一條簡(jiǎn)單的邏輯規(guī)則里進(jìn)行連接)
skip ???????Skip over one or more rules that follow(跳過(guò)緊接下來(lái)的一條或幾條規(guī)則)
skipAfter??? Skip to the rule or marker with the provided ID(跳到指定ID號(hào)的規(guī)則或標(biāo)志)
Metadata actions
表格5.15中的metadata actions提供了規(guī)則的附加信息,把這些信息和error消息結(jié)合起來(lái)就會(huì)更容易理解他們?yōu)槭裁窗l(fā)生的。
Table 5.15. Metadata actions
Action ??Description
id ????????Assign unique ID to a rule(給規(guī)則分配單獨(dú)的ID號(hào))
phase ????Phase for a rule to run in(規(guī)則在哪一段中運(yùn)行)
msg????? ?Message string(消息字符串)
rev ???????Revision number()
severity ???Severity
tag ???????Tag
Variable actions變量動(dòng)作
5.16中的變量動(dòng)作處理變量,你可以用他們來(lái)對(duì)變量進(jìn)行設(shè)置、改變和刪除。
Table 5.16. Variable actions
Action ?????Description
capture ??????Capture results into one or more variables()
deprecatevar ?Decrease numerical variable value over time
expirevar ?????Remove variable after a time period(一個(gè)時(shí)間段之后刪除變量)
initcol???????? Create a new persistent collection(創(chuàng)建一個(gè)新的連續(xù)的集合)
setenv ???????Set or remove an environment variable(設(shè)置或刪除環(huán)境變量)
setvar ???????Set, remove, increment or decrement a variable()
setuid ???????Associate current transaction with an application user ID (username)(用應(yīng)用用戶ID、用戶名和當(dāng)前交互結(jié)合起來(lái))
setsid?????? ?Associate current transaction with an application session ID(用應(yīng)用會(huì)話ID和當(dāng)前交互結(jié)合起來(lái))
Logging actions
5.17的Logging動(dòng)作會(huì)影響日志產(chǎn)生的方式。需要使用ctl動(dòng)作來(lái)整體控制交互記錄。
Table 5.17. Logging actions
Action ???????????????Description
auditlog ?????????????????Log current transaction to audit log(把當(dāng)前交互記錄得到audit log里面)
log????????????????????? Log error message; implies auditlog(記錄錯(cuò)誤信息,implies auditlog)
logdata????????????????? Log supplied data as part of error message()
noauditlog ???????????????Do not log current transaction to audit log(不把當(dāng)前交互記錄到auditlog中)
nolog??????????????????? Do not log error message; implies noauditlog()
sanitiseArg ??????????????Remove request parameter from audit log(從auditlog中刪除請(qǐng)求參數(shù))
sanitiseMatched ??????????Remove parameter in which a match occurred from audit log(從audit log中刪除匹配參數(shù))
sanitiseRequestHeader ????Remove request header from audit log(從audit log中刪除請(qǐng)求頭)
sanitiseResponseHeader ??Remove response header from audit log(從audit log中刪除響應(yīng)頭)
Special actions
5.18的special動(dòng)作是sort的gateways,使用他們可以訪問(wèn)其他功能類。Ctl動(dòng)作有幾個(gè)自己的子動(dòng)作,它能改變交互的引擎配置,而且只能改變當(dāng)前交互的。MultiMatch規(guī)則產(chǎn)生了一種特殊的匹配方式,在每一次轉(zhuǎn)換之后,規(guī)則里的運(yùn)算符都以這種方式執(zhí)行(通常情況下,當(dāng)所有的轉(zhuǎn)換完成之后運(yùn)算符只執(zhí)行這一次)。可以使用t動(dòng)作來(lái)使用0個(gè)或更多的轉(zhuǎn)換,在運(yùn)算符執(zhí)行之前對(duì)變量進(jìn)行轉(zhuǎn)換。
Table 5.18. Special actions
Action ?????Description
ctl ???????????Change configuration of current transaction(改變當(dāng)前交互的配置)
multiMatch ???Activate multi-matching, where an operator runs after every transformation()
t ????????????Specify transformation functions to apply to variables before matching(匹配之前指定變量的轉(zhuǎn)換函數(shù))
Miscellaneous actions
Miscellaneous動(dòng)作包含了不屬于任何組的動(dòng)作。
Table 5.19. Miscellaneous actions
Action ??????Description
append ???????Append content to response body
exec ?????????Execute external script(執(zhí)行外部腳本)
pause??????? ?Pause transaction(暫停交互)
prepend ??????Prepend content to response body()
status ????????Specify response status code to use with deny and redirect(指定響應(yīng)狀態(tài)碼deny和redirect)
xmlns ????????Specify name space for use with XPath expressions(為APath表達(dá)式指定響應(yīng)空間)
?
?
?
?
6 Rule Language Tutorial規(guī)則語(yǔ)言使用指南
Introducing simple rules and operators
最簡(jiǎn)單的規(guī)則值指定一個(gè)變量和一個(gè)正則表達(dá)式。下面的例子中,檢查request URI,看看能不能和正則表達(dá)式模式<script>進(jìn)行匹配。
SecRule REQUEST_URI <script>
正是由于modsecurity允許一個(gè)規(guī)則不指定運(yùn)算符,他會(huì)假設(shè)正則表達(dá)式就是一個(gè)運(yùn)算符,這個(gè)簡(jiǎn)單的規(guī)則才能成立。
?
SecRule REQUEST_URI "@rx <script>"
注意因?yàn)榈诙€(gè)參數(shù)含有空格,必須使用雙引號(hào)。Modsecurity支持很多運(yùn)算符,有些相似,但通常會(huì)有不同的執(zhí)行特點(diǎn)。例如,上面的例子中我使用的正則表達(dá)式模式(<script>)還不足以成為一個(gè)模式。只是一個(gè)字符串而已。因?yàn)樗话魏翁厥庾址N乙材苁褂?#64;contains運(yùn)算符寫(xiě)一個(gè)同樣的規(guī)則:
SecRule REQUEST_URI "@contains <script>"
?
Working with variables
在一條規(guī)則當(dāng)中你可以指定任意多的變量,只要使用“|”字符他們分開(kāi)即可。
SecRule REQUEST_URI|REQUEST_PROTOCOL <script>
對(duì)集合這個(gè)變量來(lái)說(shuō),包含了一條以上的消息。例如ARGS變量,包含了一個(gè)交互中所有的請(qǐng)求參數(shù)。你可以使用“:”運(yùn)算符來(lái)指定集合當(dāng)中的一個(gè)成員,下面這條規(guī)則只查看名字為p的參數(shù):
SecRule ARGS:p <script>
在同一條規(guī)則當(dāng)中你可以多次使用同一個(gè)集合:
SecRule ARGS:p|ARGS:q <script>
實(shí)際上,“:”非常有效,使用正則表達(dá)式的時(shí)候,你可以使用“:”來(lái)指定名字,當(dāng)參數(shù)的名字在運(yùn)行期間會(huì)發(fā)生改變的時(shí)候,這個(gè)功能非常有用。下面這條規(guī)則會(huì)找出所有名字是以字母“p”開(kāi)頭的參數(shù),捕捉密碼或者pea這樣的參數(shù):
SecRule ARGS:/^p/ <script>
如果你沒(méi)有限制規(guī)則只能訪問(wèn)集合中的某些成員時(shí),modsecurity會(huì)認(rèn)為你會(huì)用集合的所有成員。當(dāng)你不知道一個(gè)頁(yè)面會(huì)使用什么參數(shù)的時(shí)候,使用起來(lái)會(huì)很handy。并不是所有的結(jié)合都可以這么使用(ARGS可以,但是ENV不可以)。但是。。。
例如,當(dāng)一個(gè)請(qǐng)求含有p、q、z三個(gè)參數(shù)時(shí),ARGS可以如下擴(kuò)展:
[4] Expanded "ARGS" to "ARGS:p|ARGS:q|ARGS:z".
?
下面這條規(guī)則將會(huì)檢查除z以外的參數(shù):
SecRule ARGS|!ARGS:z <script>
Combining rules into chains
一個(gè)規(guī)則中指定一個(gè)以上的變量時(shí),可以使用OR邏輯運(yùn)算符。任一個(gè)變量匹配,規(guī)則就會(huì)匹配。也可以使用邏輯AND把幾個(gè)規(guī)則組合成一個(gè)。如果你想寫(xiě)一條規(guī)則,實(shí)現(xiàn)在p和q兩個(gè)參數(shù)中發(fā)現(xiàn)一些東西,規(guī)則就匹配,你可以這樣寫(xiě):
SecRule ARGS:p <script> chain
SecRule ARGS:q <script>
這就叫rule chaining,chain這個(gè)動(dòng)作構(gòu)成了兩個(gè)或更多的規(guī)則鏈,并有效的建立了帶有一個(gè)以上的evaluation步驟的一條簡(jiǎn)單規(guī)則。鏈的第一條規(guī)則總是運(yùn)行,而對(duì)子規(guī)則來(lái)說(shuō),只有當(dāng)同一條鏈中它前面的規(guī)則都運(yùn)行完了之后他才運(yùn)行。。。
?
Operator negation否定運(yùn)算符
在運(yùn)算符前面放感嘆號(hào)“!”,就會(huì)得到否定的結(jié)果。例如:你想寫(xiě)一條規(guī)則,當(dāng)用戶名既不是admin也不是root時(shí)規(guī)則匹配(與之前的例子目的相反):
SecRule ARGS:username “!@rx ^(admin|root)$”
不要把運(yùn)算符否定和規(guī)則否定混淆。只有當(dāng)一個(gè)規(guī)則只對(duì)一個(gè)變量使用的時(shí)候兩個(gè)才是一樣的。但是如果變量多于一個(gè)的話,情況就變了:
SecRule ARGS:p|ARGS:q “!@eq 5”
上面的規(guī)則只要有一個(gè)變量不等于5就會(huì)匹配。如果你想寫(xiě)一條規(guī)則實(shí)現(xiàn)兩個(gè)變量都不等于5時(shí)才進(jìn)行匹配,你就必須使用規(guī)則鏈:
SecRule ARGS:p "!@eq 5" chain
SecRule ARGS:q "!@eq 5"
Variable counting
提問(wèn):如何檢查沒(méi)有出現(xiàn)的一些東西,比如常見(jiàn)的規(guī)則,把所有的參數(shù)放在一個(gè)請(qǐng)求中:
SecRule ARGS <script>
一個(gè)請(qǐng)求不含有任何變量時(shí),ARGS會(huì)擴(kuò)展成0個(gè)變量。如果沒(méi)有變量的話,運(yùn)算符將會(huì)運(yùn)行失敗,規(guī)則(或規(guī)則鏈)將不會(huì)匹配。
答案就是使用modsecurity的能力去計(jì)算集合中變量的個(gè)數(shù)。使用&運(yùn)算符可以查看ARGS,檢測(cè)沒(méi)有參數(shù)的情況:
SecRule &ARGS “@eq 0”
&運(yùn)算符可以應(yīng)用于任意集合,包括集合的某一部分。下面這條規(guī)則當(dāng)請(qǐng)求中含有一個(gè)以上username參數(shù)的時(shí)候?qū)?huì)匹配。
SecRule &ARGS:username "!@eq 1"
Using actions
目前這個(gè)指南中的大部分例子都沒(méi)有用動(dòng)作。剛開(kāi)始我們只關(guān)注檢測(cè)機(jī)制。實(shí)際上,連一條簡(jiǎn)單動(dòng)作都不指定的話,你是寫(xiě)不出規(guī)則的。而且,寫(xiě)?yīng)毩⒌囊?guī)則而不是讓規(guī)則依賴于默認(rèn)動(dòng)作,是一個(gè)很好的習(xí)慣。
SecRule第三個(gè)參數(shù)和SecAction第一個(gè)參數(shù)是動(dòng)作。一個(gè)規(guī)則可以沒(méi)有動(dòng)作,也可以有一個(gè)或一個(gè)以上的規(guī)則。如果有一個(gè)以上的動(dòng)作,用“,”和許多空格進(jìn)行分隔。下面這條規(guī)則指定了兩個(gè)動(dòng)作:
SecRule ARGS K1 log,deny
有些動(dòng)作帶有參數(shù),你需要在動(dòng)作和參數(shù)之間放一個(gè)“:”。使用狀態(tài)碼404拒絕,規(guī)則如下:
SecRule ARGS K1 log,deny,status:404
最后,如果提供的參數(shù)帶有空格或逗號(hào),需要用單引號(hào)把參數(shù)值括起來(lái)這種參數(shù)處理方式經(jīng)常用于消息中:
SecRule ARGS K1 “l(fā)og,deny,msg:’Acme attack detected’”
在msg動(dòng)作參數(shù)周圍使用單引號(hào)之外,我把整個(gè)指令參數(shù)用雙引號(hào)括起來(lái)了。這樣Apache才會(huì)正確解析指令行。稍后你將會(huì)看到一些動(dòng)作包含復(fù)雜的參數(shù)(如ctl和setvar),現(xiàn)在討論的語(yǔ)法同樣要應(yīng)用于他們。
?
Understanding action defaults
你已經(jīng)了解了如何指定規(guī)則動(dòng)作,但是如果你不指定的話會(huì)發(fā)生什么呢。Modsecurity有一個(gè)默認(rèn)的動(dòng)作列表。當(dāng)你在配置中添加新的規(guī)則時(shí),這條規(guī)則的動(dòng)作列表和默認(rèn)動(dòng)作列表合并。Modsecurity2.5.11中,默認(rèn)動(dòng)作類表是phase:2,log,auditlog,pass,但是你可以隨時(shí)使用SecDefaultAction指令來(lái)把它覆蓋。最簡(jiǎn)單的例子是,當(dāng)增加的規(guī)則里面沒(méi)有動(dòng)作時(shí),就會(huì)替換性的使用默認(rèn)動(dòng)作列表。一下面這條規(guī)則為例(假設(shè)配置中沒(méi)有其他的規(guī)則或默認(rèn)動(dòng)作。)
SecRule ARGS K1
相當(dāng)于:
SecRule ARGS K1 phase:2,log,auditlog,pass
通常當(dāng)一個(gè)規(guī)則有一個(gè)或一個(gè)以上的動(dòng)作時(shí),合并意味著兩件事情中的一件:
Rule action replaces an action in the default action list規(guī)則動(dòng)作代替默認(rèn)動(dòng)作列表中的一個(gè)動(dòng)作
這非常典型的發(fā)生在disruptive動(dòng)作中,一個(gè)每一條規(guī)則只能有一個(gè)disruptive動(dòng)作。如果在默認(rèn)動(dòng)作列表中和新的規(guī)則中都指定了一個(gè)disruptive動(dòng)作,那么規(guī)則中的那個(gè)將會(huì)把默認(rèn)的覆蓋掉。
Rule action is appended to the ones in the default action list規(guī)則動(dòng)作添加到默認(rèn)動(dòng)作列表中去
有些動(dòng)作會(huì)在動(dòng)作列表中出現(xiàn)不止一次。像很多non-disruptive動(dòng)作,例如:t,setvar,ctl等等。有些情況下規(guī)則動(dòng)作可以完全去除默認(rèn)動(dòng)作,但怎么做到的取決于動(dòng)作。例如轉(zhuǎn)換動(dòng)作指定none作為轉(zhuǎn)換函數(shù)(t:none)的話,就是清空列表重新開(kāi)始。
?
?
SecDefaultAction phase:2,log,deny,status:404
SecRule ARGS K1
SecRule ARGS K2
…
SecRule ARGS K99
?
?
SecADefaultAction phase:2,log,pass,t:lowercase
SecRule ARGS K1 t:urlDecode
?
?
#first we have some rules that only warn
SecDefaultAction phase:2,log,pass
SecRule ARGS W1
SecRule ARGS W2
…
SecRule ARGS W19
#Now we have some rules that block
SecDefaultAction phase:2,log,deny,status:500
SecRule ARGS B1
…
SecRule ARGS B89
?
?
S
?
?
?
?
139
9 Practical Rule Writing實(shí)用規(guī)則寫(xiě)作
Whitelisting白名單
通常寫(xiě)規(guī)則集是為了挑選出不尋常的請(qǐng)求,但事實(shí)是大多數(shù)網(wǎng)絡(luò)包含一個(gè)或多個(gè)請(qǐng)求源,這些請(qǐng)求源不僅是不尋常的,而且是所需要的。網(wǎng)絡(luò)越復(fù)雜,就越需要使用白名單。大多數(shù)情況下,一個(gè)粗陋的監(jiān)視腳本監(jiān)視你的網(wǎng)站,看上去更像是一個(gè)粗陋的Perl腳本攻擊你的網(wǎng)站。你可能會(huì)把安全測(cè)試外包給第三方,并且你不想你的規(guī)則干擾他們的工作。最后,即使你沒(méi)有這些問(wèn)題,你也無(wú)法避免一些不能預(yù)料的情況,Apache會(huì)給自己發(fā)送請(qǐng)求。
Whitelisting theory
?
Integration with other Apache modules與Apache其他模塊整合
Apache最大的優(yōu)點(diǎn)就是它的模塊化。大多數(shù)情況下模塊是單獨(dú)使用的,但是多功能模塊能把一個(gè)模塊與另一個(gè)模塊聯(lián)系起來(lái)。通常modsecurity避免重復(fù)實(shí)現(xiàn)一些其他模塊已經(jīng)實(shí)現(xiàn)了的功能,即使是帶有安全標(biāo)簽的功能。向其他模塊發(fā)送指令或者從其他模塊接收指令需要時(shí)間。
Apache內(nèi)部有兩個(gè)機(jī)制實(shí)現(xiàn)模塊之間的聯(lián)系:
Environment variables環(huán)境變量
通常內(nèi)部模塊使用環(huán)境變量來(lái)實(shí)現(xiàn)與其他模塊之間的信息交換或者相互影響。當(dāng)兩個(gè)模塊需要聯(lián)系時(shí),要配置接受狀態(tài)的模塊來(lái)監(jiān)聽(tīng)環(huán)境變量,并能對(duì)環(huán)境變量進(jìn)行作用。很多模塊建立之初就帶有環(huán)境變量,所以如果你發(fā)現(xiàn)一個(gè)模塊支持環(huán)境變量,那就意味著你能夠用這個(gè)環(huán)境變量通過(guò)setenv動(dòng)作和modsecurity的模塊進(jìn)行通信。因?yàn)樵趍odsecurity內(nèi)部你能夠?qū)嵱肊NV集合檢索已命名變量的值,所以你可以不受限制的使用其他模塊提供的信息來(lái)寫(xiě)規(guī)則。
Optional functions可選函數(shù)
對(duì)一個(gè)模塊來(lái)說(shuō),有了可選函數(shù),就可以輸出一個(gè)或者更多的函數(shù)供其他模塊使用。Modsecurity在可選函數(shù)頂部建立了自己的擴(kuò)展API接口。擴(kuò)展API會(huì)在第十三章,Extending Rule Language.詳細(xì)講解。
你可能感興趣的模塊包括:
?mod_deflate
? mod_headers
? mod_log_config
? mod_rewrite
? mod_setenvif
?
Conditional logging有條件的日志記錄
通常情況下,日志會(huì)把所有Apache處理過(guò)的交互都記錄下來(lái),但是有時(shí)候你只想記錄一部分交互。這就是conditional logging。你可以使用Apache的環(huán)境變量描述你想記錄哪些東西。
? 默認(rèn)記錄 ,但是如果設(shè)置了環(huán)境變量就不記錄
? 默認(rèn)不記錄,但是如果設(shè)置了環(huán)境變量就會(huì)記錄
下面的例子,創(chuàng)建了一個(gè)自定義訪問(wèn)日志,只記錄指定IP地址的交互:
# Detect the condition that require logging
SecRule REMOTE_ADDR "@streq 192.168.1.1" \
phase:1,nolog,pass,setenv:SPECIAL_ACCESS_LOG
# Create a special access log file, which reacts to
# the SPECIAL_ACCESS_LOG environment variable.
CustomLog logs/special_access.log combined env=SPECIAL_ACCESS_LOG
?
?
?
Header manipulation頭操縱
Apache用mod_headers模塊進(jìn)行頭操縱。Header和RequestHeader指令知道怎樣去檢查我前面提到的環(huán)境變量。也就是說(shuō)你可以使用Header和RequestHeader指令有條件的改變請(qǐng)求和響應(yīng)頭。像以前一樣,用modsecurity檢查條件,如果條件符合的話設(shè)置環(huán)境變量。
Mod_Header模塊是一個(gè)Apache平臺(tái)上對(duì)請(qǐng)求頭和響應(yīng)頭進(jìn)行定制的模塊,它的強(qiáng)大之處是可以和ModSecurity的SetEnv指令聯(lián)合使用,如:(張宏超)
下面的例子中使用modsecurity引導(dǎo)mod_headers刪除session(會(huì)話)cookie:
#Simulate a condition that would want us
#to force the user to use another session(模擬一下,強(qiáng)迫用戶使用另一個(gè)會(huì)話)
SecRule ARGS attackPattern “phase:2,t:none,log,pass,setenv:DISABLE_OUTBOUND_SESSION”(當(dāng)遇到攻擊attackPattern時(shí),modsecurity會(huì)給mod_headers發(fā)送環(huán)境變量)
#Expire session cookies when instructed(mod_headers接收到命令時(shí)時(shí)終止會(huì)話cookies)
Header set Set-Cookie “PHPSESSION=;expires=Fri,31-Dec-1999 00:00:00 GMT” \
Env=DISABLE_OUTBOUND_SESSION (當(dāng)mod_headers接收到環(huán)境變量DISABLE_OUTBOUND_SESSION時(shí)就會(huì)刪除會(huì)話cookie,并給用戶返回另一個(gè)會(huì)話)
這個(gè)例子簡(jiǎn)單的來(lái)說(shuō)就是當(dāng)發(fā)現(xiàn)某個(gè)人在攻擊我們的網(wǎng)站時(shí),我們就強(qiáng)制重新給他發(fā)一個(gè)session(張宏超)
(這個(gè)規(guī)則編譯時(shí)候需要有action id號(hào),并且需要在httpd配置文件中加載模塊:
LoadModule headers_module modules/mod_headers.so)
Securing session cookies保護(hù)會(huì)話cookies
在支持用戶認(rèn)證的web應(yīng)用中,會(huì)話cookie功能作為臨時(shí)口令。用戶只提供他們的身份證明一次,假設(shè)證明是正確的,將會(huì)把他們的會(huì)話作為認(rèn)證標(biāo)記。從此刻起,只要知道會(huì)話ID就可以完全控制這次會(huì)話。應(yīng)該非常小心創(chuàng)建會(huì)話cookie,以保證他們的安全。在很多應(yīng)用中,可以通過(guò)修改cookie結(jié)構(gòu)的兩個(gè)方面提高他們的安全:
Use of the httpOnly flag使用httpOnly標(biāo)志
Ie發(fā)明了httpOnly,目的是防止JavaScript訪問(wèn)會(huì)話cookies。攻擊者經(jīng)常使用JavaScript成功實(shí)現(xiàn)XSS攻擊,然后盜竊會(huì)話ID。因?yàn)橹挥蟹?wù)器編碼使用會(huì)話cookies,所以如果阻止JavaScript訪問(wèn)并不會(huì)損失什么。使用httpOnly會(huì)使會(huì)話劫持變得更困難。
Use of the secure flag使用secure標(biāo)志
如果網(wǎng)站使用SSL,攻擊者就無(wú)法訪問(wèn)在網(wǎng)站和用戶之間傳輸?shù)臄?shù)據(jù)。當(dāng)使用SSL時(shí),經(jīng)常忽略了把會(huì)話cookies標(biāo)記為secure。這種疏忽會(huì)使用戶的會(huì)話cookies陷入危險(xiǎn),使攻擊者能夠訪問(wèn)響應(yīng)的會(huì)話。
如果你使用的是Apache2.2.4或更高版本,你就能夠只使用兩條mod_headers指令就可以很快的解決上面這些問(wèn)題。下面的例子使用PHP提高了會(huì)話cookies的安全。
# Add missing httpOnly flag
Header edit Set-Cookie "(?i)^(PHPSESSID=.+(?!httponly))" "$1; httpOnly"
# Add missing secure flag
Header edit Set-Cookie "(?i)^(PHPSESSID=.+(?!secure))" "$1; secure"
通常使用Set-Cookie頭來(lái)創(chuàng)建新的cookies,所以通過(guò)查看Set-Cookie頭,就可以找出沒(méi)有設(shè)置期望標(biāo)志的會(huì)話cookies。如果找到設(shè)置錯(cuò)誤的cookie,我們會(huì)修改頭并加上標(biāo)志。例子使用了很少用但是很有用的特性:
兩個(gè)正則表達(dá)式都以(?i)開(kāi)頭,保證匹配動(dòng)作不區(qū)分大小寫(xiě)。
第二部分里面,一個(gè)negative lookahead assertion(否定先行界定符),造成只有當(dāng)界定符里面的bits沒(méi)有在頭里面出現(xiàn)時(shí)才會(huì)匹配整個(gè)模式。
第四個(gè)參數(shù)使用反響引用($1),第四個(gè)參數(shù)包含的值,會(huì)替換現(xiàn)存的Set-Cookie的值,現(xiàn)存的頭值會(huì)替換反向引用($1)。
?
Advanced Blocking高級(jí)鎖定
簡(jiǎn)單的鎖定是直截了當(dāng)?shù)摹?/p>
使用deny狀態(tài)碼和redirect(重定向)狀態(tài)碼
配置用戶響應(yīng)頁(yè)面(單獨(dú)一個(gè)單元還是應(yīng)用程序安裝的一部分?)
不能鎖定第五階段
鎖定第三和第四階段會(huì)有困難
加上可能帶有mod_deflate的版本
蜜罐鎖定(每個(gè)IP地址/段重定向)
指定了什么時(shí)候鎖定但沒(méi)指定怎么鎖定
延遲(階段)鎖定——設(shè)置一個(gè)標(biāo)志評(píng)估段中的規(guī)則。最大化的檢測(cè)。
基于分?jǐn)?shù)的鎖定(每次交互)
持續(xù)的基于分?jǐn)?shù)的鎖定(每個(gè)IP地址,段,用戶)
外部鎖定
嚴(yán)重性有什么用
可以在鎖定中使用標(biāo)記嗎
用于鎖定的名譽(yù)數(shù)據(jù)庫(kù)(rbl)
用于鎖定的GeoIP
?
Making the most of regular expressions充分使用正則表達(dá)式
盡管modsecurity支持很多操作符,正則表達(dá)式如此強(qiáng)大而且功能廣泛,因?yàn)樵谝?guī)則中經(jīng)常見(jiàn)到正則表達(dá)式。Modsecurity使用Per1兼容正則表達(dá)式庫(kù)http://www.pcre.org ,更常稱為PCRE。這是一個(gè)周所周知應(yīng)用廣泛的正則表達(dá)式庫(kù)。Apache也使用的PCRE。正則表達(dá)式強(qiáng)大的令你驚奇,你會(huì)發(fā)現(xiàn)它比你想象的能干。這個(gè)章節(jié)將會(huì)強(qiáng)調(diào)PCRE最重要的方面以及modsecurity是如何使用它的,但這也只是冰山一角。強(qiáng)烈建議你熟悉一下PCRE參考資料http://www.pcre.org/pcre.txt ,包含了你需要知道的所有東西。
How ModSecurity Compiles Patternsmodsecurity怎樣編譯模式
正則表達(dá)式需要先編譯后使用。編譯是轉(zhuǎn)化成有效的內(nèi)部表示。在configure-time,編譯步驟做盡可能多的工作來(lái)提高庫(kù)的性能,編譯標(biāo)志會(huì)影響模式的使用,你需要注意一下他們。在最重要的地方,即@rx操作符,使用正則表達(dá)式,modsecurity用了兩個(gè)編譯標(biāo)志:
?
PCRE_DOLLAR_ENDONLY
默認(rèn),一個(gè)美元通配符$將會(huì)在字符串結(jié)尾匹配換行符。用戶通常會(huì)發(fā)現(xiàn)一件不可思議的事情,規(guī)則完全控制著哪個(gè)地方允許什么東西,但是$卻把規(guī)則打亂了。通過(guò)使用PCRE_DOLLAR_ENDONLY來(lái)編譯模式,$只能在輸入的結(jié)尾進(jìn)行匹配。
?
以下是從百度文庫(kù)里搜索的:
D(PCRE_DOLLAR_ENDONLY)
如果設(shè)定了此修正符,模式中的行結(jié)束($)僅匹配目標(biāo)字符串的結(jié)尾。沒(méi)有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,也會(huì)被匹配在里面。如果設(shè)定了m修正符則忽略此選項(xiàng)。
?
PCRE_DOTALL
默認(rèn),模式中的原點(diǎn)元字符匹配除了指定換行符之外的所有字符。在一個(gè)有潛在弱點(diǎn)的安全上下文中,攻擊者使用換行符打破攻擊有效載荷并阻止模式匹配。使用PCRE_DOTALL集,一個(gè)原點(diǎn)元字符會(huì)真正的匹配任何字符。
現(xiàn)在你知道了要使用哪些編譯標(biāo)志,去了解兩個(gè)不用的很重要:
PCRE_CASELESS
匹配時(shí)忽略大小寫(xiě)。
?
以下是從百度文庫(kù)里搜索的:
S(PCRE_DOTALL)
如果設(shè)定了次修正符,模式中的原點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。
?
?
?
Table 9.1. Pattern compilation flags
Usage ???????????????????????Compilation flags used
@rx ??????????????????????????PCRE_DOLLAR_ENDONLY, PCRE_DOTALL
@verifyCC ????????????????????PCRE_DOTALL, PCRE_MULTILINE
SecAuditLogRelevantStatus ?????PCRE_DOTALL
SecRuleRemoveByMsg ?????????No flags used
Variable selection (e.g. ARGS)? ??PCRE_CASELESS, PCRE_DOLLAR_ENDONLY, PCRE_DOTALL
Changing how patterns are compiled改變模式編譯的方式
如果你對(duì)modsecurity編譯模式的方式不滿意,但是你會(huì)對(duì)一件事情感到滿意,那就是你可以用PCRE在模式內(nèi)部可以覆蓋編譯標(biāo)志。比如下面這個(gè)例子:沒(méi)有使用任何轉(zhuǎn)換函數(shù),無(wú)論使用什么案例,它將會(huì)匹配單詞attack
SecRule ARGS “(?i)attack” phase:2,t:none
把(?i)部分放在模式開(kāi)頭,為整個(gè)模式觸發(fā)PCRE_CASELESS標(biāo)志。也可以通過(guò)在里面方修飾語(yǔ)的方法,為模式的一部分修改設(shè)置。
SecRule ARGS “attack (?i)keyword” phase:2,t:none
上面這個(gè)例子將會(huì)匹配attack keyword和attack KEYWORD,但不會(huì)匹配ATTACK keyword。如果你在次模式中使用修飾語(yǔ),只修飾余下的模式:
SecRule ARGS “(ken(?i)word) attack” phase:2,t:none
上面的例子將會(huì)匹配keyWORD attack,但不會(huì)匹配keyWORD ATTACK或者KEYWORD attack。
在字母之前使用破折號(hào)-來(lái)刪除一個(gè)標(biāo)志。下面的模式打亂了modsecurity默認(rèn)使用的PCRE_DOTALL標(biāo)志:
SecRule ARGS “(?-s)keyword” phase:2,t:none
你可以用這種方法使用的修飾符的完整列表在表9.2,你可以查閱PCRE參考文件查找他們完整的意思。
Table 9.2. Pattern modifiers
Modifier ???Meaning
i ????????????PCRE_CASELESS
J ???????????PCRE_DUPNAMES
m ???????????PCRE_MULTILINE
s??????????? ?PCRE_DOTALL
U ???????????PCRE_UNGREEDY
x ???????????PCRE_EXTENDED
X?????????? ?PCRE_EXTRA
Common pattern problems常見(jiàn)模式問(wèn)題
正則表達(dá)式出錯(cuò)很常見(jiàn),但是有兩個(gè)更加常見(jiàn):
Forgetting to escape the dot metacharacter ???????忘記忽視元字符點(diǎn).
很容易遺忘一件事情,那就是點(diǎn).是一個(gè)需要被忽視的元字符。因?yàn)镮P地址里面有很多點(diǎn),所以當(dāng)你寫(xiě)一個(gè)模式來(lái)匹配IP地址的時(shí)候,經(jīng)常發(fā)生這種事情。如果沒(méi)有忽視點(diǎn),點(diǎn)將會(huì)匹配任意一個(gè)字符,和非元字符進(jìn)行匹配。
Not using the ^ and $ anchors when matching entire input當(dāng)要匹配整個(gè)輸入的時(shí)候沒(méi)有使用^和$錨
當(dāng)你要匹配整個(gè)輸入的時(shí)候,需要使用^和$。者能夠保證,不管你寫(xiě)的是什么模式,都能夠進(jìn)行全部匹配。如果你忘記了使用^,攻擊者就是在你的模式之前發(fā)送任意內(nèi)容,如果是忘記了使用$,攻擊者就會(huì)在你的模式之后發(fā)送任意內(nèi)容。如果沒(méi)有錨,模式將會(huì)匹配中間的子字符串,而忽略其他任何東西。
?
Regular Expression Denial of Service正則表達(dá)式拒絕服務(wù)攻擊
正則表達(dá)式拒絕服務(wù)攻擊(又稱ReDoS)是一個(gè)比較令人費(fèi)解的問(wèn)題,它能影響每一個(gè)正則表達(dá)式寫(xiě)手。一些正則表達(dá)式結(jié)構(gòu)當(dāng)遇到邊界案例的時(shí)候性能變得很差(指數(shù)級(jí)的)。你一不小心會(huì)寫(xiě)出一個(gè)會(huì)被暗中操縱的模式,攻擊者從外面消耗你大部分服務(wù)器資源。
下面是從Alex’s和Adar’s借用的一些變量模式的例子:
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x},for x>10
?
Resources
當(dāng)和正則表達(dá)式一起工作的時(shí)候會(huì)變得不知所措時(shí),不要緊張。完全正常并且會(huì)得到及時(shí)解決。想要精通正則表達(dá)式?jīng)]必要買書(shū),但是如果買的話肯定會(huì)有幫助的。關(guān)于書(shū)我只關(guān)注一點(diǎn),就是他們都能涵蓋大部分正則表達(dá)式特性,而且我唯一感興趣的是PCRE。你至少應(yīng)該看兩本書(shū):
Mastering Regular Expressions。作者:JeffreyFriedl(O’Reilly,2006),普遍認(rèn)為是正則表達(dá)式的經(jīng)典著作。
Regular Expressions Cookbook,作者:Goyvaerts和Steven Levithan(O’Reilly,2009),是正則表達(dá)式最近增加的版本,更適合實(shí)踐學(xué)習(xí)。
?
?
?
?
?
?
?
Part II: Reference Documentation
14 Reference Manual
Configuration Directives配置指令:
下面一節(jié)概述了modsecurity所有的指令。大部分的modsecurity指令能被用于Apache內(nèi),例如虛擬主機(jī),地址,地址匹配,目錄等等,當(dāng)然還有其他,但是,如果在主配置文件里只能使用一次,這個(gè)在下面的章節(jié)會(huì)詳細(xì)介紹。
這些規(guī)則,和和新規(guī)則庫(kù),應(yīng)該放在httpd.conf文件外面,然后用include指令包含進(jìn)來(lái),這樣有利于更新或整合規(guī)則。如果你想自己定義一個(gè)規(guī)則,那么你應(yīng)該創(chuàng)建一個(gè)文件命名為modsecurity_crs_15_customrules.conf然后放在核心規(guī)則所在文件夾,這樣,你的自定義規(guī)則將在ModSecurity標(biāo)準(zhǔn)的核心規(guī)則庫(kù)后調(diào)用,但在其他核心規(guī)則前調(diào)用,這是很有用的,如果你的站用了”allow”指令它可以檢查核心規(guī)則是否誤報(bào)。
?
注意
建議不要修改核心規(guī)則文件,除非你把它放在你自己的規(guī)則庫(kù)里,這樣當(dāng)你從ModSecurity更新時(shí)會(huì)方便些。
?
SecAction action1,action2,action3
無(wú)條件執(zhí)行動(dòng)作清單,它只接受第一個(gè)也是唯一的一個(gè)參數(shù),其這個(gè)參數(shù)的使用規(guī)則與SecRule的第三個(gè)參數(shù)的使用規(guī)則相同,SecAction是你想無(wú)條件執(zhí)行一個(gè)動(dòng)作時(shí)的最好選擇,這個(gè)指令不受任何交互條件的限制,SecRule指定了一些動(dòng)作,而這些動(dòng)作的發(fā)生是基于請(qǐng)求/響應(yīng)對(duì)數(shù)據(jù)的檢查,當(dāng)你想執(zhí)行initcol動(dòng)作時(shí),這個(gè)指令通常被用來(lái)初始化持久化集合類。例如:
SecAction nolog,phase:1,initcol:RESOURCE=%{REQUEST_FILENAME}
?
SecArgumentSeparator character
SecArgumentSeparator ;
指定的字符作為application/x-www-form-urlencoded內(nèi)容的分隔符,默認(rèn)是&,非常少的情況下應(yīng)用會(huì)使用分號(hào)(;)。這個(gè)指令用于后臺(tái)WEB應(yīng)用在使用非標(biāo)準(zhǔn)的參數(shù)分隔符,如果沒(méi)有在每一個(gè)WEB應(yīng)用中合理設(shè)置這個(gè)指令,那么ModSecurity可能無(wú)法適當(dāng)?shù)姆治鏊械膮?shù),并且規(guī)則匹配的效果可能會(huì)顯著的降低。
SecAuditEngine On|Off|RelevantOnly
配置審計(jì)日志引擎的開(kāi)啟與否,On-默認(rèn)情況下記錄所有事務(wù)的日志,Off-默認(rèn)情況下不記錄所有事務(wù)的日志,RelevantOnly-默認(rèn)只記錄事務(wù)中由warning或error觸發(fā)的日志,或者記錄一些特意考慮過(guò)的狀態(tài)碼
在當(dāng)前事務(wù)可以通過(guò)ctl操作進(jìn)行設(shè)置或修改
以下例子說(shuō)明不同的審計(jì)指令一起使用:
SecAuditEngine RelevantOnly
SecAuditLog logs/audit/audit.log
SecAuditLogParts ABCFHZ
SecAuditLogType concurrent
SecAuditLogStorageDir logs/audit
SecAuditLogRelevantStatus ^(?:5|4\d[^4])
?
SecAuditLog /path/to/auditlog
SecAuditLog /usr/local/apache/logs/audit.log
定義審計(jì)日志文件路徑,伴隨服務(wù)器運(yùn)行開(kāi)始,這個(gè)文件會(huì)以root打開(kāi),你不能為非root權(quán)限的用戶對(duì)這個(gè)文件或存儲(chǔ)這個(gè)文件的目錄有可寫(xiě)權(quán)限。如果串行審計(jì)日志格式使用后,這個(gè)文件將被用作審計(jì)日志條目的存儲(chǔ)。如果同時(shí)審計(jì)日志格式使用這個(gè)文件那就被當(dāng)做索引,并包含所有的審計(jì)日志文件創(chuàng)建信息。如果你計(jì)劃使用同時(shí)審計(jì)日志并發(fā)送審計(jì)日志數(shù)據(jù)到遠(yuǎn)程主機(jī)或商業(yè)ModSecurity管理平臺(tái),那么你需要配置和使用ModSecurity日志搜集器(mlogc)并使用下述格式去得到審計(jì)日志:
SecAuditLog “|/path/to/mlogc/path/to/mlogc.conf”
?
SecAuditLog2 /path/to/auditlog2
SecAuditLog2 /usr/local/apache/logs/audit2.log
定義同時(shí)日志啟用下的第二審計(jì)日志索引文件路徑,在本指令使用之前必須通過(guò)SecAuditLog定義主審計(jì)日志,另外這個(gè)文件僅用于當(dāng)同時(shí)審計(jì)日志使用時(shí)復(fù)制主審計(jì)索引文件,不能用于非同時(shí)審計(jì)日志的情況。
?
SecAuditLogParts PARTS
SecAuditLogParts ABCFHZ(默認(rèn))
定義每個(gè)事務(wù)中記錄到審計(jì)日志中的部分。每部分以一個(gè)獨(dú)立的字母表示,當(dāng)每個(gè)字母出現(xiàn)在列表中,也就是指每個(gè)事務(wù)中的相同部分會(huì)被記錄,全部列表見(jiàn)下文:
A-????? 審計(jì)日志標(biāo)題(強(qiáng)制的)
B-????? 請(qǐng)求標(biāo)題
C-????? 請(qǐng)求體(目前只針對(duì)請(qǐng)求體存在,并且ModSecurity已經(jīng)配置成攔截)
D-????? 為中間人響應(yīng)頭保留,暫未實(shí)現(xiàn)
E-?????? 中間人相應(yīng)題(目前僅對(duì)配置了攔截響應(yīng)體和配置審計(jì)日志引擎記錄有效)。中間人相應(yīng)體和實(shí)際的相應(yīng)體相同,除非ModSecurity攔截了中間人響應(yīng)體,這種情況下,實(shí)際相應(yīng)體會(huì)包含出錯(cuò)信息(可能是apache的默認(rèn)錯(cuò)誤信息,也可能是出錯(cuò)文檔頁(yè)面)。
F-?????? 最終響應(yīng)頭(除了日期和服務(wù)器標(biāo)題以外的被apache添加的盡其內(nèi)容傳遞信息)。
G-????? 為實(shí)際響應(yīng)體保留,暫未實(shí)現(xiàn)
H-????? 審計(jì)日志索引
I-??????? C部分的替換,使用multipart/form-data編碼時(shí),在所有的異常情形下記錄與C相同的數(shù)據(jù),在這種情況下,會(huì)記錄假的application/x-www-form-urlencoded內(nèi)容,這包含參數(shù)的相關(guān)信息,但不是這個(gè)文件的。如果你不想用文件(通常很大)來(lái)存儲(chǔ)你的審計(jì)日志,這是很方便的。
J-??????? 保留。實(shí)現(xiàn)后,這部分會(huì)包含文件使用multipart/form-data編碼上傳的信息。、
K-?????? 這部分包含一個(gè)完整的列表,按順序匹配(每行一個(gè)),這些規(guī)則是完全合格的,從而表明繼承默認(rèn)的動(dòng)作和操作,從2.5.0開(kāi)始支持。
Z-最終分界,意味著是條目的最后(強(qiáng)制的)
?
SecAuditLogRelevantStatus REGEX
SecAuditLogRelevantStatus ^(?:5|4\d[^4])
配置哪些響應(yīng)狀態(tài)碼與審計(jì)日志的目的密切相關(guān),必須將SecAuditEngine設(shè)置為RelevantOnly,其參數(shù)是個(gè)正則表達(dá)式。
這個(gè)指令最主要的目的是允許你配置審計(jì)產(chǎn)生特殊HTTP響應(yīng)狀態(tài)碼的唯一事務(wù),這個(gè)指令通常用于減少審計(jì)日志文件的總體大小。記住一點(diǎn),如果使用了這個(gè)參數(shù),那么返回狀態(tài)碼是200的成功攻擊事件不會(huì)記錄。
?
SecAuditStorageDir /path/to/storage/dir
SecAuditStorageDir /usr/local/apache/logs/audit
配置同時(shí)審計(jì)日志條目存儲(chǔ)時(shí)的路徑,必須同時(shí)設(shè)置SecAuditLogType,啟動(dòng)apache潛,需要先創(chuàng)建目錄,而且必須讓服務(wù)器用戶運(yùn)行時(shí)可以新建文件。
盡管有了記錄日志的機(jī)制,還需要確保指定的本地文件系統(tǒng)上有足夠的磁盤(pán)空間,并且不是在根分區(qū)上。
?
SecAuditLogType Serial|Concurrent
配置使用審計(jì)日志記錄機(jī)制的類型,如果使用Concurrent類型必須指定SecAuditLogStorageDir
Serial-所有的審計(jì)日志條目都被存儲(chǔ)在主審計(jì)日志記錄文件中,隨意使用是很方便,但是他很慢,因?yàn)槿魏螘r(shí)候只有一個(gè)文件被打開(kāi)也只能寫(xiě)入一條審計(jì)日志條目。
Concurrent-審計(jì)日志條目被存儲(chǔ)于不同的文件中,每個(gè)事務(wù)一個(gè),如果你要把審計(jì)日志數(shù)據(jù)發(fā)送到遠(yuǎn)程ModSecurity控制主機(jī)上就是用Concurrent日志模式。
?
SecCacheTransformations(Deprecated/Experimental)
SecCacheTransformations On|Off [options]
SecCacheTransformations On “minlen:64,maxlen:0”
控制transformations的緩存,2.5.6開(kāi)始,緩存是默認(rèn)關(guān)閉的,當(dāng)時(shí)都不贊成開(kāi)啟并降低為實(shí)驗(yàn)性。
On-緩存變化(每階段,每次變化)允許相同的變化只執(zhí)行一次(默認(rèn)的)
Off-不緩存任務(wù)變化,強(qiáng)制所有的變化都被每一條規(guī)則實(shí)行生效
有以下可選項(xiàng)(逗號(hào)分隔):
Incremental:on|off-啟用這個(gè)選項(xiàng)后,緩存每一個(gè)變化,而不只是最后一個(gè)變化(默認(rèn):off)
Maxitems:N-緩存N個(gè)以內(nèi)的變化,超過(guò)時(shí)不再緩存,為0時(shí)表示unlimited,對(duì)于限制緩存一個(gè)使用大數(shù)字的ARGS表單這個(gè)選項(xiàng)是有用的(默認(rèn)512)
Minlen:N-緩存變化的值的最小長(zhǎng)度(默認(rèn)32)
Maxlen:N-緩存變化的值的最大長(zhǎng)度,為0時(shí)表示unlimited(默認(rèn):1024)
?
SeChrootDir /path/to/chroot/dirm
配置web服務(wù)器工作的安全目錄
這個(gè)功能在Windows系統(tǒng)版本上不可用,ModSecurity提供的內(nèi)部chroot功能在簡(jiǎn)單配置上工作的很好,舉個(gè)最簡(jiǎn)單例子,apache只提供靜態(tài)頁(yè)面服務(wù)或使用模塊提供腳本運(yùn)行功能。在一些復(fù)雜設(shè)置時(shí)你會(huì)遇到一些問(wèn)題:
1、? DNS查詢無(wú)法工作(這是因?yàn)檫@一功能在chroot操作后,一經(jīng)查詢就要求加載一個(gè)共享庫(kù))
2、? 你不能使用PHP發(fā)送郵件,因?yàn)镻HP使用sendmail但sendmail在安全目錄之外
3、? 某些情況下apache會(huì)莫名其妙的不干活了(重載)
你需要小心,這個(gè)內(nèi)部chroot功能可能不是100%可用。由于大量默認(rèn)的或是第三方為apache web服務(wù)器提供的模塊,他們不可能去校驗(yàn)在內(nèi)部chroot下是否可用,在沒(méi)有被限制在安全目錄中時(shí),一個(gè)apache的模塊,工作的很正常。特別是如果你正使用的模塊在模塊初始化階段進(jìn)行fork的(如mod_fastcgi,mod_fcgid,mod_cgid),建議你測(cè)試每個(gè)apache進(jìn)行和觀察其工作目錄,進(jìn)程根目錄,以及所打開(kāi)的文件列表。考慮一下你的選擇,在作出決定。
?
SecComponentSignature “COMPONENT_NAME/X.Y.Z(COMMENT)”
SecComponentSignature “Core Rules/1.2.3”
擴(kuò)展組件簽名為modsecurity簽名,這個(gè)指令可以讓ModSecurity增加很多有意義的已知組件,完整的簽名被記錄在事務(wù)審計(jì)記錄中,應(yīng)該讓ModSecurity模塊和規(guī)則集作家使用,使調(diào)試更加容易。
?
SecContentInjection (on|off)
啟用內(nèi)容注入使用行為附加并加在前面
SecCookieFormat 0|1
選擇當(dāng)前配置文本中使用的cookie格式
0-?????? 使用version 0(Netscape)cookies,這是大部分應(yīng)用使用的,也是默認(rèn)值
1-?????? 使用version 1 cookies
?
SecDataDir /path/to/dir
SecDataDir /usr/local/apache/logs/data
指定連續(xù)數(shù)據(jù)(如ip地址數(shù)據(jù),session數(shù)據(jù)等)存儲(chǔ)的路徑,initcol、setsid和setuid需要用到這個(gè)指令,必須讓服務(wù)器用戶對(duì)這個(gè)目錄可寫(xiě)
?
SecdDebugLog /path/to/modsec-debug.log
SecDebugLog /usr/local/apache/logs/modsec-debug.log
指定modsecurity調(diào)試日志文件的路徑
Secdebugloglevel 0|1|2|3|4|5|6|7|8|9
配置冗長(zhǎng)的調(diào)試日志數(shù)據(jù),1~3級(jí)別一直用于產(chǎn)生apache的錯(cuò)誤日志,因?yàn)槟憧梢栽诋a(chǎn)品中一直使用0級(jí)別作為默認(rèn)的日志級(jí)別,級(jí)別5用于調(diào)試,不建議在產(chǎn)品中使用這么高級(jí)別的日志,過(guò)度的日志記錄會(huì)顯著服務(wù)器的性能。
可用的值如下:
0-不記錄,1-僅僅錯(cuò)誤日志(攔截請(qǐng)求),2-警告,3-注意,4-事務(wù)控制的細(xì)節(jié),5-同上,但包含每一個(gè)信息控制的信息,9-記錄所有,包括每一個(gè)調(diào)試細(xì)節(jié)信息
?
SecDefaultAction action1,action2,action3
定義匹配規(guī)則后的默認(rèn)動(dòng)作,例:
SecDefaultAction log,auditlog,deny,status:403,phase:2
備注:SecDefaultAction指令后的規(guī)則都繼承這一設(shè)置,除非為某條規(guī)則制定了一個(gè)特定的動(dòng)作,或者制定了新的 SecDefaultAction。特別注意到,未經(jīng)處理的disruptive動(dòng)作時(shí)不允許的,但是在SecDefaultAction中一不小心就會(huì)繼承了使用disruptive動(dòng)作。
默認(rèn)值是minimal
SecDefaultAction phase:2,log,auditlog,pass
注意:SecDefaultAction必須指定一個(gè)disruptive動(dòng)作和處理階段,而且不能包含元數(shù)據(jù)動(dòng)作。
警告:SecDefaultAction不集成交叉配置的內(nèi)容。
?
SecGeoLookupDb /path/to/db
定義地理數(shù)據(jù)文件路徑,例:
SecGeoLookupDb /usr/local/geo/data/GeoLiteCity.dat? 從maxmind.com提取的免費(fèi)數(shù)據(jù)文件
?
SecGuardianLog |/path/to/httpd-guardian
配置使用httpd-guardian腳本來(lái)監(jiān)視拒絕服務(wù)攻擊(DoS)的指令,例:
SecGuardianLog |/usr/local/apache/bin/httpd-guardian? 使用默認(rèn)的httpd-guardian可以防止客戶端在1分鐘內(nèi)請(qǐng)求120次或5分鐘內(nèi)請(qǐng)求360次。
SecGuardianLog,設(shè)計(jì)此指令用于把所有允許數(shù)據(jù)通過(guò)管理日志功能發(fā)送到另一個(gè)程序。自從apache部署成典型的多進(jìn)程方式,信息共享變得困難了,這一想法就是部署一個(gè)獨(dú)立的外部進(jìn)行使用狀態(tài)機(jī)的方式去觀察所有的請(qǐng)求,提供額外的保護(hù)。
隨著ModSecurity發(fā)布,開(kāi)發(fā)一個(gè)先進(jìn)的外部保護(hù)工具將是一個(gè)重點(diǎn)。然而一個(gè)完整功能的工具已經(jīng)可以做為apache httpd工具項(xiàng)目的一部分,工具名為httpd-guardian,它能用于防御DoS,使用黑名單列表(同一個(gè)項(xiàng)目中)和基于iptables(linux)或者基于pf(*BSD)的防火墻協(xié)同工作,動(dòng)態(tài)的過(guò)濾黑名單中的惡意ip地址。也可以和SnortSam協(xié)同工作。如果已經(jīng)配置過(guò)httpd-guardian,你只需要在apache配置中添加一行就可以部署他:
SecGuardianLog |/path/to/httpd-guardian
?
Secmarker ID
Secmarker 9999
在規(guī)則集中增加一個(gè)固定規(guī)則marker,可用于skipAfter動(dòng)作。Secmarker指令本質(zhì)上是創(chuàng)建了一條規(guī)則,這條規(guī)則什么也不做,其目的只是占用一個(gè)ID號(hào)
SecRule REQUEST_URI “^/$” \
“chain,t:none,t:urlDecode,t:lowercase,t:normalisePath,skipAfter:99”
SecRule REMOTE_ADDR “^127\.0\.0\.1$” “chain”
SecRule REQUEST_HEADERS:User-Agent \
? “^Apache \(internal dummy connection\)$” “t:none”
SecRule &REQUEST_HEADERS:Host “@eq 0” \
? “deny,log,status:400,id:08,severity:4,msg:’Missing a Host Header’”
SecRule &REQUEST_HEADERS:Accept “@eq 0” \
? “l(fā)og,deny,log,status:400,id:15,msg:’Request Missing an Accept Header’”
SecMarker 99
?
SecPcreMatchLimit
?
SecPdfProtect On|Off
啟用PDF XSS保護(hù)功能,一量啟用訪問(wèn)PDF文件的跟蹤,直接訪問(wèn)嘗試被轉(zhuǎn)到包含一次性令牌的鏈接,只有提供有效令牌的請(qǐng)被無(wú)條件允許,無(wú)效令牌的請(qǐng)求也被允許,但被強(qiáng)制下載PDF文件。本實(shí)現(xiàn)用響應(yīng)頭去檢測(cè)PDF文件,因此可以對(duì)一些URI請(qǐng)求中不含有.pdf擴(kuò)展名卻能動(dòng)態(tài)生成PDF文件。
?
SecPdfProtectMethod method
SecPdfProtectMethod TokenRedirection(默認(rèn))
配置理想的保護(hù)方法用于請(qǐng)求的PDF文件進(jìn)行保護(hù)。可有的選項(xiàng)有TokenRedirection和ForcedDownload。令牌重定向方式會(huì)嘗試轉(zhuǎn)到可有的令牌上,這允許PDF文件仍舊能使用內(nèi)聯(lián)方式打開(kāi),但僅用于GET請(qǐng)求方式。強(qiáng)制下載總是導(dǎo)致PDF文件使用二進(jìn)制或附件方式傳遞,后者常用于非GET請(qǐng)求,強(qiáng)制下載方式被認(rèn)為更安全,但對(duì)用戶來(lái)說(shuō)可能會(huì)導(dǎo)致可用性問(wèn)題(“這個(gè)PDF無(wú)法再打開(kāi)了”)。
?
SecPdfProtectSecret secret
secPdfProtectSecret MyRandomSecretString
定義用戶產(chǎn)生一次性令牌的密鑰,你應(yīng)該設(shè)置一個(gè)足夠長(zhǎng)的串作為密鑰(16字符較好),一旦定下密鑰,最好不要修改,可能會(huì)破壞修改前發(fā)出的令牌。但即使你修改了也不是大問(wèn)題,導(dǎo)致過(guò)去的幾秒鐘變成使用令牌強(qiáng)制下載PDF文件。
?
SecPdfProtectTimeout timeout
SecPdfProtectTimeout 10(默認(rèn))
定義令牌超時(shí),令牌過(guò)期后,不能再用于允許訪問(wèn)PDF文件,請(qǐng)求仍舊被允許,但PDF文件會(huì)以附件方式傳送。
?
SecPdfProtectTokenName name
SecPdfProtectTokenName PDFTOKEN(默認(rèn))
定義令牌名,你想改變令牌的名字的唯一原因應(yīng)是你想隱藏你正使用ModSecurity這一事實(shí),這是一個(gè)好的理由,但這并不是提供幫助,因?yàn)閿橙四苷业奖Wo(hù)PDF的算法并能計(jì)算出來(lái),這樹(shù)立了新的標(biāo)志,所以如果你想就去試吧。
?
SecRequestBodyAccess On|Off
ModSecurity是否默認(rèn)緩存并處理請(qǐng)求體,On-訪問(wèn)請(qǐng)求體,Off-不訪問(wèn)請(qǐng)求體。
注意:當(dāng)你想檢查POST_PAYLOAD時(shí)使用這個(gè)命令,這個(gè)指令必須和“phase:2”和REQUEST_BODY一起使用,這三部分任一一個(gè)沒(méi)有配置,你就無(wú)法檢查請(qǐng)求體。
?
SecRequestBodyLimit NUMBER_IN_BYTES
SecRequestBodyLimit 134217728
配置ModSecurity允許的最大請(qǐng)求體的緩存區(qū)大小,默認(rèn)值是131072KB(134217728bytes)。任何超過(guò)此限制的都會(huì)被拒絕,提示413,請(qǐng)求體太大。還有一個(gè)應(yīng)限制,1GB。
?
SecRequestBodyNoFilesLimit NUMBER_IN_BYTES
配置ModSecurity允許的最大請(qǐng)求體的緩存區(qū)大小,除了請(qǐng)求中正在傳送的文件大小。這項(xiàng)指令便于在受到某些使用大尺寸請(qǐng)求進(jìn)行DoS攻擊時(shí)減少影響。提供上傳文件服務(wù)的WEB應(yīng)用必須配置SecRequestBodyLimit為一個(gè)很大的值。由于大文件直接進(jìn)行磁盤(pán)文件存取,不會(huì)加大內(nèi)存的消耗。但是,仍然有可能有人利用超大請(qǐng)求體限制和發(fā)送大量大小的非上傳請(qǐng)求。該指令消除這一漏洞。
SecRequestBodyLImit 131072
備注:默認(rèn)為1MB(1048576 bytes)。這個(gè)值比較古老了,大部分應(yīng)用應(yīng)該到128KB或者更低,任何超過(guò)此限制的都會(huì)被拒絕,提示413,請(qǐng)求體太大。還有一個(gè)應(yīng)限制,1GB
?
SecRequestBodyInMemoryLimit NUMBER_IN_BYTES
SecRequestBodyInMemoryLimit 131072
配置ModSecurity使用內(nèi)存保存的最大請(qǐng)求體大小,默認(rèn)的限制是128KB,在內(nèi)存中最多存儲(chǔ)128KB。
?
SecResponseBodyLimit NUMBER_IN_BYTES
SecResponseBodyLimit 524228
配置允許緩存的最大相應(yīng)體大小,任何超過(guò)此限制的響應(yīng)都會(huì)被拒絕,并出現(xiàn)狀態(tài)碼:500:內(nèi)部服務(wù)器錯(cuò)誤。這一設(shè)置不影響使用MIME類型的響應(yīng),緩存不為此做標(biāo)記(因?yàn)檫@個(gè)類型標(biāo)記為非緩存),有一個(gè)硬編碼為1GB。
默認(rèn)配置成512KB
?
SecResponseBodyLimitAction Reject|ProcessPartial
Reject 響應(yīng)體將被丟棄,傳輸中斷,返回狀態(tài)碼:500(內(nèi)部服務(wù)器錯(cuò)誤)
ProcessPartial 只檢測(cè)緩存中的響應(yīng),剩下的允許通過(guò)
配置SecResponseBodyLimit控制碰到響應(yīng)體限制的情況,默認(rèn)時(shí)ModSecurity拒絕超過(guò)指定長(zhǎng)度的響應(yīng)體,然而一些WEB站點(diǎn),因?yàn)橛休^大的響應(yīng)體,所以要指定一個(gè)合理的限制很困難。這類網(wǎng)站不得不提升限制,來(lái)達(dá)到控制首位限制的目的(控制內(nèi)存消耗)。當(dāng)達(dá)到一個(gè)限制,網(wǎng)站管理員有能力選擇只檢查響應(yīng)的第一部分,這部分在限制的范圍內(nèi),剩下的允許通過(guò)。有些爭(zhēng)辯說(shuō),響應(yīng)的一部分未經(jīng)檢查,就允許通過(guò),是個(gè)漏洞,理論上這是對(duì)的,但僅適用于攻擊者控制輸出的情況(如可以使輸出任意長(zhǎng))。在這種情況下,防止漏洞是不可能的。攻擊者在數(shù)據(jù)發(fā)送回來(lái)之前可以壓縮,打亂或者加密數(shù)據(jù),使數(shù)據(jù)可以穿越任意監(jiān)控設(shè)備。
?
SecResponseBodyMImeType mime/type
SecResponseBodyMImeType text/plain text/html
為響應(yīng)數(shù)據(jù)緩存配置推薦的MIME類型。可以使用多個(gè)SecResponseBodyMimeType指令來(lái)增加MIME類型。默認(rèn)值是text/plain text/html
?
SecResponseBodyMimeTypesClear
清除推薦的響應(yīng)體緩存MIME類型,允許你重新開(kāi)始配置。
?
SecResponseBodyAccess On|Off
配置響應(yīng)體是否被緩存并被分析。如果你計(jì)劃?rùn)z查HTML的響應(yīng),需要使用這個(gè)指令。;這個(gè)指令必須和”P(pán)hase:4”處理階段動(dòng)作和REQUEST_BODY變量/位置一起使用,這三部分任意一個(gè)沒(méi)有配置,你就無(wú)法檢查請(qǐng)求體。可選值如下:
On-訪問(wèn)響應(yīng)體(僅支持使用MIME類型)
Off-不嘗試訪問(wèn)響應(yīng)體
?
SecRule VARIABLES OPERATOR [ACTIONS]
SecRule是ModSecurity主要的指令,用于分析數(shù)據(jù),并根據(jù)結(jié)果執(zhí)行動(dòng)作。
例子:SecRule REQUEST_URI ”attack” \
”phase:1,t:none,t:urlDecode,t:lowercase,t:normalisePath”
?
OPERATOR描述如何進(jìn)行檢查
ACTIONS描述當(dāng)一個(gè)操作符成功匹配一個(gè)變量時(shí)將執(zhí)行怎樣一個(gè)動(dòng)作。
VARIABLES描述哪些變量被檢查,舉個(gè)例子,下述規(guī)則則是當(dāng)?shù)刂窓诶镉小癲irty”這個(gè)單詞時(shí)會(huì)拒絕交互。
SecRule ARGS dirty
?
每條規(guī)則可以指定一個(gè)或多個(gè)變量:
SecRule ARGS|REQUEST_HEADERS:User-Agent dirty
還有第三種格式的選擇符 –Xpath表達(dá)式的支持。Xpath表達(dá)式只能用來(lái)對(duì)付特殊的XML變量,只有請(qǐng)求體使用XML格式時(shí)可用:
SecRule XML:/xPath/Expression dirty
注意:不是所有的集合都支持所有的操作符格式,你需要查閱各個(gè)集合的文檔檢查是否支持。
?
集合Collections
一個(gè)變量可以包含一個(gè)或多個(gè)數(shù)據(jù)塊,這取決于該變量的性質(zhì)和它的使用方式。當(dāng)一個(gè)變量包含一個(gè)以上的值,我們稱它為一個(gè)集合。
集合在規(guī)則運(yùn)行前都是可以擴(kuò)展的。如:
SecRule ARGS dirty
可以進(jìn)行如下擴(kuò)展:
SecRule ARGS:p dirty
SecRule ARGS:q dirty
在一個(gè)請(qǐng)求中只有兩個(gè)參數(shù),分別為p和q。
集合有幾種特性:
只讀:
在運(yùn)行時(shí)用交互數(shù)據(jù)創(chuàng)建,如ARGS(包含所有請(qǐng)求參數(shù)值列表)和REQUEST_HEADERS(包含所有請(qǐng)求頭值的列表)。
瞬態(tài)讀/寫(xiě):
每個(gè)交互都創(chuàng)建一個(gè)空的TX集合,規(guī)則可以從中讀取并且可以寫(xiě)入(如使用setvar動(dòng)作),但在此集合中存儲(chǔ)的信息并不持續(xù)至交互結(jié)束。
連續(xù)的讀/寫(xiě):
有幾個(gè)集合能被寫(xiě)入并且持久存儲(chǔ)。這些集合可在交互中跟蹤客戶,例如IP、SESSION和USER等類型的集合。
規(guī)則里的操作符:
最簡(jiǎn)單的請(qǐng)況是用一個(gè)正則表達(dá)式作為規(guī)則的第二個(gè)參數(shù),我們已經(jīng)在上面舉過(guò)這樣的例子,如果你這樣做,ModSecurity就假定你要使用rx(正則表達(dá)式)操作符,你也可以很明確的通過(guò)使用@來(lái)指定你想要的操作符,緊跟@之后的是操作符的名字,在規(guī)則第二個(gè)參數(shù)的開(kāi)頭。例如:
SecRule ARGS “@rx dirty”
注意我們?yōu)槭裁幢仨毷褂秒p引號(hào)把第二個(gè)規(guī)則參數(shù)括起來(lái)呢,這是因?yàn)榈诙€(gè)參數(shù)里面包含空格。一些帶空格字符和數(shù)字會(huì)跟在操作符名字后面,如果出現(xiàn)非空格的字符,他們將被視為一個(gè)特殊的參數(shù)作為操作符。這種情況下制定的參數(shù)中的正則表達(dá)式被作為模式進(jìn)行匹配。
如果你使用取非操作符取反操作符返回的結(jié)果,可以讓@處于第二個(gè)字符。
SecRule &ARGS “!@rx ^0$”
?
取非操作符:
操作符的結(jié)果可以通過(guò)在第二個(gè)字符前使用感嘆號(hào)來(lái)取反,下述規(guī)則匹配在User-Agent請(qǐng)求頭中找不到dirty單詞:
SecRule REQUEST_HEADERS:User-Agent !dirty
你能用感嘆號(hào)與任一個(gè)參數(shù)聯(lián)合使用,這樣做,感嘆號(hào)優(yōu)先,后面跟上明確的操作符說(shuō)明,下述規(guī)則與前面的例子有相同的效果。
SecRule REQUEST_HEADERS:User-Agent “!@rx dirty”
如果你在多個(gè)變量中使用取非操作符,者可呢過(guò)無(wú)法立即清楚將會(huì)發(fā)生什么情況,考慮下述例子:
SecRule ARGS:P|ARGS:Q !dirty
這個(gè)規(guī)則與下面意思相同
SecRule ARGS:p !dirty
SecRule ARGS:q !dirty
警告:取非針對(duì)單個(gè)操作符,而不是針對(duì)整個(gè)變量列表。
規(guī)則中的動(dòng)作:第三個(gè)參數(shù),ACTIONS可以忽略,因?yàn)橛袀€(gè)輔助功能,即他可以在默認(rèn)的動(dòng)作清單中指定。如果這個(gè)參數(shù)沒(méi)有被忽略,當(dāng)規(guī)則匹配時(shí),這個(gè)參數(shù)指定的動(dòng)作會(huì)聯(lián)合默認(rèn)的動(dòng)作列表創(chuàng)建一個(gè)實(shí)際的動(dòng)作列表被執(zhí)行。
?
SecRuleInheritance On|Off
配置當(dāng)前環(huán)境是否繼承父節(jié)點(diǎn)環(huán)境(大部分情況下都配置成可繼承,你應(yīng)當(dāng)查一下文檔的每一個(gè)指令,已明確他繼承與否),On從父環(huán)境下繼承規(guī)則,Off-不從父環(huán)境下繼承規(guī)則。
指定資源的環(huán)境(如:Location,Directory,等)不能覆蓋主服務(wù)器或虛擬服務(wù)器上配置的phase1規(guī)則。這是因?yàn)閜hase1在請(qǐng)求處理進(jìn)程之前運(yùn)行,早于apache分發(fā)請(qǐng)求的資源,虛擬服務(wù)環(huán)境可以覆蓋主服務(wù)器配置的phase1規(guī)則。
例如:下面的例子顯示了在主apache配置范圍的哪個(gè)地方啟用ModSecurity,不過(guò),你可以為你的虛擬主機(jī)做不同的配置。第一個(gè)例子中,頭一個(gè)虛擬主機(jī)沒(méi)有繼承ModSecurity的主配置指令,而第二個(gè)做到了。
SecRuleEngine On
SecDefaultAction log,pass,phase:2
…
<VirtualHost *:80>
SerberName app1.com
ServerAlias www.app1.com
SecRuleInheritance Off
SecDefaultAction log,deny,phase:1,redirect:http://www.site2.com
…
</VirtualHost>
<VirtualHost *:80>
ServerName app2.com
ServerAlias www.app2.com
SecRuleInheritance On SecRule ARGS “attack”
…
</VirtualHost>
注意:Configuration Sections是apache的一個(gè)概念,指令<Directory>,<Files>,<Location>和<VirtualHost>都是用于創(chuàng)建Configuration Sections的,更多的信息請(qǐng)看apache的文檔部分中的Configuration Sections
?
SecRuleEngine On|Off|DetectionOnly
配置規(guī)則引擎,On-處理規(guī)則,Off-不處理規(guī)則,DetectionOnly-處理規(guī)則但不中斷交互,即使規(guī)則這樣配置了也不去執(zhí)行。這個(gè)指令針對(duì)每一條規(guī)則處理也可以通過(guò)ctl動(dòng)作進(jìn)行控制(ctl:ruleEngine=off)
?
SecRuleRemoveById RULEID ACTIONLIST
SecRuleRemoveById 1 2 “9000-9010”
SecRuleRemoveById 1 2 5 10-20 “400-556” 673
使用ID方式從上級(jí)環(huán)境中刪除規(guī)則,這個(gè)指令支持多個(gè)參數(shù),每個(gè)參數(shù)可以使一個(gè)規(guī)則ID,也可以是范圍。帶有空格的參數(shù)必須使用雙引號(hào)括起來(lái)。
?
SecRuleRemoveByMsg REGEX
SecRuleRemoveByMsg “FAIL”
使用規(guī)則方式從上級(jí)環(huán)境中刪除規(guī)則,這個(gè)指令支持多個(gè)參數(shù),每個(gè)指令是一個(gè)應(yīng)用于消息的正則表達(dá)式(指定使用的消息動(dòng)作)
?
SecRuleScript(試驗(yàn)性的)
SecRuleScript /path/to/script.lua [ACTIONS]
SecRuleScript ”/path/to/file.lua” “block”
這個(gè)指令創(chuàng)建一個(gè)特殊的規(guī)則,執(zhí)行l(wèi)ua腳本來(lái)決定是否匹配,和SecRule主要的不同是這個(gè)沒(méi)有目的也沒(méi)有操作符,這個(gè)腳本可以從ModSecurity環(huán)境中取到所有的變量,并使用(Lua)操作符來(lái)進(jìn)行測(cè)試,第二個(gè)參數(shù)可選,與SecRule相同,是一個(gè)動(dòng)作列表。
注意:所有的 Lua腳本在配置時(shí)進(jìn)行編譯并存入內(nèi)存,要重載腳本,你必須通過(guò)apache重啟來(lái)重載整個(gè)ModSecurity配置。
示例腳本:
---------------Your script must define the main entry
---------------pointl,as below.
Function main()
?? ----------Log something at level 1.Normally you shouldn’t be
?? ----------logging anything,especially not at level 1,but this is
?? ----------jusy 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”,{“l(fā)owercase”,”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
第一個(gè)例子,我僅每次提取一個(gè)變量,這種情況下,你需要事先知道變量,然而很多時(shí)候,你想檢查一些事先不知道的變量名字,就像下面這個(gè)例子。
Example showing use of m.getvars() to retrieve many variables at noce:
Function main()
???????? Retrieve script parameters.
Local d = m.getvars(“ARGS”,{“l(fā)owercase”,htmlEntityDecode”});
???????? Loop through the parameters.
For I = 1,#d do
???????? Examine parameter value.
If(string.find(d[i].value,”<script”))then
???????? Always specify the name of the variable where the
???????? Problem is located in the error message.
Return(“Suspected XSS in variable”? d[i].name..”.”);
End
End
???????? Nothing wrong found.
Return nil;
End
注意:Lua支持被標(biāo)示試驗(yàn)方式的編程接口可以繼續(xù)發(fā)展,同時(shí)我們努力讓其最佳方式運(yùn)行
?
SecRuleUpdateActionById RULEID ACTIONLIST
SecRuleUpdateActionById 12345 deny,status:403
按ID方式更新指定規(guī)則的動(dòng)作列表,本指令合并指定的動(dòng)作列表和規(guī)則的動(dòng)作列表,存在兩個(gè)限制,一是規(guī)則ID不能被改變,也不能換階段。另外還需要注意的是動(dòng)作可以duo8ci被附加到原來(lái)的。
SecAction\
“t:lowercase,phase:2,id:12345,pass,msg:’The Message’,log,auditlog”
SecRuleUpdateActionById 12345
“t:compressWhitespace,deny,status:403,msg:’A new message’”
The example above will cause the rule to be executed as if it was speciafied as follows:
SecAction\
“t:lowercase,phase:2,id:12345,log,auditlog,t:compressWhitespace,deny,status:403,msg:’A new message’”
?
SecServerSignature “WEB SERVER SOFTWARE”
SecServerSignature “Netscape-Enterprise/6.0”
通知ModSecurity改變響應(yīng)頭令牌數(shù)據(jù)中當(dāng)前使用的“Server:”,按指令的先后順序執(zhí)行,你必須完整的配置apache ServerTokens指令。通過(guò)該指令,ModSecurity會(huì)改寫(xiě)服務(wù)器簽名數(shù)據(jù)并存入內(nèi)存空間的數(shù)據(jù)集中。如果ServerTokens沒(méi)有完整設(shè)置,那么內(nèi)存空間就沒(méi)有希望的足夠大來(lái)存入我們看到的新數(shù)據(jù)。
?
SecTmpDir /path/to/dir
SecTmpDir /tmp
配置臨時(shí)文件創(chuàng)建的路徑,需要提供apache用戶進(jìn)程的可寫(xiě)權(quán)限,這個(gè)目錄的位置也是當(dāng)apache檢查數(shù)據(jù)用完內(nèi)存時(shí)(比SecRequestBodyInMemoryLimit指令指定的還多的數(shù)據(jù))會(huì)將數(shù)據(jù)交換到磁盤(pán)上的位置。
?
SecUploadDir /path/to/dir
SecUploadDir /tmp
配置攔截文件存儲(chǔ)的目錄,這個(gè)目錄必須和SecTmpDir定義的臨時(shí)目錄在同一個(gè)文件系統(tǒng)上,(This directory must be on the same filesystem as the temporary directory defiled with SecTmpDir.This directive is used with SecUploadKeepFiles.)
?
SecUploadFileMode octal_mode|”default”
SecUploadFileMode 0640
用8進(jìn)制(和chmod一樣)配置所有上傳文件的模式(權(quán)限),這個(gè)功能在不支持8進(jìn)制文件的操作系統(tǒng)上不可用。默認(rèn)模式(0600)僅允許有讀寫(xiě)許可的賬號(hào)修改這個(gè)文件,如果其他賬號(hào)也需要訪問(wèn)(使用clamd是個(gè)好例子),那么這個(gè)指令時(shí)必須的。不管怎樣,要慎用這個(gè)指令,避免將敏感數(shù)據(jù)顯露給未授權(quán)用戶,使用“default”值時(shí),還原默認(rèn)設(shè)置。
?
SecUploadKeepFiles On|Off|RelevantOnly
配置是否保存事務(wù)處理后的攔截文件,該指令要求已經(jīng)定義存儲(chǔ)目錄(使用SecUploadDir),On-保存上載文件,Off-不保存上載文件,RelevantOnly-只保存被確認(rèn)與請(qǐng)求有關(guān)的文件
?
SecWebAppId “NAME”
SecWebAppId “WebApp1”
創(chuàng)建服務(wù)器上的一個(gè)分區(qū)只屬于一個(gè)WEB應(yīng)用,通過(guò)使用分區(qū)來(lái)避免會(huì)話ID和用戶UD之間的沖突,在同一臺(tái)服務(wù)器上部署多個(gè)應(yīng)用時(shí)一定要使用這個(gè)命令,如果不使用,會(huì)話ID之間的沖突可能發(fā)生,默認(rèn)值是default
<VirtualHost *:80>
ServerName app1.com
ServerAlias www.app1.com
SecWebappId “App1”
SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass
SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}
…
</VirtualHost>
<VirtualHost *:80>
ServerName app2.com
ServerAlias www.app2.com
SecWebAppId “App2”
SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass
SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}
…
</VirtualHost>
配置顯示了兩個(gè)例子,SecWebAppId與apache的VirtualHost指令協(xié)同工作,在一臺(tái)服務(wù)器上應(yīng)創(chuàng)建各自獨(dú)特的集合名稱,一般情況下,當(dāng)啟用setsid時(shí),ModSecurity會(huì)使用”SESSION”的值來(lái)創(chuàng)建集合,這可以保存專用值,然而像上述例子一樣使用SecWebAppId,集合的名字會(huì)變成”App1_SESSION”和”App2_SESSION”。
SecWebAppId相關(guān)的兩個(gè)情況:
1、你正把事務(wù)(transactions)和報(bào)警記錄到ModSecurity Console(控制臺(tái))上,并且你想用WEB應(yīng)用ID來(lái)搜索僅屬于那些應(yīng)用的事務(wù)。
2、你正使用數(shù)據(jù)留存設(shè)施(SESSION和USER集合)并且你需要在屬于不同的應(yīng)用之間的會(huì)話和用戶之間避免沖突。
?
?
?
?
處理階段:
ModSecurity 2.x允許把規(guī)則至于下述五個(gè)階段之一:
請(qǐng)求頭(REQUEST_HEADERS)
請(qǐng)求體(REQUEST_BODY)
響應(yīng)頭(RESPONSE_HEADERS)
響應(yīng)體(RESPONSE_BODY)
記錄(LOGGING)
為了在規(guī)則執(zhí)行時(shí)選擇階段,需要使用階段命令,可以通過(guò)規(guī)則中直接使用,也可以通過(guò)SecDefaultAction指令。
SecDefaultAction “l(fā)og,pass,phase:2”
SecRule REQUEST_HEADER:Host “!^$””deny,phase:1”
注意:要注意規(guī)則的執(zhí)行時(shí)依賴于階段,即使是一個(gè)配置文件中的兩條鄰近的規(guī)則,只要是設(shè)置了在不同的階段中執(zhí)行,他們就不會(huì)是一個(gè)接一個(gè)的生效。配置文件中的規(guī)則順序僅僅是在規(guī)則各自的階段中是重要的。在使用Skip和SkipAfter動(dòng)作時(shí)尤為重要。
注意:LOGGING階段比較特別,無(wú)論前面的各個(gè)階段發(fā)生了什么事,都會(huì)每個(gè)事務(wù)的最后被執(zhí)行。這就意味著哪怕是請(qǐng)求被中斷或是放行事務(wù)時(shí)都會(huì)被執(zhí)行。
請(qǐng)求頭階段:
這個(gè)階段的規(guī)則會(huì)在apache完成請(qǐng)求頭的讀取后立即被執(zhí)行(post-read-request階段),這時(shí),還沒(méi)有讀取請(qǐng)求體,意味著不是所有的參數(shù)都可用。如果你必須讓規(guī)則盡早運(yùn)行,應(yīng)把規(guī)則放在這個(gè)階段(在apache使用這個(gè)請(qǐng)求做某些事前),在請(qǐng)求體被讀取前做些事情,從而決定是否緩存這個(gè)請(qǐng)求體,或者決定你將希望這個(gè)請(qǐng)求體如何被處理(如是否以XML格式解析或不解析)。
注意這個(gè)階段的規(guī)則無(wú)法影響apache的范圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子一樣還無(wú)法得到信息。VirtualHost指令有些例外,如果想在apache的locations使用ModSecurity規(guī)則,那么他們應(yīng)該運(yùn)行在階段2,參考apache請(qǐng)求環(huán)/ModSecurity處理階段圖標(biāo)。
請(qǐng)求體階段:
這是通用輸入分析階段,大部分傳統(tǒng)的應(yīng)用規(guī)則不在這兒,這個(gè)階段你肯定能收到參數(shù)(只有讀取過(guò)請(qǐng)求體后),在請(qǐng)求體階段,ModSecurity支持三種編碼類型。
Application/x-www-form-urlencoded – used to transfer from data
Multipart/from-data – used for file transfers
Text/xml – used for passing XML data
大部分WEB應(yīng)用還沒(méi)有使用其他的編碼方法。
響應(yīng)頭階段:
發(fā)生在響應(yīng)頭被發(fā)送到客戶端之前,如果你想觀察響應(yīng)發(fā)生前就在這兒運(yùn)行,如果你想使用響應(yīng)頭來(lái)決定你是否想緩存響應(yīng)體也行。注意一些響應(yīng)狀態(tài)碼(如404)在請(qǐng)求環(huán)的早期就被apache管理著,我也無(wú)法觸發(fā)預(yù)期。加上apache在后面的鉤子上雙增加了一些響應(yīng)頭(如日期、服務(wù)器和連接信息等),這些我們無(wú)法觸發(fā)和審查。在代理配置模式下或使用phase:5(logging)工作的較好。
響應(yīng)體階段:
這是通用輸出分析階段,這里你能運(yùn)行規(guī)則截?cái)囗憫?yīng)體(當(dāng)然提供緩存)。這個(gè)階段你想檢查輸出的HTML信息公布、錯(cuò)誤信息和失敗的驗(yàn)證文字。
日志階段:
在日志發(fā)生前運(yùn)行的一個(gè)階段,放在這個(gè)階段的規(guī)則只能影響日志記錄器如何執(zhí)行,這個(gè)階段可以檢測(cè)apache記錄的錯(cuò)誤信息,在這個(gè)階段你不能拒絕或阻斷連接,因?yàn)樘t了,這個(gè)階段也允許檢測(cè)其他的響應(yīng)頭,如那在phase:3或者phase:4階段中不可用的。注意在這個(gè)階段,你應(yīng)當(dāng)小心不要繼承破壞性的動(dòng)作到規(guī)則中,這樣的情況在ModSecurity2.5.0及其以后的版本中被當(dāng)做配置錯(cuò)誤。
?
?
Variables變量
Modsecurity2.x支持的變量:
ARGS
是一個(gè)集合,可以作為靜態(tài)參數(shù)(以名稱為匹配論點(diǎn))方式或以正則表達(dá)式(以正則表達(dá)式匹配的所有匹配的論點(diǎn)名稱)方式用于它自身(意思為POST負(fù)載中的所有論點(diǎn))
一些變量是事實(shí)上的集合,在運(yùn)行時(shí)可以擴(kuò)展更多的變量
SecRule args dirty??? 測(cè)試所有的請(qǐng)求論點(diǎn)
SecRule ARGS:p dirty?? 有些時(shí)候只想看看集合的一部分,這個(gè)例子是通過(guò)selection操作(colon)查看名為P的變量(注意:通常行情況下,請(qǐng)求可以包含多個(gè)同名的變量)
ScRule ARGS|!ARGS:z dirty???? 指定排除方式,將仔細(xì)檢查所有的請(qǐng)求參數(shù)是否有單詞dirty,除了名字為z的參數(shù)(再則,z參數(shù)可以為0個(gè),也可以為多個(gè))
SecRule &ARGS !^0$?? 統(tǒng)計(jì)一個(gè)集合中有多少個(gè)變量,如果一個(gè)請(qǐng)求中使用了0個(gè)以上的參數(shù),下面的規(guī)則就會(huì)有效果(暫時(shí)忽視了第二個(gè)參數(shù))
SecRule ARGS:/^id_/ dirty??? 有些時(shí)候你需要查看一個(gè)參數(shù)數(shù)組,每個(gè)名字只有稍微不同,這種情況下,你可以為集合操作符自己制定一個(gè)正則表達(dá)式,這個(gè)規(guī)則就是查閱所有以id_打頭的參數(shù)名字。
注意:如果參數(shù)p不存在,則使用ARGS:p不會(huì)對(duì)操作符調(diào)用起到任何作用。
?
ARGS_COMBINED_SIZE
此變量相比apache的LimitRequest指令允許你更有針對(duì)性的設(shè)置Arguments 的總大小,如你可以創(chuàng)建一條規(guī)則確保參數(shù)數(shù)據(jù)的大小小于一個(gè)特定的閥值(幫助防止緩存溢出問(wèn)題)例如:如果參數(shù)的大小超過(guò)25個(gè)字符就阻斷他。
SecRule REQUEST_FILENAME “^/cgi-bin/login\.php”\
”chain,log,deny,phase:2,t:none,t:lowercase,t:normalisePath”
SecRule ARGS_COMBINED_SIZE “@gt 25”
?
ARGS_NAMES
是參數(shù)名的集合,你可以搜索你想阻斷的特定的參數(shù)名,在一個(gè)積極策略情況下,你也可以僅僅使用白名單(使用!可以反轉(zhuǎn)規(guī)則)來(lái)審計(jì)參數(shù)名。例:下例規(guī)則僅允許規(guī)則名為p和a的兩個(gè)參數(shù),如果有其他參數(shù)名字在其中,就會(huì)被阻斷。
SecRule REQUEST_FILENAME “/index.php”\
”chain,log,deny,status:403,phase:2,t:none,t:lowercase,t:normalisePath”
SecRule ARGS_NAMES “!^(p|a)$” “t:none,t:lowercase”
?
ARGS_GET
類似于ARGS,但僅針對(duì)于查詢字符串中包含的參數(shù)
?
ARGS_GET_NAMES
類似于ARGS_NAMES,但僅針對(duì)于查詢字符串中包含的參數(shù)
?
ARGS_POST
類似于ARGS,,但僅針對(duì)于POST字符串中包含的參數(shù)
?
ARGS_POST_NAMES
類似于ARGS_NAMES,但僅針對(duì)于POST字符串中包含的參數(shù)
?
AUTH_TYPE
這個(gè)變量保存認(rèn)證方法用于驗(yàn)證一個(gè)用戶,注意:這個(gè)數(shù)據(jù)在使用非本地認(rèn)證的代理模式部署時(shí)不可用,在代理模式部署下,你需要檢查REQUEST_HEADERS認(rèn)證頭
?
ENV
是個(gè)集合,規(guī)則一個(gè)單獨(dú)的參數(shù)(在colon后),ENV變量通過(guò)setenv設(shè)置,不提供CGI環(huán)境變量的訪問(wèn),例如:
SecRule REQUEST_FILENAME “printenv” pass,setenv:tag=suspicious
SecRule ENV:tag “suspicious”
?
FILES
是個(gè)集合,包含一系列的初始文件名(就如同在遠(yuǎn)程用戶的文件系統(tǒng)上命名的一樣),注意:只有從請(qǐng)求體中提取的文件才是有用的,例:
SecRule FILES ”\.conf$” log,deny,status:403,phase:2
?
FILES_COMBINED_SIZE
單一值,所有上傳文件大小的總和,注意:只有從請(qǐng)求體中提取的文件才是有用的,例:
SecRule FILES_COMBINED_SIZE “@gt 1000”log,deny,status:403,phase:2
?
FILES_NAMES?
W/O參數(shù)集合,包含用于文件上傳的表單字段列表,注意:只有從請(qǐng)求體中提取的文件才是有用的,例:
SecRule FILES_NAMES “^upfile$” log,deny,status:403,phase:2
?
FILES_SIZES?
集合,包含文件尺寸的列表,用于實(shí)施單獨(dú)文件上傳的大小限制。注意:只有從請(qǐng)求體中提取的文件才是有用的,例:
SecRule FILES_SIZES “@gt 100”log,deny,status:403,phase:2
?
FIELS_TMPNAMES???
集合,包含磁盤(pán)上臨時(shí)文件名的集合,和@inspecFile一起使用,注意:只有從請(qǐng)求體中提取的文件才是有用的,例:
SecRule FILES_TMPNAMES “@inspectFile /path/to/inspect_script.pl”
?
GEO
是和@geoLookups操作符一起使用的集合,可以用于匹配地理位置字段進(jìn)行IP或主機(jī)名字的查詢,2.2.0以后版本可用
字段:
COUNTRY_CODE:兩個(gè)字符的國(guó)家代號(hào),如:US、UK等
COUNTRY_CODE3:升級(jí)為3個(gè)字符的國(guó)家代號(hào)
COUNTRY_NAME:完整的國(guó)家名
COUNTRY_CONTINENT:兩個(gè)字符的國(guó)家所在洲的代號(hào),如EU
REGION:兩個(gè)字符表示的區(qū)域,對(duì)美國(guó)來(lái)說(shuō)是州,對(duì)加拿大來(lái)說(shuō)是省,等等
CITY:城市名
POSTAL_CODE:郵政編碼
LATITUDE:緯度
LONGITUDE:經(jīng)度
DMA_CODE:中心城區(qū)代碼(僅指美國(guó))
AREA_CODE:電話區(qū)號(hào)(僅指美國(guó))
例如:
SecRule REMOTE_ADDR “@geoLookup” “chain,drop,msg:’Non-UK IP address’”
SecRule GEO: COUNTRY_CODE “!@streq UK”
?
HIGHEST_SEVERITY 這個(gè)變量是迄今為止所有規(guī)則匹配時(shí)最為嚴(yán)格的,Severities是個(gè)數(shù)值,和比較操作符一起,如@It等
注意:更高的severities,其數(shù)值越小,255表示沒(méi)有設(shè)置severitySecRule
HIGHEST_SEVERITY “@le 2” “phase:2,deny,status:500,msg:’severity
%{HIGHEST_SEVERITY}’”
?
id
說(shuō)明:對(duì)規(guī)則指定一個(gè)唯一的ID或鏈。
動(dòng)作組:元數(shù)據(jù)
例如:
SecRule &REQUEST_HEADERS:Host "@eq 0" \??? "log,id:60008,severity:2,msg:'Request Missing a Host Header'"
注意
這些是保留的范圍:
1-99,999;本地(內(nèi)部)保留,使用你認(rèn)為合適的但是不要在規(guī)則里使用這個(gè)范圍的因?yàn)樗麄円呀?jīng)分配給其他。
100,000-199,999;,引擎內(nèi)部保留使用,分配給沒(méi)有明確標(biāo)識(shí)的規(guī)則。
200,000-299,999;modsecurity.org規(guī)則保留。
300,000-399,999;gotroot.com規(guī)則保留。
400,000-419,999;未使用(可預(yù)約)。
420,000-429,999;為ScallyWhack保留。
430,000-699,999;未使用(可預(yù)約)。
700,000-799,999;為伊萬(wàn)里斯蒂奇保留。
900,000-999,999;為核心規(guī)則項(xiàng)目保留。
1000000及以上;未使用(可預(yù)約)。
?
initcol
說(shuō)明:初始化一個(gè)持久的集合,從存儲(chǔ)里導(dǎo)入數(shù)據(jù)或在內(nèi)存中創(chuàng)建一個(gè)新的集合。
動(dòng)作組:非中斷性
例如:下面的例子啟動(dòng)IP地址跟蹤。
SecAction phase:1,initcol:ip=%{REMOTE_ADDR},nolog
注意:通常你想在第一階段和initcol一起使用以便這個(gè)集合在所有階段都可用。
集合在initcol動(dòng)作開(kāi)始被加載進(jìn)內(nèi)存。這個(gè)集合在存儲(chǔ)里將是持續(xù)的(并且相應(yīng)的計(jì)數(shù)器增加)除非它在交互過(guò)程中改變了。請(qǐng)參考” Persistant Storage”以獲取得多內(nèi)容。
?
REQUEST_COOKIES
這個(gè)變量是一個(gè)所有cookie數(shù)據(jù)的集合。例如:下面的例子使用Ampersand(符號(hào)&)特殊運(yùn)算符計(jì)算集合中變量的個(gè)數(shù)。如果請(qǐng)求不包括任何Cookie頭的話,規(guī)則將會(huì)啟動(dòng)。
SecRule &REQUEST_COOKIES “@eq 0”
?
REQUEST_COOKIES_NAMES
這個(gè)變量是一個(gè)請(qǐng)求頭中cookie名字的集合。例如:如果沒(méi)有JSESSIONID cookie的話,下面的規(guī)則將會(huì)啟動(dòng)。
SecRule &REQUEST_COOKIES_NAMES:JSESSIONID “@eq 0”
?
REQUEST_FILENAME
這個(gè)變量包含去掉QUERY_STRING那一部分之后的相對(duì)REQUEST_URI(例如/index.php)
SecRule REQUEST_FILENAME “^/cgi-bin/login\.php$” phase:2,t:none,t:normalizePath
注意:anti-evasion交互并不默認(rèn)在REQUEST_FILENAME上使用。
?
RESPONSE_HEADERS
這個(gè)變量和REQUEST_HEADERS變量相似,可以在同樣的manner(方法)中使用,例如:
SecRule RESPONSE_HEADERS:X-Cache “MISS”
注意:這個(gè)變量不能訪問(wèn)嵌入式模式中的一些頭。在Apache鉤子里面加上了像Server,Data,Connection和Content-Type這些頭,然后向客戶端發(fā)送數(shù)據(jù)。無(wú)論是在ModSecurity phase:5還是運(yùn)行在代理模式下,這些數(shù)據(jù)都應(yīng)該是可訪問(wèn)的。
?
RESPONSE_HEADERS_NAMES
這個(gè)變量是一個(gè)響應(yīng)頭名字集合。例如:
SecRule RESPONSE_HEADERS_NAMES “Set-Cookie”
注意:和RESPONSE_HEADERS一樣,不能訪問(wèn)嵌入式模式中的一些頭。
?
SESSION
這個(gè)變量是一個(gè)集合,setsid執(zhí)行完之后才能訪問(wèn)它。例如:下面的例子說(shuō)明了怎么用setsid初始化一個(gè)SESSION集合,怎么使用setvar增加session.score的值,怎么設(shè)置session.blocked的值,最后怎么拒絕基于session.blocked的值的集合。
SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass
SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}
SecRule REQUEST_URI “^/cgi-bin/finger$” \
“phase:2,t:none,t:lowercase,t:normalizePath,pass,log,setvar:session.score=+10”
SecRule SESSION:SCORE “@gt 50” “pass,log,setvar:session.blocked=q1”
SecRule SESSION:BLOCKED “@eq 1” “l(fā)og,deny,status:403”
?
SESSIONID
這個(gè)變量使用setsid設(shè)置的一個(gè)值,例如:
SecRule SESSION !^$ chain,nolog,pass
SecRule REQUEST_COOKIES:PHPSESSID !^$
SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}
?
TIME
這個(gè)變量含有一個(gè)表示時(shí)間的格式化字符串(時(shí):分:秒),例如:
SecRule TIME “^(([1](8|9))|([2](0|1|2|3))):\d{2}:\d{2}$”
?
?
TX
交互集合。用來(lái)儲(chǔ)存數(shù)據(jù)塊,創(chuàng)建交互異常計(jì)算等。交互變量用來(lái)設(shè)置1號(hào)請(qǐng)求/響應(yīng)循環(huán)。計(jì)算和賦值將不會(huì)持續(xù)到越過(guò)當(dāng)前請(qǐng)求/響應(yīng)處理過(guò)程。例如:在這個(gè)例子中,使用setvar使tx.score增加5個(gè)點(diǎn)。緊接著計(jì)算這次請(qǐng)求的交互分?jǐn)?shù),并決定是否去允許/拒絕請(qǐng)求通過(guò)。
下面是TX集合的保留名稱:
TX:0----捕捉動(dòng)作中使用@rx或者@pm操作符時(shí)的匹配值
TX:1-9-------捕捉括號(hào)和捕捉動(dòng)作中使用@rx操作符時(shí)的捕捉子表達(dá)式的值。
SecRule WEBSERVER_ERROR_LOG “does not exist” “phase:5,pass,setvar:tx.score=+5”
SecRule TX:SCORE “@gt 20” deny,log
?
XML
可獨(dú)立使用(作為validateDTD和validateSchema的目標(biāo)),也可和XPath表達(dá)式參數(shù)(這可以使他對(duì)任何可接受純文本的函數(shù)來(lái)說(shuō)都是有效目標(biāo))一起使用。
DecDefaultAction log,deny,status:403,phase:2
SecRule REQUEST_HEADERS:Content-Type ^text/xml$ \
Phase:1,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML
SecRule REQBODY_PROCESSOR “|^xml$” skipAfter:12345
SecRule XML:|employees/employee/name/text() Fred
SecRule XML:|xp:employees/employee/name/text() Fred \
Id:12345,xmlns:xp=http://www.example.com/employees
第一個(gè)XPath表達(dá)式不使用命名空間。他將和類似如下的載荷進(jìn)行匹配:
<employees>
??? <employee>
??????? <name>Fred Jones</name>
??????? <address location=”home”>
??????????? <street>900 Aurora Ave.</street>
??????????? <city>Seattle</city>
??????????? <state>WA</state>
??????????? <zip>98115</zip>
??????? </address>
??????? <address location=”work”>
??????????? <street>2011 152nd Avenue NE</street>
??????????? <city>Redmond</city>
??????????? <state>WA<state>
??????????? <zip>98052</zip>
</address>
??????? <phone location=”work”>(425)555-5665</phone>
??????? <phone location=”home”>(206)555-5555</phone>
??????? <phone location=”mobile”>(206)555-4321</phone>
</employee>
</employees>
第二個(gè)XPath表達(dá)式使用命名空間。它將匹配以下負(fù)載:
<xq:employees xmlns:xp=”http://www.example.com/employees”>
<employee>
??? <name>Fred Jones</name>
??? <address location=”home”>
??????? <street>900 Aurora Ave.</street>
??????? <city>Seattle</city>
??????? <state>WA</state>
??????? <zip>98115</zip>
??? </address>
??? <address location=”work”>
??????? <street>2011 152nd Avenue NE</street>
??????? <city>Redmond</city>
??????? <state>WA</state>
??????? <zip>98052</zip>
??? </address>
??? <phone location=”work”>(425)555-5665</phone>
??? <phone location=”home”>(206)555-5555</phone>
??? <phone location=”mobile”>(206)555-4321</phone>
</employee>
</xp:employees
注意第二個(gè)例子中的命名空間
?
?
?
?
?
?
?
?
?
Transformation functions轉(zhuǎn)換函數(shù)(應(yīng)用,功能):
當(dāng)ModSecurity接收到請(qǐng)求或者響應(yīng)消息,它將把這個(gè)消息數(shù)據(jù)復(fù)制到內(nèi)存當(dāng)中做備份。交互函數(shù)就應(yīng)用于這個(gè)數(shù)據(jù)。原始請(qǐng)求/響應(yīng)數(shù)據(jù)不會(huì)被修改。一個(gè)變量要先使用交互函數(shù)轉(zhuǎn)換之后,才能在規(guī)則中進(jìn)行測(cè)試。
注意:ModSecurity之前的版本并沒(méi)有默認(rèn)交互函數(shù)。
下面的規(guī)則將防止攻擊者不使用混合大小寫(xiě)(mixed case)來(lái)逃避ModSecurity的規(guī)則。
SecRule ARGS:p “xp_cmdshell” “t:lowercase”
?
同一條規(guī)則中可以使用多重交互動(dòng)作,比如下面的規(guī)則也能保證攻擊者不使用URL編碼(%xx編碼)逃避規(guī)則。注意交互函數(shù)的命令能保證一個(gè)URL編碼信件是第一次編碼,而不是轉(zhuǎn)換成小寫(xiě)。
SecRule ARGS:p “xp_cmdshell” “t:urlDecode,t:lowercase”
?
可以使用SecDefaultAction命令來(lái)為每條規(guī)則保證轉(zhuǎn)換發(fā)生,直到下一條規(guī)則。注意交互動(dòng)作時(shí)附加(additive)的,所以如果一條規(guī)則明確的列出動(dòng)作,SecDefaultAction中的轉(zhuǎn)換動(dòng)作仍然執(zhí)行。
SecDefaultAction t:urlDecode,t:lowercase
?
下面是被支持的轉(zhuǎn)換函數(shù):
HtmlEntityDecode
對(duì)輸入的HTML實(shí)體進(jìn)行解碼。支持以下變型:
&#xHH and &#xHH;(H是十六進(jìn)制)
&#DDD and &#DDD;(D是十進(jìn)制)
" and "
  and
< and <
> and >
這個(gè)函數(shù)可以把任何實(shí)體轉(zhuǎn)換成一個(gè)簡(jiǎn)單的字節(jié),可能會(huì)導(dǎo)致信息丟失。有利于發(fā)現(xiàn)本來(lái)不需要編碼的字節(jié)。這個(gè)函數(shù)不能處理255以上的字符。
?
lowercase
這個(gè)函數(shù)使用current C locale把所有字符轉(zhuǎn)換成小寫(xiě)。
?
none
不是一個(gè)轉(zhuǎn)換函數(shù),命令ModSecurity刪除與當(dāng)前指令結(jié)合的所有轉(zhuǎn)換函數(shù)。
?
TrimLeft
刪除輸入左邊的空格。
?
TrimRight
刪除輸入右邊的空格。
?
trim
刪除輸入左右兩邊的空格。
?
urlDecode
這個(gè)函數(shù)為URL編碼的輸入字符串解碼。無(wú)效編碼(例如非十六進(jìn)制字符,字符串結(jié)尾部分少了一兩個(gè)字符)不會(huì)被轉(zhuǎn)換。可以用@validateUrlEncoding運(yùn)算符檢測(cè)是否是無(wú)效編碼。交互函數(shù)不能針對(duì)URL編碼的變量使用,除非你想執(zhí)行URL二次編碼。
?
urlDecodeUni
除了urlDecode對(duì)%xx解碼之外,urlDecodeUni需要解碼%uXXXX。如果編碼在FF01-FF5E(ASCII碼總寬度),那么高字節(jié)將檢查和并調(diào)整低字節(jié)。否則,只有低字節(jié)可用,高字節(jié)不可用。
?
urlEncode
對(duì)輸入數(shù)據(jù)進(jìn)行URL編碼
?
?
?
?
?
?
Actions
有五個(gè)動(dòng)作組,每個(gè)動(dòng)作分別屬于一個(gè)組:
Disruptive actions
引起modsecurity做些事情。有些情況下這些事情意味著鎖定事務(wù),但并不是所有情況都這樣做。例如,allow動(dòng)作屬于一個(gè)disruptive動(dòng)作組,但是它并不鎖定事務(wù)。每個(gè)規(guī)則中只能有一個(gè)disruptive動(dòng)作(如果有多個(gè)disruptive動(dòng)作,或者繼承的動(dòng)作,只有最后那個(gè)有效)。每個(gè)規(guī)則鏈中也只能有一個(gè)disruptive動(dòng)作(在一個(gè)鏈中,只能在第一條規(guī)則中有disruptive動(dòng)作)。
Non-disruptive actions
做一些事情,但是這些事情并不能影響規(guī)則處理流。例如,設(shè)置一個(gè)變量,或者改變變量的值。任何規(guī)則都可以使用Non-disruptive動(dòng)作,就連一個(gè)鏈中的每一個(gè)規(guī)則也都可以有Non-disruptive動(dòng)作。
Flow actions
這些動(dòng)作影響規(guī)則流(例如skip或者skipAfter)
Meta-data actions
使用Meta-data動(dòng)作可以提供關(guān)于規(guī)則更多的信息。例如:id,rev,severity和msg。
Data actions
不是真正的動(dòng)作,只是容器,用來(lái)保存其他動(dòng)作使用的數(shù)據(jù)。例如,status動(dòng)作包含了blocking(blocking發(fā)生時(shí))使用的狀態(tài)。
?
Allow
所屬動(dòng)作組:Disruptive
當(dāng)成功匹配一個(gè)規(guī)則時(shí),停止規(guī)則的處理(審核)過(guò)程,并允許交互繼續(xù)進(jìn)行。
SecRule TEMOTE_ADDR “^192\.168\.1\.100$” nolog,phase:1,allow
ModSecurity之前的版本,allow動(dòng)作只能影響當(dāng)前的phase。如果在Phase 1階段中有allow動(dòng)作,將會(huì)跳過(guò)phase 1階段剩下的規(guī)則。但是如果在Phase 2階段中有allow動(dòng)作,剩下的規(guī)則將會(huì)繼續(xù)執(zhí)行。從2.5.0版本開(kāi)始,allow動(dòng)作升級(jí)到,可以對(duì)正在執(zhí)行的規(guī)則進(jìn)行細(xì)粒度的控制。下列規(guī)則適用:
1、像上面的例子中單獨(dú)使用一個(gè)allow的話,allow會(huì)影響整個(gè)交互,停止當(dāng)前階段的處理,而且跳過(guò)除了logging階段之外的其他階段(logging階段很特殊,總是執(zhí)行)。
2、如果和參數(shù)phase一起使用,allow將會(huì)導(dǎo)致引擎停止處理當(dāng)前階段,其他階段將會(huì)照常執(zhí)行。
3、如果和request參數(shù)一起使用,allow將會(huì)引起引擎停止處理當(dāng)前階段。下一個(gè)處理階段將是RESPONSE_HEADERS階段。
例如:
#Do not process request but process response
SecAction phase:1,allow:request
?
#Do not process transaction(request和response)
SecAction phase:1,allow
如果你想讓response通過(guò),在RESPONSE_HEADERS階段使用規(guī)則,而且只單獨(dú)使用allow。
#Allow response through
SecAction phase:3,allow
?
Capture
動(dòng)作組:Non-disruptive
當(dāng)和正則表達(dá)式操作符一起使用時(shí),capture創(chuàng)建正則表達(dá)式捕捉的副本,并把這些捕捉副本放到交互變量集合里面。每次成功模式匹配,最多只能復(fù)制10個(gè),每個(gè)以數(shù)字0-9的組合命名。
SecRule REQUEST_BODY “username=(\w{25,})” phase:2,t:none,chain
SecRule TX:1 “(?:(?:a(admin|nonymous)))”
注意:數(shù)字0捕捉整個(gè)的REGEX匹配,1捕捉第一個(gè)括號(hào)里面的數(shù)據(jù)。
?
Chain
動(dòng)作組:Flow
動(dòng)作緊跟著規(guī)則時(shí),把規(guī)則串起來(lái),得到的結(jié)果就是規(guī)則鏈,串起來(lái)的規(guī)則允許有更多復(fù)雜的規(guī)則匹配,在這些這些規(guī)則匹配中,使用大量不同的變量來(lái)創(chuàng)建一個(gè)更好的規(guī)則,并且有利于防止誤報(bào)。
#Refuse to accept POST requests that do
#not specify request body length.Do note that
#this rule should be preceeded by a rule that verifies
#only valid request methods(e.g.GET,HEAD and POST)are used.
SecRule REQEST_METHOD ^POST$ chain,t:none
SecRule REQUEST_HEADERS:Content-Lenth ^$ t:none
注意:
在程序語(yǔ)言概念中,串起來(lái)的規(guī)則有點(diǎn)類似于AND條件聲明。只有當(dāng)所有的變量檢查返回正數(shù)時(shí),規(guī)則鏈中第一部分指定的動(dòng)作才被觸發(fā)。只要規(guī)則鏈有一方面是負(fù)的,那整個(gè)規(guī)則鏈都是負(fù)的。同時(shí)要注意,disruptive動(dòng)作,execution段,metadata動(dòng)作(id,rev,msg),skip,skipAfter動(dòng)作只能通過(guò)鏈開(kāi)始規(guī)則指定。
?
deny
所屬動(dòng)作組:Disruptive
停止規(guī)則處理過(guò)程,并且中斷交互。
所屬動(dòng)作組:Disruptive
?
Id
動(dòng)作組:Meta-data
給規(guī)則或鏈指定一個(gè)ID號(hào)
SecRule &REQUEST_HEADERS:Host “@eq 0” \
“l(fā)og,id:60008,severtity:2,msg:’Reqest Missing a Host Header’”
注意:
保留值范圍:
1-99,999::保留做本地(內(nèi)部)使用,你認(rèn)為怎么合適就怎么用,但是你分配給別人的規(guī)則里面不要用這個(gè)范圍。
100,000-199,999:引擎內(nèi)部使用,指定給一些沒(méi)有明確ID號(hào)的規(guī)則
200,000-299,999:modsecurity.org發(fā)布的規(guī)則使用
300,000-399,999:gotroot.com發(fā)布的規(guī)則使用
400,000-419,999:不可用,僅作保留
420,000-429,999:為ScallyWhack[http://projects.otaku42.de/wiki/Scally-Whack]
430,000-899,999:不可用,僅作保留
900,000-999,999:核心規(guī)則[http://www.modsecurity.org/projects/rules/]設(shè)計(jì)
1,000,000及以上:不可用,僅作保留
?
Log
一個(gè)成功的規(guī)則匹配需要被記錄。這個(gè)動(dòng)作不僅把匹配記錄到Apache error log file(用來(lái)記錄apache的錯(cuò)誤信息)當(dāng)中也要記錄到ModSecurity audit log(調(diào)試、審計(jì)日志)當(dāng)中。
?
msg
動(dòng)作組:Meta-data
給規(guī)則或鏈指定一個(gè)客戶消息。
SecRule &REQUEST_HEADERS:Host “@eq 0” \
“l(fā)og,id:60008,severity:2,msg:’Request Missing a Host Header’”
注意:
Msg消息在錯(cuò)誤日志和/或?qū)徲?jì)日志中,而不作為響應(yīng)頭返回給用戶。
?
noauditlog
所屬動(dòng)作組:Non-disruptive
這個(gè)動(dòng)作表明,當(dāng)成功匹配一個(gè)規(guī)則時(shí),并不記錄審計(jì)日志。不管交互應(yīng)不應(yīng)該被記錄到aodit log中,這次匹配都不能被當(dāng)做(下次判斷的)標(biāo)準(zhǔn)。(感覺(jué)可以用于白名單中)
SecRule REQUEST_HEADERS:User-Agent “Test” allow,noauditlog
注意:如果SecAuditEngine 被設(shè)置為On,那么所有的交互都會(huì)被記錄;如果被設(shè)置成RelevantOnly,你才可以使用noauditlog這個(gè)動(dòng)作來(lái)控制交互是否被記錄。
即使規(guī)則里寫(xiě)了noauditlog,規(guī)則里觸發(fā)了審計(jì)動(dòng)作,還是會(huì)記錄日志,正確的做法是在規(guī)則中加上ctl:auditEngine=Off才會(huì)不記錄日志。(上面是張彪依翻譯版的,言簡(jiǎn)意賅,好理解,我應(yīng)該感到汗顏)(即使noauditlog這個(gè)動(dòng)作是應(yīng)用于具體的規(guī)則當(dāng)中,這個(gè)規(guī)則可能在審計(jì)事件觸發(fā)之前也可能在審計(jì)事件觸發(fā)之后,但是這個(gè)交互都要被記錄在audit log(審計(jì)日志)當(dāng)中。正確的方法是:使用“ctl:auditEngine=off”來(lái)使整個(gè)交互的審計(jì)都不記錄(來(lái)使審計(jì)記錄功能失效)。)
?
nolog
Action Group:Non-disruptive
不記錄規(guī)則匹配,既不記錄在error中,也不記錄在audit logs中。
注意:使用這個(gè)動(dòng)作,也必須說(shuō)明noauditlog
?
pass:
動(dòng)作組:Disruptive
盡管成功匹配了一個(gè)規(guī)則,但繼續(xù)檢查下一條規(guī)則
SecRule REQUEST_HEADERS:User-Agent “Test” log,pass
SecRule中寫(xiě)了pass,SecRule帶了multiple targets,每一次規(guī)則匹配,所有的target都會(huì)被處理,并觸發(fā)non-disruptive動(dòng)作。下面的例子里,每一次匹配,TX:test都增加1
SecRule ARGS “test” log,pass,setvar:TX.test=+1
注意:每一次匹配,都不會(huì)終止交互,并記錄日志,除非阻止日志。
?
pass
動(dòng)作組:Meta-data
把規(guī)則或規(guī)則鏈歸于某一個(gè)有效處理階段之一
SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase
SecRule REQUEST_HEADER:User-Agent “Test” log,deny,status:403
注意:記住如果段是錯(cuò)誤的,會(huì)導(dǎo)致目標(biāo)變量為空。即變量或運(yùn)算符(RegEx)正確,但是由于指定了錯(cuò)誤的段,導(dǎo)致丟失惡意數(shù)據(jù)。
Phase:1
Normally you will want to use phase:1 along with initcol so that the collection is available in all phases.
?
redirect
動(dòng)作組:Disruptive
在給定位置發(fā)布redirect來(lái)攔截交互
SecRule REQUEST_HEADERS:User-Agent “test” \
Log,redirect:http://www.hostname.com/failed.html
注意:如果狀態(tài)動(dòng)作是現(xiàn)在時(shí)的并且值可接受(為301,302,303,或者307),這個(gè)狀態(tài)碼將會(huì)用來(lái)重定向,否則,狀態(tài)碼302被用來(lái)重定向
?
setvar
動(dòng)作組: non-disruptive
新建刪除更新集合中的變量
新建變量:setvar:tx.score=10
刪除變量:setvar:!tx.score
增加減小變量:在數(shù)字前面加上+或-:setvar:tx.score=+5
?
severity
動(dòng)作組:Meta-data
指定規(guī)則的嚴(yán)重性
SecRule REQUEST_METHOD “^PUT$” “id:340002,rev:1,severity:CRITICAL,msg:’Restricted HTTP function’”
注意:
嚴(yán)重值遵循系統(tǒng)日志,如下:
0????????????????????? EMERGENCY
1????????????????????? ALERT
2????????????????????? CRITICAL
3????????????????????? ERROR
4????????????????????? WARNING
5????????????????????? NOTICE
6????????????????????? INFO
7????????????????????? DEBUG
用數(shù)字或文字值都可以指定嚴(yán)重程度。但是每個(gè)數(shù)字代表的嚴(yán)重程度很難記憶,所有應(yīng)該使用文字值指定嚴(yán)重程度。數(shù)字值在v2.5.0版本中已經(jīng)取消了,在接下來(lái)的版本更新中也可能會(huì)被取消。
?
skip
動(dòng)作組:Flow
匹配成功時(shí),跳過(guò)一條或更多的規(guī)則或規(guī)則鏈、
SecRule REQUEST_URI “^/$” \
“phase:2,chain,t:none,skip:2”
SecRule REMOTE_ADDR “^127\.0\.0\.1$” “chain”
SecRule REQUEST_HEADERS:User-Agent “^Apache \(internal dummy connection\)$” “t:none”
SecRule &REQUEST_HEADERS:Host “@eq 0” \
“deny,log,status:400,id:960008,severity:4,msg:’Request Missing a Host Header’”
SecRule &REQUEST_HEADER:Accept “@eq 0” \
“l(fā)og,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’”
注意:skip只應(yīng)用與當(dāng)前正在處理的階段,并且沒(méi)必要應(yīng)用于配置文件里面的規(guī)則里的命令。如果想通過(guò)處理段對(duì)規(guī)則分類,就要使用skip。不能在一個(gè)規(guī)則鏈中跳過(guò)規(guī)則。一個(gè)簡(jiǎn)單的參數(shù)就可以指出要跳過(guò)的規(guī)則或規(guī)則鏈的數(shù)量。
?
skipAfter
動(dòng)作組:Flow
匹配后跳過(guò)規(guī)則或規(guī)則鏈,重新開(kāi)始執(zhí)行指定了ID號(hào)或marker(參考SecMarker)的規(guī)則。
SecRule REQUEST_URI “^/$” “chain,t:none,skipAfter:960015”
SecRule REMOTE_ADDR “^127\.0\.0\.1$”? “chain”\
SecRule REQUEST_HEADERS:User-Agent “^Apache \(internal dummy connection\)$” “t:none”
SecRule &REQUEST_HEADERS:Host “@eq 0” \
“deny,log,status:400,id:960008,severity:4,msg:’Request Missing a Host Header’”
SecRule &REQUEST_HEADERS:Accept “@eq 0” \
“l(fā)og,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’”
注意:skip只應(yīng)用與當(dāng)前正在處理的階段,并且沒(méi)必要應(yīng)用于配置文件里面的規(guī)則里的命令。如果想通過(guò)處理段對(duì)規(guī)則分類,就要使用跳過(guò)。不能在一個(gè)規(guī)則鏈中跳過(guò)規(guī)則。一個(gè)簡(jiǎn)單的參數(shù)就可以指出要跳過(guò)的規(guī)則或規(guī)則鏈的數(shù)量。
?
?
status
動(dòng)作組:Data
與動(dòng)作deny和redirect動(dòng)作一起使用來(lái)指定響應(yīng)狀態(tài)碼
SecDefaultAction log,deny,status:403,phase:1
注意:Apache在scope位置(例如Directory,location等)定義的status動(dòng)作可能會(huì)被phase:1的動(dòng)作設(shè)置所代替。如果在配置文件中出現(xiàn)的話,Apache將會(huì)觸發(fā)ErrorDocument指令。所以如果你之前已經(jīng)為一個(gè)給定的狀態(tài)定義了一個(gè)自定義錯(cuò)誤頁(yè)的話,那么這個(gè)錯(cuò)誤頁(yè)將會(huì)執(zhí)行并顯示給用戶。
?
t
動(dòng)作組:non-disruptive
當(dāng)轉(zhuǎn)換功能是針對(duì)指定變量,并且變量的結(jié)果是由運(yùn)算符計(jì)算得到時(shí),使用動(dòng)作t
SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase
SecRule REQUEST_COOKIES:SESSIONID “47414e81cbbef3cf8366e84eeacba091” \
?? Log,deny,status:403,t:md5,t:hexEncode
注意:先用SecDefaultAction中指定轉(zhuǎn)換功能,在此基礎(chǔ)之上,還需要用SecRule指定轉(zhuǎn)換功能。使用“t:none”可以為某一指定的規(guī)則取消所有轉(zhuǎn)換功能。
?
?
?
?
?
?
Operators運(yùn)算符
規(guī)則中可以使用很多運(yùn)算符,@后面跟運(yùn)算符名稱
eq
相當(dāng)于等號(hào)“=”
SecRule &REQUEST_HEADERS_NAMES “@eq 15”
?
pm
段匹配運(yùn)算符。pm使用一組匹配引擎集(Aho-Corasick)來(lái)使關(guān)鍵字列表得到更快的匹配,It will match any one of its arguments anywhere in the target value.匹配不區(qū)分大小寫(xiě)。
SecRule REQUEST_HEADERS:User-Agent “@pm WebZIP WebCopier Webster WebStripper SiteSnagger ProWebWalker”
上面這個(gè)例子中,如果口令在User-Agent HTTP頭值中得到匹配,將返回403拒絕訪問(wèn)。
?
pmFromFile
段匹配運(yùn)算符。pmFromFile使用一組匹配引擎集(Aho-Corasick)來(lái)使關(guān)鍵字列表得到更快的匹配,它和pm相同,不同在于pmFromFile需要一個(gè)一列文件作為arguments。目標(biāo)值將和文件中任一個(gè)段相匹配。
注意:1、文件的每一行只能有一個(gè)段。行尾標(biāo)記將會(huì)和段剝離,但是段里面不能沒(méi)有空格(End of line markers will be stripped from the phases,however,whitespace will not be trimmed from phases in the file.)。空行和以“#”開(kāi)頭的行被忽略。
2、使用段文件的相對(duì)路徑,可以使帶有規(guī)則集的段文件的內(nèi)容更簡(jiǎn)單。此時(shí),包含規(guī)則的文件路徑被預(yù)置為段文件路徑。
SecRule REQUEST_HEADERS:User-Agent “@pm /path/to/blacklist1 blacklist2” “deny,status:403”
上面的例子中,如果兩個(gè)文件的模式(pattern)在User-Agent的HTTP頭值中得到匹配,那么403拒絕訪問(wèn),表blacklist2需要和包含規(guī)則的文件相同路徑。
?
validateUrlEncoding
?
?
validateUtf8Encoding
檢驗(yàn)變量是不是一個(gè)有效的UTF-8編碼字符串
SecRule ARGS “@validateUtf8Encoding”
注意:UTF-8在大部分web服務(wù)器上都是有效的。0-65535之間的整數(shù)值用UTF-8字節(jié)序列編碼,UTF-8字節(jié)序列沒(méi)有百分?jǐn)?shù)。簡(jiǎn)短的形式只有雙字節(jié)。
檢查以下三類錯(cuò)誤:
Not enough bytes.UTF-8支持2,3,4,5,6字節(jié)編碼。ModSecurity將會(huì)找出一個(gè)或多個(gè)字節(jié)丟失的情況。
Overlong characters。ASCII字符直接映射成Unicode(統(tǒng)一字符編碼)空間,因而只代表一個(gè)簡(jiǎn)單的字節(jié)。但是大多數(shù)ASCII字符也能編碼成2,3,4,5,6個(gè)字符。所有就會(huì)欺騙編碼者去思考這個(gè)字符是不是其他東西(并且這樣也大概會(huì)防止安全檢查)。
?
?
?
?
?
?
?
?
?
?
SecPcreMatchLimit
SecPcreMatchLimitRecursion
這兩個(gè)是設(shè)置pcre的參數(shù)的,用來(lái)避免pcre陷入死循環(huán)之類的。
pcre是實(shí)現(xiàn)正則表達(dá)式匹配的庫(kù),modsecurity規(guī)則里面支持正則表達(dá)式,就是用pcre庫(kù)來(lái)做的。
SecStreamInBodyInspection
SecStreamOutBodyInspection
是兩個(gè)開(kāi)關(guān),是否檢查請(qǐng)求體和響應(yīng)體。
?
?
SecRule REQUEST_HEADERS:Host "^[\d.:]+$" "phase:2,t:none,msg:'Host header is a numeric IP address',severity:1,id:0401006,"
?
?
?
?
?
?
?
MIME:多功能網(wǎng)際郵件擴(kuò)充協(xié)議
(MIME,Multipurpose Internet Mail Extensions)是一個(gè)互聯(lián)網(wǎng)標(biāo)準(zhǔn),它擴(kuò)展了電子郵件標(biāo)準(zhǔn),使其能夠支持非ASCII字符、二進(jìn)制格式附件等多種格式的郵件消息。
服務(wù)器將MIME標(biāo)志符放入傳送的數(shù)據(jù)中來(lái)告訴瀏覽器使用哪種插件讀取相關(guān)文件。
MIME能夠支持非ASCII字符、二進(jìn)制格式附件等多種格式的郵件消息。MIME規(guī)定了用于表示各種各樣的數(shù)據(jù)類型的符號(hào)化方法。瀏覽器接收到文件后,會(huì)進(jìn)入插件系統(tǒng)進(jìn)行查找,查找出哪種插件可以識(shí)別讀取接收到的文件。如果瀏覽器不清楚調(diào)用哪種插件系統(tǒng),它可能會(huì)告訴用戶缺少某插件,或者直接選擇某現(xiàn)有插件來(lái)試圖讀取接收到的文件,后者可能會(huì)導(dǎo)致系統(tǒng)的崩潰。Microsoft公司應(yīng)用于Windows系統(tǒng)下的瀏覽器使用ActiveX控件,而不是Netscape插件,這種瀏覽器不必象其它瀏覽器那樣依靠MIME的編碼。"
在HTTP中,MIME類型被定義在Content-Type header中。
在ASP中,設(shè)定MIME類型的方法是通過(guò)Response對(duì)象的ContentType屬性。
?
0601001
#950103
SecRule TX:PARANOID_MODE "@eq 1" "chain,phase:1,t:none,msg:'Path Traversal Attack',id:0601001,severity:1"
?????? SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* "(?:\x5c|(?:%(?:c(?:0%(?:9v|af)|1%1c)|2(?:5(?:2f|5c)|f)|u221[56]|1u|5c)|\/))(?:%(?:u2024|2e)|\.){2}(?:\x5c|(?:%(?:c(?:0%(?:9v|af)|1%1c)|2(?:5(?:2f|5c)|f)|u221[56]|1u|5c)|\/))" "t:none,t:lowercase,capture"
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiachj/p/4112194.html
總結(jié)
以上是生活随笔為你收集整理的modsecurity配置指令学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面向对象的特点封装、继承、多态
- 下一篇: 图解Nosql(hbase)与传统数据库