创建自定义敏感信息类型

Office 365 中的数据丢失防护 (DLP) 包括许多敏感信息类型,可直接在 DLP 策略中使用。这些内置类型有助于识别和保护信用卡号、银行帐号、护照号码等。

但如需识别和保护不同类型的敏感信息(例如员工 ID,其格式特定于组织),可创建自定义敏感信息类型。在被称为规则包的 XML 文件中定义敏感信息类型。

本主题介绍如何创建 XML 文件,定义自己的自定义敏感信息类型。需要了解如何创建正则表达式。为提供示例,本主题创建识别员工 ID 的自定义敏感信息类型。可以此示例 XML 为起点,创建自己的 XML 文件。

创建正常可用的 XML 文件后,可使用 PowerShell 将其上传到 Office 365。然后便可在 DLP 策略中使用自定义敏感信息类型,测试其是否能按需检测敏感信息。

目录

规则包 XML 示例

以下是要在本主题中创建的规则包的 XML 示例。下文介绍了元素和属性。

<?xml version="1.0" encoding="UTF-16"?>
<RulePackage xmlns="http://schemas.microsoft.com/office/2011/mce">

<RulePack id="DAD86A92-AB18-43BB-AB35-96F7C594ADAA">
	<Version build="0" major="1" minor="0" revision="0"/>
	<Publisher id="619DD8C3-7B80-4998-A312-4DF0402BAC04"/>
	<Details defaultLangCode="en-us">
		<LocalizedDetails langcode="en-us">
			<PublisherName>Contoso</PublisherName>
			<Name>Employee ID Custom Rule Pack</Name>
			<Description>
			This rule package contains the custom Employee ID entity.
			</Description>
		</LocalizedDetails>
	</Details>
</RulePack>

<Rules>
<!-- Employee ID -->
	<Entity id="E1CC861E-3FE9-4A58-82DF-4BD259EAB378" patternsProximity="300" recommendedConfidence="70">
		<Pattern confidenceLevel="60">
			<IdMatch idRef="Regex_employee_id"/>
		</Pattern>
		<Pattern confidenceLevel="70">
			<IdMatch idRef="Regex_employee_id"/>
			<Match idRef="Func_us_date"/>
		</Pattern>
		<Pattern confidenceLevel="80">
			<IdMatch idRef="Regex_employee_id"/>
			<Match idRef="Func_us_date"/>
			<Any minMatches="1">
				<Match idRef="Keyword_badge" minCount=”2”/>
				<Match idRef="Keyword_employee"/>
			</Any>
			<Any minMatches="0" maxMatches="0">
				<Match idRef="Keyword_false_positives_local"/>
				<Match idRef="Keyword_false_positives_intl"/>
			</Any>
		</Pattern>
	</Entity>

	<Regex id="Regex_employee_id">(\s)(\d{9})(\s)</Regex>
	<Keyword id="Keyword_employee">
		<Group matchStyle="word">
			<Term>Identification</Term>
			<Term>Contoso Employee</Term>
		</Group>
	</Keyword>
	<Keyword id="Keyword_badge">
		<Group matchStyle="string">
			<Term>card</Term>
			<Term>badge</Term>
			<Term caseSensitive="true">ID</Term>
		</Group>
	</Keyword>
	<Keyword id="Keyword_false_positives_local">
		<Group matchStyle="word">
			<Term>credit card</Term>
			<Term>national ID</Term>
		</Group>
	</Keyword>
	<Keyword id="Keyword_false_positives_intl">
		<Group matchStyle="word">
			<Term>identity card</Term>
			<Term>national ID</Term>
			<Term>EU debit card</Term>
		</Group>
	</Keyword>
	<LocalizedStrings>
		<Resource idRef="E1CC861E-3FE9-4A58-82DF-4BD259EAB378">
			<Name default="true" langcode="en-us">Employee ID</Name>
			<Description default="true" langcode="en-us">
			A custom classification for detecting Employee IDs.
			</Description>
			<Name default="true" langcode="de-de">Name for German locale</Name>
			<Description default="true" langcode="de-de">
			Description for German locale.
			</Description>
		</Resource>
	</LocalizedStrings>
</Rules>
</RulePackage>

关键要求是什么?[Rule、Entity、Pattern 元素]

在开始之前,有必要了解一下规则的 XML 架构的基本结构,以及如何使用此结构定义自定义敏感信息类型,从而使其能够识别正确内容。

