Windows Access Control
搜索文档…
⌃K

(一)基于条件表达式ACE的SDDL

ACE在的SDDL中的条件表达式

条件访问控制项(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都用括号括起来。 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_ENABLEDSE_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

条件表达式的结果有时返回值Unknown。例如,当指定的属性不存在时,任何关系操作都将返回“未知”。
下表描述了两个条件表达式ConditionalExpression1ConditionalExpression2之间的逻辑与运算的结果。
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
下表描述了两个条件表达式ConditionalExpression1ConditionalExpression2之间的逻辑或运算的结果。
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的访问检查结果。
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))