条件访问控制项(ACE)允许在执行访问检查时评估访问条件。安全描述符定义语言(SDDL)提供了用于以字符串格式定义条件ACE的语法。
条件ACE的SDDL与其他ACE相同,条件语句的语法是写在ACE字符串的末尾。
资源属性中的“#”符号与“ 0”同义。例如,D:AI(XA; OICI; FA ;;; WD;(OctetStringType ==#1#2#3##))等效并解释为D:AI(XA; OICI; FA ;;; WD;(OctetStringType ==#01020300))。
安全描述符字符串中的每个ACE都用括号括起来。 ACE的字段按以下顺序排列,并用分号(;)分隔。
AceType**;AceFlags;Rights;ObjectGuid;InheritObjectGuid;AccountSid;(ConditionalExpression)**
这些字段如ACE字符串中所述,但以下情况除外。
- AceType字段可以是以下字符串之一。(当然不止这些,更多可以参考ACE字符串章节)
| 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 Operator Value | 返回指定操作的结果。 |
| ConditionalExpression**||**ConditionalExpression | 测试指定的条件表达式中的任何一个是否为true。 |
| ConditionalExpression && ConditionalExpression | 测试两个指定的条件表达式是否为真。 |
| **!(***ConditionalExpression*__)** | 条件表达式的逆函数。 |
| **Member_of{***SidArray*__}** | 测试客户端上下文的SID_AND_ATTRIBUTES数组是否包含SidArray指定的逗号分隔列表中的所有安全标识符(SID)。 对于允许ACE,客户端上下文SID必须将SE_GROUP_ENABLED属性设置为被视为匹配项。 对于Deny ACE,客户端上下文SID必须将SE_GROUP_ENABLED或SE_GROUP_USE_FOR_DENY_ONLY属性设置为被视为匹配项。 SidArray数组可以包含SID字符串(例如“ S-1-5-6”)或SID别名(例如“ BA”) |
属性表示客户端上下文中AUTHZ_SECURITY_ATTRIBUTES_INFORMATION数组中的元素。属性名称可以包含任何字母数字字符和任何字符“:”,“ /”,“。”和“ _”。
属性值可以是以下任何类型。
| 类型 | 描述 |
|---|---|
| Integer | 以十进制或十六进制表示的64位整数。 |
| String | 用引号分隔的字符串值。 |
| SID | 必须位于Member_of或Device_Member_of的RHS上。 |
| BLOB | #后跟十六进制数字。如果数字的长度为奇数,则将#转换为0使其变为偶数。同样,在值的其他位置出现的#也将转换为0。 |
定义了以下运算符,供在条件表达式中使用以测试属性值。所有这些都是二进制运算符,并以AttributeName运算符值的形式使用。
| Operator | Description |
|---|---|
| == | Conventional definition. |
| != | Conventional definition. |
| < | Conventional definition. |
| <= | Conventional definition. |
| > | Conventional definition. |
| >= | Conventional definition. |
| Contains | 如果指定属性的值是指定值的超集,则为TRUE;否则为TRUE。否则为FALSE. |
| Any_of | 如果指定值是指定属性值的超集,则为TRUE;否则为TRUE。否则为FALSE。 |
此外,一元运算符Exists,Member_of和negation(!)的定义如条件表达式表中所述。 “ Contains”运算符必须在空格之前和之后,而“ Any_of”运算符必须在空格之前。
条件表达式的结果有时返回值Unknown。例如,当指定的属性不存在时,任何关系操作都将返回“未知”。
下表描述了两个条件表达式ConditionalExpression1和ConditionalExpression2之间的逻辑与运算的结果。
| ConditionalExpression1 | ConditionalExpression2 | ConditionalExpression1 && ConditionalExpression2 |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE |
| TRUE | UNKNOWN | UNKNOWN |
| FALSE | TRUE | FALSE |
| FALSE | FALSE | FALSE |
| FALSE | UNKNOWN | FALSE |
| UNKNOWN | TRUE | UNKNOWN |
| UNKNOWN | FALSE | FALSE |
| UNKNOWN | UNKNOWN | UNKNOWN |
下表描述了两个条件表达式ConditionalExpression1和ConditionalExpression2之间的逻辑或运算的结果。
| ConditionalExpression1 | ConditionalExpression2 | ConditionalExpression1 || ConditionalExpression2 |
|---|---|---|
| TRUE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| TRUE | UNKNOWN | TRUE |
| FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE |
| FALSE | UNKNOWN | UNKNOWN |
| UNKNOWN | TRUE | TRUE |
| UNKNOWN | FALSE | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN |
值为UNKNOWN的条件表达式的否定也是UNKNOWN。
下表描述了根据条件表达式的最终评估得出的条件ACE的访问检查结果。
| ACE type | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| Allow | Allow | Ignore ACE | Ignore ACE |
| Deny | Deny | Ignore ACE | Deny |
下面通过一些示例说明SDDL定义的条件ACE是如何来表示指定的访问策略。
条件:如果同时满足以下两个条件,则允许对所有人执行
- 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))