一个规则定义一个或多个实体(敏感信息类型),且每个实体定义一个或多个模式。模式是 DLP 在评估电子邮件和文档等内容时查找的对象。

(关于术语的简要说明 - 如果熟悉 DLP 策略,就会知道一个策略包含一个或多个由条件和操作组成的规则。但是,在本主题中,XML 标记使用规则来表示定义实体的模式,该实体也称为敏感信息类型。所以在本主题中,出现规则时,请将其视为实体或敏感信息类型,而非条件和操作。)

最简单的方案:含一种模式的实体

下面是最简单的方案。希望 DLP 策略识别包含组织员工 ID 的内容,该 ID 由九位数字组成。此时,模式是指规则中包含的可识别九位数字的正则表达式。包含九位数字的任何内容都满足该模式。

含一个模式的实体的关系图

虽然这种模式很简单,但由于它会匹配包含九位数字但却不一定是员工 ID 的内容,所以可能会产生许多误报。

更常见的方案:含多种模式的实体

因此,更为常见的还是使用多个模式来定义实体,在此方案中,除实体(例如九位数字)外,模式还可识别支持的证据(如关键字或日期)。

例如,为了尽可能识别包含员工 ID 的内容,除识别九位数字的模式外,还可定义另一个能识别聘用日期的模式,同时再定义一个可同时识别聘用日期和关键字的模式(例如“员工 ID”)。

含多个模式的实体的关系图

注意这个结构的几个重要方面:

  • 需要更多证据的模式具有更高的可信度级别。这一点十分有用,因为稍后在 DLP 策略中使用此敏感信息类型时,可仅通过较高可信度级别的匹配来使用限制性更高的操作(如阻止内容);通过较低可信度级别的匹配来使用限制性较低的操作(如发送通知)。

  • 提供支持的 IdMatch 和 Match 元素会引用实际上是 Rule 元素(而不是 Pattern 元素)子级的正则表达式和关键字。这些支持性元素由 Pattern 引用,但却包含在 Rule 中。这意味着,支持性元素的单个定义,如正则表达式或关键字列表,可被多个实体和模式引用。

需要识别什么实体?[Entity 元素、ID 属性]

实体是信用卡号等敏感信息类型,具有定义明确的模式。每个实体具有唯一 GUID 作为其 ID。

命名实体并生成其 GUID

添加 Rules 和 Entity 元素。然后添加一个包含自定义实体名称的注释 - 在本示例中实体为员工 ID。稍后将实体名称添加到本地化的字符串部分,创建 DLP 策略时,会在 UI 中显示该名称。

接下来,生成实体的 GUID。有几种方法可生成 GUID,可在 PowerShell 中通过键入 [guid]::NewGuid() 轻松生成。稍后还要将实体 GUID 添加到本地化的字符串部分。

XML 标记,显示 Rules 和 Entity 元素

要匹配何种模式?[Pattern 元素、IdMatch 元素、Regex 元素]

模式包含敏感信息类型查找的内容的列表。其中可包括正则表达式、关键字和内置函数,函数用于执行运行正则表达式查找日期或地址等任务。敏感信息类型可具有含唯一可信度的多个模式。

以下所有模式的共同之处在于,它们都引用相同的正则表达式,该正则表达式查找由空格 (\s) … (\s) 包围的九位数字 (\d{9})。该正则表达式由 IdMatch 元素引用,且对于所有查找员工 ID 实体的模式,该表达式为通用要求。IdMatch 是模式要匹配的标识符,如员工 ID 或信用卡号或社保号。Pattern 元素只能有一个 IdMatch 元素。

XML 标记,显示多个引用单个 Regex 元素的 Pattern 元素

在满足条件的情况下,模式返回一个计数和可信度级别,可用于 DLP 策略中的条件。将检测敏感信息类型的条件添加到 DLP 策略时,可编辑计数和可信度级别,如以下所示。本主题稍后会介绍可信度级别(也称为匹配准确度)。

实例计数和匹配准确度选项

创建正则表达式时,请记住,有需要注意的潜在问题。例如,如果编写了一个识别过多内容的正则表达式并将其上传,可能会影响性能。若要详细了解这些潜在问题,请参阅后面的要注意的潜在验证问题部分。

是否需要额外证据?[Match 元素、minCount 属性]

