返回介绍

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

发布于 2022-11-26 10:40:50 字数 6823 浏览 0 评论 0 收藏 0

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_ALLOWEDACCESS_ALLOWED_CALLBACK_ACE_TYPE
"XD"SDDL_CALLBACK_ACCESS_DENIEDACCESS_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运算符值的形式使用。

OperatorDescription
==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之间的逻辑与运算的结果。

ConditionalExpression1ConditionalExpression2ConditionalExpression1 && ConditionalExpression2
TRUETRUETRUE
TRUEFALSEFALSE
TRUEUNKNOWNUNKNOWN
FALSETRUEFALSE
FALSEFALSEFALSE
FALSEUNKNOWNFALSE
UNKNOWNTRUEUNKNOWN
UNKNOWNFALSEFALSE
UNKNOWNUNKNOWNUNKNOWN

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

ConditionalExpression1ConditionalExpression2ConditionalExpression1 || ConditionalExpression2
TRUETRUETRUE
TRUEFALSETRUE
TRUEUNKNOWNTRUE
FALSETRUETRUE
FALSEFALSEFALSE
FALSEUNKNOWNUNKNOWN
UNKNOWNTRUETRUE
UNKNOWNFALSEUNKNOWN
UNKNOWNUNKNOWNUNKNOWN

值为UNKNOWN的条件表达式的否定也是UNKNOWN

条件ACE评估

下表描述了根据条件表达式的最终评估得出的条件ACE的访问检查结果。

ACE typeTRUEFALSEUNKNOWN
AllowAllowIgnore ACEIgnore ACE
DenyDenyIgnore ACEDeny

案例

下面通过一些示例说明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))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文