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

存取控制用法範例

本節中的範例說明虛構的 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") ;)

此範例假設 aci 已增加至 dc=example,dc=com entry。請注意,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.";)