除 IdMatch 元素外,模式也可以使用 Match 元素来要求额外的支持性证据,如关键字、正则表达式、日期或地址。

一种模式可包含多个 Match 元素;这些元素可直接包括在 Pattern 元素中,或通过 Any 元素进行合并。Match 元素通过隐式 AND 运算符进行连接;必须满足所有 Match 元素,才能使模式匹配。可使用 Any 元素来引入 AND 或 OR 运算符(在后面的部分会详细介绍)。

可使用可选的 minCount 属性来指定需要为每个 Match 元素找到多少个匹配实例。例如,可指定至少在关键字列表中找到两个关键字时才满足模式。

XML 标记,显示含 minOccurs 属性的 Match 元素

关键字 [Keyword、Group 和 Term 元素、matchStyle 和 caseSensitive 属性]

识别员工 ID 等敏感信息时,通常希望要求将关键字作为补强证据。例如,除匹配九位数字外,还可能希望查找“卡”、“徽章”或“ID”等字眼。若要实现此目的,可使用 Keyword 元素。Keyword 元素具有一个 ID 属性,可由多个模式或实体中的多个 Match 元素引用。

关键字作为 Term 元素列表包含在 Group 元素中。Group 元素的 matchStyle 属性有两个可能的值:

  • matchStyle=”word” 词汇匹配可识别由空格或其他分隔符包围的全部词汇。除需要匹配部分词汇或匹配亚洲语言词汇外,其他情况下都应使用词汇匹配。

  • matchStyle=”string” 字符串匹配可识别字符串,无需考虑其周围的内容例如,“id”将匹配“投标”和“创意”。仅在后列两种情况下使用字符串匹配:需匹配亚洲词汇;关键字可能为其他字符串的一部分。

最后,可使用 Term 元素的 caseSensitive 属性指定内容必须精确匹配关键字,包括字母的大小写。

XML 标记,显示引用关键字的 Match 元素

正则表达式 [Regex 元素]

在此示例中,员工 ID 实体已使用 IdMatch 元素引用模式(由空格包围的九位数字)的正则表达式。此外,模式还可使用 Match 元素再引用一个 Regex 元素,以识别补强证据,例如格式为美国邮政编码格式的五位或九位数字。

日期或地址等额外模式 [内置函数]

除内置的敏感信息类型外,DLP 还包含内置函数,可识别美国日期、欧洲日期、到期日或美国地址等补强证据。DLP 不支持上传自己的自定义函数,但创建自定义敏感信息类型时,实体可引用内置函数。

例如,员工 ID 徽章上有一个聘用日期,所以此自定义实体可使用内置函数 Func_us_date 来识别美国常用格式的日期。

有关详细信息,请参阅 DLP 函数查找的内容

XML 标记,显示引用内置函数的 Match 元素

不同的证据组合 [Any 元素、minMatches 和 maxMatches 属性]

在一个 Pattern 元素中,所有 IdMatch 和 Match 元素均通过一个隐式 AND 运算符连接,必须满足所有匹配条件才能满足模式。但可使用 Any 元素对 Match 元素进行归组,创建更灵活的匹配逻辑。例如,可使用 Any 元素来匹配其子 Match 元素中的全部、零个或一个确切子集。

Any 元素具有可选的 minMatches 和 maxMatches 属性,可用于定义模式匹配须满足的子 Match 元素的个数。请注意,这些属性定义的是必须满足的 Match 元素的数,而不是要为匹配查找的证据实例数。若要为特定匹配定义最小实例数,例如列表中的两个关键字,请为 Match 元素使用 minCount 属性(见上文)。

至少匹配一个子 Match 元素

如果希望只要求满足最小数量的 Match 元素,则可使用 minMatches 属性。实际上,这些 Match 元素通过隐式 OR 运算符进行连接。如果找到任一列表中的美国格式的日期或关键字,则满足此 Any 元素。

XML 标记,显示具有 minMatches 属性的 Any 元素

匹配任何子 Match 元素的精确子集

如果希望要求满足精确数量的 Match 元素,则可将 minMatches 和 maxMatches 设置为相同的值。仅当找到一个(仅一个)日期或关键字时,才满足 Any 元素,超过一个则不匹配该模式。

XML 标记,显示具有 minMatches 和 maxMatches 属性的 Any 元素

匹配零个子 Match 元素

