gpt4 book ai didi

php - 选择 AD ntSecurityDescriptor 属性作为非管理员

转载 作者:行者123 更新时间:2023-12-04 13:39:44 25 4
gpt4 key购买 nike

我正在研究用于 Active Directory ACL/ACE 的 SDDL/安全描述符解析器。我几乎完成了,当我使用管理帐户连接到 LDAP 时,一切正常。

但是,当我尝试查询 ntSecurityDescriptor 时作为非管理帐户,它不返回任何值。用户帐户本身有权读取该属性。当我开始调查这个时,我遇到了以下 LDAP 服务器控件:

https://msdn.microsoft.com/en-us/library/cc223323.aspx

The LDAP_SERVER_SD_FLAGS_OID control is used with an LDAP Search request to control the portion of a Windows security descriptor to retrieve. The DC returns only the specified portion of the security descriptors. It is also used with LDAP Add and Modify requests to control the portion of a Windows security descriptor to modify. The DC modifies only the specified portion of the security descriptor.

When sending this control to the DC, the controlValue field is set to the BER encoding of the following ASN.1 structure.

 SDFlagsRequestValue ::= SEQUENCE {
Flags INTEGER
}

The Flags value has the following format presented in big-endian byte order. X denotes unused bits that SHOULD be set to 0 by the client and that MUST be ignored by the server.

Specifying Flags with no bits set, or not using the LDAP_SERVER_SD_FLAGS_OID control, is equivalent to setting Flags to (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION). Sending this control to the DC does not cause the server to include any controls in its response.



文档中该语句的最后一部分似乎不正确,至少在非管理用户的上下文中不正确。

我的问题:我应该如何使用标准的 PHP LDAP 库函数将此控件发送到 LDAP?我知道我必须设置服务器控件,但我不确定如何对值进行编码。我已将其范围缩小到最简单的示例:
$user = 'user@example.local';
$pass = 'secret';
$server = 'dc1.example.local';

$ldap = ldap_connect($server);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

ldap_bind($ldap, $user, $pass);
$ctrl1 = array(
"oid" => "1.2.840.113556.1.4.801",
"iscritical" => true,
// How should this value be set???
"value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 15)
);
if (!ldap_set_option($ldap, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) {
echo "Failed to set server controls";
}

$searchUser = "user";
$dn = "dc=example,dc=local";
$filter="(sAMAccountName=$searchUser)";
$attr = array("ntsecuritydescriptor");

$sr = ldap_search($ldap, $dn, $filter, $attr);
$info = ldap_get_entries($ldap, $sr);

// Should contain ntSecurityDescriptor...but it does not.
var_dump($info);

我知道控件的值需要进行 BER 编码,但我不确定如何为文档中定义的值实现该值。我能够找到以下 Java 示例:

https://github.com/Tirasa/ADSDDL/blob/master/src/main/java/net/tirasa/adsddl/ntsd/controls/SDFlagsControl.java

但我一直无法将那里发生的事情翻译成 PHP。有任何想法吗?

最佳答案

问题似乎是非特权 AD 用户帐户将无法访问安全描述符的 SACL。为了解决这个问题并仍然检索 ntSecurityDescriptor (减去 SACL),发送带有所有其他标志设置值的控件(值为 7):

// OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION
$sdFlags = 7;

$ctrl1 = array(
"oid" => "1.2.840.113556.1.4.801",
"iscritical" => true,
"value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, $sdFlags)
);
if (!ldap_set_option($ldap, LDAP_OPT_SERVER_CONTROLS, array($ctrl1))) {
echo "Failed to set server controls";
}

我的猜测是MS docs没有错,默认值 LDAP_SERVER_SD_FLAGS_OID适用于 全部 要设置的标志(包括 SACL)。由于大多数普通帐户无权访问该 SACL,因此 AD 可能决定不返回安全描述符的任何部分,因此不返回 ntSecurityDescriptor即使您选择了查询,也会从查询中返回值。

另一个重要的注意事项,如果您使用 LDAP 分页,它似乎会干扰此控制。您不能同时使用分页和此控件。我不确定这是否是此控件的一般副作用,或者是在 PHP 的 LDAP 模块中如何完成服务器控件的问题。

关于php - 选择 AD ntSecurityDescriptor 属性作为非管理员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40771503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com