2012年7月7日 星期六

簡介PAM驗證模組 (Introduction to Pluggable Authentication Modules)

插入式驗證模組 (Pluggable authentication module)

PAM 模組最早是由Sun Mocrosystems於1995年提出,整合了許多低階的驗證計劃到一個高階的應用程式介面(API),以便讓需要驗證的程式只需要透過高階的程式介面即可使用各種驗證方法,而無需實作低階的驗證計劃。因此這些PAM-aware應用程式可以轉送程式的驗證請求至適當的PAM模組來處理,最後再將驗證處理後的結果回應給應用程式即可,所以Linux環境下的管理員可以利用PAM組來決定那些應用程式要採用何種方式來進行驗證與檢查工作,這大幅提升了Linux系統的驗證能力、彈性及安全性。

PAM模組的優點在於:

  • 對程式撰寫者而言,撰寫需要驗證的應用程式並不需要變更和新增既有程式碼並重新編譯,就可以新增額外的驗證機制與限制。
  • 對系統管理而言,只需要編輯文字組態檔就可以變更某個PAM-aware程式的驗證機制與要求。
  • PAM的模組化設計讓Linux系統下的驗證變得極具彈性,幾乎讓支援PAM的應用程式可以使用任何您所希望使用的驗證機制。

目前的PAM 模組不僅能夠提供各種驗證的服務,還能夠支援複雜的帳號與密碼的管理、並且記錄使用者於系統上的活動、限制使用者資源使用及服務的存取等。

下圖為PAM架構圖,PAM-aware應用程式透過管理員設定適當的組態檔(etc/pam.d)以呼叫一連串的PAM程式庫來執行必要的驗證與限制工作,組態檔中可以指定多個 PAM 模組,而這些模組將依照組態案檔中所設定的順序依序堆疊起來 ﹔然後按照堆疊的模組順序一一執行驗證或檢查工作,其實PAM名稱中的插入式(Pluggable)正意涵著可以輕易得新增或移除驗證堆疊內的模組。

pam_arch

由上圖可知,並非所有應用程式均能夠透過PAM模組來實現彈性的驗證機制,而是程式本身需要撰寫並編譯成PAM認知的應用程式才行,您大抵上可檢查 /etc/pam.d目錄下的組態檔就可查知系統上目前有那些PAM-aware應用程式,或是更精準的說,利用ldd工具即可得知某應用程式是否為PAM-aware程式而能夠利用PAM來執行驗證工作。例如下圖可看出 sshd與vsftpd二個著名的網路服務均是支援PAM模組的應用程式(因使用到libpam.so共用程式庫)。

pam_ldd1

PAM 模組運作相關檔案

應用程式透過PAM模組執行驗證及各項檢查工作,所牽涉到的相關檔案如下:

  • /lib/security 或 /lib64/security:這是預設PAM模組程式庫的位置,根據您的系統架構可能安裝在 /lib或/lib64底下。
  • /etc/pam.d:這是服務程式使用PAM模組的組態檔位置,用以指出每個使用PAM的服務所需要應用的PAM模組以及一旦驗證檢查成功或失敗後的行動。
  • /etc/security:存放特定PAM模組所使用的通用設定檔

常用的PAM模組

