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

第 6 章 目錄伺服器存取控制

對目錄存取的控制,是建立安全目錄不可或缺的一部分。本章將說明存取控制指令 (ACI),這些指令可決定要授予存取目錄之使用者的權限。

請在目錄部署的規劃階段過程,即定義適用整體安全性策略的存取控制策略。如需有關規劃存取控制策略的提示,請參閱「Sun Java System Directory Server Enterprise Edition 6.0 Deployment Planning Guide」

如需 ACI 的其他資訊,包括 ACI 語法與連結規則等,請參閱「Sun Java System Directory Server Enterprise Edition 6.0 Reference」

本章包含下列主題:

建立、檢視及修改 ACI

您可以使用目錄服務控制中心 (DSCC) 或指令行建立 ACI。無論選擇何種方式,檢視及複製現有的 ACI 值,通常會比重新建立新的 ACI 來得容易。

您可以在 DSCC 中檢視及修改 aci 屬性值。如需有關如何透過 DSCC 修改 ACI 的資訊,請參閱 DSCC 線上說明。

Procedure建立、修改及刪除 ACI

若要透過使用指令行建立 ACI,必須先使用 LDIP 陳述式在檔案中建立 ACI。接著,必須透過使用 ldapmodify 指令將 ACI 增加到您的目錄樹狀結構中。

您可以使用 DSCC 執行此作業。如需有關資訊,請參閱目錄服務控制中心介面與 DSCC 線上說明。

  1. 在 LDIF 檔案中建立 ACI。


    dn: dc=example,dc=com
    changetype: modify
    add: aci
    aci: (target)(version 3.0; acl "name";permission bindrules;)

    此範例說明增加 ACI 的方式。若要修改或刪除 ACI,請以 replacedelete 取代 add

    如需更多常用 ACI 的範例,請參閱存取控制用法範例

  2. 使用 LDIF 檔案進行變更。


    $ ldapmodify -h host -p port -D cn=admin,cn=Administrators,cn=config -w - -f ldif-file
    

Procedure檢視 ACI 屬性值

ACI 會儲存為項目的一或多個 aci 屬性值。aci 屬性是一種可由目錄使用者讀取及修改的多值作業屬性。因此,ACI 屬性本身應由 ACI 予以保護。通常會授予管理員使用者完整的 aci 屬性存取權。

您可以使用 DSCC 執行此作業。如需有關資訊,請參閱目錄服務控制中心介面與 DSCC 線上說明。

    透過執行下列 ldapsearch 指令,以檢視項目的 ACI 屬性值:


    $ ldapsearch -h host -p port -D cn=admin,cn=Administrators,cn=config -w - \
     -b entryDN -s base "(objectclass=*)" aci

    其結果為可複製到新的 LDIF ACI 定義以進行編輯的 LDIF 文字。因為 ACI 的值為長字串,因此 ldapsearch 作業的輸出可能會以數行顯示。此外,第一個空格是連續記號。若不讓 LDIF 輸出包含連續記號,請使用 -T 選項。複製並貼上 LDIF 輸出時,請將輸出格式納入考量。


    備註 –

    若要檢視 aci 值所授予及拒絕的權限,請參閱檢視有效權限


Procedure檢視根層級的 ACI

當您建立尾碼時,有些預設 ACI 會建立於頂層或根層級上。這些 ACI 允許預設管理員使用者 cn=admin,cn=Administrators,cn=config 對目錄資料擁有與「目錄管理員」相同的存取權限。

您可以使用 DSCC 執行此作業。如需有關資訊,請參閱目錄服務控制中心介面與 DSCC 線上說明。

    檢視預設根層級 ACI。


    $ ldapsearch -h host -p port -D cn=admin,cn=Administrators,cn=config -w - \
     -b "" -s base "(objectclass=*)" aci

存取控制用法範例

本節中的範例說明虛構的 ISP 公司 Example.com 實作其存取控制策略的方式。

此外,您也可以在安裝程式所附的範例 LDIF 檔案中找到 ACI 範例 install_path/ds6/ldif/Example.ldif

這些範例均可說明如何透過使用 LDIF 檔案執行指定的作業。下圖將透過圖形說明 example.com 的目錄資訊樹狀結構。

