可插拔驗證模組

最後更新: 2025-08-23 13:11:15 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

Linux-PAM 讓應用程式將驗證原則委派給由管理員控制的模組。應用程式擁有使用者互動與其權限邊界;PAM 擁有交易控制代碼、載入已設定的堆疊,並合併模組結果。因此,應用程式可以使用本機密碼、智慧卡、目錄服務、多重要素驗證或帳戶限制,而不必內嵌這些機制。

交易角色 #

PAM 交易有五種角色:

  • 應用程式開始並結束交易;
  • 服務是提供給 pam_start 的原則名稱,通常為 login、sshd 或 sudo;
  • 管理群組選取作業:auth、account、session 或 password;
  • 模組是實作一個或多個管理群組進入點的共用物件;
  • 對話函式讓模組透過應用程式要求提示、資訊訊息與回應。

應用程式以 pam_start(service, user, &conversation, &pamh) 開始。pam_handle_t 是不透明型別,屬於單一交易;另一個並行交易需要建立另一個控制代碼。典型授權路徑會呼叫 pam_authenticate,可選擇呼叫 pam_setcred,接著呼叫 pam_acct_mgmt;授予工作階段前呼叫 pam_open_session,拆除工作階段時呼叫 pam_close_session。密碼變更使用 pam_chauthtok。無論採用哪條路徑,應用程式都會呼叫 pam_end(pamh, last_status),該呼叫會使控制代碼失效並執行已註冊的清理回呼。

c
pam_handle_t *pamh = NULL;
int status = pam_start("example", user, &conversation, &pamh);
if (status == PAM_SUCCESS)
    status = pam_authenticate(pamh, 0);
if (status == PAM_SUCCESS)
    status = pam_acct_mgmt(pamh, 0);
if (pamh != NULL)
    pam_end(pamh, status);

auth 建立識別,並可能建立認證資料。account 檢查目前是否允許存取,包括到期與原則限制。session 執行生命週期工作,例如稽核設定、限制或掛載。password 更新驗證權杖。沒有適當的帳戶與工作階段呼叫,驗證成功並不是完整的登入流程。

原則檔案與堆疊 #

當目錄存在時,Linux-PAM 會讀取 /etc/pam.d/SERVICE;否則使用 /etc/pam.conf。/etc/pam.d 原則會覆寫 /usr/lib/pam.d 中同名的供應商檔案。pam.conf 規則包含服務欄位,而 pam.d 下的檔案則從檔名取得服務名稱:

text
service  type     control     module-path            arguments
example  auth     required    pam_unix.so            try_first_pass

四個簡單控制項定義結果流程:

  • required 記錄失敗但評估堆疊的其餘部分;
  • requisite 立即失敗;
  • sufficient 在先前沒有必要模組失敗時立即成功,而其失敗會被忽略;
  • optional 只有在它是堆疊中唯一有效模組時才有影響。

延伸控制項(例如 [success=1 default=bad])會將特定的 PAM_* 回傳值對應至包括 ignore、bad、die、ok、done、reset 與數字跳躍的動作。它們不是裝飾:變更跳躍或預設動作,可能繞過某個因素,或將服務中斷變成授權。

include 會從另一個原則檔案插入所要求管理型別的規則。substack 也會評估另一個檔案,但 done、die 與跳躍會被限制在該子堆疊內。模組引數依模組而定;請保留引號,不要假設某模組接受的選項對另一模組也有意義。

安全地撰寫模組 #

模組會實作群組特定的符號,例如 pam_sm_authenticate、pam_sm_acct_mgmt、pam_sm_open_session 與 pam_sm_chauthtok。使用 pam_get_user 取得使用者,使用 pam_get_authtok 取得驗證權杖,而不要建立競爭的提示。透過 pam_set_data 儲存交易範圍狀態,提供清理回呼,並透過 pam_syslog 回報診斷資訊,且不要記錄密碼、權杖或由祕密衍生的資料。

回傳代表失敗的已文件說明 PAM_* 結果。不要將目錄不可用、密碼無效與內部錯誤意外合併為成功。模組程式碼會在安全敏感且有時具備特權的程序中執行,因此必須驗證所有外部輸入、避免不安全的環境假設、使用有界的記憶體處理,並讓清理具備冪等性。

先使用專用服務名稱與帳戶測試原則變更。保留現有的 root 主控台或復原路徑,並由已知良好的原則進行驗證;安裝前驗證語法,並測試成功及每一條預期的失敗路徑。沒有復原路徑時,編輯遠端管理工作階段所使用的原則,可能會鎖住所有管理員。

Linux-PAM 應用程式手冊,尤其是 pam_start(3)、pam_end(3) 與 pam.conf(5),是 Linux-PAM 行為的權威介面。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)