在 Exchange 2013 中開發敏感性資訊規則套件
適用於:Exchange Server 2013
本主題中的 XML 架構和指引將協助您開始建立自己的基本數據外洩防護, (DLP) XML 檔案,這些檔案會在分類規則套件中定義您自己的敏感性資訊類型。 建立格式正確的 XML 檔案之後,您可以使用 Exchange 系統管理中心或 Exchange 管理命令介面來匯入它,以協助建立 Microsoft Exchange Server 2013 DLP 解決方案。 自定義 DLP 原則範本的 XML 檔案可以包含您分類規則套件的 XML。 如需將您自己的 DLP 範本定義為 XML 檔案的概觀,請參閱 定義您自己的 DLP 範本和資訊類型。
編寫規則程序概觀
編寫規則的程序包含下列的一般步驟。
準備一組代表其目標環境的測試檔。 要針對一組測試文件考慮的主要特性包括:檔子集包含正在撰寫規則的實體或親和性,而檔的子集不包含正在撰寫規則的實體或親和性。
識別符合接受需求的規則 (精確度和召回) ,以識別合格的內容。 這項識別工作可能需要在規則內開發多個條件,並與布爾邏輯系結,這一起滿足識別目標檔的最低比對需求。
根據接受需求 (精確度和召回率) ,為規則建立建議的信賴等級。 建議的信賴元素可視為規則的預設信賴等級。
使用規則具現化原則並監視範例測試內容,以驗證規則。 根據結果調整規則或信賴等級,將偵測到的內容最大化,同時將誤判和負面降至最低。 繼續驗證和規則調整的迴圈,直到達到正面和負面樣本令人滿意的內容偵測層級為止。
如需原則範本檔之 XML 架構定義的詳細資訊,請參閱 開發 DLP 原則範本檔案。
規則說明
您可以為 DLP 敏感性資訊偵測引擎撰寫兩個主要的規則類型:實體和親和性。 選擇的規則類型是以應套用至內容處理的處理邏輯類型為基礎,如先前各節所述。 規則定義會以標準化規則 XSD 所描述的格式,在 XML 檔案中設定。 規則會描述要比對的內容類型,以及所描述相符專案代表目標內容的信賴等級。 如果在內容中找到 Pattern,信賴等級會指定實體存在的機率,如果在內容中找到辨識項,則指定存在同質的機率。
基本規則結構
規則定義由三個主要元件構成:
實體 可定義該規則的比對和計數邏輯
親和性 可定義規則的比對邏輯
當地語系化字串 當地語系化的規則名稱和說明
另外使用三個支援元素來定義處理的詳細數據,並在主要元件中參考:關鍵詞、Regex 和 Function。 藉由使用參考,支援專案的單一定義,例如社會安全號碼,可以在多個實體或同質規則中使用。 XML 格式的基本規則結構如下所示。
<?xml version="1.0" encoding="utf-8"?>
<RulePackage xmlns="http://schemas.microsoft.com/office/2011/mce">
<RulePack id="DAD86A92-AB18-43BB-AB35-96F7C594ADAA">
<Version major="1" minor="0" build="0" revision="0"/>
<Publisher id="619DD8C3-7B80-4998-A312-4DF0402BAC04"/>
<Details defaultLangCode="en-us">
<LocalizedDetails langcode="en-us">
<PublisherName>DLP by EPG</PublisherName>
<Name>CSO Custom Rule Pack</Name>
<Description>This is a rule package for a EPG demo.</Description>
</LocalizedDetails>
</Details>
</RulePack>
<Rules>
<!-- Employee ID -->
<Entity id="E1CC861E-3FE9-4A58-82DF-4BD259EAB378" patternsProximity="300" recommendedConfidence="75">
<Pattern confidenceLevel="75">
<IdMatch idRef="Regex_employee_id" />
<Match idRef="Keyword_employee" />
</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>
<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 ID's
</Description>
</Resource>
</LocalizedStrings>
</Rules>
</RulePackage>
實體規則
實體規則是以妥善定義的標識碼為目標,例如社會安全號碼,並以可計數模式的集合表示。 實體規則會傳回相符專案的計數和信賴等級,其中 Count 是找到之實體的實例總數,而信賴等級是指定之實體存在於指定檔中的機率。 實體包含 「Id」 屬性作為其唯一標識碼。 標識碼用於當地語系化、版本設定和查詢。 實體標識碼必須是 GUID。 實體標識碼不得在其他實體或親和性中重複。 在當地語系化字串區段中會參考它。
實體規則包含選擇性模式屬性 (預設值 = 300) 套用布爾邏輯以指定滿足比對條件所需的多個模式相鄰。 Entity 元素包含一或多個子 Pattern 元素,其中每個模式都是實體的不同表示法,例如信用卡實體或驅動程式授權實體。 Pattern 元素具有 confidenceLevel 的必要屬性,代表以範例數據集為基礎的模式精確度。 Pattern 元素可以有三個子元素:
IdMatch - 此元素為必要專案。
Match
任何
如果任何 Pattern 元素傳回 「true」 則會滿足 Pattern。 Entity 元素的計數等於所有偵測到的模式計數總和。
其中 k 是實體模式元素的數目。
Pattern 元素必須只有一個 IdMatch 元素。 IdMatch 代表 Pattern 要比對的標識碼,例如信用卡號碼或 ITIN 號碼。 模式的計數是與 Pattern 元素相符的 IdMatches 數目。 IdMatch 元素會錨定 Match 元素的鄰近視窗。
Pattern 元素的另一個選擇性子元素是 Match 元素,代表必須比對才能支持尋找 IdMatch 元素的相互關聯辨識項。 例如,較高的信賴度規則可能會要求除了尋找信用卡號碼之外,檔中還會有額外的成品存在於信用卡的鄰近視窗內,例如地址和名稱。 這些額外的成品會透過 Match 元素或 Any 元素來表示, (比對方法和技術一節) 中詳細說明。 多個 Match 元素可以包含在 Pattern 定義中,而 Pattern 定義可以直接包含在 Pattern 元素中,或是使用 Any 元素來定義相符語意的組合。 如果在錨定在IdMatch內容周圍的鄰近視窗中找到相符專案,則會傳回 true。
IdMatch 和 Match 元素不會定義需要比對內容的詳細數據,而是透過 idRef 屬性加以參考。 此參考可提升多個模式建構中定義的可重複使用性。
<Entity id="..." patternsProximity="300" >
<Pattern confidenceLevel="85">
<IdMatch idRef="FormattedSSN" />
<Any minMatches="1">
<Match idRef="SSNKeyword" />
<Match idRef="USDate" />
<Match idRef="USAddress" />
<Match idRef="Name" />
</Any>
</Pattern>
<Pattern confidenceLevel="65">
<IdMatch idRef="UnformattedSSN" />
<Match idRef="SSNKeyword" />
<Any minMatches="1">
<Match idRef="USDate" />
<Match idRef="USAddress" />
<Match idRef="Name" />
</Any>
</Pattern>
</Entity>
實體標識符專案,在先前的 XML 中以 “...” 表示應該是 GUID,且會在當地語系化字串一節中參考。
實體模式近似值視窗
實體會保留選用模式屬性值 (整數,預設值 = 300) 用來尋找模式。 針對每個模式,屬性值會定義 Unicode 字元中 (的距離,) 為該模式指定的所有其他符合專案,從 IdMatch 位置。 鄰近視窗會以IdMatch位置錨定,而視窗會延伸至IdMatch的左右兩側。
下列範例說明鄰近性視窗如何影響相符演算法,其中 SSN IdMatch 元素至少需要其中一個位址、名稱或日期的相符專案。 只有 SSN1 和 SSN4 相符,因為對於 SSN2 和 SSN3,鄰近視窗內找不到或只找到部分的相互關聯辨識項。
訊息本文和每個附件會被視為獨立專案。 此條件表示鄰近視窗不會延伸到這些專案的每一個結尾之後。 對於每個 (附件或本文) 的專案,idMatch 和 corroborative 辨識項都必須位於每個項目內。
實體信賴等級
實體元素的信賴等級是所有滿足模式信賴等級的組合。 它們會使用下列方程式來結合:
其中 k 是實體的 Pattern 元素數目,而不符合 的 Pattern 會傳回信賴等級 0。
請參閱實體元素結構程式碼範例,若兩種模式都符合,就會依據下列計算傳回 94.75% 的實體信賴等級:
CLEntity= 1-[(1-CLPattern1) x (1-CLPattern1)]
= 1-[(1-0.85) x (1-0.65)]
= 1-(0.15 x 0.35)
= 94.75%
同樣地,若僅有第二種模式符合,就會依據下列計算傳回 65% 的實體信賴等級:
CLEntity= 1 - [(1 - CLPattern1) X (1 - CLPattern1)]
= 1 - [(1 - 0) X (1 - 0.65)]
= 1 - (1 X 0.35)
= 65%
系統會將這些信賴值指派給個別模式的規則,而這些模式是以規則編寫程序中驗證的測試文件集為依據。
親和性規則
同質規則的目標是沒有定義完善標識符的內容,例如 Sarbanes-Oxley 或公司財務內容。 針對此內容,找不到單一一致的標識符,而分析則需要判斷是否存在辨識項集合。 同質規則不會傳回計數,而是會在找到時傳回,而會傳回相關聯的信賴等級。 同質內容會以獨立辨識項的集合表示。 辨識項是特定鄰近性內所需相符項目的匯總。 針對同質規則,鄰近性是由 evidencesProximity 屬性所定義, (預設值為 600) ,而 thresholdConfidenceLevel 屬性則定義最低信賴等級。
同質規則包含用於當地語系化、版本設定和查詢之唯一標識碼的Id屬性。 不同於實體規則,因為同質規則不依賴定義完善的標識碼,所以它們不包含IdMatch元素。
每個同質規則都包含一或多個子辨識項元素,定義要找到的辨識項,以及參與同質規則的信賴等級。 如果產生的信賴等級低於臨界值層級,則不會將同質視為找不到。 每個辨識項都會以邏輯方式代表此檔「類型」的精確辨識項,而 confidenceLevel 屬性則是該辨識項在測試數據集上的有效位數。
Evidence 元素有一或多個 Match 或 Any 子專案。 如果所有子系 Match 和 Any 元素相符,則會找到辨識項,而且信賴等級會參與規則信賴等級計算。 相同的描述適用於同質規則的 Match 或 Any 元素,如同實體規則一樣。
<Affinity id="..."
evidencesProximity="1000"
thresholdConfidenceLevel="65">
<Evidence confidenceLevel="40">
<Any>
<Match idRef="AssetsTerms" />
<Match idRef="BalanceSheetTerms" />
<Match idRef="ProfitAndLossTerms" />
</Any>
</Evidence>
<Evidence confidenceLevel="40">
<Any minMatches="2">
<Match idRef="TaxTerms" />
<Match idRef="DollarAmountTerms" />
<Match idRef="SECTerms" />
<Match idRef="SECFilingFormTerms" />
<Match idRef="DollarTotalRegex" />
</Any>
</Evidence>
</Affinity>
親和性近似值視窗
相似性的鄰近性窗口的計算方式與實體模式不同。 相似性鄰近性遵循滑動視窗模型。 同質近接演算法會嘗試在指定的視窗中尋找相符辨識項的最大數目。 鄰近視窗中的辨識項信賴等級必須大於為找到親和性規則所定義的臨界值。
親和性信賴等級
同質的信賴等級等於相似性規則鄰近視窗內找到的辨識項組合。 雖然類似於實體規則的信賴等級,但主要差異在於鄰近窗口的應用。 與實體規則類似,同質元素的信賴等級是所有已滿足辨識項信賴等級的組合,但針對同質規則,它只代表在鄰近視窗內找到之 Evidence 元素的最高組合。 辨識項信賴等級會使用下列方程序來結合:
其中 k 為近似值視窗內符合親和性之辨識項元素的數目。
回頭參考圖 4 範例同質規則結構,如果鄰近滑動視窗內的所有三個辨識項都相符,則根據下列計算,同質信賴等級為 85.6%。 此值超過親和性規則閾值 65,這會導致規則比對。
CLAffinity= 1 - [(1 - CLEvidence 1) X (1 - CLEvidence 2) X (1 - CLEvidence 2)]
= 1 - [(1 - 0.6) X (1 - 0.4) X (1 - 0.4)]
= 1 - (0.4 X 0.6 X 0.6)
= 85.6%
使用相同的範例規則定義,如果只有第一個辨識項相符,因為第二個辨識項不在鄰近範圍之外,則根據下列計算,最高親和性信賴等級為 60%,而且自不符合閾值 65 之後,同質規則不相符。
CLAffinity= 1 - [(1 - CLEvidence 1) X (1 - CLEvidence 2) X (1 - CLEvidence 2)]
= 1 - [(1 - 0.6) X (1 - 0) X (1 - 0)]
= 1 - (0.4 X 1 X 1)
= 60%
調整信賴等級
規則撰寫程式的其中一個主要層面是調整實體和親和性規則的信賴等級。 建立規則定義之後,請針對代表性內容執行規則,並收集精確度數據。 比較每個模式或辨識項的傳回結果與測試檔的預期結果。
如果規則符合接受需求,也就是 Pattern 或 Evidence 的信賴率高於已建立的臨界值 (例如,75%) ,則比對表達式已完成,而且可以移至下一個步驟。
如果模式或辨識項不符合信賴等級,請重新授權它 (例如,新增更多相互關聯的辨識項;拿掉或新增額外的模式/辨識項;etc.) 並重複此步驟。
接下來,根據上一個步驟的結果,調整規則中每個模式或辨識項的信賴等級。 針對每個模式或辨識項,匯總 True Positives (TP) 的數目、包含正在撰寫規則之實體或同構型的檔子集,併產生相符專案,以及 FP) (誤判數目,這是檔的子集,其中不包含正在撰寫規則的實體或親和性,而且也會傳回相符專案。 使用下列計算設定每個模式/辨識項的信賴等級:
信賴等級 = True Positive / (True Positive + False Positive)
模式或辨識項 | 真肯定 | 誤判 | 信賴等級 |
---|---|---|---|
P1或 E1 | 4 | 1 | 80% |
P2或 E2 | 2 | 2 | 50% |
Pn或 En | 9 | 10 | 47% |
在 XML 檔中使用當地語言
規則架構支援儲存每個 Entity 和 Affinity 元素的當地語系化名稱和描述。 每個 Entity 和 Affinity 元素都必須在 LocalizedStrings 區段中包含對應的專案。 若要將每個項目當地語系化,請包含 Resource 元素作為 LocalizedStrings 元素的子系,以儲存每個元素之多個地區設定的名稱和描述。 Resource 元素包含必要的 idRef 屬性,該屬性符合正在當地語系化之每個項目的對應 idRef 屬性。 Resource 元素的地區設定子專案包含每個指定地區設定的當地語系化名稱和描述。
<LocalizedStrings>
<Resource idRef="guid">
<Locale langcode="en-US" default="true">
<Name>affinity name en-us</Name>
<Description>
affinity description en-us
</Description>
</Locale>
<Locale langcode="de">
<Name>affinity name de</Name>
<Description>
affinity description de
</Description>
</Locale>
</Resource>
</LocalizedStrings>
分類規則套件 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">
<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"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="UniqueProcessorId">
<xs:selector xpath="mce:Regex|mce:Keyword"></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"/>
<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="512"/>
</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:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Regex" type="mce:RegexType"/>
<xs:element name="Keyword" type="mce:KeywordType"/>
</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: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: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: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:restriction base="xs:positiveInteger">
<xs:minInclusive value="1"/>
</xs:restriction>
</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: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="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>