範例目錄樹狀結構的形貌。頂層項目與緊接於頂層項目下方的項目均會顯示。

Example.com 提供網站託管服務與網際網路存取。Example.com 其中一部分的網站託管服務,是託管客戶公司的目錄。Example.com 實際上託管並局部管理兩家中型公司 Company333 與 Company999 的目錄。Example.com 也為許多個別訂閱者提供網際網路存取。

Example.com 想制定下列存取規則:

授予匿名存取權

大部分的目錄依配置均可讓您匿名存取至少一個尾碼以進行讀取、搜尋或比較。若您執行公司人員目錄,例如要供員工搜尋的電話簿,也可以設定這些權限。Example.com 內部即為此情況,如 ACI “Anonymous Example.com” 中所說明。

做為 ISP,Example.com 也想要建立可供全世界存取的公用電話簿,以通告其所有訂閱者的連絡資訊。相關說明請參閱ACI “Anonymous World”

ACI “Anonymous Example.com”

在 LDIF 中,若要將整個 Example.com 樹狀結構的讀取、搜尋與比較權限授予 Example.com 員工,請撰寫下列陳述式:


aci: (targetattr !="userPassword")(version 3.0; acl "Anonymous
 example"; allow (read, search, compare)
 userdn= "ldap:///anyone") ;)

此範例假設 dc=example,dc=com entry 中已加入 aci。請注意,userPassword 屬性排除於 ACI 的範圍之外。


備註 –

任何機密屬性或可見屬性,均應使用 (targetattr !="attribute-name") 以密碼屬性的形式列出。


ACI “Anonymous World”

在 LDIF 中,若要全面授予個別訂閱者子樹狀結構的讀取與搜尋存取權,但拒絕任何人存取特別要求不列出的訂閱者資訊,您可以撰寫下列陳述式:


aci: (targetfilter= "(!(unlistedSubscriber=yes))")
 (targetattr="homePostalAddress || homePhone || mail")
 (version 3.0; acl "Anonymous World"; allow (read, search)
 userdn="ldap:///anyone";)

此範例假設 ou=subscribers,dc=example, dc=com 項目中已加入 ACI。此範例亦假設每個訂閱者項目均具有設為 yesnounlistedSubscriber 屬性。目標定義會根據此屬性的值篩選不列出的訂閱者。如需篩選定義的詳細資訊,請參閱使用篩選設定目標

授予個人項目的寫入存取權

有許多目錄伺服器管理員雖允許內部使用者變更其本身項目中的某些屬性,但不是所有屬性皆可變更。Example.com 的目錄伺服器管理員允許使用者變更其本身的密碼、家用電話號碼與住家地址,但其他項目則一概不准變更。相關說明請參閱ACI “Write Example.com”

若訂閱者對目錄建立了 SSL 連線,則 Example.com 的策略亦將允許其訂閱者在 Example.com 樹狀結構中更新本身的個人資訊。相關說明請參閱ACI “Write Subscribers”

ACI “Write Example.com”


備註 –

設定此權限後,即會授予使用者刪除屬性值的權限。


在 LDIF 中,若要授予 Example.com 員工更新其家用電話號碼與住家地址的權限,請撰寫下列陳述式:


aci: (targetattr="homePhone ||
 homePostalAddress")(version 3.0; acl "Write Example.com";
 allow (write) userdn="ldap:///self" ;)

此範例假設 ou=People,dc=example,dc=com 項目中已加入 ACI。

ACI “Write Subscribers”


備註 –

設定此權限後,即會授予使用者刪除屬性值的權限。


在 LDIF 中,若要授予 Example.com 訂閱者更新其家用電話號碼的權限,請撰寫下列陳述式:


aci: (targetattr="homePhone")
 (version 3.0; acl "Write Subscribers"; allow (write)
 userdn= "ldap://self" and authmethod="ssl";)

此範例假設 ou=subscribers,dc=example, dc=com 項目中已加入 aci,且使用者必須使用 SSL 進行連結。

請注意,Example.com 訂閱者並無其住家地址的寫入存取權,因為他們可能會刪除該屬性。住家地址是 Example.com 寄發帳單時的重要業務資訊。

授予特定層級的存取權

您可以設定 ACI 範圍來影響目錄樹狀結構內不同的層級,以微調所要允許的存取層級。目標 ACI 範圍可設為下列其中一項:

