条件 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_ENABLED 或 SE_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”运算符必须前接空格。
运算符优先级
运算符按以下优先级顺序计算,从左到右计算相等优先级的操作。
- Exists、Member_of
- Contains、Any_of
- ==, !=, <, <=, >, >=
- !
- &&
- ||
此外,条件表达式的任何部分都可以括在括号中。 首先计算括号内的表达式。
未知值
条件表达式的结果有时返回 Unknown 值。 例如,当指定属性不存在时,任何关系操作返回 Unknown。
下表描述了两个条件表达式(ConditionalExpression1 和 ConditionalExpression2)之间的逻辑 AND 运算的结果。
ConditionalExpression1 | ConditionalExpression2 | ConditionalExpression1 && ConditionalExpression2 |
---|---|---|
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
FALSE |
TRUE |
未知 |
未知 |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
未知 |
FALSE |
未知 |
TRUE |
未知 |
未知 |
FALSE |
FALSE |
未知 |
未知 |
未知 |
下表描述了两个条件表达式(ConditionalExpression1 和 ConditionalExpression2)之间的逻辑 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))