PAM提供了許多驗證模組,不同的驗證模組可支援不同的驗證確認或檢查方法,有些在UNIX/Linux環境已沿用許久,有些仍持續發展中,下圖顯示了作者的CentOS 6.2系統內的所有PAM模組:
pammoduler
下表則列出了一些較重要且常用的PAM模組並說明其用途:
PAM 模組 用途說明
pam_access 利用 /etc/security/access.conf檔案並依據帳號、IP位址、網域名稱、網路卡號或終端機等方式來限制使用者或群組登入
pam_cracklib 可用來規範及檢查密碼的字元組成與長度,做為密碼檢查器以避免使用者選擇簡單、容易猜測的密碼
pam_deny pam_deny模組用來拒絕所有存取,主要是用來定義系統存取的預設原則(Default Policy)
pam_env 用以建立使用者登入的預設環境,例如可定義使用者系統環境變數PATH需包含那個目錄,pam_env模組使用 /etc/security/pam_env.conf 建立變數。
pam_limits 模組透過組態檔  /etc/security/limits.conf to來限制使用者所使用的資源,包括限制允許的最大檔案大小、最大允許開啟的檔案、CPU時間、處理程序數量、最大允許登入次數。
pam_mail 檢查使用者的郵件目錄是否有新郵件,通常用於使用者登入系統
pam_mkhomedir 當使用者第一次登入系統時,若沒有家目錄存在可利用pam_mkhomedir模組來自動建立家目錄,本模組也可以確保/etc/skel目錄下的檔案被拷貝到家目錄,這個模組在使用者經由NIS或LDAP的網路環境下驗證時特別有用,可集中使用者家目錄於NFS目錄下。
pam_nologin 當/etc/nologin檔案存在時,除了root之外,沒有任何人可以登入,適用於管理員維護系統時使用。
pam_permit 這是最不安全的PAM模組,不論誰登入,它永遠允許存取,通常只使用在測試用途上。
pam_pwcheck 當使用者變更密碼時,此模組會執行額外的檢查工作,包括密碼最短長度,不能使最近用過的數次密碼,也經常與pam_cracklib搭配使用。
pam_rootok pam_rootok模組授予使用者無需輸入密碼就可以存取。例如su程式利用此模組來讓root可以su到任何使用者帳戶,而無需輸入使用者密碼。
pam_securetty pam_securetty模組利用 /etc/securetty檔案來控制root可以登入的TTY,這主要是應用於較早的UNIX時期,root經常利用不加密的telnet登入而造成安全性問題所設計的模組,如此可避免oot帳戶經由特定主控台或網路登入。
pam_tally 用以維護企圖存取系統的次數,所以可以讓管理員拒絶過多次企圖存取失敗者。
pam_time pam_time模組利用/etc/security/time.conf檔案來限制使用者登入系統的時間,您也可以限制使用者登入時可以存取的服務或特定的TTY。
pam_unix 這是一個相當重要的PAM模組,用來轉送經由/etc/passwd和 /etc/shadow檔案的驗證請求。使用nullok和try_first_pass參數可允許使用空白密碼以及當密碼請求再度出現時可以嘗試使用先前用過的密碼來加以驗證。
pam_warn 用以記錄有用的錯誤訊息,可記錄有關於驗證和密碼修改的訊息,通常與pam_deny模組搭配以記錄使用者企圖連到系統的資訊。
pam_wheel 此模組利用 /etc/pam.d/su 檔案設定只允許 wheel 群組的成員,可以執行 su 指令來切換成其他使用者的身份。

PAM的服務組態檔 (PAM Configuration File)

想要使用PAM模組來協助驗證,需要設定位於/etc/pam.d目錄下的服務組態檔(其實預設上大多數的PAM-aware服務的組態檔業已存在),而服務組態檔的格式有四個欄位,如下所示:
[模組類型]     [控制旗標]     [模組路徑]     [模組參數]
PAM-aware應用程式利用位於/etc/pam.d目錄下的對應組態檔來執行驗證與檢查工作,而組態檔內相同模組類型就形成了堆疊,PAM通常會由上往下依序一一呼叫PAM模組,每個模組執行後會向PAM回報成功或失敗,當組態檔內的所有模組堆疊均已執行完畢後,PAM程式庫向應用程式回應最終是成功或失敗。

模組類型

PAM支援四種模組類型:

模組類型 意義 控制說明
account 帳戶管理 針對已經驗證的使用者進一步決定是否授權允許其所企圖存取的服務 (例如帳戶是否過期,存取的時間是否允許)
auth 驗證 對使用者所提供的識別資訊執行驗證工作以確認使用者可以使用此服務,可使用密碼或其它機制
password 密碼變更 更新驗證機制,常見的如變更使用者密碼
session 工作階段管理 當服務啟動或登入時或是關閉登出時執行一些相關的工作

控制旗標

控制旗標用以控制模組執行後,如何影響到最終驗證的結果,並根據其成功或失敗以決定是否要繼續往下執行其它模組,亦或結束執行。