base

項目本身

onelevel

項目本身與低一層的所有項目

subtree

項目本身及該項目下不限深度的所有項目

ACI “Read Example.com only”

在 LDIF 中,若要授予 Example.com 訂閱者對公司連絡資訊項目 dc=example,dc=com 的讀取權限,但不允許存取該項目下的任何項目,請撰寫下列陳述式:


aci: (targetscope="base") (targetattr="*")(version 3.0;
 acl "Read Example.com only";  allow (read,search,compare)
 userdn="ldap:///cn=*,ou=subscribers,dc=example,dc=com";)

此範例假設 dc=example, dc=com 項目中已加入 ACI。

限制主要角色的存取

您可以使用目錄中的角色定義來識別您的企業所不可或缺的功能,例如網路與目錄的管理。

例如,您可以在全球各地的公司網站上,找出於每週特定工作日之特定時間提供服務之系統管理員的子集,以建立 superAdmin 角色。或者,您也可以在特定網站上建立 First Aid 角色,內含所有受過急救訓練的工作成員。如需有關建立角色定義的資訊,請參閱管理角色

當某個角色在重要的公司或企業功能方面提供了任何種類的專用使用者權限時,建議您限制對於該角色的存取。以 Example.com 為例,員工可在其本身的項目中加入任何角色,但 superAdmin 角色除外,如下列範例所說明。

ACI “Roles”

在 LDIF 中,若要授予 Example.com 員工在其本身的項目中加入 superAdmin 以外之任何角色的權限,請撰寫下列陳述式:


