obmc的user managment 可以參考官方文件 (https://github.com/openbmc/docs/blob/master/architecture/user-management.md)
在user-management.md中有分別說明三個模塊的目的為何
openbmc ldap設定和驗證,能從以下幾個方向來看
- nss-pam-ldapd
- ldap server 架設
- redfish/web 設定
先了解 nss-pam-ldapd 的概念後就能進行ldap
server的設定,設定完就能驗證redfish/web的ldap功能是否正常
這篇會介紹nss-pam-ldap,ldap server的架設和 redfish& web設定會在openBMC LDAP 設定(二) - openldap server 架設和bmc設定中介紹,LDAPS在openBMC LDAP 設定(三) - LDAPS(LDAP over TLS)
nss-pam-ldapd
OpenBMC - User Management - High Level architectural diagram |
我們先來看一下 openbmc 對nss-pam-ldapd 的描述
Bringing the LDAP authentication module support in openbmc
stack requires to pull the nss-pam-ldapd which allows the
LDAP server to provide the user, passwd, group info that we
normally get from the /etc flat files.
openbmc auth stack 使用nss-pam-ldapd
來引入LDAP驗證模組讓我們能從/etc 平面文件中取得LDAP server
提供的 user, psswd, group 資訊。
nss-pam-ldapd provides libnss-ldap(Name Service Switch
module) and pam_ldap(Pluggable Authentication Module) module
which delegate the work to the nslcd(daemon) that queries the
LDAP server.
nss-pam-ldapd 是透過 nslcd(daemon) 使用 libnss-ldap和
pam_ldap (thin NSS and PAM modules )來實現的
pam_ldap uses the openldap client API to interact with the
LDAP server.
其中pam_ldap 是使用openldap client API來和LDAP
server做溝通的
因此我們在bmc的進程中可以看到nslcd這個daemon
- path of nss-pam-ldapd.bb in openbmc: openbmc/meta-phosphor/recipes-support/nss-pam-ldapd/nss-pam-ldapd_0.9.8.bb
- nss-pam-ldapd的opensource: arthurdejong/nss-pam-ldapd
在接下來這邊會分別介紹 nslcd的設定檔(nslcd.conf), pam module 和 nss module
💣nslcd.conf
nslcd.conf 是存放LDAP server的配置的文件,包含了base dc, binddn, bindpw 等資訊,在官方網站(https://arthurdejong.org/nss-pam-ldapd/setup)中有說明最低配置應該包含如以下:
在BMC中,當我們設定完ldap的連線後,會由 phosphor-ldap-conf 這個daemon來更新nslcd.conf的內容,舉的例子,我們先透過redfish 來設定LDAP service ([PATCH] redfish/v1/AccountService)
💣PAM(Pluggable Authentication Modules)
在Linux中,我們常常需要用不同的機制來判斷帳號密碼,例如本地帳號密碼,LDAP,指紋讀取機等,越來越多元的帳號認證方式,就出現了PAM,可插拔身分驗證模塊,他可以透過使用配置文件而不是更改應用程序代碼來切換安全應用程序的身份驗證方法。例如密碼輸入錯誤幾次就要鎖幾分鐘,幾個月要換一次密碼,能不能透過LDAP登入,這些設定都記錄在pam.d/*
或 pam.conf中,並且透過不同的shared library(.so)來實現
pam shared library(.so) 在obmc的位置是存放在"/lib/security/*"
以webserver 為例
這邊include
common-auth,從common-auth中可以看到驗證帳號的步驟分別呼叫了
pam_tally2.so, pam_unix.so and
pam_ldap.so,(unix後也呼叫了ldap)
在user-management.md中有分別說明三個模塊的目的為何
💣nsswitch(Name Service Switch)
最後,我們需要在nsswitch.conf中新增ldap 的配置供client 端驗證查詢使用,在pam 驗證模塊中,會去分別對有效帳戶,密碼核對,所屬群組去做驗證,通常在本地端會將帳戶訊息存在 /etc/passwd, 密碼放在 /etc/shadow (for uid),群組訊息放在/etc/group (for gid) ,但LDAP的訊息並不會存放在本地端檔案中,因此我們就需要透過nss來找到相對應的database source因此 nss 被視為任何在client端呼叫getXbyY()的介面,例如:
getpwnam() (&(objectClass=posixAccount)(uid=%s))
getpwuid() (&(objectClass=posixAccount)(uidNumber=%d))
getpwent() (objectClass=posixAccount)
透過nssswitch.conf 列出database(資料庫, 如group, passwd等)相對應的來源,格式如下:
Name Service Switch Types: Sources#1 Sources#2
例如 passwd: files ldap --> 搜尋passwd database 會依序lookup /etc/passwd 再 ldap
目前支援的Name Service Switch Type有16種: aliases, bootparams, ethers, group, hosts, ipnodes, netgroup, netmasks, networks, passwd (includes shadow information), protocols, publickey, rpc, services, automount, sendmailvars
如果要啟用ldap 服務的話,至少要將ldap 加到passwd, group and shadow 的映射中,在local lookup後面加上ldap。如以下
nsswitch.conf |
也可以通過更改nslcd.conf配置來修改 NSS lookup(查找)和LDAP database之間的mapping。
在Redfish AccountService的schema中,可以看到LDAP有兩個property: GroupNameAttribute
和 GroupsAttribute如下:
"GroupNameAttribute": {
"description": "The attribute name that contains the LDAP group name entry.",
"longDescription": "This property shall contain the attribute name that contains the LDAP group name.",
"readonly": false,
"type": [
"string",
"null"
],
"versionAdded": "v1_3_0"
},
"GroupsAttribute": {
"description": "The attribute name that contains the groups for a user on the LDAP user entry.",
"longDescription": "This property shall contain the attribute name that contains the groups for an LDAP user entry.",
"readonly": false,
"type": [
"string",
"null"
],
"versionAdded": "v1_3_0"
}
這什麼意思呢? 因為在pam中識別user都是透過uid (user id), group 是透過 gid(group id),那我們也能設定不同的識別方式,就是透過MAP
如以下當在比對 uid (&(objectClass=posixAccount)(uidNumber=%d))的時候,uid就會自動map成sAccountName,那這兩個property是可以為null的,所以沒設定的時候這兩個值是默認uid 和 gid
map passwd uid sAccountName
map passwd gidNumber primaryGroupID
nss_pam_ldap lookup 流程如下
那不負責任的總結就是"NSS可以枚舉有關服務/用戶的信息(屬於哪個組,主目錄在哪裡等)。PAM決定如何處理該信息"
最後附上obmc的nsswitch.conf : )
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。