完整性监控规则语言

完整性监控规则语言是一种基于 XML 的声明性语言,用于描述应该受趋势科技服务器深度安全防护系统监控的系统组件和关联属性。此语言还提供一种方法来指定一组数量较大的组件中应免于监控的组件。

创建新完整性监控规则的方式有两种:如果只是希望监控文件中是否发生未授权更改,则可以使用“基本规则”模板。可以在定义完整性监控规则以在策略中使用中找到有关使用“基本规则”模板的说明。

如果要创建用来监控计算机上其他实体(目录、注册表值、服务等)的规则,则必须使用完整性监控规则语言来编写规则。(要使用完整性监控规则语言创建新的完整性监控规则,请转至策略 > 通用对象 > 规则 > 完整性监控规则 > 新建 > 新建完整性监控规则 > 内容并选择“定制 (XML)”。)

实体集

完整性监控规则中包括的系统组件称为“实体”。每种类型的组件便是一个实体类。例如,文件、注册表项和进程分别是不同的实体类。完整性监控规则语言为每种实体类提供一种标记,用于描述该组实体(实体集)。以下实体集类型可用于规则中:

  • DirectorySet:规则将扫描目录的完整性
  • 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="C:\program files\CompanyName * Web Server"

而以下格式则是无效的:

base="C:\* files\Microsoft Office"

在实体集内,"include" 和 "exclude" 标记可用于控制特征码匹配。这些标记都具有 "key" 属性,用于指定要匹配的特征码。key 的源因实体集而异。例如,对于文件和目录,源为其路径;对于端口,源为唯一的协议/IP/端口号元组。

如果包含或排除规则中提供的路径从语法角度讲无效,则客户端将生成“完整性监控规则编译问题”客户端事件,并提供规则 ID 和路径(扩展后)作为参数。无效路径的示例为 C:\test1\D:\test2 ,因为文件名不可以包含两个卷标识符。

Include

include 标记实质上是一张白名单。使用此标记意味着仅包括由此标记(或其他 include 标记)匹配的实体。通过添加 include 标记,以下规则现在仅监控对 "C:\Program Files\MySQL" 文件夹和子文件夹中名为 "*.exe" 的文件所进行的更改:

<FileSet base="C:\Program Files\MySQL">
<include key="**/*.exe"/>
</FileSet>

可以对 "Includes" 进行组合。以下规则将监控对 "C:\Program Files\MySQL" 文件夹和子文件夹中名为 "*.exe" 和 "*.dll" 的文件所进行的更改:

<FileSet base="C:\Program Files\MySQL">
<include key="**/*.exe"/>
<include key="**/*.dll"/>
</FileSet>

还可以将多个条件组合到单个 include 块中,其中对于要包含的给定实体而言,所有条件都必须满足。以下 "include 标记要求包含以 ".exe" 结束且以 "sample" 开头的实体。虽然可以更简洁地表达此要求,但在主要特征码与实体的其他功能结合时,此表达方式的实用性会更加明显,如以下“功能”部分中所述。

<include>
<key pattern="**/*.exe"/>
<key pattern="**/sample*"/>
</include>

下面是同一要求的另一种表达方式:

<include key="**/*.exe">
<key pattern="**/sample*"/>
</include>

Exclude

exclude 标记用作文件黑名单,用于从集中移除文件,否则将返回这些文件。以下(不太可能)示例将使除临时文件之外的所有内容都受到监控。

<FileSet base="C:\Program Files\MySQL">
<include key="**"/>
<exclude key="**/*.tmp"/>
</FileSet>

以下规则用于从 EXE 和 DLL 集中排除 "MySQLInstanceConfig.exe":

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

在此示例中,Windows 和 Unix 系统上都只返回 "Sample.txt":

<FileSet base="C:\Program Files\MySQL">
<include key="**/*Sample*" casesensitive="true"/>
</FileSet>

对于大多数对象名称,区分大小写设置 "true" 在不区分大小写的平台上(如 Windows)的使用是受限制的。

功能

对于某些实体类型,也支持基于功能(而不是 "key")包含和排除实体。功能集因实体类型而异。以下示例将包括所有可执行文件。与前一个示例使用文件扩展名不同,此示例不依赖文件扩展名,而是将检查文件的前几百个字节以确定该文件是否可以在给定的操作系统上执行。

<FileSet base="C:\Program Files\MySQL">
<include key="**" executable="true"/>
</FileSet>

功能属性必须显示在 "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。

使用多条件 include/exclude 来表示 AND 的方式有多种。最直接的方式是将多个条件包括在单个封闭标记内。以下示例显示了一个简单的多条件 AND 过程:

<include>
<key pattern="**/*MySQL*" />
<key pattern="**/*.exe"/>
</include>

同样,作为多条件要求的一部分,表示为包括标记属性的任意条件将会与封闭条件进行组合。以下示例显示了前一个以此方式重写的多条件 "include":

<include key="**/*.exe">
<key pattern="**/*MySQL*" />
</include>

最后,如果多个条件被表示为包含或排除的属性,则会将这些条件视为 AND:

<include executable="true" key="**/*MySQL*" />

OR 可以通过包含多个包含或排除标记简单地进行表达。以下代码可包括扩展名为 ".exe" 或 ".dll" 的文件:

<include key="**/*.dll" />
<include key="**/*.exe" />

评估顺序

无论规则中表面顺序如何,都会先处理所有 "includes"。如果一个对象名称匹配至少一个 "include" 标记,则会针对 "exclude" 标记对此名称进行测试。如果此对象名称匹配至少一个 "exclude" 标记,则系统会从受监控的对象集中移除此对象。