aci: (targetattr="*") (targattrfilters="add=nsRoleDN:
 (nsRoleDN !="cn=superAdmin, dc=example, dc=com")")
 (version 3.0; acl "Roles"; allow (write)
 userdn= "ldap:///self" ;)

此範例假設 ou=People,dc=example, dc=com 項目中已加入 ACI。

授予某角色對整個尾碼的完整存取權

有時為特定使用者針對尾碼授予與「目錄管理員」相同的權限,確實有其效用。在 Example.com 中,Kirsten Vaughan 是目錄伺服器的管理員。她具有 superAdmin 的角色。此角色具有下列優勢:


備註 –

將 Kirsten Vaughan 加入 cn=Administrators,cn=config 群組,亦會授予其與「目錄管理員」相同的權限。


若要讓使用者對整部伺服器獲得與「目錄管理員」相同的權限,請遵循建立具有超級使用者存取權的管理使用者中的程序。

ACI “Full Access”

在 LDIF 中,若要授予管理員 Kirsten Vaughan 與「目錄管理員」相同的權限,請使用下列陳述式:


aci: (targetattr="*") (version 3.0; acl "Full Access";
 allow (all) groupdn= "ldap:///cn=SuperAdmin,dc=example,dc=com"
 and authmethod="ssl" ;)

此範例假設根項目 "" (無文字) 中已加入 ACI。

授予某群組對尾碼的完整存取權

大部分的目錄都具有用以識別特定公司功能的群組。可賦予群組所有或部分目錄的存取權。對整個群組套用存取權限,即不需個別設定每個成員的存取權限。而是只要將使用者加入群組中,即可授予其存取權限。

例如,當您建立目錄伺服器實例時,依預設會建立對目錄具有完整存取權的「管理員」群組 cn=Administrators,cn=config

在 Example.com 中,「人力資源」群組對目錄的 ou=People 分支具有完整存取權,因此可更新員工目錄,如 ACI “HR” 中所說明。

ACI “HR”

在 LDIF 中,若要授予 HR 群組對目錄之員工分支的所有權限,請使用下列陳述式:


aci: (targetattr="*") (version 3.0; acl "HR"; allow (all)
  groupdn= "ldap:///cn=HRgroup,ou=Groups,dc=example,dc=com";)

此範例假設下列項目中已加入 ACI:


ou=People,dc=example,dc=com

授予新增及刪除群組項目的權限

有些組織會允許員工在樹狀結構中建立項目,以提升其工作效率,並鼓勵他們為公司的活力注入一己之力。以 Example.com 為例,社委會即是由各種不同性質的社團所組成,如網球、游泳、滑雪與角色扮演等。

Example.com 的任何員工皆可建立代表新社團的群組項目,如 ACI “Create Group” 中所說明。

凡屬 Example.com 員工,即可成為這些群組之一的成員,如允許使用者在群組中加入或移除本身中所說明。

只有群組所有者可修改或刪除群組項目,如 ACI “Delete Group” 中所說明。

ACI “Create Group”

在 LDIF 中,若要授予 Example.com 員工在 ou=Social Committee 分支下建立群組項目的權限,請撰寫下列陳述式:


aci: (targetattr="*") (targattrfilters="add=objectClass: 
(|(objectClass=groupOfNames)(objectClass=top))") 
(version 3.0; acl "Create Group"; allow (read,search,add) 
userdn= "ldap:///uid=*,ou=People,dc=example,dc=com") 
and dns="*.Example.com";)

此範例假設 ou=Social Committee,dc=example,dc=com 項目中已加入 ACI。


備註 –

ACI “Delete Group”

在 LDIF 中,若要授予 Example.com 員工對他們在 ou=Social Committee 分支下所屬群組的群組項目進行修改或刪除的權限,請撰寫下列陳述式:


aci: (targetattr = "*") (targattrfilters="del=objectClass:
(objectClass=groupOfNames)")
 (version 3.0; acl "Delete Group"; allow (write,delete)
 userattr="owner#GROUPDN";)

此範例假設 ou=Social Committee,dc=example,dc=com 項目中已加入 aci

請注意,使用 DSCC 建立此 ACI 是缺乏效率的方式,因為您必須用手動編輯模式以建立目標篩選器,並檢查群組所有權。

允許使用者在群組中加入或移除本身

許多目錄都會設定 ACI 允許使用者在群組 (如郵件收信人清單) 中加入或移除本身。

在 Example.com 中,員工可將其本身加入 ou=Social Committee 子樹狀結構下的任何群組項目中,如 ACI “Group Members” 中所說明。

ACI “Group Members”

在 LDIF 中,若要授予 Example.com 員工將其本身加入群組中的權限,請撰寫下列陳述式:


aci: (targettattr="member")(version 3.0; acl "Group Members";
 allow (selfwrite)
 (userdn= "ldap:///uid=*,ou=People,dc=example,dc=com") ;)

此範例假設 ou=Social Committee, dc=example,dc=com 項目中已加入 ACI。

授予對群組或角色的條件式存取權

當您授予目錄的群組或角色專用存取權時,經常必須確定入侵者無法模擬您的專用使用者使用這些權限。因此,授予群組或角色的重要存取權時所依據的存取控制規則,通常涉及許多條件。

以 Example.com 為例,它為託管的兩家公司 Company333 與 Company999 皆建立了「目錄伺服器管理員」角色。Example.com 希望這兩家公司能夠自行管理資料並實作存取控制規則,同時又能保護資料不受入侵。

因此,Company333 與 Company999 將在符合下列條件的情況下,對其各自位於目錄樹狀結構下的分支具有完整權限:

上述條件會列在兩家公司的 ACI 中,即 ACI “Company333” 與 ACI “Company999”。由於這兩個 ACI 的內容完全相同,下列範例將僅使用 “Company333” ACI 進行說明。

ACI “Company333”

在 LDIF 中,若要以前述條件為限,授予 Company333 對自己目錄分支的完整存取權,請撰寫下列陳述式:


aci: (targetattr = "*") (version 3.0; acl "Company333"; allow (all)
 (roledn="ldap:///cn=DirectoryAdmin,ou=Company333,
 ou=corporate clients,dc=example,dc=com") and (authmethod="ssl")
 and (dayofweek="Mon,Tues,Wed,Thu") and (timeofday >= "0800" and
 timeofday <= "1800") and (ip="255.255.123.234"); )

此範例假設 ou=Company333,ou=corporate clients,dc=example,dc=com 項目中已加入 ACI。

拒絕存取

若您已允許尾碼大部分的存取,您可以在現有的 ACI 下拒絕少部分尾碼的存取。


備註 –

您應儘可能避免拒絕存取,因為這樣可能會導致意外或複雜的存取控制運作方式。若要限制存取,請搭配使用範圍設定、屬性清單與目標篩選器等方法。

此外,刪除拒絕存取 ACI 並不會移除權限,而會擴充其他 ACI 所設定的權限。


目錄伺服器在評估存取權限時,會先讀取 deny 權限,再讀取 allow 權限。

在後續的範例中,Example.com 希望讓所有訂閱者都能夠讀取其本身項目下的帳單資訊,如連線時間或帳戶餘額等。Example.com 亦明確希望拒絕該資訊的寫入存取。read 存取的說明位於 ACI “Billing Info Read” 中。deny 存取的說明位於 ACI “Billing Info Deny” 中。

ACI “Billing Info Read”

在 LDIF 中,若要授予訂閱者讀取其本身項目中之帳單資訊的權限,請撰寫下列陳述式:


aci: (targetattr="connectionTime || accountBalance")
 (version 3.0; acl "Billing Info Read"; allow (search,read)
  userdn="ldap:///self";)

此範例假設模式中已建立相關屬性,且 ou=subscribers,dc=example,dc=com 項目中已加入 ACI。

ACI “Billing Info Deny”

在 LDIF 中,若要拒絕訂閱者修改其本身項目中之帳單資訊的權限,請撰寫下列陳述式:


aci: (targetattr="connectionTime || accountBalance")
 (version 3.0; acl "Billing Info Deny";
 deny (write) userdn="ldap:///self";)

此範例假設模式中已建立相關屬性,且 ou=subscribers,dc=example,dc=com 項目中已加入 ACI。

代理授權

代理授權方法是一種特殊形式的認證。使用本身的身份識別連結至目錄的使用者,會透過代理授權而授予其他使用者的權限。

若要配置目錄伺服器以允許代理伺服器請求,您必須執行下列動作:


備註 –

您可以將代理權限授予目錄的任何使用者,但「目錄管理員」除外。此外,您無法以「目錄管理員」的 DN 做為代理 DN。在授予代理權限時,您必須極為謹慎,因為您會授予可將任何 DN (「目錄管理員」DN 除外) 指定為代理 DN 的權限。若目錄伺服器在相同的作業中收到多個代理認證控制,即會有錯誤傳回用戶端應用程式,而作業嘗試將會失敗。


代理授權範例

Example.com 想讓連結為 MoneyWizAcctSoftware 的用戶端應用程式對 LDAP 資料具有與「會計管理員」相同的存取權限。

所套用的參數如下:

若要使用與「會計管理員」相同的存取權限,讓用戶端應用程式取得「會計」子樹狀結構的存取權,下列必須為真:

正確使用此 ACI 後,MoneyWizAcctSoftware 用戶端應用程式即可連結至目錄,並傳送 ldapsearchldapmodify 之類的 LDAP 指令,而要求代理 DN 的存取權限。

在此範例中,若用戶端要執行 ldapsearch 指令,指令中將會納入下列控制:


$ ldapsearch -D "uid=MoneyWizAcctSoftware,ou=Applications,dc=example,dc=com" -w - \
 -y "uid=AcctAdministrator,ou=Administrators,dc=example,dc=com" ...

請注意,用戶端會以本身的形式連結,但仍會被授予代理伺服器項目的權限。用戶端不需具備代理伺服器項目密碼。

使用篩選設定目標

若要設定允許存取目錄中眾多項目的存取控制,您可以使用篩選器設定目標。

在 LDIF 中,若要使用篩選器讓 HR 中所有的使用者均可存取員工項目,請撰寫下列陳述式:


aci: (targetattr="*") (targetfilter=(objectClass=employee))
 (version 3.0; acl "HR access to employees";
 allow (all) groupdn= "ldap:///cn=HRgroup,ou=People,dc=example,dc=com";)

此範例假設 ou=People,dc=example, dc=com 項目中已加入 ACI。


備註 –

由於搜尋篩選不會直接為您管理存取的物件命名,因此在允許或拒絕物件的存取權時,請勿搞錯對象。若不慎允許或拒絕了錯誤物件的存取權,您的目錄將變得更為複雜,因而提高風險。此外,使用篩選也可能使您難以對目錄內的存取控制問題進行疑難排解。


為含有逗號的 DN 定義權限

含有逗號的 DN 在您的 LDIF ACI 陳述式中需要特殊的處理方式。在 ACI 陳述式的目標與連結規則部分中,逗號之前必須加上一個反斜線 (\)。此語法如下列範例所說明:


dn: o=Example.com Bolivia\, S.A. 
objectClass: top 
objectClass: organization 
aci: (target="ldap:///o=Example.com Bolivia\,S.A.") (targetattr="*") 
(version 3.0; acl "aci 2"; allow (all) groupdn = 
"ldap:///cn=Directory Administrators, o=Example.com Bolivia\, S.A.";)

檢視有效權限

維護目錄中某些項目的存取策略時,您必須瞭解所定義的 ACI 在安全性方面會受到哪些影響。目錄伺服器可讓您檢視 ACI 授予指定項目之指定使用者的有效權限,以評估現有的 ACI。

目錄伺服器會對「取得有效權限」控制加以回應,此控制可納入搜尋作業中。此控制的回應會傳回搜尋結果中有關項目與屬性的有效權限資訊。這項額外資訊含有每一個項目以及各項目中每一個屬性的讀取與寫入權限。您可以針對用於搜尋的連結 DN 或任意 DN 請求這些權限。此選擇可讓管理員測試目錄使用者的權限。

有效權限功能需依賴 LDAP 控制。您必須確定用以連結至遠端伺服器的代理伺服器身份識別亦可存取有效權限屬性。

限制取得有效權限控制的存取

檢視有效權限的作業是一項必須受到保護與適當限制的目錄作業。

若要限制有效權限資訊的存取,請修改 getEffectiveRights 屬性的預設 ACI。接著請建立 getEffectiveRightsInfo 屬性的新 ACI。

例如,下列 ACI 將僅允許「目錄伺服器管理員群組」的成員取得有效權限:


aci: (targetattr != "aci")(version 3.0; acl
 "getEffectiveRights"; allow(all) groupdn =
 "ldap:///cn=Directory Administrators,ou=Groups,dc=example,dc=com";)

若要取得有效權限資訊,您必須具備使用「有效權限」控制的存取控制權限,以及 aclRights 屬性的讀取存取權。這種雙層的存取控制,可提供能夠在必要時進一步微調的基本安全性。與代理伺服器相似,若您對某項目中的 aclRights 屬性具有讀取存取權,即可請求任何人對該項目及其屬性之權限的相關資訊。這表示,管理資源的使用者能夠決定擁有資源權限的人員,即使這名使用者並未實際管理具有這些權限的人員亦然。

若請求權限資訊的使用者無權使用「有效權限」控制,作業即會失敗並傳回錯誤訊息。但若請求權限資訊的使用者有權使用控制,但缺少讀取 aclRights 屬性的權限,aclRights 屬性即不會出現在傳回的項目中。此運作方式會反映目錄伺服器的一般搜尋運作方式。

使用「取得有效權限」控制

使用 ldapsearch 指令與 -J "1.3.6.1.4.1.42.2.27.9.5.2" 選項,指定「取得有效權限」控制。依預設,控制會在搜尋結果中傳回項目與屬性的連結 DN 項目有效權限。

請使用下列選項變更預設運作方式:


備註 –

aclRightsaclRightsInfo 屬性的運作方式與虛擬作業屬性相仿。這些屬性並未儲存在目錄中,且非經明確請求不會傳回。它們會由目錄伺服器在回應「取得有效權限」控制時產生。

因此,這些屬性無法用於任何類型的篩選或搜尋作業中。


有效權限功能會繼承可影響存取控制的其他參數。這些參數包括一天中的時間、認證方法、機器位址與名稱。

下列範例將說明使用者 Carla Fuente 能夠以何種方式檢視她在目錄中的權限。在結果之中,1 表示已授予權限,0 表示已拒絕權限。


$ ldapsearch -J "1.3.6.1.4.1.42.2.27.9.5.2 -h host1.Example.com -p 389 \
 -D "uid=cfuente,ou=People,dc=example,dc=com" -w - -b "dc=example,dc=com" \
 "(objectclass=*)" aclRights
Enter bind password:
dn: dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: ou=Groups, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: cn=Accounting Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: cn=HR Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: uid=bjensen,ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: uid=cfuente, ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0

此結果為 Carla Fuente 顯示了她在目錄中至少具有讀取權限的項目,並顯示她可修改本身的項目。「有效權限」控制不會略過一般存取權限,因此使用者不會看見他不具讀取權限的項目。在下列範例中,「目錄管理員」將可看見 Carla Fuente 不具讀取權限的項目:


$ ldapsearch -h host1.Example.com -p 389 -D cn=admin,cn=Administrators,cn=config -w - \
 -c "dn: uid=cfuente,ou=People,dc=example,dc=com" -b "dc=example,dc=com" \
 "(objectclass=*)" aclRights
Enter bind password:
dn: dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: ou=Groups, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: cn=Directory Administrators, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0
dn: ou=Special Users,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0
dn: ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: cn=Accounting Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: cn=HR Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: uid=bjensen,ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0
dn: uid=cfuente, ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0

在上方的輸出中,「目錄管理員」可看出 Carla Fuente 甚至無法檢視目錄樹狀結構中的「特殊使用者」或「目錄伺服器管理員」分支。在下列範例中,「目錄管理員」將可看出 Carla Fuente 無法修改其本身項目中的 mailmanager 屬性:


$ ldapsearch -h host1.Example.com -p 389 -D cn=admin,cn=Administrators,cn=config -w - \
 -c "dn: uid=cfuente,ou=People,dc=example,dc=com" -b "dc=example,dc=com" \
 "(uid=cfuente)" aclRights "*"
Enter bind password:
version: 1
dn: uid=cfuente, ou=People, dc=example,dc=com
aclRights;attributeLevel;mail: search:1,read:1,compare:1,
 write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0
mail: cfuente@Example.com
aclRights;attributeLevel;uid: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
uid: cfuente
aclRights;attributeLevel;givenName: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
givenName: Carla
aclRights;attributeLevel;sn: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
sn: Fuente
aclRights;attributeLevel;cn: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
cn: Carla Fuente
aclRights;attributeLevel;userPassword: search:0,read:0,
 compare:0,write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
userPassword: {SSHA}wnbWHIq2HPiY/5ECwe6MWBGx2KMiZ8JmjF80Ow==
aclRights;attributeLevel;manager: search:1,read:1,compare:1,
 write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0
manager: uid=bjensen,ou=People,dc=example,dc=com
aclRights;attributeLevel;telephoneNumber: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
telephoneNumber: (234) 555-7898
aclRights;attributeLevel;objectClass: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy: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 的評估。

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

記錄存取控制資訊

若要在錯誤記錄中取得存取控制的相關資訊,您必須設定適當的記錄層級。

Procedure設定 ACI 記錄

無法使用 DSCC 執行此作業。請依照此程序中的說明使用指令行。

    設定記錄層級,以將 ACI 處理納入考量。


    $ dsconf set-log-prop -h host -p port error level:err-acl

使用 TCP 包裝的用戶端主機存取控制

您可以使用 TCP 包裝程式,控制連線在 TCP 上所接受或遭拒絕的主機或 IP 位址。您可以透過 TCP 包裝,限制用戶端主機的存取。如此一來,您即可對目錄伺服器的初始 TCP 連線使用非主機式保護。

雖然您可以為目錄伺服器設定 TCP 包裝,但如此可能會使效能受到嚴重影響,特別是在阻絕服務攻擊期間。使用在目錄伺服器以外維護的主機式防火牆,或使用 IP 連接埠篩選,將可達到最佳效能。

Procedure啟用 TCP 包裝

無法使用 DSCC 執行此作業。請依照此程序中的說明使用指令行。

  1. 在實例路徑內,建立 hosts.allow 檔案或 hosts.deny 檔案。

    例如,您可以在 instance-path/config 中建立檔案。請確定您所建立的檔案格式符合 hosts_access(4)

  2. 設定存取檔案的路徑。


    $ dsconf set-server-prop -h host -p port host-access-dir-path:path-to-file
    

    例如︰


    $ dsconf set-server-prop -h host -p port host-access-dir-path:/local/ds1/config
    "host-access-dir-path" property has been set to "/local/ds1/config".
    The "/local/ds1/config" directory on host1 must contain valid hosts.allow
    and/or hosts.deny files.
    Directory Server must be restarted for changes to take effect. 

Procedure停用 TCP 包裝

無法使用 DSCC 執行此作業。請依照此程序中的說明使用指令行。

    將主機存取路徑設為 ""


    $ dsconf set-server-prop -h host -p port host-access-dir-path:""