OpenBMC: User Management

前言

此系列文是參考OpenBMC官方Youtube頻道的學習筆記,
相關投影片可以由OpenBMC GitHub的wiki頁面取得。

具備知識

這邊假設聽眾具備基礎的BMC(包含IPMI、Redfish等)知識。
其中D-Bus在OpenBMC是重要的IPC溝通方式,也需要有點基本認識。

User Management設計概念

OpenBMC希望設計一個通用的使用者管理,而非以往大多以IPMI為中心的”Interface Specific”作法,即:任何服務(WebUI、Redfish等)都與IPMI共用使用者。

為了達到此目的,OpenBMC將User Management獨立為單一的daemon,並建立通用的D-Bus API提供操作,
且只有一個API可以去取得local或remote的使用者資訊。

另外,考量易用性與安全性,OpenBMC使用PAM modules而非單純的D-Bus API來進行驗證(登入)與修改密碼的操作。

OpenBMC也支援RMCP+登入。

總之,在設計概念上,基本的username、group以及privileges都是由這個通用的使用者管理來進行維護,
其餘的設定則交由各個應用程式自行維護。

預設的Groups與Privilege Roles

這邊有幾個預設的groups:ssh、ipmi、redfish、web。
若要讓使用者使用這些功能就必須將user加入這些群組。

此外還有一些預設的privilege roles:

架構概念圖

主要使用者管理由Common User Manager(Phosphor-user-manager)負責,其他應用程式(如:Web Service / Redfish、IPMI等)則透過D-Bus的API呼叫來取得或建立使用者。

應用程式可以透過監控D-Bus上的”interfacesAdded”、”interfacesRemoved”、與”PropertiesChanged”這幾個signal來cache使用者資訊。

主要元件

整個User Management包含兩個主要的元件:

1. Phosphor-user-manager

Unix風格的使用者管理器,所謂Unix風格就是利用OS提供的操作(例如:adduser、deluser等)進行使用者管理,其使用者資訊的設定檔會被儲存於目錄/etc/password與/etc/shadow中。

支援LDAP的配置以及privilege映射。

相關的D-Bus interface定義在位置:/xyz/openbmc_project/user

(註:問答有提到目前的D-Bus API實作不穩定,所以如果要透過API實作自己的management則需自行承擔風險)

這邊簡單介紹phosphor-user-manage的interface:

預設配置:no lockout, minlenght(8), no timeout, rememberOldPassword(0)

2. Stacked PAM

主要用來管理使用者密碼,使用者的登入(驗證)與密碼修改的操作都會透過Stacked PAM進行。
其中,remote(LDAP) user會呼叫pam_autoenticate()與pam_chauthtok()兩個API來進行驗證與修改密碼的操作。

密碼使用one-way hash(SHA512),不過由於IPMI使用設定不同,因此在IPMI group中的使用者密碼會另外加密保存(Cipher:AES-128-CBC, Digest-SHA256 whth HMAC)。

在Stacked PAM中有三個主要的modules:

  1. pam_tally2.so
    主要用來handle登入失敗的狀況。

  2. pam_unix.so
    主要用來進行local user的驗證。

  3. nss_pam_ldap.so
    如果loacal的驗證失敗,則會嘗試LDAP的登入,
    此module就是用來處理remote的驗證。

問:有沒有API提供設定優先使用LDAP驗證,省去local驗證的時間?
答:的確如果有相同使用者名稱分別在LDAP與local的狀況下會有這個需求,
不過目前沒有API可以設定,但可以透過configuration設定。

在更新密碼的操作則會包含下列流程:

  1. 使用pam_chauthtok()來設定或修改密碼。
  2. pam_cracklib會檢查密碼長度是否符合要求。
  3. pam_pwhistory檢查密碼歷史紀錄是否符合。
  4. pam_unit會計算加密(SHA)的密碼。
  5. 如果user屬於ipmi group,此時會在pam_ipmisave處理;
    若原先不屬於ipmi group,經過設定之後增加進入ipmi group時也會在這邊進行處理。

設定檔

Authentication PAM Configuration: /etc/pam.d/common-auth
這個檔案可以改變auth的順序

Password Update PAM Configuration: /etc/pam.d/common-password

驗證流程

整個流程如下圖所示(不包含IPMI)

支援的方法

整理驗證與介面之間的支援度,參考下表:

其他補充

在local.conf.sample設定檔中可以設定預設密碼


OpenBMC: User Management
https://chris-suo.github.io/ChrisComplete/2022/09/24/OpenBMC-User-Management/
Author
Chris Suo
Posted on
September 24, 2022
Licensed under