跳轉到內容

LPI Linux 認證/PAM 身份驗證

來自 Wikibooks,開放世界中的開放書籍

詳細目標 (210.2)

[編輯 | 編輯原始碼]

(LPIC-2 版本 4.5)


權重 3


描述: 候選人應該能夠配置 PAM 以支援使用各種可用方法進行身份驗證。 這包括基本的 SSSD 功能。


關鍵知識領域

  • PAM 配置檔案、術語和實用程式。
  • passwd 和 shadow 密碼。
  • 使用 sssd 進行 LDAP 身份驗證。


術語和實用程式

  • /etc/pam.d
  • pam.conf
  • nsswitch.conf
  • pam_unix, pam_cracklib, pam_limits, pam_listfile, pam_sss
  • sssd.conf

== PAM 身份驗證 == 測試

PAM(可插拔身份驗證模組)是一種靈活的機制,用於對使用者進行身份驗證。

從 UNIX 的誕生之日起,對使用者的身份驗證就透過使用者輸入密碼並系統檢查輸入的密碼是否與儲存在 /etc/passwd 中的加密官方密碼相符來實現。 想法是,只有當用戶能夠正確輸入他們的秘密密碼時,他們才是真正的使用者。

那是最初。 從那時起,許多新的使用者身份驗證方式變得流行起來。 包括對 /etc/passwd 檔案的更復雜的替換,以及硬體裝置智慧卡等等。 問題是,每次開發新的身份驗證方案時,都需要重新編寫所有必要的程式(login、ftpd 等)以支援它。

PAM 提供了一種開發獨立於身份驗證方案的程式的方法。 這些程式需要“身份驗證模組”在執行時附加到它們才能工作。 要附加哪個身份驗證模組取決於本地系統設定,由本地系統管理員決定。

PAM 身份驗證

Linux-PAM(用於 Linux 的可插拔身份驗證模組)是一套共享庫,使本地系統管理員能夠選擇應用程式如何對使用者進行身份驗證。

換句話說,無需(重寫和)重新編譯 PAM 感知應用程式,就可以在它使用的身份驗證機制之間切換。 事實上,可以完全升級本地身份驗證系統,而無需觸碰應用程式本身。

從歷史上看,需要對給定使用者進行身份驗證的應用程式必須編譯以使用特定的身份驗證機制。 例如,在傳統的 UN*X 系統中,使用者的身份由使用者輸入正確的密碼進行驗證。 此密碼在加上兩個字元的salt後,會被加密(使用 crypt(3))。 然後,如果此加密密碼與系統密碼資料庫(/etc/passwd 檔案)中使用者條目的第二個欄位相同,則對使用者進行身份驗證。 在此類系統上,大多數如果不是全部的特權都是根據這種單一身份驗證方案授予的。 特權以個人使用者識別符號 (uid) 和對各種組的成員身份的形式出現。 根據使用者的個人身份和組身份提供服務和應用程式。 傳統上,組成員身份是根據 /etc/group 檔案中的條目分配的。

PAM 身份驗證

不幸的是,計算機速度的提高和基於網路的計算的廣泛引入,使得曾經安全的身份驗證機制(如這種機制)容易受到攻擊。 鑑於此類現實,新的身份驗證方法不斷湧現。 Linux-PAM 專案的目的是將特權授予軟體的開發與安全且適當的身份驗證方案的開發分離。 這是透過提供一個函式庫來實現的,應用程式可以使用該函式庫來請求對使用者進行身份驗證。 此 PAM 庫在本地使用系統檔案 /etc/pam.conf(或位於 /etc/pam.d/ 中的一系列配置檔案)進行配置,以透過本地可用的身份驗證模組對使用者請求進行身份驗證。 模組本身通常位於 /lib/security 目錄中,並採用動態載入的可執行檔案形式(參見 dlopen(3))。

PAM 身份驗證

概述

對於新手,我們首先考慮一個例子。 我們拿一個向用戶提供服務的應用程式; login 就是這樣的一個程式。 login 做兩件事,它首先確定請求的使用者是他們聲稱的那個人,然後向他們提供請求的服務:在 login 的情況下,服務是使用使用者身份執行的命令 shell(bash、tcsh、zsh 等)。

