16.2. sshd 的 PAM 組態

為了顯示 PAM 實際運作的理論,請將 sshd 的 PAM 組態當做實際範例:

範例 16.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

應用程式的一般 PAM 組態 (在此例中為 sshd) 包含四個 include 陳述式,它們參照四個模組類型的組態檔:common-authcommon-accountcommon-password 以及 common-session。這四個檔案具有每個模組類型的預設組態。藉由包括它們而不是為每個 PAM 應用程式分別呼叫每個模組,這樣如果管理員變更預設值,就會自動取得更新的 PAM 組態。在以前,當 PAM 有變更或是安裝新應用程式時,必須為所有的應用程式手動調整所有的組態檔案。現在 PAM 組態是由中央的組態檔案組成,每個服務的 PAM 組態都會自動繼承所有的變更內容。

第一個 include 檔 (common-auth) 會呼叫 auth 類型的兩個模組:pam_envpam_unix2。請參閱 範例 16.2, "auth 區段的預設組態"

範例 16.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 陳述式,在此例為 範例 16.3, "account 區段的預設組態" 中的陳述式。common-account 只包含一個模組:pam_unix2。如果 pam_unix2 傳回的結果是使用者存在,則 sshd 會收到此已成功的訊息,而且會接著處理下一個堆疊的模組 (password),如 範例 16.4, "password 區段的預設組態" 中所示。

範例 16.3. account 區段的預設組態


account required        pam_unix2.so

範例 16.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 所執行的檢查。當 accountauth 類型前面的模組是設定成會針對過期密碼發出警告時,就應該使用 password 類型的模組。

範例 16.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 模組。