完整性監控規則語言是一種基於 XML 的聲明性語言,用於描述應由 Server & Workload Security保護 監控的系統組件及相關屬性。它還提供了一種方法來指定應從較大組件集中排除哪些組件的監控。
秘訣如果您只需要監控檔案或 Windows 登錄的未經授權變更,您可以使用檔案和登錄規則範本,而不是創建自訂範本。關於使用這些範本的詳細資訊,請參閱 創建完整性監控規則。
|
要建立新的自訂完整性監控規則,請從 建立完整性監控規則 中的程序開始(選擇 Custom (XML) 作為範本類型),然後根據完整性監控規則語言建立您的自訂規則,如以下各節所述:
實體集
在完整性監控規則中包含的系統元件稱為「實體」。每種類型的元件都是一類實體。例如,檔案、註冊表鍵和進程都是一類實體。完整性監控規則語言提供了一個標籤,用於描述每類實體的一組實體(實體集)。以下Entity Set類型可用於規則中:
- 目錄集:規則將掃瞄目錄的完整性
- FileSet:規則將掃瞄檔案的完整性
- GroupSet:規則將掃瞄群組的完整性
- InstalledSoftwareSet:規則將掃瞄已安裝軟體的完整性
- PortSet:規則將掃瞄監聽埠的完整性
- ProcessSet:規則將掃瞄程序的完整性
- RegistryKeySet:規則將掃瞄登錄檔鍵
- RegistryValueSet:規則將掃瞄登錄值
- ServiceSet:規則將掃瞄服務的完整性
- UserSet:規則將掃瞄使用者的完整性
- WQLSet:規則將監控 Windows Management Instrumentation WQL 查詢語句結果的完整性
單一完整性規則可以包含多個實體集。這使您能夠,例如,使用單一規則來保護應用程式,該規則監控多個檔案和註冊表項。
階層和萬用字元
對於表示層次資料類型(如 FileSet 和 RegistryKeySet)的實體集,支援基於區段的模式匹配:
/
(正斜杠):標示要應用於層次結構級別的模式部分**
(兩個星號):匹配零個或多個部分
支援以下萬用字元:
?
(問號) : 匹配一個字符*
(一個星號):匹配零個或多個字符
也支援「跳脫」字元:
- \
\
(反斜線):跳脫下一個字元
該模式使用 "
/
" 字元將其分成多個部分,模式的每個部分將依次應用於層級結構的各個層次,只要它繼續匹配。例如,如果模式:/a?c/123/*.java
已應用至路徑:
/abc/123/test.java
然後:
- "
a?c
" 匹配 "abc" - "
123
" 符合 "123" - "
*.java
" 匹配 "test.java"
當模式應用於路徑時:
/abc/123456/test.java
然後:
- "
a?c
" 匹配 "abc" - "
123
" 與 "123456" 不匹配,因此不再進行匹配
"
**
" 表示法模式匹配零個或多個部分,因此:/abc/**/*.java
同時符合 "abc/123/test.java" 和 "abc/123456/test.java"。它也會符合 "abc/test.java" 和 "abc/123/456/test.java"。
語法和概念
本節將展示一些完整性監控規則範例。這些範例將使用FileSet實體集,但所描述的主題和組件對所有實體集都是通用的。一個最小的完整性監控規則可能如下所示:
<FileSet base="C:\Program Files\MySQL"> </FileSet>
「base」屬性指定 FileSet 的基礎目錄。規則的其他所有內容都將相對於此目錄。如果沒有進一步添加規則,則「base」以下的所有內容(包括子目錄)都將被監控變更。
注意“
*" 和 " ?"萬用字元可以用在"base"屬性字串中,但只能用在base的最後一個路徑組件中。所以這是有效的: <codeblock>base="C:\program files\CompanyName * Web Server" </codeblock> but this is not: <codeblock>base="C:\* files\Microsoft Office"</codeblock> |
在實體集內,可以使用「include」和「exclude」標籤來控制模式匹配。這些標籤具有指定匹配模式的「key」屬性。key 的來源因實體集而異。例如,對於檔案和目錄來說,它是它們的路徑,而對於埠來說,它是唯一的通訊協定/IP/埠號組合。
注意如果在包含或排除規則中提供的路徑在語法上無效,代理程式將生成「完整性監控規則編譯問題」代理事件,並提供規則 ID 和路徑(展開後)作為參數。無效路徑的示例將是
C:\test1\\D:\test2 ,因為檔案名稱可能不包含兩個卷標識符。 |
包含標籤
include 標籤本質上是一個允許清單。使用它意味著只有與其(或其他 include 標籤)匹配的實體才會被包含。通過添加 include 標籤,以下規則現在僅監控
"C:\Program Files\MySQL" 資料夾及其子資料夾中名稱為 "*.exe" 的檔案變更:
<FileSet base="C:\Program Files\MySQL"> <include key="**/*.exe"/> </FileSet>
「包含」可以合併。以下規則將監控「C:\Program Files\MySQL」資料夾及其子資料夾中名稱為「*.exe」和「*.dll」的檔案變更:
<FileSet base="C:\Program Files\MySQL"> <include key="**/*.exe"/> <include key="**/*.dll"/> </FileSet>
也可以在單個包含封鎖中結合多個條件,在這種情況下,all 條件必須為真,才能包含給定的實體。以下的 "include" 標籤要求實體必須同時以 ".exe" 結尾並以 "sample" 開頭才能被包含。儘管這個要求可以更簡潔地表示,但當關鍵模式與實體的其他特徵結合時,其實用性會變得更加明顯,如下方
"Features" 部分所述。
<include> <key pattern="**/*.exe"/> <key pattern="**/sample*"/> </include>
以下是表達相同需求的另一種方式:
<include key="**/*.exe"> <key pattern="**/sample*"/> </include>
排除標籤
排除標籤的功能是作為封鎖清單,將文件從原本會返回的集合中移除。以下(不太可能的)示例將監控除臨時文件以外的所有內容。
<FileSet base="C:\Program Files\MySQL"> <include key="**"/> <exclude key="**/*.tmp"/> </FileSet>
以下規則將 "MySQLInstanceConfig.exe" 排除在 EXE 和 DLL 集合之外:
<FileSet base="C:\Program Files\MySQL"> <include key="**/*.exe"/> <include key="**/*.dll" /> <exclude key="**/MySQLInstanceConfig.exe"/> </FileSet>
像 "include" 標籤一樣,"exclude" 標籤也可以寫成需要多個條件。以下範例顯示了一個多條件的 "exclude" 標籤。
<exclude> <key pattern="**/MySQLInstanceConfig*" /> <key pattern="**/*.exe" /> </exclude>
區分大小寫
模式匹配的大小寫敏感性可以通過 "casesensitive" 屬性來控制。該屬性有三個允許的值:
- true
- false
- platform
此屬性的預設值為 "platform",這意味著模式的大小寫敏感性將與其運行的平台相匹配。在以下範例中,在 Windows 系統上會返回 "Sample.txt"
和 "sample.txt",但在 Unix 系統上只會返回 "Sample.txt":
<FileSet base="C:\Program Files\MySQL"> <include key="**/*Sample*"/> </FileSet>
在此範例中,只有 "Sample.txt" 會在 Windows 和 Unix 上返回:
<FileSet base="C:\Program Files\MySQL"> <include key="**/*Sample*" casesensitive="true"/> </FileSet>
注意在 Windows 這樣的平台上,"true" 的區分大小寫設定用途有限,因為大多數物件名稱在這個平台上是不區分大小寫的。
|
實體功能
根據特徵而非“鍵”來包含和排除實體的功能也支持某些實體類型。特徵集因實體類型而異。以下範例將包含所有可執行檔案。它不像之前使用副檔名的範例那樣依賴副檔名,而是會檢查檔案的前幾百位元組,以確定它是否可以在給定的操作系統上執行。
<FileSet base="C:\Program Files\MySQL"> <include key="**" executable="true"/> </FileSet>
功能屬性必須出現在 "include" 或 "exclude" 標籤中。要將它們用作多標準 include 或 exclude 的一部分,必須將它們指定為包含的 include
或 exclude 標籤的屬性。以下範例包括所有名稱中包含字串 "MySQL" 且可執行的檔案:
<include executable="true"> <key pattern="**/*MySQL*"/> </include>
前面的例子可以更簡潔地表達為:
<include key="**/*MySQL*" executable="true"/>
某些功能屬性僅僅是與實體屬性之一的值匹配。在這種情況下,有時會支援使用 "
*
" 和 "?
" 的萬用字元匹配。個別 實體集 的說明頁面會指出哪些屬性可以用於包含或排除規則,以及它們是否支援萬用字元匹配或簡單字串匹配。
注意在支援萬用字元匹配的情況下,重要的是要注意匹配的是屬性的字串值,且不會進行正規化。用於實體鍵匹配的結構如 "
** " 和用於分隔層次結構組件的 "/ " 不適用。在 Windows 上匹配路徑名稱需要使用 "\ ",因為這是屬性值中出現的字元,而 Unix 系統將在路徑值中使用 "/ ",因此匹配 Unix 路徑需要使用 "/ "。 |
以下是使用 "state" 屬性進行功能匹配的示例:
<ServiceSet> <include state="running"/> </ServiceSet>
注意不支援在狀態匹配中使用萬用字元。
|
以下範例會匹配二進位路徑以 "\notepad.exe" 結尾的任何進程:
<ProcessSet> <include path="*\notepad.exe"/> </ProcessSet>
以下範例會匹配命令列以 "/sbin/" 開頭的任何進程:
<ProcessSet> <include commandLine="/sbin/*"/> </ProcessSet>
注意在使用萬用字元時要小心。像 "
** " 這樣的萬用字元表達式會檢查 "base" 下每個子目錄中的每個檔案。為這樣的表達式建立基準可能會花費大量時間和資源。 |
AND 和 OR
可以透過使用多重條件的包含和排除以及多重包含和排除來表達邏輯 AND 和 OR。
有幾種方法可以使用多重條件包含或排除來表示 AND。最直接的方法是將多個條件包含在單個封閉標籤內。以下範例顯示了一個簡單的多重條件 AND:
<include> <key pattern="**/*MySQL\*" /> <key pattern="**/*.exe"/> </include>
此外,任何作為包含標籤屬性表達的條件將與封閉條件一起作為多條件要求的一部分進行分組。以下示例顯示了以這種方式重寫的先前多條件「包含」:
<include key="**/*.exe"> <key pattern="**/*MySQL*" /> </include>
最後,如果多個條件被表達為包含或排除的屬性,它們將被視為 AND:
<include executable="true" key="**/*MySQL*" />
ORs 可以通過包含多個 include 或 exclude 標籤來簡單表示。以下代碼包含副檔名為 ".exe" 或 ".dll" 的檔案:
<include key="**/*.dll" /> <include key="**/*.exe" />
評估順序
所有 "include" 標籤會先被處理,不論在規則中出現的順序。如果物件名稱至少符合一個 "include" 標籤,則會進一步測試 "exclude" 標籤。如果物件名稱至少符合一個
"exclude" 標籤,則會從監控物件集中移除。
實體屬性
給定的實體具有一組可以監控的屬性。如果未為實體集指定任何屬性(即屬性包裝標籤不存在),則假定該實體的標準屬性集。(請參閱個別實體集的簡寫屬性部分。)
然而,對於給定的實體集,只有某些實體屬性可能對完整性監控有興趣。例如,日誌文件內容的變更很可能是預期且允許的。然而,權限或所有權的變更應該被報告。
Entity Sets 的 "attributes" 標籤允許表達這一點。"attributes" 標籤包含一組列舉感興趣屬性的標籤。允許的 "attribute"
標籤集根據所提供的 Entity Set 而有所不同。
注意如果存在 "attributes" 標籤,但不包含任何條目,則僅監控規則定義的實體是否存在。
|
以下範例監控 "C:\Program Files\MySQL" 中名稱包含 "SQL" 的可執行檔案,檢查其 "最後修改時間"、"權限" 和 "擁有者" 屬性的變更:
<FileSet base="C:\Program Files\MySQL" > <include key="**/*SQL*" executable="true"/> <attributes> <lastModified/> <permissions/> <owner/> </attributes> </FileSet>
以下範例監控 "C:\程式集\MySQL" 中日誌檔案的 "permissions" 和 "owner" 屬性:
<FileSet base="C:\Program Files\MySQL" > <attributes> <permissions/> <owner/> </attributes> <include key="**/*.log" /> </FileSet>
在以下範例中,將監控 STANDARD 屬性集。(請參閱下文的簡寫屬性)
<FileSet base="C:\Program Files\MySQL" > <include key="**/*.log" /> </FileSet>
在以下範例中,不會監控任何屬性。僅會追蹤實體的存在變化。
<FileSet base="C:\Program Files\MySQL" > <attributes/> <include key="**/*.log" /> </FileSet>
速記屬性
速記屬性提供了一種使用單一高階屬性來指定一組屬性的方法。與常規屬性一樣,允許的值集根據所提供的實體集而有所不同。
簡寫屬性在以下情況中非常有用:屬性集自然地組合在一起、詳盡列出屬性集會很繁瑣、以及高級屬性所代表的屬性集可能隨時間或系統配置而改變。以下是每種情況的示例:
屬性
|
說明
|
標準
|
監控實體集屬性的集合。這與實體集的“所有可能屬性”不同。例如,它不會包括所有可能的雜湊算法,只包括被認為足夠的那些。關於每個實體集的“標準”屬性列表,請參見各個實體集的章節。
|
目錄
|
這是文件內容的雜湊值或一組雜湊值的簡寫。預設為 SHA-1。
|
onChange 屬性
可以將 EntitySet 設定為即時監控變更。如果 EntitySet 的 onChange 屬性設為 true(預設值),則 EntitySet 返回的實體將即時監控變更。當檢測到變更時,實體會立即與其基線進行比較以檢查變異。如果
EntitySet 的 onChange 屬性設為 false,則僅在建立基線時或通過排程任務或由 Server & Workload Security保護 按需觸發時運行。
以下範例即時監控 MySQL 二進位檔:
<FileSet base="C:\Program Files\MySQL" onChange="true"> <include key="**/*.exe"/> <include key="**/*.dll" /> </FileSet>
環境變數
環境變數可以包含在實體集使用的基值中。它們用 "${}" 括起來。變數名稱本身以 "env." 為前綴。
以下範例將 FileSet 的基礎目錄設置為存儲在 PROGRAMFILES 環境變數中的路徑:
<FileSet base="${env.PROGRAMFILES}"/>
注意引用的環境變數值在代理啟動時由代理讀取並存儲。如果環境變數的值發生變化,必須重新啟動代理以註冊變更。
|
如果找不到引用的環境變數,引用它的實體集將不會被掃描或監控,但其餘的配置將被使用。會觸發一個警報,指示該變數不存在。代理會使用代理事件 "完整性監控規則編譯問題"
報告無效的環境變數。完整性監控規則的 ID 和環境變數名稱將作為參數提供給該事件。
以下是完整性監控使用的預設環境變數:
名稱
|
值
|
ALLUSERSPROFILE
|
C:\ProgramData
|
COMMONPROGRAMFILES
|
C:\程式集\Common Files
|
程式檔案
|
C:\Program Files
|
SYSTEMDRIVE
|
C:
|
SYSTEMROOT
|
C:\Windows
|
WINDIR
|
C:\Windows
|
環境變數覆蓋
當在 Windows 作業系統中使用非標準位置時,覆寫環境變數。例如,Microsoft Windows - 'Hosts' file modified 完整性監控規則會監控 Windows 主機檔案的變更,該檔案位於 C:\WINDOWS\system32\drivers\etc 資料夾中。然而,並非所有 Windows
安裝都使用 C:\WINDOWS 目錄,因此完整性監控規則使用 WINDIR 環境變數,並將目錄表示為 %WINDIR%\system32\drivers\etc。
注意環境變數主要由虛擬裝置在對虛擬機進行無代理完整性監控時使用。這是因為虛擬裝置無法知道特定虛擬機上的作業系統是否使用標準目錄位置。
|
- 打開您想要覆寫環境變數的Computer or Policy editor。
- 點選 。
- 在Environment Variable Overrides section中,點選View Environment Variables以顯示Environment Variable Overrides頁面。
- 在功能表列中點選New,然後輸入新的名稱-值對(例如,WINDIR 和 D:\Windows),再點選確定。
登錄值
可以在實體集使用的基值中包含註冊表值。它們包含在 ${} 中。註冊表值本身的路徑以 "reg." 開頭。以下範例將 FileSet 的基目錄設置為存儲在 "HKLM\Software\Trend
Micro\Deep Security Agent\InstallationFolder" 註冊表值中的路徑:
<FileSet base="${reg.HKLM\Software\Trend Micro\Deep Security Agent\InstallationFolder}"/>
當代理程式接收到新的或更改的規則時,會讀取引用的登錄值的值。代理程式還會在啟動時檢查所有規則,如果任何引用的登錄值發生變化,將重新建立受影響規則的基線。
如果未找到引用的註冊表值,則引用它的 EntitySets 不會被掃描或監控,但其餘配置將被使用。會發出通知變數不存在的警報。代理會使用代理事件 8012 報告無效的環境變數擴展。完整性監控規則的
ID 和註冊表值路徑作為參數提供給事件。
注意萬用字元僅允許在基底名稱的最後一個層級元件中。例如,"
base="HKLM\Software\ATI\* " 是有效的,將會找到 "HKLM\Software\ATI" 和 "HKLM\Software\ATI Technologies";然而,base="HKLM\*\Software\ATI\* 是無效的。 |
使用「..」
在所有當前版本的代理程式中,支援使用「..」來引用父目錄。代理程式將嘗試透過解析「..」引用並將 Windows 短名稱轉換為長名稱來標準化 FileSet 和 DirectorySet
元素的基目錄名稱。例如,在某些較新版本的 Windows 上,以下的 FileSet 會有一個基目錄 C:\Users。在較早版本的 Windows 上,它會是 C:\Documents
and Settings。
<FileSet base="${env.USERPROFILE}\.."> <include key="*/Start Menu/Programs/Startup/*"/> </FileSet>
最佳實踐
規則應僅包含具有重要性的對象和屬性。這將確保如果對象的其他屬性發生變化,則不會報告任何事件。例如,您的變更監控策略可能會對
/bin
中的文件權限和所有權進行限制。您的完整性監控規則應監控所有者、群組和權限,但不包括其他屬性,如lastModified或哈希值。使用完整性監控規則來偵測惡意程式和可疑活動時,請監控服務,注意 NTFS 資料流的使用,並注意在不尋常位置(如 "
/tmp
" 或 "${env.windir}\temp
")中的可執行檔案。在指定規則中要包含哪些對象時,請盡可能具體。包含的對象越少,建立基準所需的時間就越少,掃瞄變更所需的時間也會越少。排除預期會變更的對象,僅監控您關心的屬性。
在建立規則時,請勿:
- 使用 "
**/...
" 從層級結構的頂層,例如 "/
"、"C:\
" 或 "HKLM\Software
"。 - 除非絕對必要,否則請使用多於一種內容雜湊類型。
- 參考使用者特定位置,例如
HKEY_CURRENT_USER
、${env.USERPROFILE}
或${env.HOME}
。
在完整性監控規則中,任何這些語句都會導致性能問題,因為代理會搜索許多項目以匹配指定的模式。