傳統上,前一個步驟是透過 login 應用程式提示使用者輸入密碼,然後驗證它是否與系統上的密碼一致; 因此驗證就係統而言使用者是他們聲稱的那個人。 這是委託給 Linux-PAM 的任務。 從應用程式程式設計師(在本例中是編寫 login 應用程式的人)的角度來看,Linux-PAM 處理了此身份驗證任務 - 驗證使用者的身份。

PAM 身份驗證

Linux-PAM 的靈活性在於,您可以(系統管理員)自由指定要使用的身份驗證方案。 您有權為 Linux 系統上的任何/所有 PAM 感知應用程式設定方案。 也就是說,您可以從簡單的信任(pam_permit)等簡單方案到視網膜掃描、語音指紋和一次性密碼相結合等複雜方案進行身份驗證!

為了說明您面臨的靈活性,請考慮以下情況:一位系統管理員(家長)希望提高其使用者(孩子)的數學能力。 他們可以配置使用者最喜歡的射擊遊戲(當然,它支援 PAM)來驗證他們的身份,方法是要求他們提供兩個小於 12 的隨機數的乘積。 很明顯,如果這款遊戲還不錯,他們很快就會學會乘法表。 隨著他們的成長,身份驗證可以升級到包括(長)除法!

PAM 身份驗證

Linux-PAM 處理四種不同的(管理)任務型別。 這些是:身份驗證管理; 帳戶管理; 會話管理; 和密碼管理。首選管理方案與應用程式行為之間的關聯是透過相關 Linux-PAM 配置檔案中的條目進行的。 管理功能由配置檔案中指定的模組執行。

Linux-PAM 庫會查詢 PAM 配置檔案的內容並載入適合應用程式的模組。 這些模組屬於四種管理組之一,並按它們在配置檔案中出現的順序堆疊。 這些模組在被 Linux-PAM 呼叫時,會為應用程式執行各種身份驗證任務。 透過使用應用程式提供的對話函式,可以交換使用者需要或提供的文字資訊。

PAM 身份驗證

Linux-PAM 旨在為系統管理員提供很大的靈活性來配置其系統的特權授予應用程式。 由 Linux-PAM 控制的系統安全性的這些方面的本地配置包含在兩個地方之一:單個系統檔案 /etc/pam.conf; 或 /etc/pam.d/ 目錄。

此檔案中的 Linux-PAM 特定標記不區分大小寫。 但是,模組路徑區分大小寫,因為它們指示檔名稱並反映典型 Linux 檔案系統的區分大小寫性。 任何給定模組的引數的區分大小寫性由每個模組依次定義。 除了下面描述的行之外,還提供了兩個特殊字元以方便系統管理員:註釋以“#”開頭,一直延伸到下一行結束; 此外,模組規範行可以用轉義換行符“\”擴充套件。

/etc/pam.conf 檔案的通用配置行具有以下形式: : service-name module-type control-flag module-path args

PAM 身份驗證

下面,我們將解釋每個標記的含義。 配置 Linux-PAM 的第二種(也是最近採用的)方法是透過 /etc/pam.d/ 目錄的內容。 在我們解釋了上述標記的含義之後,我們將描述這種方法。


服務名稱

與此條目關聯的服務的名稱。 通常,服務名稱是給定應用程式的傳統名稱。 例如,“ftpd”、“rlogind”和“su”等。 有一個特殊的服務名稱,保留用於定義預設身份驗證機制。 它名為“OTHER”,可以使用小寫或大寫字元指定。 請注意,當為命名服務指定模組時,將忽略“OTHER”條目。

PAM 身份驗證模組型別 (當前)四種模組型別之一。 四種類型如下:

auth; 此模組型別提供了對使用者進行身份驗證的兩個方面。 首先,它透過指示應用程式提示使用者輸入密碼或其他識別方式來確定使用者是他們聲稱的那個人。 其次,該模組可以透過其憑據授予屬性來授予組成員身份(獨立於上面討論的 /etc/groups 檔案)或其他特權。

account; 此模組執行非身份驗證的帳戶管理。 它通常用於根據時間、當前可用的系統資源(最大使用者數)或申請使用者的地理位置(僅在控制檯上登入“root”)來限制/允許訪問服務。

