PAM 高級選項究竟是如何工作的?
我一直在閱讀我可以在 PAM 上找到的所有內容(例如http://wpolllock.com/AUnix2/PAM-Help.htm),但是我仍然對高級選項應該如何精確地工作感到困惑。例如,每個參考文獻都這樣說:
Each of the four control-flag keywords (required, requisite, sufficient, and optional) have an equivalent expression in terms of the [...] syntax: required [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
我的理解是模組可以返回多種token,每個token關聯的動作在配置文件中都有描述。基於這種理解,什麼
new_authtok_reqd=ok
與所需的控制標誌有關嗎?的意義/目的是什麼
ignore=ignore ?
僅此一項:
success=ok
是我認為符合要求的行為,但確實
default=bad
意味著如果模組返回任何其他操作令牌,模組會失敗?action=value令牌success=ok是否被default=bad否決,反之亦然?哪個優先?從我讀過的任何東西都不清楚。
更一般地說,假設我有類似的東西
[success=done default=die]
如果模組返回成功和另一個令牌會發生什麼?
最後,我也找不到這個問題的答案:每個值都
ok, done, bad, die, ignore, reset, N
可以與任何動作相關聯嗎?甚至是什麼意思[default=done] ?
首先,ua2b 提供了引起我困惑的關鍵答案:
PAM 模組每次呼叫只能返回一個狀態值
由於模組只能返回一個狀態碼,因此很明顯,任何帶括號的值/操作對集合的操作都是明確的。我認為一個模組可以一次返回多個狀態碼(基於閱讀各種文件),因此我感到困惑。令人難以置信的是,我找不到任何參考資料,包括官方文件,能夠清楚地說明這一點。相反,人們會發現這樣的評論:
這對我來說聽起來像一個模組可以返回幾個狀態程式碼。只有在閱讀了 PAM 模組開發人員指南之後,我才意識到狀態程式碼作為單個整數返回,該整數映射到此處描述的可能狀態程式碼值 (是的,相同的參考!)
我的下一個問題與將所需的舊式控制標誌關鍵字等同於此方括號語法有關:
[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
這種等價性在各處重複出現,例如這裡。
事實證明,這完全是一派胡言。任何特定模組返回的狀態程式碼都可能不同,並且根據管理組類型(例如身份驗證與帳戶)再次不同。
以pam_securetty 模組為例。該模組僅提供auth類型,並有以下可能的狀態碼返回值:
PAM_SUCCESS PAM_AUTH_ERR PAM_INCOMPLETE PAM_SERVICE_ERR PAM_USER_UNKNOWN
因此,
ignore=ignore
價值/動作映射似乎是無用的,因為這個模組永遠不會返回忽略。在這種情況下,您可能需要考慮使用user_unknown=ignore
if 實際上您確實想在找不到使用者的情況下忽略結果。
PAM 模組有超過 30 個不同的返回值,這些返回值映射到整個 PAM 堆棧的通過或失敗,如配置所述。
值得注意的是,根據呼叫它的上下文(身份驗證、帳戶、密碼、會話),PAM 模組的行為可能會有所不同。
方括號中的value = action對描述了對 PAM 模組的每個可能返回值採取的操作。
通過仔細閱讀上面提到的頁面,可以找到對價值觀和行動的一個很好的解釋。
success=ok
模組返回成功,這將在整個 PAM 堆棧的評估中得到尊重,如果沒有前一個模組失敗,則考慮通過整個堆棧。new_authtok_reqd=ok
需要新的身份驗證令牌。例如,在會話上下文中,這可能會使使用者更改她/他的密碼。ignore=ignore
PAM 模組希望它的結果被忽略,所以我們忽略它。default=bad
所有其他結果使 PAM 堆棧失敗(但不要停止處理後續模組)如果模組返回成功和另一個令牌會發生什麼?
PAM 模組只返回一個值。
最後,我也找不到這個問題的答案:每個值 ok、done、bad、die、ignore、reset、N 是否可以與任何操作相關聯?甚至是什麼意思
[default=done] ?
這意味著:此處未提及的任何令牌(即每個可能的令牌)都會結束 PAM 堆棧的處理並返回到目前為止的結果。