二:權限控制
8.1:訪問控制
訪問控制主要是通過在slapd.conf文件中配置來實現,具體配置解析如下:
# Sample Access Control
# Allow read access of root DSE
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# access to dn="" by * read
access to * by self write
by users read
by anonymous auth
#
# if no access controls are present, the default is:
# Allow read by all
#
# rootdn can always write!
此選項涉及如何管理服務器上的 LDAP 目錄的訪問權限。只要在數據庫特定部分沒有聲明任何自定義訪問規則,slapd.conf 的全局部分中的設置將始終有效。這些自定義聲明會重寫全局聲明。如本例所示,所有用戶都可以讀取目錄,但只有管理員 (rootdn) 才能寫入此目錄。LDAP 中的訪問控制管理是一個非常複雜的過程。以下提示會有所幫助:
每條訪問規則都具有如下結構:
access to <what> by <who> <access>
what 是一個佔位符,表示授權訪問的對象或屬性。可以使用單獨的規則來明確保護各個目錄分支。還可以使用正則表達式通過一條規則處理目錄樹的各個區域。slapd 按照各條規則列在配置文件中的先後順序依次評估它們。較通用的規則應列在較特定的規則之後 - 在評估 slapd 認爲有效的第一條規則之後,隨後的所有項都將被忽略。
who 確定應該授權誰來訪問 what 確定的區域。可以使用正則表達式。slapd 同樣會在評估第一條有效規則之後中止對隨後的 who 的評估,所以應將較具體的規則列在較抽象的規則之前。
access 指定訪問類型。請使用 上表所列的選項。
slapd 會將客戶機請求的訪問權限與 slapd.conf 中授予的權限進行對比。如果規則允許的權限等於或高於請求的權限,則可以授予客戶機權限。如果客戶機請求的權限高於規則中聲明的權限,便會拒絕授予權限。
如下一個簡單示例,使用正則表達式可以隨意指定這樣的簡單訪問控制。
access to dn.regex="ou=([^,]+),dc=example,dc=com"
by dn.regex="cn=Administrator,ou=$1,dc=example,dc=com" write
by user read
by * none
此規則聲明只有各個 ou 項的管理員纔有權寫入他/她所管理的項。其他所有通過身份驗證的用戶只有讀權限,其餘人沒有任何權限。
如果沒有 access to 規則或匹配的 by 指令,則拒絕訪問。只有經過顯式聲明才能授予訪問權限。如果根本沒有聲明任何規則,默認規則是管理員具有寫權限,其他所有用戶都具有讀權限。
除了可以使用中央服務器配置文件 (slapd.conf) 管理訪問權限之外,還可以使用訪問控制信息 (ACI)。ACI 允許儲存 LDAP 樹中各個對象的訪問信息。
8.2訪問控制補充
安裝好了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
的前面才能生效
三:備份補充
9:備註補充(這個步驟僅做備份用,前面都已經註明過)
9.1. 生成LDIF格式文件
往openldap數據庫存放數據,有多種方式:1. 手動編輯;2. 用工具生成
手動編輯這裏不介紹。工具生成指的是用migrationtools腳本來產生ldif文件
9.2 安裝migrationtools工具
虛擬機console執行命令:rpm -qa | grep migrationtools,查看系統是否已經安裝migrationtools
若沒有安裝,執行命令:yum -y installl migrationtools,進行工具安裝
9.3 用migrationtools生成ldif文件
這裏是希望用openldap來實現用戶認證,因此需要把系統中存在的user和group產生ldif,添加到ldap的數據庫中。
虛擬機console執行命令:
/usr/share/migrationtools /migrate_base.pl > base.ldif
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd > passwd.ldif
/usr/share/migrationtools/migrate_group.pl /etc/group > group.ldif
9.4 添加ldif到ldap數據庫
上面過程,已經將用戶認證時需要的文件/etc/passwd和/etc/group生成ldif文件。
改用ldap驗證時,就需要將這幾個文件添加到ldap數據庫中。
虛擬機console執行命令:
ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com' -c -W -f base.ldif
ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com" -c -W -f passwd.ldif
ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com" -c -W -f group.ldif
提示輸入密碼時,輸入liwanliang,回車
9.5密碼的生成方式
rootpw的密碼最好用密文形式的,密文形式的密文可以用命令slappasswd來生成。
# /usr/local/openldap/sbin/slappasswd
New password:
Re-enter new password:
{SSHA}BsaRKs65dsw5dhesleHEHEWOE1843decJ
密文就是:{SSHA}BsaRKs65dsw5dhesleHEHEWOE1843decJ
9.6刪除原配置,生成新配置(修改slapd.conf文件後)
# rm -rf /etc/ldap/slapd.d/*
# slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/
# 給新生成的配置文件賦予openldap的權限
# chown -R openldap.openldap /etc/ldap/slapd.d/
重啓openldap
# /etc/init.d/slapd restart