session; 主要是,此模組與在使用者可以獲得服務之前/之後需要執行的操作相關聯。 這些操作包括記錄有關與使用者開啟/關閉某些資料交換的資訊,掛載目錄等。

password; 此最後一個模組型別是更新與使用者關聯的身份驗證令牌所必需的。 通常,每個“挑戰/響應”基於身份驗證 (auth) 模組型別有一個模組。 PAM 身份驗證

控制標誌

控制標誌用於指示 PAM 庫將如何對與其關聯的模組的成功或失敗做出反應。 由於模組可以堆疊(同一型別的模組按順序執行,一個接一個),因此控制標誌決定每個模組的相對重要性。 應用程式不會意識到 `/etc/pam.conf' 檔案中列出的各個模組的成功或失敗。 相反,它從 Linux-PAM 庫接收一個彙總的成功或失敗響應。 這些模組的執行順序是 /etc/pam.conf 檔案中條目的順序; 較早的條目在較晚的條目之前執行。 從 Linux-PAM v0.60 開始,此控制標誌可以用兩種語法之一定義。

控制標誌的更簡單(也是歷史上的)語法是一個單獨的關鍵字,用於指示與特定模組的成功或失敗相關的嚴重性。 有四個這樣的關鍵字:required、requisite、sufficient 和 optional。

PAM 身份驗證

控制標誌

Linux-PAM 庫以以下方式解釋這些關鍵字:required;這表示模組的成功對於模組型別設施的成功是必需的。此模組的失敗在所有剩餘的模組(相同模組型別)都執行之前不會對使用者顯現。

requisite;類似於 required,但是,如果這樣的模組返回失敗,則控制權直接返回給應用程式。返回值與第一個失敗的 required 或 requisite 模組相關聯。請注意,此標誌可用於防止使用者有機會在不安全的媒介上輸入密碼。可以想象,這種行為可能會通知攻擊者系統上的有效帳戶。應權衡這種可能性與在敵對環境中公開敏感密碼的並非不重要的擔憂。

sufficient;此模組的成功被認為“足以”讓 Linux-PAM 庫相信此模組型別已成功完成其目的。如果之前沒有 required 模組失敗,則不會呼叫更多此型別的“堆疊”模組。(請注意,在這種情況下,不會呼叫後續的 required 模組。)此模組的失敗不被認為是滿足應用程式已成功完成此模組型別的致命錯誤。

Optional;顧名思義,此控制標誌將模組標記為對使用者應用程式服務成功或失敗並不重要。通常,Linux-PAM 在確定模組堆疊是否成功或失敗時會忽略此類模組。但是,如果之前或後續堆疊模組沒有明確的成功或失敗,則此模組將決定對應用程式的響應的性質。後一種情況的一個示例是,當其他模組返回類似 PAM_IGNORE 的內容時。PAM 身份驗證

控制標誌 

更詳細(較新)的語法更加具體,併為管理員提供了對使用者身份驗證方式的很大控制。這種形式的控制標誌用方括號分隔,幷包含一系列 value=action 標記

 [value1=action1 value2=action2 ...]

這裡,valueI 是以下返回值之一:success;open_err;symbol_err;service_err;system_err;buf_err;perm_denied;auth_err;cred_insufficient;authinfo_unavail;user_unknown;maxtries;new_authtok_reqd;acct_expired;session_err;cred_unavail;cred_expired;cred_err;no_module_data;conv_err;authtok_err;authtok_recover_err;authtok_lock_busy;authtok_disable_aging;try_again;ignore;abort;authtok_expired;module_unknown;bad_item;和 default。其中最後一個(default)可用於為未明確定義的返回值設定操作。

actionI 可以是正整數或以下標記之一:ignore;ok;done;bad;die;和 reset。當將正整數 J 指定為操作時,它可以用於指示將跳過當前模組型別的下一個 J 個模組。透過這種方式,管理員可以開發一個具有多個不同執行路徑的相當複雜的模組堆疊。可以根據各個模組的反應來確定選擇哪條路徑。

PAM 身份驗證

ignore - 當與一組模組一起使用時,模組的返回狀態不會影響應用程式獲得的返回程式碼。

bad - 此操作表示應將返回程式碼視為模組失敗的指示。如果此模組是堆疊中第一個失敗的模組,則其狀態值將用於整個堆疊。

die - 等同於 bad,並具有終止模組堆疊並立即將 PAM 返回給應用程式的副作用。

ok - 這告訴 PAM 管理員認為此返回程式碼應直接影響整個模組堆疊的返回程式碼。換句話說,如果堆疊的先前狀態會導致返回 PAM_SUCCESS,則模組的返回程式碼將覆蓋此值。請注意,如果堆疊的先前狀態包含某些表示模組失敗的值,則此“ok”值將不會用於覆蓋該值。

done - 等同於 ok,並具有終止模組堆疊並立即將 PAM 返回給應用程式的副作用。

reset - 清除模組堆疊狀態的所有記憶體,並從下一個堆疊模組開始重新開始。PAM 身份驗證四個關鍵字中的每一個:required;requisite;sufficient;和 optional,在 [...] 語法方面都有等效的表示式。它們如下

required 等同於 [success=ok new_authtok_reqd=ok ignore=ignore default=bad]

requisite 等同於 [success=ok new_authtok_reqd=ok ignore=ignore default=die]

sufficient 等同於 [success=done new_authtok_reqd=done default=ignore]

optional 等同於 [success=ok new_authtok_reqd=ok default=ignore]

為了瞭解這種新語法的強大功能,這裡提供了一些您可以使用它的示例。在 Linux-PAM-0.63 中,引入了客戶端外掛代理的概念。這使 PAM 能夠使用客戶端/伺服器應用程式固有的傳輸協議支援機器到機器身份驗證。使用 [ ... value=action ... ] 控制語法,應用程式可以被配置為支援與相容客戶端的二進位制提示,但對於較舊的傳統應用程式,可以優雅地轉換為備用身份驗證模式。

PAM 身份驗證

Module-path

可動態載入的物件檔案的路徑名;可插拔模組本身。如果模組路徑的第一個字元是“/”,則假定它是一個完整路徑。如果不是這種情況,則給定的模組路徑將附加到預設模組路徑:/lib/security

Args

引數是呼叫模組時傳遞給模組的一系列標記。非常類似於典型 Linux shell 命令的引數。通常,有效引數是可選的,並且特定於任何給定的模組。無效引數被模組忽略,但是,當遇到無效引數時,模組需要向 syslog(3) 寫入錯誤。有關通用選項的列表,請參見下一節。

在(一個或多個)配置檔案中的任何未正確格式化的行通常傾向於(以謹慎為準)使身份驗證過程失敗。相應的錯誤將使用對 syslog(3) 的呼叫寫入系統日誌檔案。

PAM 身份驗證

基於目錄的配置

從版本 0.56 開始,比單個配置檔案更靈活,可以透過 /etc/pam.d/ 目錄的內容配置 libpam。在這種情況下,目錄中包含的檔案每個檔案都具有一個檔名,該檔名等於服務名稱(小寫):它是命名服務的個人配置檔案。

Linux-PAM 可以編譯為兩種模式之一。首選模式使用 /etc/pam.d/ 或 /etc/pam.conf 配置,但不能同時使用兩者。也就是說,如果存在 /etc/pam.d/ 目錄,則 libpam 僅使用此目錄中包含的檔案。但是,如果不存在 /etc/pam.d/ 目錄,則使用 /etc/pam.conf 檔案(這可能是您首選發行版使用的模式)。另一種模式是按順序使用 /etc/pam.d/ 和 /etc/pam.conf。在此模式下,/etc/pam.d/ 中的條目將覆蓋 /etc/pam.conf 中的條目。/etc/pam.d/ 中每個檔案的語法類似於 /etc/pam.conf 檔案的語法,由以下形式的行組成

module-type control-flag module-path arguments 唯一的區別是服務名稱不存在。服務名稱當然是給定配置檔案的名稱。例如,/etc/pam.d/login 包含登入服務的配置。

PAM 身份驗證

這種配置方法比單檔案方法有很多優點。我們在此列出它們以幫助讀者決定採用哪種方案

錯誤配置應用程式的可能性較低。手動編輯配置檔案時,需要輸入的欄位少一個。

更易於維護。可以重新配置一個應用程式,而不會干擾系統上的其他應用程式。

可以將不同服務的配置檔案符號連結到單個檔案。這使得更容易在不同的應用程式之間保持一致的訪問系統策略。(需要注意的是,為了節省空間,也可以將多個配置檔案硬連結在一起。但是,在管理此安排時要謹慎,因為編輯硬連結檔案可能會破壞連結。)

配置檔案解析可能更快。當服務繫結到其模組時,僅解析相關的條目。可以使用檔案系統的檔案保護限制對各個 Linux-PAM 配置檔案的讀取訪問。

包管理變得更簡單。每次安裝新應用程式時,都可以使用 /etc/pam.d/xxxxxx 檔案作為伴隨檔案。

PAM 身份驗證

以下是任何模組都可能理解的可選引數。引數(包括這些引數)通常是可選的。

Debug : 使用 syslog(3) 呼叫將除錯資訊記錄到系統日誌檔案。

no_warn : Instruct module to not give warning messages to the application. 
use_first_pass : The module should not prompt the user for a password. Instead, it should obtain the previously typed password (from the preceding auth module), and use that. If that doesn't work, then the user will not be authenticated. (This option is intended for auth and password modules only). 
try_first_pass : The module should attempt authentication with the previously typed password (from the preceding auth module). If that doesn't work, then the user is prompted for a password. (This option is intended for auth modules only). 
use_mapped_pass : This argument is not currently supported by any of the modules in the Linux-PAM distribution because of possible consequences associated with U.S. encryption exporting restrictions. Within the U.S., module developers are, of course, free to implement it (as are developers in other countries).

expose_account : 通常,洩露有關使用者帳戶的一些資訊對於模組來說不是安全的策略。有時,使用者名稱或主目錄或首選 shell 等資訊可用於攻擊使用者的帳戶。但是,在某些情況下,這種資訊不被視為威脅:在安全的環境中,在要求使用者輸入密碼時顯示使用者的全名也可以稱為“友好”。expose_account 引數是一個標準模組引數,用於鼓勵模組在本地管理員認為合適的情況下,對帳戶資訊少一些謹慎。

PAM 身份驗證

示例配置檔案條目

預設策略 : 如果要將系統視為安全系統,它最好具有一個相當安全的“OTHER”條目。以下是偏執設定(這是一個不錯的起點!)

  1. default; 拒絕訪問

OTHER auth required pam_deny.so OTHER account required pam_deny.so OTHER password required pam_deny.so OTHER session required pam_deny.so

雖然從根本上來說這是一個安全的預設值,但這對於錯誤配置的系統來說並不友好。例如,如果檔案的其餘部分寫得不好,這樣的系統很容易導致所有使用者被鎖定。pam_deny 模組並不十分複雜。例如,它在被呼叫時不會記錄任何資訊,因此,除非系統的使用者在無法執行服務應用程式時聯絡管理員,否則管理員可能很長時間都不知道他的系統配置錯誤。

PAM 身份驗證

在上述示例中的那些行之前新增以下行將為管理員提供適當的警告。

  1. default; 醒醒!此應用程式未配置

OTHER auth required pam_warn.so OTHER password required pam_warn.so

擁有兩個 OTHER auth 行是堆疊的示例。在使用 /etc/pam.d/ 配置的系統上,可以使用以下檔案實現相應的預設設定

  1. 預設配置:/etc/pam.d/other

auth required pam_warn.so auth required pam_deny.so account required pam_deny.so password required pam_warn.so password required pam_deny.so session required pam_deny.so

PAM 身份驗證

在配置較低的安全級別,系統管理員希望對 Linux-PAM 的強大功能保持無知的情況下,以下行(位於 /etc/pam.conf 中)的選擇很可能模擬出傳統熟悉的 Linux 設定。

  1. default; 標準 UN*X 訪問

OTHER auth required pam_unix.so OTHER account required pam_unix.so OTHER password required pam_unix.so OTHER session required pam_unix.so


PAM 認證關鍵詞、檔案和實用程式:/etc/pam.d /etc/pam.conf /lib/libpam.so.*


華夏公益教科書