modsecurity配置指令學習

事務(transactions)php

Console(控制檯)html

1 Introductionreact

Modsecurity是保護網絡應用安全的工做。不,從零開始。我常稱modsecurity爲WAF(網絡應用防火牆),這是種被普遍接受的叫法,它指的是爲保護網絡應用而專門設計的產品族。也有些時候我稱它爲HTTP入侵檢測工具,我認爲這個稱呼更好的描述了modsecurity作了什麼。linux

 

Understanding ModSecurityweb

像Apache爲其餘模塊所作的同樣,Apache爲modsecurity處理一些基礎任務:正則表達式

一、  加密解密算法

二、  破壞HTTP請求的入站鏈接流shell

三、  部分性解析HTTP請求數據庫

四、  引導modsecurity,選擇正確的配置文本(<VirtualHost>,<Location>等)express

五、  De-chunks必需的請求體

反向代理模式時Apache會執行幾個別的任務:

一、  請求轉發到後端服務器(SSL或者非SSL)

二、  部分性解析HTTP響應

三、  De-chunks必需的響應體

 

What ModSecurity Does

Modsecurity提供的功能大概能分紅四個部分:

Parsing解析:

Modsecurity會努力解析儘量多的數據。Security-conscientious解析器會提取儲存數據,義工在規則中使用,並支持必定的數據格式。

Buffering緩存

典型安裝時,請求體和響應體都會緩存。這就意味着,modsecurity在請求被傳到應用服務器進行處理以前,就見到完整的請求了。在響應被送到客戶端以前就見到了響應。緩存是一個重要的特性,由於只有這種方式才能可靠的攔截數據。緩存也存在缺陷,他須要額外的RAM來存儲請求體和響應體數據。

Logging日誌

全事務日誌(又稱審計日誌)佔據了modsecurity所作工做的很大一部分。你能夠利用日誌記錄完整的HTTP流量,而不是僅僅粗略的訪問日誌信息。請求頭、請求體、響應頭、響應體,全部這些信息你都能得到。只有日誌有這個功能

 

 

 

 

 

What Rules Look Like規則是什麼樣子的

ModSecurity圍繞兩種東西:配置和規則。配置告訴modsecurity怎麼處理它遇到的數據。規則決定對要處理的數據作什麼。儘管如今看規則是怎麼運做的還太早,我將給你展現一個快速的例子,僅僅告訴你規則是什麼樣子的:

SecRule ARGS 「<script>」 log,deny,status:404

即便沒有進一步的幫助,你大概也能看出來規則指定了在輸入數據(<script>)中咱們但願獲得什麼樣的數據。相似的,你很容易發現當獲得指望模式(log,deny,status:404)時會發生什麼。若是我告訴你規則的通常語法,你將會更加清晰,例以下面:

SecRule VARIABLES OPERATOR ACTIONS

三部分的含義以下:

VARIABLES告訴ModSecurity上哪查找,例子中的ARGS變量,表示全部的請求參數;。

OPERATOR告訴ModSecurity怎麼查找,例子中,咱們用一個正則表達式模式,他將和ARGS匹配。

ACTIONS告訴ModSecurity,當匹配發生時,將會作什麼。例子中的規則給出了指示:記錄問題,拒絕交互,用狀態號:404拒絕。

我但願你不要對第一條規則的簡單而失望,我向你保證經過組合ModSecurity提供的不一樣的工具,你可以寫出有用的規則來實現負責的邏輯功能。

 

Transaction Lifecycle交互週期

ModSecurity中,每次交互都須要五步或五段:每一段,modSecurity都要在開始作一些工做(例如:剖析數據),激發這一段中指定的規則,讓他起做用,或者段規則結束以後作一兩件事情。乍一看,五步不少,可是每一段的存在都有一個緣由。總有一件或者幾件事情只能在交互週期的某一特定時刻發生。

請求頭(1)

請求頭段是modsecurity第一個切入點。這一段的首要目的是容許規則做者在代價很高的請求體處理過程發生以前對請求進行評估。請求頭段會影響modsecurity怎麼處理一個請求體。例如,modsecurity不會默認分析XML請求體,可是你能夠經過在第一階段指定合適的規則來指示他這麼作。

請求體(2)

請求體階段是主要的請求分析階段而且當接收到一個完整的請求體並進行處理時,這一階段當即發生。這一階段的規則能夠任意處理全部的請求數據。

響應頭(3)

響應頭階段在接收到響應頭以後,尚未讀取響應體以前發生。這一階段的規則將會決定是否檢查響應體。

響應體(4)

響應體階段是主要的響應分析階段。這一階段一開始,就會讀取響應體的數據以供規則使用。

記錄(5)

記錄階段很特殊,首先,這是惟一的一個你不能鎖定的階段。交互完成以後,這個階段纔開始運行,因此你什麼都不能作,只能記錄發生的事實。這個階段的規則將會控制怎麼記錄。

 

週期實例

爲了讓你更好的理解每一個交互階段發生了什麼,咱們將研究一個POST交互的詳細調試日誌。由於下面這個交互將會運用modsecurity的大多數部分,咱們特地選擇了一個使用請求體來發送數據的交互類型。爲了使事情相對簡單,我使用了一個沒有任何規則的配置,爲了清晰起見,去除了一些調試記錄行、時間戳和一些附加的元數據。

注意:不要指望在此就能理解關於日誌的全部事情。只是有一個關於modsecurity如何工做的大致感受。開始使用modsecurity以後,你很快就會發現調試記錄是一個不可缺乏的書寫規則和疑難排解的工具。

我在這一段文章中使用的交互很直接。我把請求數據放在兩個不一樣的地方,參數a放在查詢字符串中,參數b放在請求體中,可是在這個請求當中再沒有值得注意的地方了。

POST /?a=test HTTP/1.0

Content-type: application/x-www-form-urlencoded

Content-Length:6

 

B=test

 

響應一點都不起眼:

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!

 

請求頭available以後可是請求體(若是有的話)未讀以前,Apache第一次啓用ModSecurity。先出現初始化消息,包含了mod_unique_id產生的獨立的交互ID號。使用這個信息你應該可以把調試日誌裏的信息和你訪問的信息以及審計日誌裏的信息配對。這時,modsecurity將解析請求行和請求頭上的信息。在這個例子中,查詢字符串包含了一個簡單的參數a,因此你會看見記錄它的發現的消息。而後Modsecurity會建立一個交互語境,並引起REQUEST_HEADERS段:

[4]初始化交互(txid SopXW38EAAE9YbLQ)

[5]增長請求參數(查詢字符串QUERY_STRING):名字「a「,值「test」

[4]建立交互語境(dcfg 8121800)

[4]開始段REQUEST_HEADERS

若是一個規則沒有鎖定交互,那麼如今modsecurity就會給Apache返回控制,以容許其餘模塊在控制返回給他以前處理請求。在第二階段,modsecurity先讀取而後處理請求體,前提是請求體存在。在接下來的例子中,你能看到輸入過濾器中的三個消息,告訴你讀取了什麼。第四條消息告訴你,從請求體中獲取了一個參數。請求(application/x-www-form-urlcoded)中使用的內容類型是modsecurity能識別而且自動分析的類型。一旦處理了請求體,就會處理ERQUEST_BODY規則。

[4]第二階段開始(dcfg 8121800)

[4]輸入過濾器:正在讀取請求體

[9]輸入過濾器:鬥式HEAP包含6個字節

[9]輸入過濾器:鬥式EOS包含0個字節

[5]正在增長請求參數(BODY):名稱「b」,值:「test」

[4]輸入過濾器:已完成接受請求體(長度6)

[4]開始階段REQUEST_BODY

記錄當中一直提到的過濾器是modsecurity處理請求體和響應體的部分。

[4]鉤住嵌入過濾器:增長輸入轉發過濾器(r 81d0588)

[4]鉤住嵌入過濾器:增長輸出過濾器(r 81d0588)

Modsecurity無法送一大塊數據給請求處理程序,就會在調試日誌裏面增長一條消息,最後一條小時用來講明緩衝區中沒有數據了。

[4]輸入過濾器:轉發輸入:mode=0,block=0,nbytes=8192(f 81d2228,r 81d0588)

[4]輸入過濾器:轉發了6個字節

[4]輸入過濾器:發送了EOS

[4]輸入過濾器:輸入轉發完成

不久以後,輸出過濾器將會開始接收數據,就在此時引起RESPONSE_HEADERS規則:

[9]輸出過濾器:接收輸出(f 81d2258,r 81d0588)

[4]開始RESPONSE_HEADERS階段

一旦全部的規則都運行過了,modsecurity將繼續在緩存區中儲存響應體,以後運行RESPONSE_BODY規則。

[9]輸出過濾器:鬥式MMAP包含12個字節

[9]輸出過濾器:鬥式EOS包含0個字節

[4]輸出過濾器:完成接收響應體(緩衝區滿-12個字節)

[4]開始階段RESPONSE_BODY

再一次假設沒有鎖定規則,積累的響應體將會轉發給客戶端。

[4]輸出過濾器:輸出轉發完成

最後,記錄階段開始。先運行LOGGING規則來影響記錄動做,這以後若是有必要的話纔會啓動審計記錄子系統來記錄交互。審計記錄子系統發的消息將會是日誌中最後一條交互消息。在這個例子中,modsecurity告訴咱們他沒有發現交互當中任何值得關注的事情而且沒有理由記錄:

[4]開始記錄

[4]開始LOGGING階段

[4]審計記錄:忽略了一個不想管的請求。

 

 

 

 

 

 

 

 

 

 

 

處理階段:

ModSecurity 2.x容許把規則至於下述五個階段之一:

請求頭(REQUEST_HEADERS)

請求體(REQUEST_BODY)

響應頭(RESPONSE_HEADERS)

響應體(RESPONSE_BODY)

記錄(LOGGING)

爲了在規則執行時選擇階段,須要使用階段命令,能夠經過規則中直接使用,也能夠經過SecDefaultAction指令。

SecDefaultAction 「log,pass,phase:2」

SecRule REQUEST_HEADER:Host 「!^$」」deny,phase:1」

注意:要注意規則的執行時依賴於階段,即便是一個配置文件中的兩條鄰近的規則,只要是設置了在不一樣的階段中執行,他們就不會是一個接一個的生效。配置文件中的規則順序僅僅是在規則各自的階段中是重要的。在使用Skip和SkipAfter動做時尤其重要。

注意:LOGGING階段比較特別,不管前面的各個階段發生了什麼事,都會每一個事務的最後被執行。這就意味着哪怕是請求被中斷或是放行事務時都會被執行。

請求頭階段:

這個階段的規則會在apache完成請求頭的讀取後當即被執行(post-read-request階段),這時,尚未讀取請求體,意味着不是全部的參數均可用。若是你必須讓規則儘早運行,應把規則放在這個階段(在apache使用這個請求作某些事前),在請求體被讀取前作些事情,從而決定是否緩存這個請求體,或者決定你將但願這個請求體如何被處理(如是否以XML格式解析或不解析)。

注意這個階段的規則沒法影響apache的範圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子同樣還沒法獲得信息。VirtualHost指令有些例外,若是想在apache的locations使用ModSecurity規則,那麼他們應該運行在階段2,參考apache請求環/ModSecurity處理階段圖標。

請求體階段:

這是通用輸入分析階段,大部分傳統的應用規則不在這兒,這個階段你確定能收到參數(只有讀取過請求體後),在請求體階段,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應用尚未使用其餘的編碼方法。

響應頭階段:

