安裝好了openldap以後,就是對它進行配置了,其中一項就是設置訪問控制,限制普通用戶只能修改/訪問他們能修改/訪問的項。這就是ACL須要作的事情。linux
一、能夠將 include行放在/etc/openldap/slapd.conf 的頂部,指向一個單獨的文件(例如, include /etc/openldap/slapd.access.conf)
二、或者能夠將 ACL 直接添加到 slapd.conf。這徹底由您選擇 ― Mandrake 一般使用 include 行;Red Hat 將 ACL 添加到配置文件。slapd.conf文件路徑:/etc/openldap/slapd.conf正則表達式
access to what:
by who access control
其中,access to指示啓用訪問控制,上句大體能夠理解爲:
access to <對什麼目標進行控制>[by <做用於哪些訪問者> <授予什麼樣的訪問權限><採起什麼樣的匹配控制動做>]+dom
這一域主要是實現對ACL應用對象的指定,對象能夠是記錄和屬性。選擇ACL目標記錄的方法通常有兩種:DN和filter,語法爲:ssh
ui
what ::= * |
[dn[.basic-style]=regex | dn.scope-style=DN]
[filter=ldapfilter] [attrs=<attrlist>]
access to *
code
語法以下:server
to dn[.basic-style]=regex
對象
basic-style ::= regex | exact
to dn.scope-style=DN
scope-style ::= base | one | subtree | children
第一種方法是使用正則表達式(dn.regex)或精確匹配(dn.style)的方式來匹配符合條件的記錄(這個好像不像想象的那麼簡單,實現起來頗爲費腦筋),例如:it
access to dn="^.*,uid=([^,]+),ou=users,(.*)$"
test
第二種方法經過「區域」選擇的方法進行目標記錄的選取,對以指定的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」 匹配記錄二、三、四、5
規則 dn.children=」ou=users,dc=mydomain,dc=org」 匹配記錄三、四、5,由於記錄0、1和2都是以DN直接命名的,故不匹配
經過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)
語法: attrs=attribute list
例如: access to attrs=uid,uidNumber,gidNumber
也能夠結合使用DN和attrs進行記錄的匹配,例如: access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid
指定被受權的用戶範圍的方法大體有如下幾種: * 全部的訪問者,包括匿名的用戶
anonymous 非認證的匿名用戶
users 認證的用戶
self 目標記錄的用戶自身
dn[.<basic-style>]=<regex> 在指定目錄內匹配正則表達式的用戶
dn.<scope-style>=<DN> 指定DN內的用戶
例如: by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"
當選取好ACL做用的目標記錄並選取好用戶範圍後,就該給這些用戶授予他們應該獲得的權限了。大體的權限(由低到高)有如下幾類:
none 無權限,即拒絕訪問
auth 訪問bind(認證)設置的權限;前提是須要用戶提交一個DN形式的用戶名並能經過認證
compare 比較屬性的權限;(例如:對照查看某用戶的telephoneNumber值是否是158 8888 8888),但並不具備搜索的權限
search 利用過慮條件進行搜索的權限,但這並不必定具備可讀取搜索結果的權限
read 讀取搜索結果的權限
write 更改記錄屬性值的權限
能夠在slapd.conf文件中經過defaultaccess指定默認的權限級別,如:
defaultaccess search
在進行記錄的匹配時,若是有多條規則存在,那麼在第一次匹配產生後是否還進行後續的匹配或採起其它的動做將取決於此項的設置;控制方式共有如下三種:
stop 這個是默認值,這表示在一次匹配產生後將再也不進行下一個匹配,全部後續的匹配將會中止。
continue 不管匹配是否已經發生,繼續進行直到全部的規則所有進行完匹配檢查
break 一個匹配發生後,跳出當前的子句進行後一個子句的檢查
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
的前面才能生效