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
的前面才能生效
OpenLDAP權限配置