2021年5月28日 星期五

openBMC LDAP 設定(一) - nss-pam-ldapd

obmc的user managment 可以參考官方文件 (https://github.com/openbmc/docs/blob/master/architecture/user-management.md

openbmc ldap設定和驗證,能從以下幾個方向來看 
先了解 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


在接下來這邊會分別介紹 nslcd的設定檔(nslcd.conf), pam modulenss 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)


redfish 會將資料透過Dbus 由phosphor-ldap-conf  來更新nslcd.conf





💣PAM(Pluggable Authentication Modules)


在Linux中,我們常常需要用不同的機制來判斷帳號密碼,例如本地帳號密碼,LDAP,指紋讀取機等,越來越多元的帳號認證方式,就出現了PAM,可插拔身分驗證模塊,他可以透過使用配置文件而不是更改應用程序代碼來切換安全應用程序的身份驗證方法。例如密碼輸入錯誤幾次就要鎖幾分鐘,幾個月要換一次密碼,能不能透過LDAP登入,這些設定都記錄在pam.d/* 或 pam.conf中,並且透過不同的shared library(.so)來實現

pam shared library(.so) 在obmc的位置是存放在"/lib/security/*"

pam config file位在/etc/pam.d/*

如果我們要同時使用LDAP和local user 都能登入的話,就需要在/etc/pam.d 下編輯相關文件。在任何有呼叫pam_unix的地方,也需要呼叫pam_ldap

以webserver 為例

 
這邊include common-auth,從common-auth中可以看到驗證帳號的步驟分別呼叫了 pam_tally2.so, pam_unix.so and pam_ldap.so,(unix後也呼叫了ldap)


user-management.md中有分別說明三個模塊的目的為何




而有了以上設定,webserver就能同時使用local user 或 ldap user 登入了,流程如下圖,LDAP server的相關資料會存放在nslcd.conf中





💣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 : )



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。