如果要求不能存在特定证据才可满足模式,则可将 minMatches 和 maxMatches 均设置为 0。当具有可能导致误报的关键字列表或其他证据时,这一设置十分有用。

例如,员工 ID 实体会查找关键字“卡”,因为它可能指“ID 卡”。但是,如果“卡”只出现在了“信用卡”一词中,那么此内容中的“卡”不可能指“ID 卡”。那么,可将“信用卡”作为关键字添加到满足模式时要排除的术语列表中。

XML 标记,显示值为零的 maxMatches 属性

另一个证据必须多接近实体?[patternsProximity 属性]

敏感信息类型正在查找表示员工 ID 的模式,同时也在查找补强证据(作为模式的一部分),例如“ID”等关键字。这样做的意义在于,此证据近似度越高,那么模式就越有可能真的是员工 ID。可使用 Entity 元素所需的 patternsProximity 属性来确定模式中其他证据须达到的与实体的接近程度。

XML 标记,显示 patternsProximity 属性

对于实体中的每个模式,patternsProximity 属性值针对为该模式指定的所有其他匹配定义与 IdMatch 位置的距离(采用 Unicode 字符)。接近度窗口通过 IdMatch 位置锚定,窗口扩展到 IdMatch 的左右。

接近度窗口的关系图

下方示例展示接近度窗口如何影响模式匹配,其中,员工 ID 自定义实体的 IdMatch 元素要求至少满足一个关键字或日期的补强匹配。只有 ID1 匹配,因为对于 ID2 和 ID3,在接近度窗口中没有或只存在部分补强证据。

补强证据和接近度窗口的关系图

对于电子邮件,请注意,邮件正文和各个附件视为单独项目。这意味着接近度窗口不会扩展到上述各个项目结尾之外。对于每个项目(附件或正文),idMatch 和确凿证据需要驻留在该项目中。

对于不同模式,适合的可信度级别是什么?[confidenceLevel 属性、recommendedConfidence 属性]

模式需要的证据越多,模式匹配时,就越能确定识别出真正的实体(如员工 ID)。例如,相比只要求九位数 ID 号码的模式,一个要求九位数 ID 号码、聘用日期和高度相关的关键字的模式可信度会更高。

Pattern 元素具有必需的 confidenceLevel 属性。可将 confidenceLevel(1 到 100 间的整数)的值视为实体中每个模式的唯一 ID - 实体中的模式必须具有不同的可信度级别。整数的具体值无关紧要 - 只需选取对符合性团队有意义的数字即可。上传自定义敏感信息类型并创建 DLP 策略后,可在创建的规则的条件中引用这些可信度级别。

XML 标记,显示 Pattern 元素,该元素具有 confidenceLevel 属性的不同值

除每个模式的 confidenceLevel 外,Entity 还有一个 recommendedConfidence 属性。可将推荐的可信度属性视为规则的默认可信度级别。在 DLP 策略中创建规则时,如果不指定规则要使用的可信度级别,则该规则将基于推荐的实体可信度级别进行匹配。

是否希望安全与合规中心的用户界面支持其他语言?[LocalizedStrings 元素]

如果符合性团队使用 Office 365 安全与合规中心在不同区域设置和不同语言环境中创建 DLP 策略,则可提供本地化版本的自定义敏感信息类型的名称和描述。若符合性团队使用支持语言的 Office 365,则 UI 中会出现本地化的名称。

实例计数和匹配准确度选项

Rules 元素必须包含一个 LocalizedStrings 元素,该元素包含引用自定义实体的 GUID 的 Resource 元素。而每个 Resource 元素又包含一个或多个 Name 和 Description 元素,每个元素都使用 langcode 属性为特定语言提供一个本地化的字符串。

XML 标记,显示 LocalizedStrings 元素的内容

请注意,本地化字符串只能用于决定自定义敏感信息类型在安全与合规中心的 UI 中的显示方式。不能使用本地化字符串来提供不同版本的本地化关键字列表或正则表达式。

其他规则包标记 [RulePack GUID]

最后,每个 RulePackage 的开头部分都包含一些需要填写的基本信息。可使用以下标记作为模板,使用自己的信息替换“. . .”。

最重要的是,需要为 RulePack 生成 GUID。如上述,为该实体生成了一个 GUID;这是 RulePack 的第二个 GUID。有几种方法可生成 GUID,可在 PowerShell 中通过键入 [guid]::NewGuid() 轻松生成。