發生在響應頭被髮送到客戶端以前,若是你想觀察響應發生前就在這兒運行,若是你想使用響應頭來決定你是否想緩存響應體也行。注意一些響應狀態碼(如404)在請求環的早期就被apache管理着,我也沒法觸發預期。加上apache在後面的鉤子上雙增長了一些響應頭(如日期、服務器和鏈接信息等),這些咱們沒法觸發和審查。在代理配置模式下或使用phase:5(logging)工做的較好。

響應體階段:

這是通用輸出分析階段,這裏你能運行規則截斷響應體(固然提供緩存)。這個階段你想檢查輸出的HTML信息公佈、錯誤信息和失敗的驗證文字。

日誌階段:

在日誌發生前運行的一個階段,放在這個階段的規則只能影響日誌記錄器如何執行,這個階段能夠檢測apache記錄的錯誤信息,在這個階段你不能拒絕或阻斷鏈接,由於太遲了,這個階段也容許檢測其餘的響應頭,如那在phase:3或者phase:4階段中不可用的。注意在這個階段,你應當當心不要繼承破壞性的動做到規則中,這樣的狀況在ModSecurity2.5.0及其之後的版本中被當作配置錯誤。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Embedded vs. Reverse Proxy Mode

嵌入式與反向代理模式

Modsecurity並不關心本身是否處於嵌入式或反向代理模式,反向代理模式時,Apache負責向後端服務器轉發數據並接收發回來的數據,因此modsecurity不用關心。只有一點小區別,下面我列出來供參考:

一、  嵌入式時,一般會使用一個資源(一個script腳本或者一個file文件)來知足每個請求。Modsecurity規則會檢查這些文件(SCRIPT_*容許訪問的變量族)的屬性。反向代理模式時,其實是由後端服務器來知足全部的請求。也就是說不使用本地資源,而且相關變量的使用一點意義也沒有。

二、  嵌入式時,

 

 

 

 

 

 

 

Integrating with ClamAV

結合clamav

Clamav是一個開源防病毒軟件,若是你已經安裝了Clamav,你能夠使用下面的腳本掃描modsecurity的文件。(Clam AntiVirus是一個類UNIX系統上使用的反病毒軟件包。主要應用於郵件服務器,採用多線程後臺操做,能夠自動升級病毒庫。)

 

 

 

 

3 Configuration

Modsecurity已經編譯好而且準備好運行了,如今咱們能夠對他進行配置。這一段落以及不少分段,會講到modsecurity配置的每一部分,並明確的配置每個小細節。

Table 3.1. Main configuration directives

Directive                          Description

SecArgumentSeparator                Sets the application/x-www-form-urlencoded parameter separator

SecCookieFormat                     Sets the cookie parser version(設置cookie解析器版本)

SecDataDir                           Sets the folder for persistent storage(設置用於持久性存儲的文件夾)

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各類各樣的選項

這一段落的指令幾乎不會用到,可是有了他們,咱們能夠徹底掌握modsecurity的配置選項。你也應該意識到他們的存在,並在一些罕見的須要使用它們的時候會使用它們。

能夠使用SecArgumentSeparator指令改變application/x-www-form-urlencoded編碼的參數separator。application/x-www-form-urlencoded編碼是用來傳輸全部的GET參數和大部分POST參數的。

SecArgumentSeparator &

實際上,全部的application都使用一個&來達到這個目的,可是也有一些不會。HTML4.01說明書建議,爲了方便,application支持使用分號做爲separators(參考段落B.2.2URI屬性值中的&)。PHP則能夠把任何字符黨組separator。

SecCookieFormat指令會從modsecurity支持的兩個cookie解析器當中選出一個。實際上,全部的applications都使用Netscape-style cookie(有時也當作version 0)因此,幾乎沒有理由來改變這個設置:

SecCookieFormat 0

 

 

4 Logging

這一段落詳細的講述了modsecurity的logging能力。Modsecurity所作的工做中,Logging佔了大部分。

Debug Log調試日誌

調試日誌是你進行疑難排解的最基本的工具,尤爲是在你剛開始學習modsecurity怎麼工做的時候。

Table 4.1. Debug log directives

Directive           Description

SecDebugLog         Path to the debug log file

SecDebugLogLevel    Debug log level

理論上調試日誌有10個等級,但不是所有都使用。1-3等級的消息是有意義的,而且被複制到Apache的error log中。更高等級的消息大部分是用來解決問題和調試的。

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!

你會想把調試日誌的等級控制的很低(當你想把全部的消息複製到調試日誌時,使用等級3;或者你只想把它們放在error log中時,使用等級0)。這是由於調試日誌的消息會超過50條(每一條消息都是一條I/O操做),而且平鉅額每一個交互至少有7KB的數據。爲每個交互都記錄全部的消息將會消耗大量的資源。

一個簡單的調試日誌行是這樣的:

