Linux 安裝並配置 OpenLDAP 新編(5)訪問控制
Linux 安裝並配置 OpenLDAP 新編(5)訪問控制
SASL機制授權和簡單授權
顧名思義,訪問控制即是控制目標在系統中可以訪問的內容。回想一下之前在不同場景中的操作:
- 在YUM安裝後,使用 "-Q -Y" 進行授權驗證;
- 在編譯安裝後,使用 "-x -W -D "進行授權驗證。
而導致此區別的重要原因,正是體現在不同方式安裝 OpenLDAP 後的 olcDatabase={0}config.ldif 與 olcDatabase={x}mdb.ldif 這兩個檔案中:
YUM安裝後的 olcDatabase={0}config.ldif 檔案中包含下面這句,即為SASL機制授權:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" manage by * none
編譯安裝後的 olcDatabase={x}mdb.ldif 檔案中,則包含下面的語句(當前前提是配置了),即為簡單授權:
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: e1NTSEF9SDdwcWlwdUNvSGJNSCthQUF5M2k5WTIvem8rSVkycnk=
如果用形象點的類比,就像是 Microsoft SQL Server 中的整合身份驗證與帳號密碼登入的區別。而同樣的,在預設的情況下,兩者也並不是同時生效的。
對於YUM形式的安裝來說,預設就添加了SASL機制,雖然也支援簡單授權,但是沒有預設密碼,SASL機制的格式為:
gidNumber=<gid>+uidNumber=<uid>,cn=peercred,cn=external,cn=auth
因此,root 賬戶的SASL標識,即為上面的內容。
而對於編譯安裝的情景來說,若只按照之前的快速入門中的描述,則只會在通用資料庫 olcDatabase=mdb 中啟用簡單驗證,未啟用SASL驗證。而且,由於編譯安裝的預設配置中,是隱式建立的 cn=config 資料庫,這會導致既不能通過SASL機制授權也不能通過簡單授權來管理 cn=config 全域性資料庫的配置,請務必注意! 。那麼,對於簡單授權方式來說,該如何定義這樣的超級許可權呢?答案是使用: olcRootDN
測試
# 簡單授權方式
ldapsearch -LLL -x -W -D cn=config -b cn=config dn olcRootDN olcRootPW
ldapsearch -LLL -x -W -D cn=config -b cn=config "(olcRootDN=*)" dn olcRootDN olcRootPW
# SASL機制授權
ldapsearch -LLL -Q -Y EXTERNAL -H ldapi:// -b cn=config dn olcRootDN olcRootPW
ldapsearch -LLL -Q -Y EXTERNAL -H ldapi:// -b cn=config "(olcRootDN=*)" dn olcRootDN olcRootPW
現在可以通過上面的四個語句,在不同情景下進行測試了。同時,會發現一個小彩蛋~~~
許可權對映
我們之前使用SASL機制,都是使用root來進行的,那如果用其他使用者呢?我們首先編輯一個測試檔案:
# add_member3.ldif
dn: uid=test3,ou=People,dc=example,dc=com
objectclass: account
uid: test3
然後使用一個普通使用者登入,直接執行新增命令會返回錯誤,這是因為普通使用者並沒有操作條目的許可權。此時我們可以通過新增 sudo 的方式執行新增操作,還可以使用前面的方式,使用 olcAccess 指令新增到資料庫中,但是這次我們換種方式來操作。
首先檢視一下當前賬戶的SASL標識:
ldapwhoami -Q -Y EXTERNAL -H ldapi://
dn:gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth
接下來在另外一個終端中,使用 root 賬戶建立下面的配置檔案:
# file: add_access_map.ldif
# 注意,對映只能新增到 頂級全域性配置中
dn: cn=config
changetype: modify
add: olcAuthzRegexp
# 注意,字串中的加號,要做轉義
olcAuthzRegexp: "gidNumber=1000\+uidNumber=1000,cn=peercred,cn=external,cn=auth" "cn=Manager,dc=example,dc=com"
然後使用命令使配置生效:
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_access.ldif
最後,再次切換到普通使用者的終端,檢視當前使用者。
ldapwhoami -Q -Y EXTERNAL -H ldapi://
dn:cn=manager,dc=example,dc=com
Bingo,可以看到當前使用者SASL標識已經被替換為DN賬戶。
訪問控制
LDAP中的控制訪問,是通過對資料庫新增 olcAccess 指令來實現的。該指令的正規化為:
olcAccess: to <what> [ by <who> [<access>] [<control>] ]+
正如前面所說,該指令定義了什麼資源(what)可以由何人(who),執行什麼(access)。因此再對照前面的配置,就明白下面這行配置的含義了:
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" manage by * none
這個配置的意思是:對於當前資料庫範圍的所有資源,允許 root 進行管理,其他人不賦予任何許可權。同時, olcRootDN 所指定的ID名稱,不受訪問控制的約束。
WHAT:
WHAT表示可以操作的條目物件,有三種方式來宣告要操作的物件:
- to * : 表示全部物件
- to dn[.basic-style]=
: 通過正則表示式來匹配條目的DN - to dn.
= : 用於範圍請求
正則正規化,類似於:
to filter=(objectClass=person)
範圍請求類似於:
- dn.base="ou=people,o=suffix" : 精準匹配
- dn.one="ou=people,o=suffix" : 只匹配下一級
- dn.subtree="ou=people,o=suffix" : 匹配同一樹幹
- dn.children="ou=people,o=suffix" : 匹配所有子級,不限級別
兩種方式可以在同一個字句內混合使用,例如:
to dn.one="ou=people,o=suffix" filter=(objectClass=person)
WHO:
WHO即表示將前面的資源,授權給誰進行操作:
指令 | 實體 |
---|---|
* | 所有物件,包括匿名和授權使用者 |
anonymous | 匿名未授權使用者 |
users | 授權使用者 |
self | 與目標條目直接關聯的使用者,比如使用者條目自己 |
dn[. |
符合正則匹配的使用者 |
dn. |
DN所指定範圍內的使用者 |
ACCESS:
ACCESS則是銜接前面的,某個資源對於某個使用者來說可以進行 何種 操作:
級別 | 許可權 | 描述 |
---|---|---|
none | =0 | 沒有許可權 |
disclose | =d | 這個未理解是幹嘛的~~~~ |
auth | =dx | 需要進行授權的操作 |
compare | =cdx | 進行比較的許可權 |
seach | =scdx | 進行搜尋過濾的許可權 |
read | =rscdx | 進行讀取的許可權 |
write | =wrcdx | 進行寫入的許可權 |
manage | =mwrscdx | 進行管理的許可權 |
從上面的表格可以看出,許可權是向下相容的,即如果給使用者指定了 write 的許可權,那麼他同時會擁有 read 、 search 、 compare 、 auth 以及 disclose 的許可權。
訪問控制的變更
既然可以新增訪問控制,那是否可以刪除或者修改訪問控制?當然是可以的!繼續編輯一個新增許可權的檔案:
# add_access.ldif
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by dn.base="ou=People,dc=example,dc=com"
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by dn.base="ou=Group,dc=example,dc=com"
使用 ldapadd 將檔案新增到資料庫中,此時查詢該資料庫的配置,可以看到已經添加了2條新的許可權記錄。此時我們發現上面的許可權似乎有錯誤,即並未給使用者指定具體的操作許可權,我們再次建立一個檔案
# delete_access.ldif
dn: olcDatabase={2}mdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {1}
此時可以使用 ldapadd 命令來刪除指定的索引,根據官網介紹似乎可以直接執行 relace 指令,但是實操下來似乎會把全部都替換,因此對於更新操作,建議開始刪除後再新增。或者一個 replace 指令中就新增多個 olcAccess 指令。
總結
通過本章的學習,深入瞭解了 LDAP 的許可權控制,可以是針對系統賬戶,也可以是LDAP管理賬戶。可以靈活的LDAP資訊保安管理了。下一章,將介紹LDAP的模組,以及絕大多數人都需要的 memberof 功能。
本章示例點選這裡下載。