旗標關鍵字 旗標功能
required 此模組的執行結果必需成功,最後驗證結果才會成功,如果本模組執行結果傳回失敗,PAM還是會繼續執行其他的堆疊模組認證工作,而且不論其它堆疊模組執行結果為何,最後總會傳回驗證失敗,如此的做法主要是為了避免攻擊者知道到底是何種原因而導致驗證失敗。
requisite 此模組的執行結果必需成功,最後驗證結果才會成功,但與required所不同者在於一旦本模組執行失敗將會放棄堆疊其它模組的執行並且立即傳回驗證失敗,但如果傳回成功,將會會繼續往下執行其他堆疊模組的驗證工作。
sufficient 本模組的執行結果如果成功,則意謂著這種模組類型已經成功,而同屬於此種類型的其它模組不需要再執行,如果本模組失敗,亦不代表驗證失敗,還需要看相同模組類型的其它模組是否成功來決定,這通常應用於如果某個驗證方法失敗,則可嘗試另一個驗證方法,其中有一個可驗證成功即可,例如如果將Linux加入Active Directory網域,您可以在系統驗證時設定Active Directory網域帳戶驗證模組與Linux 本機帳戶驗證模組為sufficient旗標,如此將表示使用者只要能夠利用網域帳戶或Linux本機帳戶二者之一驗證通過即可。
optional 結果通常會被忽略,一個 optional 模組只有當它是堆疊中唯一的模組時才會有關失敗與成功,此外,它也可以用來做為記錄用途
include 是用來包含並引入其後所接的組態檔案 ( include file )

模組路徑

這個欄位通常只有模組名稱,因為預設路徑為 /lib/security或/lib64/security,可予以省略不寫。

模組參數

每個PAM模組可提供多個參數來控制如何驗證與檢查。

簡單的PAM組態檔範例

底下利用一個簡單的login服務所使用PAM組態檔案的內容來說明Linux 的 login服務如何透過設定PAM組態檔案來進行安全性的驗證工作:

$ cat /etc/pam.d/login
#%PAM-1.0
auth    required    pam_securetty.so
auth    include    system-auth
account    required    pam_nologin.so

…………………………


  1. PAM 首先呼叫 pam_securetty模組以確定如果是root登入,則他是由被允許的終端機所登入(定義在檔案/etc/securetty),如果root企圖從一個未經授權的終端機登入時,則此pam_securetty模組將會回報失敗,所以login服務若要能夠成功通過驗證,首先pam_securetty必需成功(required)才有可能。ss
  2. 接下來,引入system-auth 組態檔內的設定來檢查登入使用者是否能夠通過驗證,通常system-auth組態檔利用本機帳戶和密碼來進行驗證。
  3. 第三行的pam_nologin檢查/etc/nologin檔案是否存在,如果存在nologin檔案則回報失敗(因為只有root允許登入),反之,若nologin檔案並不存在或是root登入,才會回報成功,而login服務要能夠成功通過驗證,這個pam_nologin模組必需要回應成功(required)才行。而這個account模組類型是在使用者已經驗證之後才執行的檢查。

結語

  • 插入式認證模組為一群相當彈性化且可擴充的共用程式庫組成,用來支援應用程式如何安全性的驗證與管理使用者帳戶。
  • 整合許多低階的驗證機制成為應用程式可直接呼叫的高階程式介面(API) ,讓應用程式方便的呼叫PAM API即可使用PAM機制來替程式執行驗證檢查工作。
  • 模組化的設計,讓應用程式變更驗證相關機制時,不必重新改寫應用軟體,只需由管理員變更模組設定,大幅提升了驗證機制的通用性與靈活性。
  • 需要應用程式使用PAM的程式介面來支援。
  • Linux PAM的功能豐富,為目前Linux實現安全性帳戶管理最實務的做法
    • 強制使用嚴謹與複雜的密碼
    • 限制使用者不能使用先前(相似)的密碼 (記錄密碼歷程)
    • 限制使用者登入次數
    • 限制使用者登入的機器
    • 限制使用者登入時段
    • 限制資源的使用
  • •Linux系統實現SSO不可或缺的一環。

相關文章