Sun Java System Directory Server Enterprise Edition 6.0 管理指南

進階存取控制:使用巨集 ACI

使用重複目錄樹狀結構的組織,可透過巨集而最佳化目錄中所使用的 ACI 數目。當您降低目錄樹狀結構中的 ACI 數目時,存取控制策略將更易於管理。此外,ACI 記憶體的使用效率也會獲得提昇。

巨集是指在 ACI 中用以表示 DN 或部分 DN 的預留位置。您可以使用巨集代表 ACI 之目標部分中的 DN,和/或連結規則部分中的 DN。就實務上來說,當目錄伺服器收到內送 LDAP 作業時,即會根據 LDAP 作業預定為目標的資源比對 ACI 巨集。執行比對的目的在於找出相符的子字串 (如果有的話)。若有相符項目,連結規則方的巨集即會以相符的子字串展開,並在該展開的連結規則完成評估後判定資源的存取權。

本節含有巨集 ACI 的範例與巨集 ACI 語法的相關資訊。

巨集 ACI 範例

巨集 ACI 的好處及其運作方式以範例說明最為清楚。圖 6–1 說明使用巨集 ACI 的目錄樹狀結構可有效降低整體的 ACI 數目。

在此圖例中,請注意相同的樹狀結構 (ou=groups,ou=people) 具有重複的子網域模式。此模式也同樣在樹狀結構中的各處重複,因為 Example.com 目錄樹狀結構中存有兩個尾碼 dc=hostedCompany2,dc=example,dc=comdc=hostedCompany3,dc=example,dc=com,並未顯示在此圖中。

目錄樹狀結構中的 ACI 也具有重複的模式。例如,下列 ACI 位於 dc=hostedCompany1,dc=example,dc=com 節點上:


aci: (targetattr="*")
 (targetfilter=(objectClass=nsManagedDomain))(version 3.0;
 acl "Domain access"; allow (read,search) groupdn=
 "ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,
 dc=example,dc=com";)

此 ACI 會授予 domainAdmins 群組對 dc=hostedCompany1,dc=example,dc=com 樹狀結構中任何項目的讀取與搜尋權限。

圖 6–1 巨集 ACI 的範例目錄樹狀結構

範例目錄樹狀結構的形貌,可顯示 dc=hostedcompany1,dc=example,dc=com 與各種子網域。

下列 ACI 位於 dc=hostedCompany1,dc=example,dc=com 節點上:


aci: (targetattr="*")
 (targetfilter=(objectClass=nsManagedDomain))
 (version 3.0; acl "Domain access"; allow (read,search)
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)

下列 ACI 位於 dc=subdomain1,dc=hostedCompany1, dc=example,dc=com 節點上:


aci: (targetattr="*")
 (targetfilter=(objectClass=nsManagedDomain))
 (version 3.0; acl "Domain access"; allow (read,search)
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,
  dc=example,dc=com";)

下列 ACI 位於 dc=hostedCompany2,dc=example,dc=com 節點上:


aci: (targetattr="*")
 (targetfilter=(objectClass=nsManagedDomain))
 (version 3.0; acl "Domain access"; allow (read,search)
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2, dc=example,dc=com";)

下列 ACI 位於 dc=subdomain1,dc=hostedCompany2, dc=example,dc=com 節點上:


aci: (targetattr="*")
 (targetfilter=(objectClass=nsManagedDomain))
 (version 3.0; acl "Domain access"; allow (read,search)
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2,
 dc=example,dc=com";)

在上方的四個 ACI 中,唯一的不同之處是 groupdn 關鍵字中所指定的 DN。只要使用 DN 的巨集,即可在樹狀結構的根,亦即 dc=example,dc=com 節點上,以一個 ACI 取代這些 ACI。此巨集 ACI 如下所示:


aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com")
 (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
 (version 3.0; acl "Domain access"; allow (read,search) 
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)

請注意,此時必須加入先前未使用的 target 關鍵字。

在前述範例中,ACI 的數目已從四個縮減為一個。但其真正的好處在於您在目錄樹狀結構中所減少的重複模式。

巨集 ACI 語法

為使本節的討論更單純,在此將用以提供連結憑證的 userdnroledngroupdnuserattr 等 ACI 關鍵字統稱為 ACI 主體。主體可決定套用 ACI 的對象。

下表說明可取代特定 ACI 關鍵字的巨集。

表 6–1 巨集 ACI 關鍵字

巨集 

說明 

ACI 關鍵字 

($dn)

用以在目標中進行比對,以及在主體中直接取代。 

target, targetfilter, userdn, roledn, groupdn, userattr

[$dn]

用以取代在主體的子樹狀結構中使用的多個 RDN。 

targetfilter, userdn, roledn, groupdn, userattr

($attr.attrName)

用以將目標項目中的 attributeName 屬性值取代至主體中。

userdn, roledn, groupdn, userattr

巨集 ACI 關鍵字具有下列限制:

比對目標中的 ($dn)

ACI 目標中的 ($dn) 巨集可將本身與 LDAP 請求預定為目標的項目進行比較,以決定取代值。例如,您的 LDAP 請求將下列項目預定為目標:


cn=all,ou=groups,dc=subdomain1, dc=hostedCompany1,dc=example,dc=com

此外,您具有將目標定義如下的 ACI:


(target="ldap:///ou=Groups,($dn),dc=example,dc=com")

($dn) 巨集與 “dc=subdomain1, dc=hostedCompany1” 相符。因此,此子字串將做為 ACI 主體中的取代值。

取代主體中的 ($dn)

在 ACI 的主體中,($dn) 巨集會由目標中相符的整個子字串所取代。例如︰


groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com"

主體會變成:


groupdn="ldap:///cn=DomainAdmins,ou=Groups,
 dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"

在巨集展開後,目錄伺服器會在完成一般程序後評估 ACI,以判定是否已授予存取權。


備註 –

使用巨集取代的 ACI 與標準 ACI 不同,它不一定會將存取權授予目標項目的子項。這是因為,當目標為子 DN 時,取代可能不會在主體字串中建立有效的 DN。


取代主體中的 [$dn]

[$dn] 的取代機制與 ($dn) 略有不同。目標資源的 DN 會進行數次檢查,並逐次捨棄最左邊的 RDN 元件,直到找到相符項目為止。

例如,假設您的 LDAP 請求將 cn=all,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 子樹狀結構預定為目標,並且具有下列 ACI:


aci: (targetattr="*")
 (target="ldap:///ou=Groups,($dn),dc=example,dc=com")
 (version 3.0; acl "Domain access"; allow (read,search)
 groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],
 dc=example,dc=com";)

    伺服器會以下列方式繼續作業,以展開此 ACI:

  1. 伺服器驗證目標中的 ($dn) 確實符合 dc=subdomain1,dc=hostedCompany1

  2. 伺服器將主體中的 [$dn] 取代為 dc=subdomain1,dc=hostedCompany1

    產生的主體為 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。若因連結 DN 為該群組的成員而授予存取權,即會停止巨集展開,並評估 ACI。若連結 DN 不是成員,則會繼續進行程序。

  3. 伺服器將主體中的 [$dn] 取代為 dc=hostedCompany1

    產生的主體為 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com"。連結 DN 會再次被視為此群組的成員進行測試,若為其成員,則會完整評估 ACI。若連結 DN 不是成員,巨集展開則會停在最後一個具有相符值的 RDN 上,而此 ACI 的 ACI 評估即告完成。

[$dn] 巨集的好處是,它可透過彈性的方式,授予目錄樹狀結構中所有子網域的網域層級管理員存取權。因此,在表示不同網域間的階層式關係時,[$dn] 巨集即可派上用場。

例如,請考量下列 ACI:


aci: (target="ldap:///ou=*,($dn),dc=example,dc=com") (targetattr="*")
(targetfilter=(objectClass=nsManagedDomain)) 
(version 3.0; acl "Domain access"; allow (read,search) groupdn= 
"ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)

ACI 可授予 cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com 的成員對 dc=hostedCompany1 下所有子網域的存取權。因此,凡屬於該群組的管理員,即可存取如子樹狀結構 ou=people,dc=subdomain1.1,dc=subdomain1 的項目。

但在此同時,cn=DomainAdmins,ou=Groups, dc=subdomain1.1 的成員將遭拒絕存取 ou=people,dc=subdomain1, dc=hostedCompany1ou=people,dc=hostedCompany1 節點。

($attr.attrName) 的巨集比對

($attr.attrname) 巨集一律用於 DN 的主體部分中。例如,您可以定義下列 roledn


roledn = "ldap:///cn=DomainAdmins,($attr.ou),dc=HostedCompany1,dc=example,dc=com"

現在,假設伺服器收到將下列項目預設為目標的 LDAP 作業:


dn: cn=Babs Jensen,ou=People,dc=HostedCompany1,dc=example,dc=com
cn: Babs Jensen
sn: Jensen
ou: Sales
...

為評估 ACI 的 roledn 部分,伺服器會讀取目標項目中所儲存的 ou 屬性值。接著,伺服器會在主體中取代此值,以展開巨集。在此範例中,roledn 會展開如下:


roledn = "ldap:///cn=DomainAdmins,ou=Sales,dc=HostedCompany1,dc=example,dc=com"

然後,目錄伺服器會根據一般 ACI 評估演算法進行 ACI 的評估。

若巨集中的已命名屬性為多值屬性,則會依序使用每個值展開巨集。會採用第一個產生成功比對的值。