為了顯示 PAM 實際運作的理論,請將 sshd 的 PAM 組態當做實際範例:
範例 24-1 sshd 的 PAM 組態
#%PAM-1.0 auth include common-auth auth required pam_nologin.so account include common-account password include common-password session include common-session # Enable the following line to get resmgr support for # ssh sessions (see /usr/share/doc/packages/resmgr/README.SuSE) #session optional pam_resmgr.so fake_ttyname
典型的應用程式 (本例中為 sshd) PAM 組態會包含四個 include 陳述式,它們參照四個模組類型的組態檔:common-auth、common-account、common-password 和 common-session。這四個檔案具有每個模組類型的預設組態。藉由包括它們而不是為每個 PAM 應用程式分別呼叫每個模組,這樣如果管理員變更預設值,就會自動取得更新的 PAM 組態。在以前,當 PAM 有變更或是安裝新應用程式時,必須為所有的應用程式手動調整所有的組態檔案。現在 PAM 組態是由中央的組態檔案組成,每個服務的 PAM 組態都會自動繼承所有的變更內容。
第一個 include 檔案 (common-auth) 會呼叫 auth 類型的兩個檔案:pam_env 與 pam_unix2。請參閱範例 24-2。
範例 24-2 auth 區段的預設組態
auth required pam_env.so auth required pam_unix2.so
第一個 pam_env 會載入 /etc/security/pam_env.conf 檔案,以根據此檔案的指定來設定環境變數。這可用來將 DISPLAY 變數設為正確的值,因為 pam_env 模組知道登入正在發生的位置。第一個模組 pam_unix2 會根據 /etc/passwd 與 /etc/shadow 檢查使用者的登入名稱與密碼。
在成功地呼叫 common-auth 中所指定的模組後,第三個模組會呼叫 pam_nologin,以檢查 /etc/nologin 是否存在。如果它存在,則除了 root 以外的使用者都不能登入。在處理完 auth 模組的整個堆疊後,sshd 才會收到關於登入是否成功的回應。假定堆疊的所有模組都有 required 控制旗標,則必須成功地處理完所有的模組後,sshd 才會收到成功結果的訊息。如果其中一個模組沒有成功,仍然會處理整個模組堆疊,並且會在此時通知 sshd 失敗的結果。
只要已成功處理 auth 類型的所有模組,就會處理另一個 include 陳述式,在此例為 範例 24-3 中的陳述式。common-account 只包含一個模組:pam_unix2。如果 pam_unix2 傳回的結果是使用者存在,則 sshd 會收到此已成功的訊息,而且會接著處理下一個堆疊的模組 (password),如 範例 24-4 中所示。
範例 24-3 account 區段的預設組態
account required pam_unix2.so
範例 24-4 password 區段的預設組態
password required pam_pwcheck.so nullok password required pam_unix2.so nullok use_first_pass use_authtok #password required pam_make.so /var/yp
此外,sshd 的 PAM 組態只有一個 include 陳述式參照 password 模組的預設組態,它是在 common-password 中。不論應用程式何時要求變更驗證權杖,這些模組皆必須順利完成 (控制旗標 required)。變更密碼或另一個驗證權杖時,必需做安全性檢查。這是以 pam_pwcheck 模組來達成。之後使用的 pam_unix2 模組會沿用任何 pam_pwcheck 的舊密碼或新密碼,因此使用者不必再進行驗證。這也使人無法規避 pam_pwcheck 所執行的檢查。當 account 或 auth 類型前面的模組是設定成會針對過期密碼發出警告時,就應該使用 password 類型的模組。
範例 24-5 session 區段的預設組態
session required pam_limits.so session required pam_unix2.so
最後一個步驟會呼叫與 common-session 檔案繫結在一起的 session 類型的模組,以便根據有問題的使用者之設定值來設定工作階段。雖然會已再次處理 pam_unix2,但是由於在此模組 pam_unix2.conf 的個別組態中指定了 none 選項,所以不會有實際的結果。pam_limits 模組會載入 /etc/security/limits.conf 檔案,它可以定義某些系統資源的使用限制。當使用者登出時,會第二次呼叫 session 模組。