Linux

ldapquery 為屬於名為 X 的組的使用者的 Active Directory 伺服器

  • July 31, 2013

當我在 CentOS 6.4 的 bash 提示符下執行此操作時

ldapsearch -LLL -H ldap://adserver.example.com -x -D someuser@example.com -w somepass -b 'OU=Users,DC=example,DC=com' '(&(objectClass=person)(sAMAccountName=testuser))'

我明白了

dn: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
objectClass: person
...
cn: TestUser Surname
sn: Surname
...
distinguishedName: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
memberOf: CN=Group1,OU=Area,OU=Users,DC=example,DC=com
memberOf: CN=Gropu2,OU=Users,DC=example,DC=com
...
sAMAccountName: testuser

我只想在 testuser 屬於名為 X 的組時得到響應,而不管組 X 在 AD 層次結構中的位置。例如:我想要一個名為 testuser 的使用者的數據,該使用者是名為 Group1 的組的成員。

我嘗試將過濾器更改為:

  1. (&(objectClass=person)(sAMAccountName=testuser)(memberOf=CN=Group1*))
  2. (&(objectClass=person)(sAMAccountName=testuser)(memberOf=Group1))

無濟於事。

從上面的輸出可以看出,testuser 屬於組

  1. CN=Group1,OU=Area,OU=Users,DC=example,DC=com
  2. CN=Gropu2,OU=Users,DC=example,DC=com。

當我使用過濾器 ‘(&(objectClass=person)(sAMAccountName=testuser)(memberOf=CN=Group1,OU=Area,OU=Users,DC=example,DC=com))’ 時,它可以工作,但我需要一個僅使用組名查詢(不使用完整的“路徑”)。

有什麼辦法嗎?

我正在嘗試這樣做,因為我需要使用 Active Directory 定義的組作為 squid(linux 代理)ACL。為此,我需要定義一個外部 ACL 類型,例如

external_acl_type ADGroup %LOGIN /usr/lib64/squid/squid_ldap_group -R -b "OU=Users,DC=example,DC=com" -D someuser@example.com -w somepass -f "(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=example,DC=com))" -h adserver.example.com

然後使用該類型來定義諸如此類的 ACL

acl ADGroup_Group1 external ADGroup Group1
acl ADGroup_Group2 external ADGroup Group2
...
http_access allow ADGroup_Group1;
http_access deny ADGroup_Group2;

當 squid 檢查這個“允許”時,它會將 %u 替換為使用者登錄名,並將 %g 替換為 ACL (Group1,Group2) 中定義的組名,然後進行上面的 LDAP 查詢。

從上面可以看到“http_access allow ADGroup_Group1;” 將按預期工作,但“http_access deny ADGroup_Group2;” 不起作用,因為 Group1 和 Group2 的父 OU 不同。

所以我有3個選擇:

  1. 查找適用於任何組名的過濾器,無論路徑如何(這個問題)
  2. 將(可能)所有AD 組移動到同一個 OU(呃……將對象移動到不同的 OU 將給我帶來更多的工作,因為我必須重新調整 GPO - 或者至少檢查已經定義的 GPO 是否有任何更改這個國王搬家可以帶)
  3. 為每個帶有組的 OU 定義(可能)一個 external_acl_type。(在這種情況下,我將有 N 個外部程序來檢查 LDAP 過濾器中的路徑更改)

不幸的是沒有。LDAP 對象的通用名稱不是全域唯一的;它僅相對於其父 OU 是唯一的。因此,如果您可以根據組的 CN 詢問使用者是否是組的成員,您可能會得到多個結果。

正是由於這個原因,使用者對象的 memberOf 屬性是一個 DN 列表(可分辨名稱,或完整的 X.500 路徑)。

引用自:https://serverfault.com/questions/527428