Version 元素也很重要。首次上传规则包时,Office 365 会记录版本号。稍后,如果更新规则包并上传新版本,请务必更新版本号,否则 Office 365 将不会部署该规则包。

<?xml version="1.0" encoding="utf-16"?>
<RulePackage xmlns="http://schemas.microsoft.com/office/2011/mce">
  <RulePack id=". . .">
    <Version major="1" minor="0" build="0" revision="0" />
    <Publisher id=". . ." /> 
    <Details defaultLangCode=". . .">
      <LocalizedDetails langcode=" . . . ">
         <PublisherName>. . .</PublisherName>
         <Name>. . .</Name>
         <Description>. . .</Description>
      </LocalizedDetails>
    </Details>
  </RulePack>
  
 <Rules>

	. . .

 </Rules>
</RulePackage>

完成后,RulePack 元素应为如下所示。

XML 标记,显示 RulePack 元素

Exchange Online 的更改

以前,你可能已使用过 Exchange Online PowerShell 为 DLP 导入自定义敏感信息类型。现在,可以自定义可用于 Exchange 管理中心中和安全与合规中心的敏感信息类型。此次改进后,应使用安全与合规中心 PowerShell 导入自定义敏感信息类型,不再可从 Exchange PowerShell 导入它们。自定义敏感信息类型将像往常一样正常工作,但是,在安全与合规中心进行的更改可能需要至多一小时才会出现在 Exchange 管理中心。

请注意,在安全与合规中心,要使用 DlpSensitiveInformationTypeRulePackage cmdlet 来上传规则包。以前,在 Exchange 管理中心,使用的是 ClassificationRuleCollection cmdlet。

上传规则包

若要上传规则包,请执行以下操作。

  1. 使用 Unicode 编码将其保存为 xml 文件。

  2. 使用远程 PowerShell 连接到 Office 365 安全与合规中心

  3. 在安全与合规中心 PowerShell 中,键入 New-DlpSensitiveInformationTypeRulePackage -FileData (Get-Content -Path "C:\custompath\MyNewRulePack.xml" -Encoding Byte)

    确保使用实际存储规则包的文件位置。C:\custompath\ 是占位符。

  4. 键入“Y”,然后按 Enter 键以确认。

  5. 键入 Get-DlpSensitiveInformationType 查看所有敏感类型的列表,验证是否上传了新敏感信息类型。可查看“发布者”列,快速区分自定义敏感信息类型与内置敏感信息类型。可运行 Get-DlpSensitiveInformationType -Identity “敏感信息类型名称”以筛选列表,获取特定敏感信息类型。

要注意的潜在验证问题

上传规则包 XML 文件时,系统将验证 XML 并检查已知错误模式和明显的性能问题。以下是验证过程要检查的一些已知问题 - 正则表达式:

  • 不能以交替符“|”开头或结尾,交替符会匹配所有内容,因为其被视为空匹配。

    例如,“|a”或“b|”无法通过验证。

  • 不能以“.{0,m}”模式开头或结尾,这种模式不具有功能,只会削弱性能。

    例如,“.{0,50}ASDF”或“ASDF.{0,50}”无法通过验证。

  • 组中不能含有“.{0,m}”或“.{1,m}”,以及“.*”或“.+”。

    例如,“(.{0,50000})”无法通过验证。

  • 组中不能含有带“{0,m}”或“{1,m}”repeater 的任何字符。

    例如,“(a*)”无法通过验证。

  • 不能将“.{1,m}”用于开头或结尾,只能使用“.”

    例如,“.{1,m}asdf”无法通过验证,只有“.asdf”能通过验证。

  • 一个组中不能有无界 repeater(如“*”或“+”)。

    例如,“(xx)*”或“(xx)+”无法通过验证。

如果自定义敏感信息类型包含可能会影响性能的问题,则不会上传该类型,并可能会出现以下任一错误消息:

  • 匹配内容的量超过预期的泛型限定符(例如,“+”、“*”)

  • Lookaround 断言

  • 配合使用复杂分组与常规限定符

重新爬取内容以识别敏感信息

DLP 使用搜索爬取器识别网站内容中的敏感信息并进行分类。SharePoint Online 和 OneDrive for Business 网站中的内容更新时会自动重新爬取内容。但若要确定所有现有内容中的新自定义类型的敏感信息,必须重新爬取该内容。

