OpenLDAP權限配置


安裝好了openldap之后,就是對它進行配置了,其中一項就是設置訪問控制,限制普通用戶只能修改/訪問他們能修改/訪問的項。這就是ACL需要做的事情。


設置方法

1、可以將 include行放在/etc/openldap/slapd.conf 的頂部,指向一個單獨的文件(例如, include /etc/openldap/slapd.access.conf) 
2、或者可以將 ACL 直接添加到 slapd.conf。這完全由您選擇 ― Mandrake 通常使用 include 行;Red Hat 將 ACL 添加到配置文件。slapd.conf文件路徑:/etc/openldap/slapd.conf

ACL設置語法

1.語法

access to what: 
by who access control
 
其中,access to指示啟用訪問控制,上句大致可以理解為: 
access to <對什么目標進行控制>[by <作用於哪些訪問者> <授予什么樣的訪問權限><采取什么樣的匹配控制動作>]+

2.剖析

2.1 控制目標 what

這一域主要是實現對ACL應用對象的指定,對象可以是記錄和屬性。選擇ACL目標記錄的方法一般有兩種:DN和filter,語法為:


what ::= * | 
[dn[.basic-style]=regex | dn.scope-style=DN] 
[filter=ldapfilter] [attrs=<attrlist>] 

2.1.1 指定所有的記錄

access to *

2.1.2 通過DN指定

語法如下:

to dn[.basic-style]=regex 
basic-style ::= regex | exact 
to dn.scope-style=DN 
scope-style ::= base | one | subtree | children

第一種方法是使用正則表達式(dn.regex)或精確匹配(dn.style)的方式來匹配符合條件的記錄(這個好像不像想象的那么簡單,實現起來頗為費腦筋),例如:

access to dn="^.*,uid=([^,]+),ou=users,(.*)$"

第二種方法通過“區域”選擇的方法進行目標記錄的選取,對以指定的DN開始的目錄樹區域進行目標記錄匹配。匹配區域的方式共有四種: 
base 只匹配DN本身一條記錄 
one 匹配以給定DN為父目錄的所有記錄 
subtree 匹配以給定DN為根目錄的所有子樹內的記錄 
children 匹配給定DN下的所有記錄,但應該不包括以DN直接命名的那條記錄(參見例子的解釋)

例如:對於 
0: dc=mydomain,dc=org 
1: cn=root,dc=mydomain,dc=org 
2: ou=users,dc=mydomain,dc=org 
3: uid=samba,ou=users,dc=mydomain,dc=org 
4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org 
5: uid=guest,ou=users,dc=mydomain,dc=org

規則 dn.base=”ou=users,dc=mydomain,dc=org” 只會匹配記錄2 
規則 dn.one=”ou=users,dc=mydomain,dc=org” 匹配記錄3和記錄5,記錄4是記錄3的子目錄,故不算在內 
規則 dn.subtree=”ou=users,dc=mydomain,dc=org” 匹配記錄2、3、4、5 
規則 dn.children=”ou=users,dc=mydomain,dc=org” 匹配記錄3、4、5,因為記錄0、1和2都是以DN直接命名的,故不匹配

2.1.3 通過filter匹配記錄

通過filter指定過濾規則進行記錄過慮,語法如下:

access to filter=ldap filter

其中filter指定的為search的過濾規則,這類同於linux系統中grep的匹配方式。如:

access to filter=(objectClass=sambaSamAccount)

也可以結合使用DN和filter進行記錄的匹配,例如:

access to dn.subtree=”ou=users,dc=mydomain,dc=org” filter=(objectClass=posixAccount)

2.1.4 通過attrs選取匹配記錄

語法: 
attrs=attribute list

例如: 
access to attrs=uid,uidNumber,gidNumber

也可以結合使用DN和attrs進行記錄的匹配,例如: 
access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid

2.2 被用來授權的訪問者的指定

指定被授權的用戶范圍的方法大致有以下幾種: 
* 所有的訪問者,包括匿名的用戶 
anonymous 非認證的匿名用戶 
users 認證的用戶 
self 目標記錄的用戶自身 
dn[.<basic-style>]=<regex> 在指定目錄內匹配正則表達式的用戶 
dn.<scope-style>=<DN> 指定DN內的用戶

例如: 
by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"

2.3 被授予的權限access

當選取好ACL作用的目標記錄並選取好用戶范圍后,就該給這些用戶授予他們應該得到的權限了。大致的權限(由低到高)有以下幾類: 
none 無權限,即拒絕訪問 
auth 訪問bind(認證)設置的權限;前提是需要用戶提交一個DN形式的用戶名並能通過認證 
compare 比較屬性的權限;(例如:對照查看某用戶的telephoneNumber值是不是158 8888 8888),但並不具有搜索的權限 
search 利用過慮條件進行搜索的權限,但這並不一定具有可讀取搜索結果的權限 
read 讀取搜索結果的權限 
write 更改記錄屬性值的權限

可以在slapd.conf文件中通過defaultaccess指定默認的權限級別,如: 
defaultaccess search

2.4 采取什么樣的匹配控制動作control

在進行記錄的匹配時,如果有多條規則存在,那么在第一次匹配產生后是否還進行后續的匹配或采取其它的動作將取決於此項的設置;控制方式共有以下三種:

stop 這個是默認值,這表示在一次匹配產生后將不再進行下一個匹配,所有后續的匹配將會停止。 
continue 無論匹配是否已經發生,繼續進行直到所有的規則全部進行完匹配檢查 
break 一個匹配發生后,跳出當前的子句進行后一個子句的檢查

2.5 一個例子

access to dn.chilren="ou=users,dc=mydomain,dc=org" 
attrs=userPassword #指定“密碼”屬性 
by self write #用戶自己可更改 
by * auth #所有訪問者需要通過認證 
by dn.children="ou=admins,dc=mydomain,dc=org" write #管理員組的用戶可更改

access to dn.subtree="ou=SUDOers,dc=test,dc=com" #SUDOers的所有內容必須提供其他匿名可讀,不然在linux上切換到該用戶,不能使用sudo 
by dn="cn=Manager,dc=test,dc=com" write 
by * read 
access to attrs="gidNumber,homeDirectory,loginShell,uidNumber,sshPublicKey" 
by * read #對這些屬性只能讀,但是userPassword字段是可寫的,允許用戶自行修改密碼,但是不能修改自己的gid,home目錄等 
access to * 
by anonymous read #匿名訪問可讀 
by self write #自己可寫 
by users read
 #其他用戶可讀

前面這些配置需要放在 
database config 
access to * 
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage 
by * none 
enable server status monitoring (cn=monitor) 
database monitor 
access to * 
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read 
by dn.exact="cn=Manager,dc=test,dc=com" read 
by * none
 
的前面才能生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM