条件 ACE 的安全描述符定义语言

条件访问控制项 (ACE) 允许在执行访问检查时评估访问条件。 安全描述符定义语言 (SDDL) 提供用于以字符串格式定义条件 ACE 的语法。

条件 ACE 的 SDDL 与任何 ACE 的 SDDL 相同,条件语句的语法追加到 ACE 字符串的末尾。 有关 SDDL 的信息,请参阅安全描述符定义语言

“#”符号与资源属性中的“0”同义。 例如,D:AI(XA;OICI;FA;;;WD;(OctetStringType==#1#2#3##)) 等效于并解释为 D:AI(XA;OICI;FA;;;WD;(OctetStringType==#01020300))。

条件 ACE 字符串格式

安全描述符字符串中的每个 ACE 都括在括号中。 ACE 的字段按以下顺序排列,并用分号 (;) 分隔。

AceType**;AceFlags;Rights;ObjectGuid;InheritObjectGuid;AccountSid;(ConditionalExpression)**

字段在 ACE 字符串中描述,但存在以下例外情况。

  • AceType 字段可以是以下字符串之一。

    ACE 类型字符串 Sddl.h 中的常量 AceType 值
    "XA"
    SDDL_CALLBACK_ACCESS_ALLOWED
    ACCESS_ALLOWED_CALLBACK_ACE_TYPE
    "XD"
    SDDL_CALLBACK_ACCESS_DENIED
    ACCESS_DENIED_CALLBACK_ACE_TYPE
  • ACE 字符串包含一个或多个条件表达式,括在字符串末尾的括号中。

条件表达式

条件表达式可以包含以下任何元素。

表达式元素 说明
AttributeName
测试指定的属性是否具有非零值。
exists AttributeName
测试客户端上下文中是否存在指定的属性。
AttributeName 运算符
返回指定操作的结果。
ConditionalExpression**||**ConditionalExpression
测试指定的任一条件表达式是否为 true。
ConditionalExpression && ConditionalExpression
测试两个指定的条件表达式是否为 true。
!(ConditionalExpression)
反转条件表达式。
Member_of{SidArray}
测试客户端上下文的 SID_AND_ATTRIBUTES 数组是否包含由 SidArray 指定的逗号分隔列表中的所有安全标识符 (SID)。
对于“允许 ACE”,客户端上下文 SID 必须设置 SE_GROUP_ENABLED 属性才能被视为匹配项。
对于拒绝 ACE,客户端上下文 SID 必须具有 SE_GROUP_ENABLEDSE_GROUP_USE_FOR_DENY_ONLY 属性集才能被视为匹配项。
SidArray 数组可以包含 SID 字符串(例如“S-1-5-6”)或 SID 别名(例如,“BA”)

特性

属性表示客户端上下文中 AUTHZ_SECURITY_ATTRIBUTES_INFORMATION 数组中的元素。 属性名称可以包含任何字母数字字符和任何字符“:”、“/”、“.”和“_”。

属性值可以是以下任一类型。

值类型 说明
整数
十进制或十六进制表示法中的 64 位整数。
字符串
用引号分隔的字符串值。
SID
SID(S-1-1-0) 或 SID(BA)。 必须位于 Member_of 或 Device_Member_of 的 RHS 上。
BLOB
# 后跟十六进制数字。 如果数字的长度为奇数,则 # 将转换为 0 以使其均匀。 此外,值中的其他位置显示的 # 将转换为 0。

运算符

定义了以下运算符,以便在条件表达式中用于测试属性值。 所有这些运算符都是二进制运算符,并采用 AttributeName Operator Value 的形式。

运算符 说明
==
传统定义。
%>
传统定义。
<
传统定义。
<?
传统定义。
>
传统定义。
>?
传统定义。
包含
如果指定属性的值是指定值的超集,则为 TRUE;否则为 FALSE
Any_of
如果指定值是指定属性值的超集,则为 TRUE;否则为 FALSE

此外,一元运算符 Exists、Member_of 和求反 (!) 的定义如条件表达式表中所述。

“Contains”运算符必须前接和后接空格,并且“Any_of”运算符必须前接空格。

运算符优先级

运算符按以下优先级顺序计算,从左到右计算相等优先级的操作。

  1. Exists、Member_of
  2. Contains、Any_of
  3. "
  4. %>
  5. ||

此外,条件表达式的任何部分都可以括在括号中。 首先计算括号内的表达式。

未知值

条件表达式的结果有时返回 Unknown 值。 例如,当指定属性不存在时,任何关系操作返回 Unknown

下表描述了两个条件表达式(ConditionalExpression1ConditionalExpression2)之间的逻辑 AND 运算的结果。

ConditionalExpression1 ConditionalExpression2 ConditionalExpression1 && ConditionalExpression2
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
TRUE
未知
未知
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
未知
FALSE
未知
TRUE
未知
未知
FALSE
FALSE
未知
未知
未知

下表描述了两个条件表达式(ConditionalExpression1ConditionalExpression2)之间的逻辑 OR 运算的结果。

ConditionalExpression1 ConditionalExpression2 ConditionalExpression1 || ConditionalExpression2
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
TRUE
未知
TRUE
FALSE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
未知
未知
未知
TRUE
TRUE
未知
FALSE
未知
未知
未知
未知

具有 UNKNOWN 值的条件表达式的求反也为 UNKNOWN

条件 ACE 评估

下表根据条件表达式的最终计算,描述了条件 ACE 的访问检查结果。

ACE 类型 TRUE FALSE 未知
允许
Allow
忽略 ACE
忽略 ACE
拒绝
拒绝
忽略 ACE
拒绝

示例

以下示例演示如何使用 SDDL 定义的条件 ACE 来表示指定的访问策略。

策略

如果满足以下两个条件,则允许对 Everyone 执行:

  • Title = PM
  • Division = Finance or Division = Sales

SDDL

D:(XA; ;FX;;;S-1-1-0; (@User.Title=="PM" && (@User.Division=="Finance" || @User.Division ==" Sales")))

策略

如果任何用户项目与文件项目相交,则允许执行。

SDDL

D:(XA; ;FX;;;S-1-1-0; (@User.Project Any_of @Resource.Project))

策略

如果用户已使用智能卡登录,是备份操作员,并且从启用了 Bitlocker 的计算机进行连接,则允许进行读取访问。

SDDL

D:(XA; ;FR;;;S-1-1-0; (Member_of {SID(Smartcard_SID), SID(BO)} &&@Device.Bitlocker))

[MS-DTYP]:安全描述符描述语言