在 Office 365 中,无法手动请求重新爬取整个租户,但可对网站集、列表或库执行此操作 - 请参阅 Manually request crawling and re-indexing of a site, a library or a list(手动请求爬取网站、库或列表及重新对其编制索引)。

删除自定义敏感信息类型

  1. 使用远程 PowerShell 连接到 Office 365 安全与合规中心

  2. 在安全与合规中心 PowerShell 中,执行以下任一操作:

    • 删除整个规则包及其包含的所有实体

      键入 Remove-DlpSensitiveInformationTypeRulePackage "NameOfYourRulePack" – 对于以上示例 XML,请键入 Remove-DlpSensitiveInformationTypeRulePackage "Employee ID Custom Rule Pack"

      请注意,若要识别规则包,可使用 <Rule Pack> 元素中的 <Name> 元素(适用于任何语言)或 RulePack 元素的 ID 属性的 GUID。

    • 从规则包删除单个实体

      删除该特定实体后,必须使用 Set-DlpSensitiveInformationTypeRulePackage 上传新版本的规则包。在删除特定实体之前,需确保没有 DLP 策略或 Exchange 传输规则仍在引用此敏感信息类型。

  3. 键入“Y”,然后按 Enter 键以确认。

  4. 键入 Get- DlpSensitiveInformationType,验证是否已删除新规则,若已删除,则不会再显示敏感信息类型的名称。

参考:规则包 XML 架构定义