[18/Aug/2009:08:18:08 +0100] [192.168.3.111/sid#80f4e40][rid#81d0588][/index.html]}

[4] Initialising transaction (txid SopVsH8AAAEAAE8-NB4AAAAD)。

這一命令行以元數據開頭,而元數據一般比消息自己還要長。

 

 

 

 

 

 

 

 

 

 

 

 

 

5 Rule Language Overview規則語言概述

 

Operators

截止到目前,全部的例子都是假設使用正規模式對輸入進行匹配。儘管正則表達式很是有用,咱們仍是常常想作一些其餘的事情。這時候就會用到運算符。事實是modsecurity老是使用一個運算符,而不是你在一個規則中指定一個運算符它才使用運算符,不指定的話,它就使用正規模式匹配。因此做爲開始,下面的規則明確指定了一個運算符——正規模式正在匹配一個!

SecRule ARGS:username 「@rx ^(admin|root)$」

上面的規則檢查請求用戶名是admin仍是root。你也許已經注意到了幾件事情:

運算符以@開頭

運算符老是被放在第二條SecRule token開頭(token貌似指的是引號部分)

運算符後面有一個空格。不管運算符後面是否是一個簡單的運算符參數。@rx運算符的參數是一個正則表達式

當規則中帶有明確的運算符的時候,你須要在token周圍使用雙引號,token內部老是有一個空格。沒有雙引號,Apache將會混淆。

運算符之因此強大在於它提供的普遍的功能。表5.9中列出的字符串操做符,使用最頻繁。目前你已經看到了足夠的使用正規模式匹配的例子。除了簡單的匹配運算符(@beginsWith,@endsWith等)以外,modsecurity還提供了相似的匹配,能夠當即匹配大量的模式。@pm@pmFromFile就是這麼用的。

String matching operators字符串匹配運算符

字符串匹配運算符從輸入提取一個字符串,而後嘗試將他和提供的參數進行匹配。@rx和@pm是常用的運算符,由於他們的versatility(@rx)和速度(@pm),剩下 運算符也有用,尤爲是當你 須要不一樣種類的擴展的時候,@rx和@pm都不支持。

Table 5.9. String matching operators

Operator                   Description

@beginsWith                   Begins with

@contains                      Contains

@endsWith                     Ends with

@rx                            Regular pattern match(正規模式匹配)

@pm                           Parallel matching(平行匹配)

@pmFromFile  (@pmf in v2.6)   Parallel matching, with arguments from a file(與文件中的參數進行平行匹配)

@streq                         String equal to

@within                        Within

Numerical operators數字運算符

表格5.10,使比較數字值變得很簡單(previously you had to resort to使用複雜的正則表達式)

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

動做會使modsecurity精簡(tick)。

 

 

Disruptive actions

表格5.13指定了規則成功匹配時將會作什麼。每一條規則都必須和一個disruptive動做結合。Pass動做時惟一例外,當規則匹配時他會繼續處理規則。其餘全部的動做都會以某一指定方式進行攔截。

Table 5.13. Disruptive actions

Action        Description

Allow           Stop processing of one or more remaining phases(中止一個或更多的剩下階段的處理)

Block           Indicates that a rule wants to block(規則會攔截)

Deny           Block transaction with an error page(用一個錯誤頁面攔截交互)

drop            Close network connection(關閉網絡鏈接)

pass            Do not block, go to the next rule(不攔截,繼續下一條規則)

proxy           Proxy request to a backend web server(對後端服務器進行代理請求)

redirect          Redirect request to some other web server()

Flow actions

表格5.14中的動做會轉變規則在一個段中處理的方式。

 

Table 5.14. Flow actions

Action     Description

chain       Connect two or more rules into a single logical rule(把兩條或更多的規則在一條簡單的邏輯規則裏進行鏈接)

skip        Skip over one or more rules that follow(跳過緊接下來的一條或幾條規則)

skipAfter    Skip to the rule or marker with the provided ID(跳到指定ID號的規則或標誌)

Metadata actions

表格5.15中的metadata actions提供了規則的附加信息,把這些信息和error消息結合起來就會更容易理解他們爲何發生的。

Table 5.15. Metadata actions

Action   Description

id         Assign unique ID to a rule(給規則分配單獨的ID號)

phase     Phase for a rule to run in(規則在哪一段中運行)

msg       Message string(消息字符串)

rev        Revision number()

severity    Severity

tag        Tag

Variable actions變量動做

5.16中的變量動做處理變量,你能夠用他們來對變量進行設置、改變和刪除。

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(一個時間段以後刪除變量)

initcol         Create a new persistent collection(建立一個新的連續的集合)

setenv        Set or remove an environment variable(設置或刪除環境變量)

setvar        Set, remove, increment or decrement a variable()

setuid        Associate current transaction with an application user ID (username)(用應用用戶ID、用戶名和當前交互結合起來)

setsid        Associate current transaction with an application session ID(用應用會話ID和當前交互結合起來)

Logging actions

5.17的Logging動做會影響日誌產生的方式。須要使用ctl動做來總體控制交互記錄。

Table 5.17. Logging actions

Action                Description

auditlog                  Log current transaction to audit log(把當前交互記錄獲得audit log裏面)

log                      Log error message; implies auditlog(記錄錯誤信息,implies auditlog)

logdata                  Log supplied data as part of error message()

noauditlog                Do not log current transaction to audit log(不把當前交互記錄到auditlog中)

nolog                    Do not log error message; implies noauditlog()

sanitiseArg               Remove request parameter from audit log(從auditlog中刪除請求參數)

sanitiseMatched           Remove parameter in which a match occurred from audit log(從audit log中刪除匹配參數)

sanitiseRequestHeader     Remove request header from audit log(從audit log中刪除請求頭)

sanitiseResponseHeader   Remove response header from audit log(從audit log中刪除響應頭)

Special actions

5.18的special動做是sort的gateways,使用他們能夠訪問其餘功能類。Ctl動做有幾個本身的子動做,它能改變交互的引擎配置,並且只能改變當前交互的。MultiMatch規則產生了一種特殊的匹配方式,在每一次轉換以後,規則裏的運算符都以這種方式執行(一般狀況下,當全部的轉換完成以後運算符只執行這一次)。能夠使用t動做來使用0個或更多的轉換,在運算符執行以前對變量進行轉換。

Table 5.18. Special actions

Action      Description

ctl            Change configuration of current transaction(改變當前交互的配置)

multiMatch    Activate multi-matching, where an operator runs after every transformation()

t             Specify transformation functions to apply to variables before matching(匹配以前指定變量的轉換函數)

Miscellaneous actions

Miscellaneous動做包含了不屬於任何組的動做。

Table 5.19. Miscellaneous actions

Action       Description

append        Append content to response body

exec          Execute external script(執行外部腳本)

pause         Pause transaction(暫停交互)

prepend       Prepend content to response body()

status         Specify response status code to use with deny and redirect(指定響應狀態碼deny和redirect)

xmlns         Specify name space for use with XPath expressions(爲APath表達式指定響應空間)

 

 

 

 

6 Rule Language Tutorial規則語言使用指南

Introducing simple rules and operators

最簡單的規則值指定一個變量和一個正則表達式。下面的例子中,檢查request URI,看看能不能和正則表達式模式<script>進行匹配。

SecRule REQUEST_URI <script>

正是因爲modsecurity容許一個規則不指定運算符,他會假設正則表達式就是一個運算符,這個簡單的規則才能成立。

 

SecRule REQUEST_URI "@rx <script>"

注意由於第二個參數含有空格,必須使用雙引號。Modsecurity支持不少運算符,有些類似,但一般會有不一樣的執行特色。例如,上面的例子中我使用的正則表達式模式(<script>)還不足以成爲一個模式。只是一個字符串而已。由於他不包含任何特殊字符。我也能使用@contains運算符寫一個一樣的規則:

SecRule REQUEST_URI "@contains <script>"

 

Working with variables

在一條規則當中你能夠指定任意多的變量,只要使用「|」字符他們分開便可。

SecRule REQUEST_URI|REQUEST_PROTOCOL <script>

對集合這個變量來講,包含了一條以上的消息。例如ARGS變量,包含了一個交互中全部的請求參數。你能夠使用「:」運算符來指定集合當中的一個成員,下面這條規則只查看名字爲p的參數:

SecRule ARGS:p <script>

在同一條規則當中你能夠屢次使用同一個集合:

SecRule ARGS:p|ARGS:q <script>

實際上,「:」很是有效,使用正則表達式的時候,你能夠使用「:」來指定名字,當參數的名字在運行期間會發生改變的時候,這個功能很是有用。下面這條規則會找出全部名字是以字母「p」開頭的參數,捕捉密碼或者pea這樣的參數:

SecRule ARGS:/^p/ <script>

若是你沒有限制規則只能訪問集合中的某些成員時,modsecurity會認爲你會用集合的全部成員。當你不知道一個頁面會使用什麼參數的時候,使用起來會很handy。並非全部的結合均可以這麼使用(ARGS能夠,可是ENV不能夠)。可是。。。

例如,當一個請求含有p、q、z三個參數時,ARGS能夠以下擴展:

[4] Expanded "ARGS" to "ARGS:p|ARGS:q|ARGS:z".

 

下面這條規則將會檢查除z之外的參數:

SecRule ARGS|!ARGS:z <script>

Combining rules into chains

一個規則中指定一個以上的變量時,能夠使用OR邏輯運算符。任一個變量匹配,規則就會匹配。也能夠使用邏輯AND把幾個規則組合成一個。若是你想寫一條規則,實如今p和q兩個參數中發現一些東西,規則就匹配,你能夠這樣寫:

SecRule ARGS:p <script> chain

SecRule ARGS:q <script>

這就叫rule chaining,chain這個動做構成了兩個或更多的規則鏈,並有效的創建了帶有一個以上的evaluation步驟的一條簡單規則。鏈的第一條規則老是運行,而對子規則來講,只有當同一條鏈中它前面的規則都運行完了以後他才運行。。。

 

Operator negation否認運算符

在運算符前面放感嘆號「!」,就會獲得否認的結果。例如:你想寫一條規則,當用戶名既不是admin也不是root時規則匹配(與以前的例子目的相反):

SecRule ARGS:username 「!@rx ^(admin|root)$」

不要把運算符否認和規則否認混淆。只有當一個規則只對一個變量使用的時候兩個纔是同樣的。可是若是變量多於一個的話,狀況就變了:

SecRule ARGS:p|ARGS:q 「!@eq 5」

上面的規則只要有一個變量不等於5就會匹配。若是你想寫一條規則實現兩個變量都不等於5時才進行匹配,你就必須使用規則鏈:

SecRule ARGS:p "!@eq 5" chain

SecRule ARGS:q "!@eq 5"

Variable counting

提問:如何檢查沒有出現的一些東西,好比常見的規則,把全部的參數放在一個請求中:

SecRule ARGS <script>

一個請求不含有任何變量時,ARGS會擴展成0個變量。若是沒有變量的話,運算符將會運行失敗,規則(或規則鏈)將不會匹配。

答案就是使用modsecurity的能力去計算集合中變量的個數。使用&運算符能夠查看ARGS,檢測沒有參數的狀況:

SecRule &ARGS 「@eq 0」

&運算符能夠應用於任意集合,包括集合的某一部分。下面這條規則當請求中含有一個以上username參數的時候將會匹配。

SecRule &ARGS:username "!@eq 1"

Using actions

目前這個指南中的大部分例子都沒有用動做。剛開始咱們只關注檢測機制。實際上,連一條簡單動做都不指定的話,你是寫不出規則的。並且,寫獨立的規則而不是讓規則依賴於默認動做,是一個很好的習慣。

SecRule第三個參數和SecAction第一個參數是動做。一個規則能夠沒有動做,也能夠有一個或一個以上的規則。若是有一個以上的動做,用「,」和許多空格進行分隔。下面這條規則指定了兩個動做:

SecRule ARGS K1 log,deny

有些動做帶有參數,你須要在動做和參數之間放一個「:」。使用狀態碼404拒絕,規則以下:

SecRule ARGS K1 log,deny,status:404

最後,若是提供的參數帶有空格或逗號,須要用單引號把參數值括起來這種參數處理方式常常用於消息中:

SecRule ARGS K1 「log,deny,msg:’Acme attack detected’」

在msg動做參數周圍使用單引號以外,我把整個指令參數用雙引號括起來了。這樣Apache纔會正確解析指令行。稍後你將會看到一些動做包含複雜的參數(如ctl和setvar),如今討論的語法一樣要應用於他們。

 

Understanding action defaults

你已經瞭解瞭如何指定規則動做,可是若是你不指定的話會發生什麼呢。Modsecurity有一個默認的動做列表。當你在配置中添加新的規則時,這條規則的動做列表和默認動做列表合併。Modsecurity2.5.11中,默認動做類表是phase:2,log,auditlog,pass,可是你能夠隨時使用SecDefaultAction指令來把它覆蓋。最簡單的例子是,當增長的規則裏面沒有動做時,就會替換性的使用默認動做列表。一下面這條規則爲例(假設配置中沒有其餘的規則或默認動做。)

SecRule ARGS K1

至關於:

SecRule ARGS K1 phase:2,log,auditlog,pass

一般當一個規則有一個或一個以上的動做時,合併意味着兩件事情中的一件:

Rule action replaces an action in the default action list規則動做代替默認動做列表中的一個動做

這很是典型的發生在disruptive動做中,一個每一條規則只能有一個disruptive動做。若是在默認動做列表中和新的規則中都指定了一個disruptive動做,那麼規則中的那個將會把默認的覆蓋掉。

Rule action is appended to the ones in the default action list規則動做添加到默認動做列表中去

有些動做會在動做列表中出現不止一次。像不少non-disruptive動做,例如:t,setvar,ctl等等。有些狀況下規則動做能夠徹底去除默認動做,但怎麼作到的取決於動做。例如轉換動做指定none做爲轉換函數(t:none)的話,就是清空列表從新開始。

 

 

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實用規則寫做

Whitelisting白名單

一般寫規則集是爲了挑選出不尋常的請求,但事實是大多數網絡包含一個或多個請求源,這些請求源不只是不尋常的,並且是所須要的。網絡越複雜,就越須要使用白名單。大多數狀況下,一個粗陋的監視腳本監視你的網站,看上去更像是一個粗陋的Perl腳本攻擊你的網站。你可能會把安全測試外包給第三方,而且你不想你的規則干擾他們的工做。最後,即便你沒有這些問題,你也沒法避免一些不能預料的狀況,Apache會給本身發送請求。

Whitelisting theory

 

Integration with other Apache modules與Apache其餘模塊整合

Apache最大的優勢就是它的模塊化。大多數狀況下模塊是單獨使用的,可是多功能模塊能把一個模塊與另外一個模塊聯繫起來。一般modsecurity避免重複實現一些其餘模塊已經實現了的功能,即便是帶有安全標籤的功能。向其餘模塊發送指令或者從其餘模塊接收指令須要時間。

Apache內部有兩個機制實現模塊之間的聯繫:

Environment variables環境變量

一般內部模塊使用環境變量來實現與其餘模塊之間的信息交換或者相互影響。當兩個模塊須要聯繫時,要配置接受狀態的模塊來監聽環境變量,並能對環境變量進行做用。不少模塊創建之初就帶有環境變量,因此若是你發現一個模塊支持環境變量,那就意味着你可以用這個環境變量經過setenv動做和modsecurity的模塊進行通訊。由於在modsecurity內部你可以實用ENV集合檢索已命名變量的值,因此你能夠不受限制的使用其餘模塊提供的信息來寫規則。

Optional functions可選函數

對一個模塊來講,有了可選函數,就能夠輸出一個或者更多的函數供其餘模塊使用。Modsecurity在可選函數頂部創建了本身的擴展API接口。擴展API會在第十三章,Extending Rule Language.詳細講解。

你可能感興趣的模塊包括:

•mod_deflate

• mod_headers

• mod_log_config

• mod_rewrite

• mod_setenvif

 

Conditional logging有條件的日誌記錄

一般狀況下,日誌會把全部Apache處理過的交互都記錄下來,可是有時候你只想記錄一部分交互。這就是conditional logging你能夠使用Apache的環境變量描述你想記錄哪些東西。

• 默認記錄 ,可是若是設置了環境變量就不記錄

• 默認不記錄,可是若是設置了環境變量就會記錄

下面的例子,建立了一個自定義訪問日誌,只記錄指定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模塊進行頭操縱。Header和RequestHeader指令知道怎樣去檢查我前面提到的環境變量。也就是說你能夠使用Header和RequestHeader指令有條件的改變請求和響應頭。像之前同樣,用modsecurity檢查條件,若是條件符合的話設置環境變量。

Mod_Header模塊是一個Apache平臺上對請求頭和響應頭進行定製的模塊,它的強大之處是能夠和ModSecurity的SetEnv指令聯合使用,如:(張宏超)

下面的例子中使用modsecurity引導mod_headers刪除session(會話)cookie:

#Simulate a condition that would want us

#to force the user to use another session(模擬一下,強迫用戶使用另外一個會話)

SecRule ARGS attackPattern 「phase:2,t:none,log,pass,setenv:DISABLE_OUTBOUND_SESSION」(當遇到攻擊attackPattern時,modsecurity會給mod_headers發送環境變量)

#Expire session cookies when instructed(mod_headers接收到命令時時終止會話cookies)

Header set Set-Cookie 「PHPSESSION=;expires=Fri,31-Dec-1999 00:00:00 GMT」 \

Env=DISABLE_OUTBOUND_SESSION (當mod_headers接收到環境變量DISABLE_OUTBOUND_SESSION時就會刪除會話cookie,並給用戶返回另外一個會話)

這個例子簡單的來講就是當發現某我的在攻擊咱們的網站時,咱們就強制從新給他發一個session(張宏超)

(這個規則編譯時候須要有action id號,而且須要在httpd配置文件中加載模塊:

LoadModule headers_module modules/mod_headers.so)

Securing session cookies保護會話cookies

在支持用戶認證的web應用中,會話cookie功能做爲臨時口令。用戶只提供他們的身份證實一次,假設證實是正確的,將會把他們的會話做爲認證標記。今後刻起,只要知道會話ID就能夠徹底控制此次會話。應該很是當心建立會話cookie,以保證他們的安全。在不少應用中,能夠經過修改cookie結構的兩個方面提升他們的安全:

Use of the httpOnly flag使用httpOnly標誌

Ie發明了httpOnly,目的是防止JavaScript訪問會話cookies。攻擊者常用JavaScript成功實現XSS攻擊,而後盜竊會話ID。由於只有服務器編碼使用會話cookies,因此若是阻止JavaScript訪問並不會損失什麼。使用httpOnly會使會話劫持變得更困難。

Use of the secure flag使用secure標誌

若是網站使用SSL,攻擊者就沒法訪問在網站和用戶之間傳輸的數據。當使用SSL時,常常忽略了把會話cookies標記爲secure。這種疏忽會使用戶的會話cookies陷入危險,使攻擊者可以訪問響應的會話。

若是你使用的是Apache2.2.4或更高版本,你就可以只使用兩條mod_headers指令就能夠很快的解決上面這些問題。下面的例子使用PHP提升了會話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頭來建立新的cookies,因此經過查看Set-Cookie頭,就能夠找出沒有設置指望標誌的會話cookies。若是找到設置錯誤的cookie,咱們會修改頭並加上標誌。例子使用了不多用可是頗有用的特性:

兩個正則表達式都以(?i)開頭,保證匹配動做不區分大小寫。

第二部分裏面,一個negative lookahead assertion(否認先行界定符),形成只有當界定符裏面的bits沒有在頭裏面出現時纔會匹配整個模式。

第四個參數使用反響引用($1),第四個參數包含的值,會替換現存的Set-Cookie的值,現存的頭值會替換反向引用($1)。

 

Advanced Blocking高級鎖定

簡單的鎖定是直截了當的。

使用deny狀態碼和redirect(重定向)狀態碼

配置用戶響應頁面(單獨一個單元仍是應用程序安裝的一部分?)

不能鎖定第五階段

鎖定第三和第四階段會有困難

加上可能帶有mod_deflate的版本

蜜罐鎖定(每一個IP地址/段重定向)

指定了何時鎖定但沒指定怎麼鎖定

延遲(階段)鎖定——設置一個標誌評估段中的規則。最大化的檢測。

基於分數的鎖定(每次交互)

持續的基於分數的鎖定(每一個IP地址,段,用戶)

外部鎖定

嚴重性有什麼用

能夠在鎖定中使用標記嗎

用於鎖定的名譽數據庫(rbl)

用於鎖定的GeoIP

 

Making the most of regular expressions充分使用正則表達式

儘管modsecurity支持不少操做符,正則表達式如此強大並且功能普遍,由於在規則中常常見到正則表達式。Modsecurity使用Per1兼容正則表達式庫http://www.pcre.org ,更常稱爲PCRE。這是一個周所周知應用普遍的正則表達式庫。Apache也使用的PCRE。正則表達式強大的令你驚奇,你會發現它比你想象的能幹。這個章節將會強調PCRE最重要的方面以及modsecurity是如何使用它的,但這也只是冰山一角。強烈建議你熟悉一下PCRE參考資料http://www.pcre.org/pcre.txt ,包含了你須要知道的全部東西。

How ModSecurity Compiles Patternsmodsecurity怎樣編譯模式

正則表達式須要先編譯後使用。編譯是轉化成有效的內部表示。在configure-time,編譯步驟作儘量多的工做來提升庫的性能,編譯標誌會影響模式的使用,你須要注意一下他們。在最重要的地方,即@rx操做符,使用正則表達式,modsecurity用了兩個編譯標誌:

 

PCRE_DOLLAR_ENDONLY

默認,一個美圓通配符$將會在字符串結尾匹配換行符。用戶一般會發現一件難以想象的事情,規則徹底控制着哪一個地方容許什麼東西,可是$卻把規則打亂了。經過使用PCRE_DOLLAR_ENDONLY來編譯模式,$只能在輸入的結尾進行匹配。

 

如下是從百度文庫裏搜索的:

D(PCRE_DOLLAR_ENDONLY)

若是設定了此修正符,模式中的行結束($)僅匹配目標字符串的結尾。沒有此選項時,若是最後一個字符是換行符的話,也會被匹配在裏面。若是設定了m修正符則忽略此選項。

 

PCRE_DOTALL

默認,模式中的原點元字符匹配除了指定換行符以外的全部字符。在一個有潛在弱點的安全上下文中,攻擊者使用換行符打破攻擊有效載荷並阻止模式匹配。使用PCRE_DOTALL集,一個原點元字符會真正的匹配任何字符。

如今你知道了要使用哪些編譯標誌,去了解兩個不用的很重要:

PCRE_CASELESS

匹配時忽略大小寫。

 

如下是從百度文庫裏搜索的:

S(PCRE_DOTALL)

若是設定了次修正符,模式中的原點元字符(.)匹配全部的字符,包括換行符。沒有此設定的話,則不包括換行符。

 

 

 

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改變模式編譯的方式

若是你對modsecurity編譯模式的方式不滿意,可是你會對一件事情感到滿意,那就是你能夠用PCRE在模式內部能夠覆蓋編譯標誌。好比下面這個例子:沒有使用任何轉換函數,不管使用什麼案例,它將會匹配單詞attack

SecRule ARGS 「(?i)attack」 phase:2,t:none

把(?i)部分放在模式開頭,爲整個模式觸發PCRE_CASELESS標誌。也能夠經過在裏面方修飾語的方法,爲模式的一部分修改設置。

SecRule ARGS 「attack (?i)keyword」 phase:2,t:none

上面這個例子將會匹配attack keyword和attack KEYWORD,但不會匹配ATTACK keyword。若是你在次模式中使用修飾語,只修飾餘下的模式:

SecRule ARGS 「(ken(?i)word) attack」 phase:2,t:none

上面的例子將會匹配keyWORD attack,但不會匹配keyWORD ATTACK或者KEYWORD attack。

在字母以前使用破折號-來刪除一個標誌。下面的模式打亂了modsecurity默認使用的PCRE_DOTALL標誌:

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常見模式問題

正則表達式出錯很常見,可是有兩個更加常見:

Forgetting to escape the dot metacharacter        忘記忽視元字符點.

很容易遺忘一件事情,那就是點.是一個須要被忽視的元字符。由於IP地址裏面有不少點,因此當你寫一個模式來匹配IP地址的時候,常常發生這種事情。若是沒有忽視點,點將會匹配任意一個字符,和非元字符進行匹配。

Not using the ^ and $ anchors when matching entire input當要匹配整個輸入的時候沒有使用^和$錨

當你要匹配整個輸入的時候,須要使用^和$。者可以保證,無論你寫的是什麼模式,都可以進行所有匹配。若是你忘記了使用^,攻擊者就是在你的模式以前發送任意內容,若是是忘記了使用$,攻擊者就會在你的模式以後發送任意內容。若是沒有錨,模式將會匹配中間的子字符串,而忽略其餘任何東西。

 

Regular Expression Denial of Service正則表達式拒絕服務攻擊

正則表達式拒絕服務攻擊(又稱ReDoS)是一個比較使人費解的問題,它能影響每個正則表達式寫手。一些正則表達式結構當遇到邊界案例的時候性能變得不好(指數級的)。你一不當心會寫出一個會被暗中操縱的模式,攻擊者從外面消耗你大部分服務器資源。

下面是從Alex’s和Adar’s借用的一些變量模式的例子:

(a+)+

([a-zA-Z]+)*

(a|aa)+

(a|a?)+

(.*a){x},for x>10

 

Resources

當和正則表達式一塊兒工做的時候會變得不知所措時,沒關係張。徹底正常而且會獲得及時解決。想要精通正則表達式不必買書,可是若是買的話確定會有幫助的。關於書我只關注一點,就是他們都能涵蓋大部分正則表達式特性,並且我惟一感興趣的是PCRE。你至少應該看兩本書:

Mastering Regular Expressions。做者:JeffreyFriedl(O’Reilly,2006),廣泛認爲是正則表達式的經典著做。

Regular Expressions Cookbook,做者:Goyvaerts和Steven Levithan(O’Reilly,2009),是正則表達式最近增長的版本,更適合實踐學習。

 

 

 

 

 

 

 

Part II: Reference Documentation

14 Reference Manual

Configuration Directives配置指令:

下面一節概述了modsecurity全部的指令。大部分的modsecurity指令能被用於Apache內,例如虛擬主機,地址,地址匹配,目錄等等,固然還有其餘,可是,若是在主配置文件裏只能使用一次,這個在下面的章節會詳細介紹。

這些規則,和和新規則庫,應該放在httpd.conf文件外面,而後用include指令包含進來,這樣有利於更新或整合規則。若是你想本身定義一個規則,那麼你應該建立一個文件命名爲modsecurity_crs_15_customrules.conf而後放在覈心規則所在文件夾,這樣,你的自定義規則將在ModSecurity標準的核心規則庫後調用,但在其餘核心規則前調用,這是頗有用的,若是你的站用了」allow」指令它能夠檢查覈心規則是否誤報。

 

注意

建議不要修改核心規則文件,除非你把它放在你本身的規則庫裏,這樣當你從ModSecurity更新時會方便些。

 

SecAction action1,action2,action3

無條件執行動做清單,它只接受第一個也是惟一的一個參數,其這個參數的使用規則與SecRule的第三個參數的使用規則相同,SecAction是你想無條件執行一個動做時的最好選擇,這個指令不受任何交互條件的限制,SecRule指定了一些動做,而這些動做的發生是基於請求/響應對數據的檢查,當你想執行initcol動做時,這個指令一般被用來初始化持久化集合類。例如:

SecAction nolog,phase:1,initcol:RESOURCE=%{REQUEST_FILENAME}

 

SecArgumentSeparator character

SecArgumentSeparator ;

指定的字符做爲application/x-www-form-urlencoded內容的分隔符,默認是&,很是少的狀況下應用會使用分號(;)。這個指令用於後臺WEB應用在使用非標準的參數分隔符,若是沒有在每個WEB應用中合理設置這個指令,那麼ModSecurity可能沒法適當的分析全部的參數,而且規則匹配的效果可能會顯著的下降。

SecAuditEngine On|Off|RelevantOnly

配置審計日誌引擎的開啓與否,On-默認狀況下記錄全部事務的日誌,Off-默認狀況下不記錄全部事務的日誌,RelevantOnly-默認只記錄事務中由warning或error觸發的日誌,或者記錄一些特地考慮過的狀態碼

在當前事務能夠經過ctl操做進行設置或修改

如下例子說明不一樣的審計指令一塊兒使用:

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

定義審計日誌文件路徑,伴隨服務器運行開始,這個文件會以root打開,你不能爲非root權限的用戶對這個文件或存儲這個文件的目錄有可寫權限。若是串行審計日誌格式使用後,這個文件將被用做審計日誌條目的存儲。若是同時審計日誌格式使用這個文件那就被當作索引,幷包含全部的審計日誌文件建立信息。若是你計劃使用同時審計日誌併發送審計日誌數據到遠程主機或商業ModSecurity管理平臺,那麼你須要配置和使用ModSecurity日誌蒐集器(mlogc)並使用下述格式去獲得審計日誌:

SecAuditLog 「|/path/to/mlogc/path/to/mlogc.conf」

 

SecAuditLog2 /path/to/auditlog2

SecAuditLog2 /usr/local/apache/logs/audit2.log

定義同時日誌啓用下的第二審計日誌索引文件路徑,在本指令使用以前必須經過SecAuditLog定義主審計日誌,另外這個文件僅用於當同時審計日誌使用時複製主審計索引文件,不能用於非同時審計日誌的狀況。

 

SecAuditLogParts PARTS

SecAuditLogParts 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 REGEX

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

配置哪些響應狀態碼與審計日誌的目的密切相關,必須將SecAuditEngine設置爲RelevantOnly,其參數是個正則表達式。

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

 

SecAuditStorageDir /path/to/storage/dir

SecAuditStorageDir /usr/local/apache/logs/audit

配置同時審計日誌條目存儲時的路徑,必須同時設置SecAuditLogType,啓動apache潛,須要先建立目錄,並且必須讓服務器用戶運行時能夠新建文件。

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

 

SecAuditLogType Serial|Concurrent

配置使用審計日誌記錄機制的類型,若是使用Concurrent類型必須指定SecAuditLogStorageDir

Serial-全部的審計日誌條目都被存儲在主審計日誌記錄文件中,隨意使用是很方便,可是他很慢,由於任什麼時候候只有一個文件被打開也只能寫入一條審計日誌條目。

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

 

SecCacheTransformations(Deprecated/Experimental)

SecCacheTransformations On|Off [options]

SecCacheTransformations On 「minlen:64,maxlen:0」

控制transformations的緩存,2.5.6開始,緩存是默認關閉的,當時都不同意開啓並下降爲實驗性。

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

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

有如下可選項(逗號分隔):

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

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

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

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

 

SeChrootDir /path/to/chroot/dirm

配置web服務器工做的安全目錄

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

一、  DNS查詢沒法工做(這是由於這一功能在chroot操做後,一經查詢就要求加載一個共享庫)

二、  你不能使用PHP發送郵件,由於PHP使用sendmail但sendmail在安全目錄以外

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

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

 

SecComponentSignature 「COMPONENT_NAME/X.Y.Z(COMMENT)」

SecComponentSignature 「Core Rules/1.2.3」

擴展組件簽名爲modsecurity簽名,這個指令可讓ModSecurity增長不少有意義的已知組件,完整的簽名被記錄在事務審計記錄中,應該讓ModSecurity模塊和規則集做家使用,使調試更加容易。

 

SecContentInjection (on|off)

啓用內容注入使用行爲附加並加在前面

SecCookieFormat 0|1

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

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

1-       使用version 1 cookies

 

SecDataDir /path/to/dir

SecDataDir /usr/local/apache/logs/data

指定連續數據(如ip地址數據,session數據等)存儲的路徑,initcol、setsid和setuid須要用到這個指令,必須讓服務器用戶對這個目錄可寫

 

SecdDebugLog /path/to/modsec-debug.log

SecDebugLog /usr/local/apache/logs/modsec-debug.log

指定modsecurity調試日誌文件的路徑

Secdebugloglevel 0|1|2|3|4|5|6|7|8|9

配置冗長的調試日誌數據,1~3級別一直用於產生apache的錯誤日誌,由於你能夠在產品中一直使用0級別做爲默認的日誌級別,級別5用於調試,不建議在產品中使用這麼高級別的日誌,過分的日誌記錄會顯著服務器的性能。

可用的值以下:

0-不記錄,1-僅僅錯誤日誌(攔截請求),2-警告,3-注意,4-事務控制的細節,5-同上,但包含每個信息控制的信息,9-記錄全部,包括每個調試細節信息

 

SecDefaultAction action1,action2,action3

定義匹配規則後的默認動做,例:

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

備註:SecDefaultAction指令後的規則都繼承這一設置,除非爲某條規則制定了一個特定的動做,或者制定了新的 SecDefaultAction。特別注意到,未經處理的disruptive動做時不容許的,可是在SecDefaultAction中一不當心就會繼承了使用disruptive動做。

默認值是minimal

SecDefaultAction phase:2,log,auditlog,pass

注意:SecDefaultAction必須指定一個disruptive動做和處理階段,並且不能包含元數據動做。

警告:SecDefaultAction不集成交叉配置的內容。

 

SecGeoLookupDb /path/to/db

定義地理數據文件路徑,例:

SecGeoLookupDb /usr/local/geo/data/GeoLiteCity.dat  從maxmind.com提取的免費數據文件

 

SecGuardianLog |/path/to/httpd-guardian

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

SecGuardianLog |/usr/local/apache/bin/httpd-guardian  使用默認的httpd-guardian能夠防止客戶端在1分鐘內請求120次或5分鐘內請求360次。

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

隨着ModSecurity發佈,開發一個先進的外部保護工具將是一個重點。然而一個完整功能的工具已經能夠作爲apache httpd工具項目的一部分,工具名爲httpd-guardian,它能用於防護DoS,使用黑名單列表(同一個項目中)和基於iptables(linux)或者基於pf(*BSD)的防火牆協同工做,動態的過濾黑名單中的惡意ip地址。也能夠和SnortSam協同工做。若是已經配置過httpd-guardian,你只須要在apache配置中添加一行就能夠部署他:

SecGuardianLog |/path/to/httpd-guardian

 

Secmarker ID

Secmarker 9999

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

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」 \

  「log,deny,log,status:400,id:15,msg:’Request Missing an Accept Header’」

SecMarker 99

 

SecPcreMatchLimit

 

SecPdfProtect On|Off

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

 

SecPdfProtectMethod method

SecPdfProtectMethod TokenRedirection(默認)

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

 

SecPdfProtectSecret secret

secPdfProtectSecret MyRandomSecretString

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

 

SecPdfProtectTimeout timeout

SecPdfProtectTimeout 10(默認)

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

 

SecPdfProtectTokenName name

SecPdfProtectTokenName PDFTOKEN(默認)

定義令牌名,你想改變令牌的名字的惟一緣由應是你想隱藏你正使用ModSecurity這一事實,這是一個好的理由,但這並非提供幫助,由於敵人能找到保護PDF的算法並能計算出來,這樹立了新的標誌,因此若是你想就去試吧。

 

SecRequestBodyAccess On|Off

ModSecurity是否默認緩存並處理請求體,On-訪問請求體,Off-不訪問請求體。

注意:當你想檢查POST_PAYLOAD時使用這個命令,這個指令必須和「phase:2」和REQUEST_BODY一塊兒使用,這三部分任一一個沒有配置,你就沒法檢查請求體。

 

SecRequestBodyLimit NUMBER_IN_BYTES

SecRequestBodyLimit 134217728

配置ModSecurity容許的最大請求體的緩存區大小,默認值是131072KB(134217728bytes)。任何超過此限制的都會被拒絕,提示413,請求體太大。還有一個應限制,1GB。

 

SecRequestBodyNoFilesLimit NUMBER_IN_BYTES

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

SecRequestBodyLImit 131072

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

 

SecRequestBodyInMemoryLimit NUMBER_IN_BYTES

SecRequestBodyInMemoryLimit 131072

配置ModSecurity使用內存保存的最大請求體大小,默認的限制是128KB,在內存中最多存儲128KB。

 

SecResponseBodyLimit NUMBER_IN_BYTES

SecResponseBodyLimit 524228

配置容許緩存的最大相應體大小,任何超過此限制的響應都會被拒絕,並出現狀態碼:500:內部服務器錯誤。這一設置不影響使用MIME類型的響應,緩存不爲此作標記(由於這個類型標記爲非緩存),有一個硬編碼爲1GB。

默認配置成512KB

 

SecResponseBodyLimitAction Reject|ProcessPartial

Reject 響應體將被丟棄,傳輸中斷,返回狀態碼:500(內部服務器錯誤)

ProcessPartial 只檢測緩存中的響應,剩下的容許經過

配置SecResponseBodyLimit控制碰到響應體限制的狀況,默認時ModSecurity拒絕超過指定長度的響應體,然而一些WEB站點,由於有較大的響應體,因此要指定一個合理的限制很困難。這類網站不得不提高限制,來達到控制首位限制的目的(控制內存消耗)。當達到一個限制,網站管理員有能力選擇只檢查響應的第一部分,這部分在限制的範圍內,剩下的容許經過。有些爭辯說,響應的一部分未經檢查,就容許經過,是個漏洞,理論上這是對的,但僅適用於攻擊者控制輸出的狀況(如能夠使輸出任意長)。在這種狀況下,防止漏洞是不可能的。攻擊者在數據發送回來以前能夠壓縮,打亂或者加密數據,使數據能夠穿越任意監控設備。

 

SecResponseBodyMImeType mime/type

SecResponseBodyMImeType text/plain text/html

爲響應數據緩存配置推薦的MIME類型。能夠使用多個SecResponseBodyMimeType指令來增長MIME類型。默認值是text/plain text/html

 

SecResponseBodyMimeTypesClear

清除推薦的響應體緩存MIME類型,容許你從新開始配置。

 

SecResponseBodyAccess On|Off

配置響應體是否被緩存並被分析。若是你計劃檢查HTML的響應,須要使用這個指令。;這個指令必須和」Phase:4」處理階段動做和REQUEST_BODY變量/位置一塊兒使用,這三部分任意一個沒有配置,你就沒法檢查請求體。可選值以下:

On-訪問響應體(僅支持使用MIME類型)

Off-不嘗試訪問響應體

 

SecRule VARIABLES OPERATOR [ACTIONS]

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

例子:SecRule REQUEST_URI 」attack」 \

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

 

OPERATOR描述如何進行檢查

ACTIONS描述當一個操做符成功匹配一個變量時將執行怎樣一個動做。

VARIABLES描述哪些變量被檢查,舉個例子,下述規則則是當地址欄裏有「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 On|Off

配置當前環境是否繼承父節點環境(大部分狀況下都配置成可繼承,你應當查一下文檔的每個指令,已明確他繼承與否),On從父環境下繼承規則,Off-不從父環境下繼承規則。

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

例如:下面的例子顯示了在主apache配置範圍的哪一個地方啓用ModSecurity,不過,你能夠爲你的虛擬主機作不一樣的配置。第一個例子中,頭一個虛擬主機沒有繼承ModSecurity的主配置指令,而第二個作到了。

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的一個概念,指令<Directory>,<Files>,<Location>和<VirtualHost>都是用於建立Configuration Sections的,更多的信息請看apache的文檔部分中的Configuration Sections

 

SecRuleEngine On|Off|DetectionOnly

配置規則引擎,On-處理規則,Off-不處理規則,DetectionOnly-處理規則但不中斷交互,即便規則這樣配置了也不去執行。這個指令針對每一條規則處理也能夠經過ctl動做進行控制(ctl:ruleEngine=off)

 

SecRuleRemoveById RULEID ACTIONLIST

SecRuleRemoveById 1 2 「9000-9010」

SecRuleRemoveById 1 2 5 10-20 「400-556」 673

使用ID方式從上級環境中刪除規則,這個指令支持多個參數,每一個參數能夠使一個規則ID,也能夠是範圍。帶有空格的參數必須使用雙引號括起來。

 

SecRuleRemoveByMsg REGEX

SecRuleRemoveByMsg 「FAIL」

使用規則方式從上級環境中刪除規則,這個指令支持多個參數,每一個指令是一個應用於消息的正則表達式(指定使用的消息動做)

 

SecRuleScript(試驗性的)

SecRuleScript /path/to/script.lua [ACTIONS]

SecRuleScript 」/path/to/file.lua」 「block」

這個指令建立一個特殊的規則,執行lua腳原本決定是否匹配,和SecRule主要的不一樣是這個沒有目的也沒有操做符,這個腳本能夠從ModSecurity環境中取到全部的變量,並使用(Lua)操做符來進行測試,第二個參數可選,與SecRule相同,是一個動做列表。

注意:全部的 Lua腳本在配置時進行編譯並存入內存,要重載腳本,你必須經過apache重啓來重載整個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」,{「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 noce:

Function main()

         Retrieve script parameters.

Local d = m.getvars(「ARGS」,{「lowercase」,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支持被標示試驗方式的編程接口能夠繼續發展,同時咱們努力讓其最佳方式運行

 

SecRuleUpdateActionById RULEID ACTIONLIST

SecRuleUpdateActionById 12345 deny,status:403

按ID方式更新指定規則的動做列表,本指令合併指定的動做列表和規則的動做列表,存在兩個限制,一是規則ID不能被改變,也不能換階段。另外還須要注意的是動做能夠duo8ci被附加到原來的。

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改變響應頭令牌數據中當前使用的「Server:」,按指令的前後順序執行,你必須完整的配置apache ServerTokens指令。經過該指令,ModSecurity會改寫服務器簽名數據並存入內存空間的數據集中。若是ServerTokens沒有完整設置,那麼內存空間就沒有但願的足夠大來存入咱們看到的新數據。

 

SecTmpDir /path/to/dir

SecTmpDir /tmp

配置臨時文件建立的路徑,須要提供apache用戶進程的可寫權限,這個目錄的位置也是當apache檢查數據用完內存時(比SecRequestBodyInMemoryLimit指令指定的還多的數據)會將數據交換到磁盤上的位置。

 

SecUploadDir /path/to/dir

SecUploadDir /tmp

配置攔截文件存儲的目錄,這個目錄必須和SecTmpDir定義的臨時目錄在同一個文件系統上,(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進制(和chmod同樣)配置全部上傳文件的模式(權限),這個功能在不支持8進制文件的操做系統上不可用。默認模式(0600)僅容許有讀寫許可的帳號修改這個文件,若是其餘帳號也須要訪問(使用clamd是個好例子),那麼這個指令時必須的。無論怎樣,要慎用這個指令,避免將敏感數據顯露給未受權用戶,使用「default」值時,還原默認設置。

 

SecUploadKeepFiles On|Off|RelevantOnly

配置是否保存事務處理後的攔截文件,該指令要求已經定義存儲目錄(使用SecUploadDir),On-保存上載文件,Off-不保存上載文件,RelevantOnly-只保存被確認與請求有關的文件

 

SecWebAppId 「NAME」

SecWebAppId 「WebApp1」

建立服務器上的一個分區只屬於一個WEB應用,經過使用分區來避免會話ID和用戶UD之間的衝突,在同一臺服務器上部署多個應用時必定要使用這個命令,若是不使用,會話ID之間的衝突可能發生,默認值是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>

配置顯示了兩個例子,SecWebAppId與apache的VirtualHost指令協同工做,在一臺服務器上應建立各自獨特的集合名稱,通常狀況下,當啓用setsid時,ModSecurity會使用」SESSION」的值來建立集合,這能夠保存專用值,然而像上述例子同樣使用SecWebAppId,集合的名字會變成」App1_SESSION」和」App2_SESSION」。

SecWebAppId相關的兩個狀況:

一、你正把事務(transactions)和報警記錄到ModSecurity Console(控制檯)上,而且你想用WEB應用ID來搜索僅屬於那些應用的事務。

二、你正使用數據留存設施(SESSION和USER集合)而且你須要在屬於不一樣的應用之間的會話和用戶之間避免衝突。

 

 

 

 

處理階段:

ModSecurity 2.x容許把規則至於下述五個階段之一:

請求頭(REQUEST_HEADERS)

請求體(REQUEST_BODY)

響應頭(RESPONSE_HEADERS)

響應體(RESPONSE_BODY)

記錄(LOGGING)

爲了在規則執行時選擇階段,須要使用階段命令,能夠經過規則中直接使用,也能夠經過SecDefaultAction指令。

SecDefaultAction 「log,pass,phase:2」

SecRule REQUEST_HEADER:Host 「!^$」」deny,phase:1」

注意:要注意規則的執行時依賴於階段,即便是一個配置文件中的兩條鄰近的規則,只要是設置了在不一樣的階段中執行,他們就不會是一個接一個的生效。配置文件中的規則順序僅僅是在規則各自的階段中是重要的。在使用Skip和SkipAfter動做時尤其重要。

注意:LOGGING階段比較特別,不管前面的各個階段發生了什麼事,都會每一個事務的最後被執行。這就意味着哪怕是請求被中斷或是放行事務時都會被執行。

請求頭階段:

這個階段的規則會在apache完成請求頭的讀取後當即被執行(post-read-request階段),這時,尚未讀取請求體,意味着不是全部的參數均可用。若是你必須讓規則儘早運行,應把規則放在這個階段(在apache使用這個請求作某些事前),在請求體被讀取前作些事情,從而決定是否緩存這個請求體,或者決定你將但願這個請求體如何被處理(如是否以XML格式解析或不解析)。

注意這個階段的規則沒法影響apache的範圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子同樣還沒法獲得信息。VirtualHost指令有些例外,若是想在apache的locations使用ModSecurity規則,那麼他們應該運行在階段2,參考apache請求環/ModSecurity處理階段圖標。

請求體階段:

這是通用輸入分析階段,大部分傳統的應用規則不在這兒,這個階段你確定能收到參數(只有讀取過請求體後),在請求體階段,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應用尚未使用其餘的編碼方法。

響應頭階段:

發生在響應頭被髮送到客戶端以前,若是你想觀察響應發生前就在這兒運行,若是你想使用響應頭來決定你是否想緩存響應體也行。注意一些響應狀態碼(如404)在請求環的早期就被apache管理着,我也沒法觸發預期。加上apache在後面的鉤子上雙增長了一些響應頭(如日期、服務器和鏈接信息等),這些咱們沒法觸發和審查。在代理配置模式下或使用phase:5(logging)工做的較好。

響應體階段:

這是通用輸出分析階段,這裏你能運行規則截斷響應體(固然提供緩存)。這個階段你想檢查輸出的HTML信息公佈、錯誤信息和失敗的驗證文字。

日誌階段:

在日誌發生前運行的一個階段,放在這個階段的規則只能影響日誌記錄器如何執行,這個階段能夠檢測apache記錄的錯誤信息,在這個階段你不能拒絕或阻斷鏈接,由於太遲了,這個階段也容許檢測其餘的響應頭,如那在phase:3或者phase:4階段中不可用的。注意在這個階段,你應當當心不要繼承破壞性的動做到規則中,這樣的狀況在ModSecurity2.5.0及其之後的版本中被當作配置錯誤。

 

 

Variables變量

Modsecurity2.x支持的變量:

ARGS

是一個集合,能夠做爲靜態參數(以名稱爲匹配論點)方式或以正則表達式(以正則表達式匹配的全部匹配的論點名稱)方式用於它自身(意思爲POST負載中的全部論點)

一些變量是事實上的集合,在運行時能夠擴展更多的變量

SecRule args dirty    測試全部的請求論點

SecRule ARGS:p dirty   有些時候只想看看集合的一部分,這個例子是經過selection操做(colon)查看名爲P的變量(注意:一般行狀況下,請求能夠包含多個同名的變量)

ScRule ARGS|!ARGS:z dirty     指定排除方式,將仔細檢查全部的請求參數是否有單詞dirty,除了名字爲z的參數(再則,z參數能夠爲0個,也能夠爲多個)

SecRule &ARGS !^0$   統計一個集合中有多少個變量,若是一個請求中使用了0個以上的參數,下面的規則就會有效果(暫時忽視了第二個參數)

SecRule ARGS:/^id_/ dirty    有些時候你須要查看一個參數數組,每一個名字只有稍微不一樣,這種狀況下,你能夠爲集合操做符本身制定一個正則表達式,這個規則就是查閱全部以id_打頭的參數名字。

注意:若是參數p不存在,則使用ARGS:p不會對操做符調用起到任何做用。

 

ARGS_COMBINED_SIZE

此變量相比apache的LimitRequest指令容許你更有針對性的設置Arguments 的總大小,如你能夠建立一條規則確保參數數據的大小小於一個特定的閥值(幫助防止緩存溢出問題)例如:若是參數的大小超過25個字符就阻斷他。

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

是參數名的集合,你能夠搜索你想阻斷的特定的參數名,在一個積極策略狀況下,你也能夠僅僅使用白名單(使用!能夠反轉規則)來審計參數名。例:下例規則僅容許規則名爲p和a的兩個參數,若是有其餘參數名字在其中,就會被阻斷。

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,但僅針對於查詢字符串中包含的參數

 

ARGS_GET_NAMES

相似於ARGS_NAMES,但僅針對於查詢字符串中包含的參數

 

ARGS_POST

相似於ARGS,,但僅針對於POST字符串中包含的參數

 

ARGS_POST_NAMES

相似於ARGS_NAMES,但僅針對於POST字符串中包含的參數

 

AUTH_TYPE

這個變量保存認證方法用於驗證一個用戶,注意:這個數據在使用非本地認證的代理模式部署時不可用,在代理模式部署下,你須要檢查REQUEST_HEADERS認證頭

 

ENV

是個集合,規則一個單獨的參數(在colon後),ENV變量經過setenv設置,不提供CGI環境變量的訪問,例如:

SecRule REQUEST_FILENAME 「printenv」 pass,setenv:tag=suspicious

SecRule ENV:tag 「suspicious」

 

FILES

是個集合,包含一系列的初始文件名(就如同在遠程用戶的文件系統上命名的同樣),注意:只有從請求體中提取的文件纔是有用的,例:

SecRule FILES 」\.conf$」 log,deny,status:403,phase:2

 

FILES_COMBINED_SIZE

單一值,全部上傳文件大小的總和,注意:只有從請求體中提取的文件纔是有用的,例:

SecRule FILES_COMBINED_SIZE 「@gt 1000」log,deny,status:403,phase:2

 

FILES_NAMES 

W/O參數集合,包含用於文件上傳的表單字段列表,注意:只有從請求體中提取的文件纔是有用的,例:

SecRule FILES_NAMES 「^upfile$」 log,deny,status:403,phase:2

 

FILES_SIZES 

集合,包含文件尺寸的列表,用於實施單獨文件上傳的大小限制。注意:只有從請求體中提取的文件纔是有用的,例:

SecRule FILES_SIZES 「@gt 100」log,deny,status:403,phase:2

 

FIELS_TMPNAMES   

集合,包含磁盤上臨時文件名的集合,和@inspecFile一塊兒使用,注意:只有從請求體中提取的文件纔是有用的,例:

SecRule FILES_TMPNAMES 「@inspectFile /path/to/inspect_script.pl」

 

GEO

是和@geoLookups操做符一塊兒使用的集合,能夠用於匹配地理位置字段進行IP或主機名字的查詢,2.2.0之後版本可用

字段:

COUNTRY_CODE:兩個字符的國家代號,如:US、UK等

COUNTRY_CODE3:升級爲3個字符的國家代號

COUNTRY_NAME:完整的國家名

COUNTRY_CONTINENT:兩個字符的國家所在洲的代號,如EU

REGION:兩個字符表示的區域,對美國來講是州,對加拿大來講是省,等等

CITY:城市名

POSTAL_CODE:郵政編碼

LATITUDE:緯度

LONGITUDE:經度

DMA_CODE:中心城區代碼(僅指美國)

AREA_CODE:電話區號(僅指美國)

例如:

SecRule REMOTE_ADDR 「@geoLookup」 「chain,drop,msg:’Non-UK IP address’」

SecRule GEO: COUNTRY_CODE 「!@streq UK」

 

HIGHEST_SEVERITY 這個變量是迄今爲止全部規則匹配時最爲嚴格的,Severities是個數值,和比較操做符一塊兒,如@It等

注意:更高的severities,其數值越小,255表示沒有設置severitySecRule

HIGHEST_SEVERITY 「@le 2」 「phase:2,deny,status:500,msg:’severity

%{HIGHEST_SEVERITY}’」

 

id

說明:對規則指定一個惟一的ID或鏈。

動做組:元數據

例如:

SecRule &REQUEST_HEADERS:Host "@eq 0" \    "log,id:60008,severity:2,msg:'Request Missing a Host Header'"

注意

這些是保留的範圍:

1-99,999;本地(內部)保留,使用你認爲合適的可是不要在規則裏使用這個範圍的由於他們已經分配給其餘。

100,000-199,999;,引擎內部保留使用,分配給沒有明確標識的規則。

200,000-299,999;modsecurity.org規則保留。

300,000-399,999;gotroot.com規則保留。

400,000-419,999;未使用(可預定)。

420,000-429,999;爲ScallyWhack保留。

430,000-699,999;未使用(可預定)。

700,000-799,999;爲伊萬里斯蒂奇保留。

900,000-999,999;爲核心規則項目保留。

1000000及以上;未使用(可預定)。

 

initcol

說明:初始化一個持久的集合,從存儲裏導入數據或在內存中建立一個新的集合。

動做組:非中斷性

例如:下面的例子啓動IP地址跟蹤。

SecAction phase:1,initcol:ip=%{REMOTE_ADDR},nolog

注意:一般你想在第一階段和initcol一塊兒使用以便這個集合在全部階段均可用。

集合在initcol動做開始被加載進內存。這個集合在存儲裏將是持續的(而且相應的計數器增長)除非它在交互過程當中改變了。請參考」 Persistant Storage」以獲取得多內容。

 

REQUEST_COOKIES

這個變量是一個全部cookie數據的集合。例如:下面的例子使用Ampersand(符號&)特殊運算符計算集合中變量的個數。若是請求不包括任何Cookie頭的話,規則將會啓動。

SecRule &REQUEST_COOKIES 「@eq 0」

 

REQUEST_COOKIES_NAMES

這個變量是一個請求頭中cookie名字的集合。例如:若是沒有JSESSIONID cookie的話,下面的規則將會啓動。

SecRule &REQUEST_COOKIES_NAMES:JSESSIONID 「@eq 0」

 

REQUEST_FILENAME

這個變量包含去掉QUERY_STRING那一部分以後的相對REQUEST_URI(例如/index.php)

SecRule REQUEST_FILENAME 「^/cgi-bin/login\.php$」 phase:2,t:none,t:normalizePath

注意:anti-evasion交互並不默認在REQUEST_FILENAME上使用。

 

RESPONSE_HEADERS

這個變量和REQUEST_HEADERS變量類似,能夠在一樣的manner(方法)中使用,例如:

SecRule RESPONSE_HEADERS:X-Cache 「MISS」

注意:這個變量不能訪問嵌入式模式中的一些頭。在Apache鉤子裏面加上了像Server,Data,Connection和Content-Type這些頭,而後向客戶端發送數據。不管是在ModSecurity phase:5仍是運行在代理模式下,這些數據都應該是可訪問的。

 

RESPONSE_HEADERS_NAMES

這個變量是一個響應頭名字集合。例如:

SecRule RESPONSE_HEADERS_NAMES 「Set-Cookie」

注意:和RESPONSE_HEADERS同樣,不能訪問嵌入式模式中的一些頭。

 

SESSION

這個變量是一個集合,setsid執行完以後才能訪問它。例如:下面的例子說明了怎麼用setsid初始化一個SESSION集合,怎麼使用setvar增長session.score的值,怎麼設置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」 「log,deny,status:403」

 

SESSIONID

這個變量使用setsid設置的一個值,例如:

SecRule SESSION !^$ chain,nolog,pass

SecRule REQUEST_COOKIES:PHPSESSID !^$

SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}

 

TIME

這個變量含有一個表示時間的格式化字符串(時:分:秒),例如:

SecRule TIME 「^(([1](8|9))|([2](0|1|2|3))):\d{2}:\d{2}$」

 

 

TX

交互集合。用來儲存數據塊,建立交互異常計算等。交互變量用來設置1號請求/響應循環。計算和賦值將不會持續到越過當前請求/響應處理過程。例如:在這個例子中,使用setvar使tx.score增長5個點。緊接着計算此次請求的交互分數,並決定是否去容許/拒絕請求經過。

下面是TX集合的保留名稱:

TX:0----捕捉動做中使用@rx或者@pm操做符時的匹配值

TX:1-9-------捕捉括號和捕捉動做中使用@rx操做符時的捕捉子表達式的值。

SecRule WEBSERVER_ERROR_LOG 「does not exist」 「phase:5,pass,setvar:tx.score=+5」

SecRule TX:SCORE 「@gt 20」 deny,log

 

XML

可獨立使用(做爲validateDTD和validateSchema的目標),也可和XPath表達式參數(這能夠使他對任何可接受純文本的函數來講都是有效目標)一塊兒使用。

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

第一個XPath表達式不使用命名空間。他將和相似以下的載荷進行匹配:

<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>

第二個XPath表達式使用命名空間。它將匹配如下負載:

<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

注意第二個例子中的命名空間

 

 

 

 

 

 

 

 

 

Transformation functions轉換函數(應用,功能):

當ModSecurity接收到請求或者響應消息,它將把這個消息數據複製到內存當中作備份。交互函數就應用於這個數據。原始請求/響應數據不會被修改。一個變量要先使用交互函數轉換以後,才能在規則中進行測試。

注意:ModSecurity以前的版本並無默認交互函數。

下面的規則將防止攻擊者不使用混合大小寫(mixed case)來逃避ModSecurity的規則。

SecRule ARGS:p 「xp_cmdshell」 「t:lowercase」

 

同一條規則中能夠使用多重交互動做,好比下面的規則也能保證攻擊者不使用URL編碼(%xx編碼)逃避規則。注意交互函數的命令能保證一個URL編碼信件是第一次編碼,而不是轉換成小寫。

SecRule ARGS:p 「xp_cmdshell」 「t:urlDecode,t:lowercase」

 

能夠使用SecDefaultAction命令來爲每條規則保證轉換髮生,直到下一條規則。注意交互動做時附加(additive)的,因此若是一條規則明確的列出動做,SecDefaultAction中的轉換動做仍然執行。

SecDefaultAction t:urlDecode,t:lowercase

 

下面是被支持的轉換函數:

HtmlEntityDecode

對輸入的HTML實體進行解碼。支持如下變型:

&#xHH and &#xHH;(H是十六進制)

&#DDD and &#DDD;(D是十進制)

&quot and &quot;

&nbsp and &nbsp;

&lt and &lt;

&gt and &gt;

這個函數能夠把任何實體轉換成一個簡單的字節,可能會致使信息丟失。有利於發現原本不須要編碼的字節。這個函數不能處理255以上的字符。

 

lowercase

這個函數使用current C locale把全部字符轉換成小寫。

 

none

不是一個轉換函數,命令ModSecurity刪除與當前指令結合的全部轉換函數。

 

TrimLeft

刪除輸入左邊的空格。

 

TrimRight

刪除輸入右邊的空格。

 

trim

刪除輸入左右兩邊的空格。

 

urlDecode

這個函數爲URL編碼的輸入字符串解碼。無效編碼(例如非十六進制字符,字符串結尾部分少了一兩個字符)不會被轉換。能夠用@validateUrlEncoding運算符檢測是不是無效編碼。交互函數不能針對URL編碼的變量使用,除非你想執行URL二次編碼。

 

urlDecodeUni

除了urlDecode對%xx解碼以外,urlDecodeUni須要解碼%uXXXX。若是編碼在FF01-FF5E(ASCII碼總寬度),那麼高字節將檢查和並調整低字節。不然,只有低字節可用,高字節不可用。

 

urlEncode

對輸入數據進行URL編碼

 

 

 

 

 

 

Actions

有五個動做組,每一個動做分別屬於一個組:

Disruptive actions

引發modsecurity作些事情。有些狀況下這些事情意味着鎖定事務,但並非全部狀況都這樣作。例如,allow動做屬於一個disruptive動做組,可是它並不鎖定事務。每一個規則中只能有一個disruptive動做(若是有多個disruptive動做,或者繼承的動做,只有最後那個有效)。每一個規則鏈中也只能有一個disruptive動做(在一個鏈中,只能在第一條規則中有disruptive動做)。

Non-disruptive actions

作一些事情,可是這些事情並不能影響規則處理流。例如,設置一個變量,或者改變變量的值。任何規則均可以使用Non-disruptive動做,就連一個鏈中的每個規則也均可以有Non-disruptive動做。

Flow actions

這些動做影響規則流(例如skip或者skipAfter)

Meta-data actions

使用Meta-data動做能夠提供關於規則更多的信息。例如:id,rev,severity和msg。

Data actions

不是真正的動做,只是容器,用來保存其餘動做使用的數據。例如,status動做包含了blocking(blocking發生時)使用的狀態。

 

Allow

所屬動做組:Disruptive

當成功匹配一個規則時,中止規則的處理(審覈)過程,並容許交互繼續進行。

SecRule TEMOTE_ADDR 「^192\.168\.1\.100$」 nolog,phase:1,allow

ModSecurity以前的版本,allow動做只能影響當前的phase。若是在Phase 1階段中有allow動做,將會跳過phase 1階段剩下的規則。可是若是在Phase 2階段中有allow動做,剩下的規則將會繼續執行。從2.5.0版本開始,allow動做升級到,能夠對正在執行的規則進行細粒度的控制。下列規則適用:

一、像上面的例子中單獨使用一個allow的話,allow會影響整個交互,中止當前階段的處理,並且跳過除了logging階段以外的其餘階段(logging階段很特殊,老是執行)。

二、若是和參數phase一塊兒使用,allow將會致使引擎中止處理當前階段,其餘階段將會照常執行。

三、若是和request參數一塊兒使用,allow將會引發引擎中止處理當前階段。下一個處理階段將是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經過,在RESPONSE_HEADERS階段使用規則,並且只單獨使用allow。

#Allow response through

SecAction phase:3,allow

 

Capture

動做組:Non-disruptive

當和正則表達式操做符一塊兒使用時,capture建立正則表達式捕捉的副本,並把這些捕捉副本放到交互變量集合裏面。每次成功模式匹配,最多隻能複製10個,每一個以數字0-9的組合命名。

SecRule REQUEST_BODY 「username=(\w{25,})」 phase:2,t:none,chain

SecRule TX:1 「(?:(?:a(admin|nonymous)))」

注意:數字0捕捉整個的REGEX匹配,1捕捉第一個括號裏面的數據。

 

Chain

動做組:Flow

動做緊跟着規則時,把規則串起來,獲得的結果就是規則鏈,串起來的規則容許有更多複雜的規則匹配,在這些這些規則匹配中,使用大量不一樣的變量來建立一個更好的規則,而且有利於防止誤報。

#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

注意:

在程序語言概念中,串起來的規則有點相似於AND條件聲明。只有當全部的變量檢查返回正數時,規則鏈中第一部分指定的動做才被觸發。只要規則鏈有一方面是負的,那整個規則鏈都是負的。同時要注意,disruptive動做,execution段,metadata動做(id,rev,msg),skip,skipAfter動做只能經過鏈開始規則指定。

 

deny

所屬動做組:Disruptive

中止規則處理過程,而且中斷交互。

所屬動做組:Disruptive

 

Id

動做組:Meta-data

給規則或鏈指定一個ID號

SecRule &REQUEST_HEADERS:Host 「@eq 0」 \

「log,id:60008,severtity:2,msg:’Reqest Missing a Host Header’」

注意:

保留值範圍:

1-99,999::保留作本地(內部)使用,你認爲怎麼合適就怎麼用,可是你分配給別人的規則裏面不要用這個範圍。

100,000-199,999:引擎內部使用,指定給一些沒有明確ID號的規則

200,000-299,999:modsecurity.org發佈的規則使用

300,000-399,999:gotroot.com發佈的規則使用

400,000-419,999:不可用,僅做保留

420,000-429,999:爲ScallyWhack[http://projects.otaku42.de/wiki/Scally-Whack]

430,000-899,999:不可用,僅做保留

900,000-999,999:核心規則[http://www.modsecurity.org/projects/rules/]設計

1,000,000及以上:不可用,僅做保留

 

Log

一個成功的規則匹配須要被記錄。這個動做不只把匹配記錄到Apache error log file(用來記錄apache的錯誤信息)當中也要記錄到ModSecurity audit log(調試、審計日誌)當中。

 

msg

動做組:Meta-data

給規則或鏈指定一個客戶消息。

SecRule &REQUEST_HEADERS:Host 「@eq 0」 \

「log,id:60008,severity:2,msg:’Request Missing a Host Header’」

注意:

Msg消息在錯誤日誌和/或審計日誌中,而不做爲響應頭返回給用戶。

 

noauditlog

所屬動做組:Non-disruptive

這個動做代表,當成功匹配一個規則時,並不記錄審計日誌。無論交互應不該該被記錄到aodit log中,此次匹配都不能被當作(下次判斷的)標準。(感受能夠用於白名單中)

SecRule REQUEST_HEADERS:User-Agent 「Test」 allow,noauditlog

注意:若是SecAuditEngine 被設置爲On,那麼全部的交互都會被記錄;若是被設置成RelevantOnly,你才能夠使用noauditlog這個動做來控制交互是否被記錄。

即便規則裏寫了noauditlog,規則裏觸發了審計動做,仍是會記錄日誌,正確的作法是在規則中加上ctl:auditEngine=Off纔會不記錄日誌。(上面是張彪依翻譯版的,言簡意賅,好理解,我應該感到汗顏)(即便noauditlog這個動做是應用於具體的規則當中,這個規則可能在審計事件觸發以前也可能在審計事件觸發以後,可是這個交互都要被記錄在audit log(審計日誌)當中。正確的方法是:使用「ctl:auditEngine=off」來使整個交互的審計都不記錄(來使審計記錄功能失效)。)

 

nolog

Action Group:Non-disruptive

不記錄規則匹配,既不記錄在error中,也不記錄在audit logs中。

注意:使用這個動做,也必須說明noauditlog

 

pass:

動做組:Disruptive

儘管成功匹配了一個規則,但繼續檢查下一條規則

SecRule REQUEST_HEADERS:User-Agent 「Test」 log,pass

SecRule中寫了pass,SecRule帶了multiple targets,每一次規則匹配,全部的target都會被處理,並觸發non-disruptive動做。下面的例子裏,每一次匹配,TX:test都增長1

SecRule ARGS 「test」 log,pass,setvar:TX.test=+1

注意:每一次匹配,都不會終止交互,並記錄日誌,除非阻止日誌。

 

pass

動做組:Meta-data

把規則或規則鏈歸於某一個有效處理階段之一

SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase

SecRule REQUEST_HEADER:User-Agent 「Test」 log,deny,status:403

注意:記住若是段是錯誤的,會致使目標變量爲空。即變量或運算符(RegEx)正確,可是因爲指定了錯誤的段,致使丟失惡意數據。

Phase:1

Normally you will want to use phase:1 along with initcol so that the collection is available in all phases.

 

redirect

動做組:Disruptive

在給定位置發佈redirect來攔截交互

SecRule REQUEST_HEADERS:User-Agent 「test」 \

Log,redirect:http://www.hostname.com/failed.html

注意:若是狀態動做是如今時的而且值可接受(爲301,302,303,或者307),這個狀態碼將會用來重定向,不然,狀態碼302被用來重定向

 

setvar

動做組: non-disruptive

新建刪除更新集合中的變量

新建變量:setvar:tx.score=10

刪除變量:setvar:!tx.score

增長減少變量:在數字前面加上+或-:setvar:tx.score=+5

 

severity

動做組:Meta-data

指定規則的嚴重性

SecRule REQUEST_METHOD 「^PUT$」 「id:340002,rev:1,severity:CRITICAL,msg:’Restricted HTTP function’」

注意:

嚴重值遵循系統日誌,以下:

0                      EMERGENCY

1                      ALERT

2                      CRITICAL

3                      ERROR

4                      WARNING

5                      NOTICE

6                      INFO

7                      DEBUG

用數字或文字值均可以指定嚴重程度。可是每一個數字表明的嚴重程度很難記憶,全部應該使用文字值指定嚴重程度。數字值在v2.5.0版本中已經取消了,在接下來的版本更新中也可能會被取消。

 

skip

動做組:Flow

匹配成功時,跳過一條或更多的規則或規則鏈、

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」 \

「log,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’」

注意:skip只應用與當前正在處理的階段,而且不必應用於配置文件裏面的規則裏的命令。若是想經過處理段對規則分類,就要使用skip。不能在一個規則鏈中跳過規則。一個簡單的參數就能夠指出要跳過的規則或規則鏈的數量。

 

skipAfter

動做組:Flow

匹配後跳過規則或規則鏈,從新開始執行指定了ID號或marker(參考SecMarker)的規則。

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」 \

「log,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’」

注意:skip只應用與當前正在處理的階段,而且不必應用於配置文件裏面的規則裏的命令。若是想經過處理段對規則分類,就要使用跳過。不能在一個規則鏈中跳過規則。一個簡單的參數就能夠指出要跳過的規則或規則鏈的數量。

 

 

status

動做組:Data

與動做deny和redirect動做一塊兒使用來指定響應狀態碼

SecDefaultAction log,deny,status:403,phase:1

注意:Apache在scope位置(例如Directory,location等)定義的status動做可能會被phase:1的動做設置所代替。若是在配置文件中出現的話,Apache將會觸發ErrorDocument指令。因此若是你以前已經爲一個給定的狀態定義了一個自定義錯誤頁的話,那麼這個錯誤頁將會執行並顯示給用戶。

 

t

動做組:non-disruptive

當轉換功能是針對指定變量,而且變量的結果是由運算符計算獲得時,使用動做t

SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase

SecRule REQUEST_COOKIES:SESSIONID 「47414e81cbbef3cf8366e84eeacba091」 \

   Log,deny,status:403,t:md5,t:hexEncode

注意:先用SecDefaultAction中指定轉換功能,在此基礎之上,還須要用SecRule指定轉換功能。使用「t:none」能夠爲某一指定的規則取消全部轉換功能。

 

 

 

 

 

 

Operators運算符

規則中能夠使用不少運算符,@後面跟運算符名稱

eq

至關於等號「=」

SecRule &REQUEST_HEADERS_NAMES 「@eq 15」

 

pm

段匹配運算符。pm使用一組匹配引擎集(Aho-Corasick)來使關鍵字列表獲得更快的匹配,It will match any one of its arguments anywhere in the target value.匹配不區分大小寫。

SecRule REQUEST_HEADERS:User-Agent 「@pm WebZIP WebCopier Webster WebStripper SiteSnagger ProWebWalker」

上面這個例子中,若是口令在User-Agent HTTP頭值中獲得匹配,將返回403拒絕訪問。

 

pmFromFile

段匹配運算符。pmFromFile使用一組匹配引擎集(Aho-Corasick)來使關鍵字列表獲得更快的匹配,它和pm相同,不一樣在於pmFromFile須要一個一列文件做爲arguments。目標值將和文件中任一個段相匹配。

注意:一、文件的每一行只能有一個段。行尾標記將會和段剝離,可是段裏面不能沒有空格(End of line markers will be stripped from the phases,however,whitespace will not be trimmed from phases in the file.)。空行和以「#」開頭的行被忽略。

二、使用段文件的相對路徑,能夠使帶有規則集的段文件的內容更簡單。此時,包含規則的文件路徑被預置爲段文件路徑。

SecRule REQUEST_HEADERS:User-Agent 「@pm /path/to/blacklist1 blacklist2」 「deny,status:403」

上面的例子中,若是兩個文件的模式(pattern)在User-Agent的HTTP頭值中獲得匹配,那麼403拒絕訪問,表blacklist2須要和包含規則的文件相同路徑。

 

validateUrlEncoding

 

 

validateUtf8Encoding

檢驗變量是否是一個有效的UTF-8編碼字符串

SecRule ARGS 「@validateUtf8Encoding」

注意:UTF-8在大部分web服務器上都是有效的。0-65535之間的整數值用UTF-8字節序列編碼,UTF-8字節序列沒有百分數。簡短的形式只有雙字節。

檢查如下三類錯誤:

Not enough bytes.UTF-8支持2,3,4,5,6字節編碼。ModSecurity將會找出一個或多個字節丟失的狀況。

Overlong characters。ASCII字符直接映射成Unicode(統一字符編碼)空間,於是只表明一個簡單的字節。可是大多數ASCII字符也能編碼成2,3,4,5,6個字符。全部就會欺騙編碼者去思考這個字符是否是其餘東西(而且這樣也大概會防止安全檢查)。

 

 

 

 

 

 

 

 

 

 

SecPcreMatchLimit

SecPcreMatchLimitRecursion

這兩個是設置pcre的參數的,用來避免pcre陷入死循環之類的。

pcre是實現正則表達式匹配的庫,modsecurity規則裏面支持正則表達式,就是用pcre庫來作的。

SecStreamInBodyInspection

SecStreamOutBodyInspection

是兩個開關,是否檢查請求體和響應體。

 

 

SecRule REQUEST_HEADERS:Host "^[\d.:]+$" "phase:2,t:none,msg:'Host header is a numeric IP address',severity:1,id:0401006,"

 

 

 

 

 

 

 

MIME:多功能網際郵件擴充協議

MIMEMultipurpose Internet Mail Extensions)是一個互聯網標準,它擴展了電子郵件標準,使其可以支持非ASCII字符、二進制格式附件等多種格式的郵件消息。

服務器將MIME標誌符放入傳送的數據中來告訴瀏覽器使用哪一種插件讀取相關文件。

MIME可以支持非ASCII字符、二進制格式附件等多種格式的郵件消息。MIME規定了用於表示各類各樣的數據類型的符號化方法。瀏覽器接收到文件後,會進入插件系統進行查找,查找出哪一種插件能夠識別讀取接收到的文件。若是瀏覽器不清楚調用哪一種插件系統,它可能會告訴用戶缺乏某插件,或者直接選擇某現有插件來試圖讀取接收到的文件,後者可能會致使系統的崩潰。Microsoft公司應用於Windows系統下的瀏覽器使用ActiveX控件,而不是Netscape插件,這種瀏覽器沒必要象其它瀏覽器那樣依靠MIME的編碼。"

在HTTP中,MIME類型被定義在Content-Type header中。

在ASP中,設定MIME類型的方法是經過Response對象的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"

相關文章
相關標籤/搜索