实体属性

给定的实体具有一组可以监控的属性。如果没有为实体集指定任何属性(例如不存在属性包装标记),则假定该实体具有 STANDARD 属性集。(有关各实体集的信息,请参阅速记属性部分。)

但是,对于给定的实体集,只有特定的实体属性才用于完整性监控。例如,最可能认为有必要并允许的是对日志文件内容的更改。但是,应该报告对权限或所有权进行的更改。

实体集的 "attributes" 标记允许表达此内容。"attributes" 标记包含一组枚举有用属性的标记。允许的 "attribute" 标记集会发生变化,具体取决于应用这些标记的实体集。

如果 "attributes" 标记存在,但不包含任何条目,则系统只监控是否存在由规则定义的实体。

以下示例监控 "C:\Program Files\MySQL" 中名称包含 "SQL" 的可执行文件的“上次修改时间”、“权限”以及“所有者”属性所发生的更改:

<FileSet base="C:\Program Files\MySQL" >
<include key="**/*SQL*" executable="true"/>
<attributes>
<lastModified/>
<permissions/>
<owner/>
</attributes>
</FileSet>

以下示例监控 "C:\Program Files\MySQL" 中日志文件的“权限”和“所有者”属性:

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

速记属性

速记属性提供了一种使用单个更高级别属性指定一组属性的方式。与常规属性相似,允许的值集会发生变化,具体取决于应用这些值的实体集。

速记属性在以下情况下会非常有用:一组属性自然组合到一起,完全列出一组属性将变得冗长,以及由高级别属性表示的属性集可能会随时间或系统配置发生更改。每种情况的示例分别如下所示:

属性 描述
STANDARD 用于监控实体集的属性集。这不同于实体集的“每个可能的属性”。例如,此属性集不包括每个可能的哈希算法,仅包括被认为足以满足功能的哈希算法。有关每个实体集的 "standard" 属性列表,请参阅各实体集的相关部分。
CONTENTS 这是文件内容的哈希或哈希集速记。缺省值为 SHA-1。

onChange

EntitySet 可能会被设置为实时监控更改。如果将 EntitySet 的 onChange 属性设置为 true(缺省值),则由 EntitySet 返回的实体的更改情况将受到实时监控。当检测到更改时,系统会立即根据实体基线对实体进行对比,以找出变化。如果将 EntitySet 的 onChange 属性设置为 false,仅当生成基线或通过预设任务(或根据趋势科技服务器深度安全防护系统管理中心的需求)触发基线时,才运行此实体集。

以下示例实时监控 MySQL 二进制文件:

<FileSet base="C:\Program Files\MySQL" onChange="true">
<include key="**/*.exe"/>
<include key="**/*.dll" />
</FileSet>

环境变量

环境变量可以包含在实体集中所使用的基值中。这些变量括在 "${}" 内。变量名称本身的前缀为 "env."。

以下示例将 FileSet 的基本目录设置为 PROGRAMFILES 环境变量中存储的路径:

<FileSet base="${env.PROGRAMFILES}"/>

引用的环境变量的值由趋势科技服务器深度安全防护系统客户端在客户端启动时读取并存储。如果环境变量的值发生更改,则必须重新启动客户端才能注册更改。

如果未找到引用的环境变量,则不会扫描或监控引用此变量的实体集,但使用其余配置。触发警报表示变量不存在。客户端使用客户端事件“完整性监控规则编译问题”来报告无效的环境变量。完整性监控规则的 ID 和环境变量名称将作为参数提供给事件。

注册表值

注册表值可以包含在实体集中所使用的基值中。这些注册表值括在 ${} 内。注册表值本身的路径前缀为 "reg."。以下示例将 FileSet 的基本目录设置为 "HKLM\Software\Trend Micro\趋势科技服务器深度安全防护系统 Agent\InstallationFolder" 注册表值中存储的路径:

<FileSet base="${reg.HKLM\Software\Trend Micro\趋势科技服务器深度安全防护系统 Agent\安装文件夹}"/>

客户端收到新的或已更改的规则时,会读取引用的注册表值。客户端还会在启动时检查所有规则,如果任何引用的注册表值发生更改,客户端将针对受影响的规则重新生成基线。

如果未找到引用的注册表值,则不会扫描或监控引用此注册表值的实体集,但使用其余配置。会引发警报,通知您变量不存在。客户端使用客户端事件 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" 中的文件的权限和所有权设置限制。完整性监控规则应该监控所有者、组和权限,而非其他属性(如上次修改时间或哈希值)。

使用完整性监控规则检测恶意软件和可疑活动时,监控服务、观察 NTFS 数据流的使用情况,并留意特殊位置(如 "/tmp" 或 "${env.windir}\temp")中的可执行文件。

指定要在规则中包括的对象时,尽可能具体一点。包括的对象越少,则创建基线以及扫描更改所花费的时间就越少。排除预料中会发生更改的对象,仅监控关心的属性。

请勿执行以下操作:

  • 从层次结构的顶级(如 "/"、"C:\" 或 "HKLM\Software")使用 "**/..."
  • 使用多个内容哈希类型(除非绝对必要)
  • 引用用户特定的位置,如 HKEY_CURRENT_USER${env.USERPROFILE}${env.HOME}

在完整性监控规则中使用任何这些语句都将导致性能问题,因为趋势科技服务器深度安全防护系统客户端会搜索许多项以匹配指定的特征码。