維護目錄中某些項目的存取策略時,您必須瞭解所定義的 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 項目有效權限。
請使用下列選項變更預設運作方式:
-c "dn: bind DN " — 搜尋結果會顯示以指定 DN 連結之使用者的有效權限。此選項可讓管理員檢查其他使用者的有效權限。選項 -c "dn:" 可顯示匿名認證的有效權限。
-X "attributeName ... " — 搜尋結果會同時包含已命名屬性的有效權限。使用此選項可指定未出現在搜尋結果中的屬性。例如,您可以使用此選項,指定使用者是否有權增加目前不在項目中的屬性。
使用 -c 和/或 -X 選項時,-J 選項與「取得有效權限」控制的 OID 即已包含在內,不需另行指定。若您指定了空值的「有效權限」控制,則會擷取目前使用者的權限。此外,也會擷取目前的 ldapsearch 作業所傳回之屬性與項目的權限。
接著,您必須選取所要檢視的資訊類型。請選擇簡單權限,或選擇可說明這些權限之授予或拒絕情形的詳細記錄資訊。在搜尋結果中增加 aclRights 或 aclRightsInfo 屬性,可決定傳回的資訊類型。您可以同時請求兩種屬性,以接收所有的有效權限資訊,但實際上簡單權限會在詳細的記錄資訊中重複這些資訊。
aclRights 與 aclRightsInfo 屬性的運作方式與虛擬作業屬性相仿。這些屬性並未儲存在目錄中,且非經明確請求不會傳回。它們會由目錄伺服器在回應「取得有效權限」控制時產生。
因此,這些屬性無法用於任何類型的篩選或搜尋作業中。
有效權限功能會繼承可影響存取控制的其他參數。這些參數包括一天中的時間、認證方法、機器位址與名稱。
下列範例將說明使用者 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 無法修改其本身項目中的 mail 與 manager 屬性:
$ 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 |