1. 程式人生 > 其它 >Linux 安裝並配置 OpenLDAP 新編(5)訪問控制

Linux 安裝並配置 OpenLDAP 新編(5)訪問控制

Linux 安裝並配置 OpenLDAP 新編(5)訪問控制

SASL機制授權和簡單授權

顧名思義,訪問控制即是控制目標在系統中可以訪問的內容。回想一下之前在不同場景中的操作:

  • 在YUM安裝後,使用 "-Q -Y" 進行授權驗證;
  • 在編譯安裝後,使用 "-x -W -D "進行授權驗證。

而導致此區別的重要原因,正是體現在不同方式安裝 OpenLDAP 後的 olcDatabase={0}config.ldifolcDatabase={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

olcRootPW。即把 olcRootDN 當做賬戶名, olcRootPW 當做密碼來實現簡單授權。

測試

# 簡單授權方式
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 DN所指定範圍內的使用者

ACCESS:

ACCESS則是銜接前面的,某個資源對於某個使用者來說可以進行 何種 操作:

級別 許可權 描述
none =0 沒有許可權
disclose =d 這個未理解是幹嘛的~~~~
auth =dx 需要進行授權的操作
compare =cdx 進行比較的許可權
seach =scdx 進行搜尋過濾的許可權
read =rscdx 進行讀取的許可權
write =wrcdx 進行寫入的許可權
manage =mwrscdx 進行管理的許可權

從上面的表格可以看出,許可權是向下相容的,即如果給使用者指定了 write 的許可權,那麼他同時會擁有 readsearchcompareauth 以及 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 功能。

本章示例點選這裡下載。

參考資料