可复制此标记,将其另存为 XSD 文件,并将其用于验证规则包 XML 文件。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:mce="http://schemas.microsoft.com/office/2011/mce"
           targetNamespace="http://schemas.microsoft.com/office/2011/mce" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           id="RulePackageSchema">
  <!-- Use include if this schema has the same target namespace as the schema being referenced, otherwise use import -->
  <xs:element name="RulePackage" type="mce:RulePackageType"/>
  <xs:simpleType name="LangType">
    <xs:union memberTypes="xs:language">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value=""/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
  <xs:simpleType name="GuidType" final="#all">
    <xs:restriction base="xs:token">
      <xs:pattern value="[0-9a-fA-F]{8}\-([0-9a-fA-F]{4}\-){3}[0-9a-fA-F]{12}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="RulePackageType">
    <xs:sequence>
      <xs:element name="RulePack" type="mce:RulePackType"/>
      <xs:element name="Rules" type="mce:RulesType">
        <xs:key name="UniqueRuleId">
          <xs:selector xpath="mce:Entity|mce:Affinity|mce:Version/mce:Entity|mce:Version/mce:Affinity"/>
          <xs:field xpath="@id"/>
        </xs:key>
        <xs:key name="UniqueProcessorId">
          <xs:selector xpath="mce:Regex|mce:Keyword|mce:Fingerprint"></xs:selector>
          <xs:field xpath="@id"/>
        </xs:key>
        <xs:key name="UniqueResourceIdRef">
          <xs:selector xpath="mce:LocalizedStrings/mce:Resource"/>
          <xs:field xpath="@idRef"/>
        </xs:key>        
        <xs:keyref name="ReferencedRuleMustExist" refer="mce:UniqueRuleId">
          <xs:selector xpath="mce:LocalizedStrings/mce:Resource"/>
          <xs:field xpath="@idRef"/>
        </xs:keyref>
        <xs:keyref name="RuleMustHaveResource" refer="mce:UniqueResourceIdRef">
          <xs:selector xpath="mce:Entity|mce:Affinity|mce:Version/mce:Entity|mce:Version/mce:Affinity"/>
          <xs:field xpath="@id"/>
        </xs:keyref>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="RulePackType">
    <xs:sequence>
      <xs:element name="Version" type="mce:VersionType"/>
      <xs:element name="Publisher" type="mce:PublisherType"/>
      <xs:element name="Details" type="mce:DetailsType">
        <xs:key name="UniqueLangCodeInLocalizedDetails">
          <xs:selector xpath="mce:LocalizedDetails"/>
          <xs:field xpath="@langcode"/>
        </xs:key>
        <xs:keyref name="DefaultLangCodeMustExist" refer="mce:UniqueLangCodeInLocalizedDetails">
          <xs:selector xpath="."/>
          <xs:field xpath="@defaultLangCode"/>
        </xs:keyref>
      </xs:element>
      <xs:element name="Encryption" type="mce:EncryptionType" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="id" type="mce:GuidType" use="required"/>
  </xs:complexType>
  <xs:complexType name="VersionType">
    <xs:attribute name="major" type="xs:unsignedShort" use="required"/>
    <xs:attribute name="minor" type="xs:unsignedShort" use="required"/>
    <xs:attribute name="build" type="xs:unsignedShort" use="required"/>
    <xs:attribute name="revision" type="xs:unsignedShort" use="required"/>
  </xs:complexType>
  <xs:complexType name="PublisherType">
    <xs:attribute name="id" type="mce:GuidType" use="required"/>
  </xs:complexType>
  <xs:complexType name="LocalizedDetailsType">
    <xs:sequence>
      <xs:element name="PublisherName" type="mce:NameType"/>
      <xs:element name="Name" type="mce:RulePackNameType"/>
      <xs:element name="Description" type="mce:OptionalNameType"/>
    </xs:sequence>
    <xs:attribute name="langcode" type="mce:LangType" use="required"/>
  </xs:complexType>
  <xs:complexType name="DetailsType">
    <xs:sequence>
      <xs:element name="LocalizedDetails" type="mce:LocalizedDetailsType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="defaultLangCode" type="mce:LangType" use="required"/>
  </xs:complexType>
  <xs:complexType name="EncryptionType">
    <xs:sequence>
      <xs:element name="Key" type="xs:normalizedString"/>
      <xs:element name="IV" type="xs:normalizedString"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="RulePackNameType">
    <xs:restriction base="xs:token">
      <xs:minLength value="1"/>
      <xs:maxLength value="64"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="NameType">
    <xs:restriction base="xs:normalizedString">
      <xs:minLength value="1"/>
      <xs:maxLength value="256"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OptionalNameType">
    <xs:restriction base="xs:normalizedString">
      <xs:minLength value="0"/>
      <xs:maxLength value="256"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="RestrictedTermType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
      <xs:maxLength value="100"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="RulesType">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Entity" type="mce:EntityType"/>
        <xs:element name="Affinity" type="mce:AffinityType"/>
        <xs:element name="Version" type="mce:VersionedRuleType"/>
      </xs:choice>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Regex" type="mce:RegexType"/>
        <xs:element name="Keyword" type="mce:KeywordType"/>
        <xs:element name="Fingerprint" type="mce:FingerprintType"/>
        <xs:element name="ExtendedKeyword" type="mce:ExtendedKeywordType"/>
      </xs:choice>
      <xs:element name="LocalizedStrings" type="mce:LocalizedStringsType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="EntityType">
    <xs:sequence>
      <xs:element name="Pattern" type="mce:PatternType" maxOccurs="unbounded"/>
      <xs:element name="Version" type="mce:VersionedPatternType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="id" type="mce:GuidType" use="required"/>
    <xs:attribute name="patternsProximity" type="mce:ProximityType" use="required"/>
    <xs:attribute name="recommendedConfidence" type="mce:ProbabilityType"/>
    <xs:attribute name="workload" type="mce:WorkloadType"/>
  </xs:complexType>
  <xs:complexType name="PatternType">
    <xs:sequence>
      <xs:element name="IdMatch" type="mce:IdMatchType"/>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Match" type="mce:MatchType"/>
        <xs:element name="Any" type="mce:AnyType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="confidenceLevel" type="mce:ProbabilityType" use="required"/>
  </xs:complexType>
  <xs:complexType name="AffinityType">
    <xs:sequence>
      <xs:element name="Evidence" type="mce:EvidenceType" maxOccurs="unbounded"/>
      <xs:element name="Version" type="mce:VersionedEvidenceType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="id" type="mce:GuidType" use="required"/>
    <xs:attribute name="evidencesProximity" type="mce:ProximityType" use="required"/>
    <xs:attribute name="thresholdConfidenceLevel" type="mce:ProbabilityType" use="required"/>
    <xs:attribute name="workload" type="mce:WorkloadType"/>
  </xs:complexType>
  <xs:complexType name="EvidenceType">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Match" type="mce:MatchType"/>
        <xs:element name="Any" type="mce:AnyType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="confidenceLevel" type="mce:ProbabilityType" use="required"/>
  </xs:complexType>
  <xs:complexType name="IdMatchType">
    <xs:attribute name="idRef" type="xs:string" use="required"/>
  </xs:complexType>
  <xs:complexType name="MatchType">
    <xs:attribute name="idRef" type="xs:string" use="required"/>
    <xs:attribute name="minCount" type="xs:positiveInteger" use="optional"/>
    <xs:attribute name="uniqueResults" type="xs:boolean" use="optional"/>
  </xs:complexType>
  <xs:complexType name="AnyType">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Match" type="mce:MatchType"/>
        <xs:element name="Any" type="mce:AnyType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="minMatches" type="xs:nonNegativeInteger" default="1"/>
    <xs:attribute name="maxMatches" type="xs:nonNegativeInteger" use="optional"/>
  </xs:complexType>
  <xs:simpleType name="ProximityType">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:enumeration value="unlimited"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:positiveInteger">
          <xs:minInclusive value="1"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
  <xs:simpleType name="ProbabilityType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="100"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="WorkloadType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Exchange"/>
      <xs:enumeration value="Outlook"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="EngineVersionType">
    <xs:restriction base="xs:token">
      <xs:pattern value="^\d{2}\.01?\.\d{3,4}\.\d{1,3}$"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="VersionedRuleType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="Entity" type="mce:EntityType"/>
      <xs:element name="Affinity" type="mce:AffinityType"/>
    </xs:choice>
    <xs:attribute name="minEngineVersion" type="mce:EngineVersionType" use="required" />
  </xs:complexType>
  <xs:complexType name="VersionedPatternType">
    <xs:sequence>
      <xs:element name="Pattern" type="mce:PatternType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="minEngineVersion" type="mce:EngineVersionType" use="required" />
  </xs:complexType>
  <xs:complexType name="VersionedEvidenceType">
    <xs:sequence>
      <xs:element name="Evidence" type="mce:EvidenceType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="minEngineVersion" type="mce:EngineVersionType" use="required" />
  </xs:complexType>
  <xs:simpleType name="FingerprintValueType">
    <xs:restriction base="xs:string">
      <xs:minLength value="2732"/>
      <xs:maxLength value="2732"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="FingerprintType">
    <xs:simpleContent>
      <xs:extension base="mce:FingerprintValueType">
        <xs:attribute name="id" type="xs:token" use="required"/>
        <xs:attribute name="threshold" type="mce:ProbabilityType" use="required"/>
        <xs:attribute name="shingleCount" type="xs:positiveInteger" use="required"/>
        <xs:attribute name="description" type="xs:string" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="RegexType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="id" type="xs:token" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="KeywordType">
    <xs:sequence>
      <xs:element name="Group" type="mce:GroupType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:token" use="required"/>
  </xs:complexType>
  <xs:complexType name="GroupType">
    <xs:sequence>
      <xs:choice>
        <xs:element name="Term" type="mce:TermType" maxOccurs="unbounded"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="matchStyle" default="word">
      <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
          <xs:enumeration value="word"/>
          <xs:enumeration value="string"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="TermType">
    <xs:simpleContent>
      <xs:extension base="mce:RestrictedTermType">
        <xs:attribute name="caseSensitive" type="xs:boolean" default="false"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ExtendedKeywordType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="id" type="xs:token" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="LocalizedStringsType">
    <xs:sequence>
      <xs:element name="Resource" type="mce:ResourceType" maxOccurs="unbounded">
      <xs:key name="UniqueLangCodeUsedInNamePerResource">
        <xs:selector xpath="mce:Name"/>
        <xs:field xpath="@langcode"/>
      </xs:key>
      <xs:key name="UniqueLangCodeUsedInDescriptionPerResource">
        <xs:selector xpath="mce:Description"/>
        <xs:field xpath="@langcode"/>
      </xs:key>
    </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ResourceType">
    <xs:sequence>
      <xs:element name="Name" type="mce:ResourceNameType" maxOccurs="unbounded"/>
      <xs:element name="Description" type="mce:DescriptionType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="idRef" type="mce:GuidType" use="required"/>
  </xs:complexType>
  <xs:complexType name="ResourceNameType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="default" type="xs:boolean" default="false"/>
        <xs:attribute name="langcode" type="mce:LangType" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="DescriptionType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="default" type="xs:boolean" default="false"/>
        <xs:attribute name="langcode" type="mce:LangType" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

更多信息

扩展你的技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×