了解基本的插入式驗證子產品和配置方法并編寫一個登入應用程式
插入式驗證子產品(Pluggable Authentication Module,PAM)API 将公開一組功能,應用程式程式員可以使用這些功能來實作與安全性相關的功能,例如使用者驗證、資料加密、LDAP 等。在本文中,獲得在 Linux 中使用 PAM 子產品的基本指南,了解如何配置 PAM,并了解如何通過 10 個簡單步驟設計樣例 PAM 登入應用程式。

評論:
Vishal Srivistava, 助理軟體工程師, IBM
關閉 [x]
Vishal Srivistava 一直在核心級别上從事各種風格的 UNIX 和 Linux 工作。從 2007 年 6 月開始,Srivistava 就已經在 IBM India Software Labs 工作,目前是負責開發 IBM IIS 核心引擎的團隊成員。從事該職位讓他積累了配置團隊應用以在許多 UNIX 平台上使用 PAM 的大量經驗。
2009 年 4 月 16 日
- 内容
了解和配置 PAM了解基本的插入式驗證子產品和配置方法并編寫一個登入應用程式 - PAM 的使用曆史記錄
- 配置 PAM
- 設計簡單 PAM 登入應用程式的 10 個步驟
- 結束語
- 參考資料
- 評論
在 IBM Bluemix 雲平台上開發并部署您的下一個應用。
開始您的試用
對于 Linux 使用者,安全地共享檔案是一項麻煩的任務。例如,需要費力地回想多個密碼,并且重新設計系統通路應用程式(如 login、su、password、ftp 等)十分耗費時間。增加這一複雜度的是驗證 過程,在該過程中,系統将識别使用者并為該使用者提供相應的通路控制。
PAM 的使用曆史記錄
PAM 是關注如何為服務驗證使用者的 API。在使用 PAM 之前,諸如 login(和 rlogin、telnet、rsh)之類的應用程式在
/etc/passwd
中查找使用者名,然後将兩者相比較并驗證使用者輸入的名稱。所有應用程式使用了這些共享服務,但是并未共享實作細節和配置這些服務的權限。
接下來,應用程式開發人員嘗試編寫自定義過程代碼。在此過程中,需要分離應用程式與安全子產品(通用安全子產品可以在應用程式之間共享并且可以根據需求進行配置)。
PAM 機制将把多個低級别驗證模式內建到進階别 API 中,該 API 将允許以獨立于底層驗證模式的方式編寫使用驗證的程式。PAM 的主要特征表現為通過
/etc/pam.d
或
/etc/pam.conf
檔案實作動态驗證配置。
PAM 可以被配置為拒絕某些程式對使用者進行驗證,或者在某些程式嘗試驗證時發出警告。PAM 程式将使用 PAM 子產品(驗證子產品):這些子產品在運作時與應用程式綁定在一起才能工作。
圖 1 顯示了 PAM 子產品的基本流程。
圖 1. PAM 庫将解析配置檔案并将子產品裝入其中
哪些作業系統支援 PAM?
PAM 最初是由 Sun Microsystems 于 1995 年開發的,并且以下作業系統版本(及更高版本)都提供支援:
- RedHat 5.0
- SUSE 6.2
- Debian 2.2
- Mandrake 5.2
- Caldera 1.3
- TurboLinux 3.6
最新版本的 Solaris™、AIX®、HP-UX 和 Mac OS® X 也支援 PAM。PAM 後來被标準化為 X/Open UNIX® 标準化流程(在 X/Open 單點登入服務(XSSO)架構中)的一部分。
我可以獲得哪種 PAM?
雖然沒有進行嚴格劃分,但是可以認為有三種 PAM:
- Linux-PAM:Linux-PAM 涵蓋了本文中讨論的所有 PAM。在任何一個 Linux 平台中的 PAM 的主要結構都類似于 Linux-PAM 版本。
- OpenPAM:OpenPAM 是由 NAI 實驗室的 Dag-Erling Smorgrav 開發的另一個 PAM 實作,屬于 DARPA-CHATS 研究項目。由于它是開源的,是以它主要由 FreeBSD、NetBSD 及應用程式(加上 Mac OS X)使用。
- Java™ PAM 或 JPam:PAM 主要是支援 Linux 和 UNIX 的标準驗證子產品。JPam 将 Java 部分與普通 PAM 聯系了起來。JPam 允許基于 Java 的應用程式使用 PAM 子產品或工具(如 auth、account、passwd、session 等)。它提供了 JAAS 和直接 API,并且支援大多數 Unix OS 和架構。
雖然這些是不同的 PAM,但是其主要功能仍然相同。
PAM 子產品是什麼樣子的?
安裝 PAM 是一個逐漸的過程。要獲得安裝說明,請參閱 參考資料。
PAM 子產品是按子產品類型歸類的。任何給定的子產品至少要實作四種子產品類型功能之一:
- 驗證子產品用于驗證使用者或設定/銷毀憑證。
- 帳戶管理子產品将執行與通路、帳戶及憑證有效期、密碼限制/規則等有關的操作。
- 使用管理模組用于初始化和終止會話。
- 密碼管理子產品将執行與密碼更改/更新有關的操作。
PAM 将提供不同的功能,例如單點登入驗證、通路控制等。每個功能的實作都是由不同的子產品處理的。下面是一些主要子產品:
-
将使用登入名/域名,根據 /etc/security/access.conf 中的預定義規則傳遞日志守護程序樣式的登入通路控制。pam_access
-
将根據密碼規則檢查密碼。pam_cracklib
-
環境變量來自 /etc/security/pam_env_conf。pam_env sets/unsets
-
将調試 PAM。pam_debug
-
将拒絕 PAM 子產品。pam_deny
-
将列印消息。pam_echo
-
将執行外部指令。pam_exec
-
是匿名通路子產品。pam_ftp
-
要求将使用者列于 /etc/passwd 中。pam_localuser
-
将通過pam_unix
提供傳統密碼驗證。/etc/passwd
還有許多其他子產品(
pam_userdb
、
pam_warn
、
pam_xauth
),這些子產品将擷取傳回的一組值(這些子產品的詳細資訊可以在 參考資料 的 PAM 管理指南中找到)。
回頁首
配置 PAM
PAM 配置通常是在
/etc/pam.d
或
/etc/pam.conf
(用于舊版本)中的配置檔案中實作的。
配置檔案的結構
對于使用 PAM 的各項服務,目錄中都有一個對應的檔案,其中包含應當如何擷取該服務的驗證及帳戶資訊的規則或說明。通常每一行有一個規則。
PAM 配置檔案中的字段包括:
-
将指定服務/應用程式的名稱(預設值為 OTHER)。Service_name
-
将為Module_type
字段中的相應服務指定子產品類型(Service_name
)。auth/account/session/passwd
-
将指定子產品的堆棧行為。它可以擷取諸如Control_flag
、requisite
、required
和sufficient
之類的值。optional
-
将指定實作子產品的庫對象的路徑名稱。預設情況下,它将被設為Module_path
。/lib/security
-
/Module_options
(可選字段)将指定可以傳遞給服務子產品的選項或實參。module_args
子產品将按照在配置檔案中列出的順序被調用,這取決于每個條目允許的
Control_flag
的值。Control_flag 值包括:
- Required:堆棧中的所有 Required 子產品必須看作一個成功的結果。如果一個或多個 Required 子產品失敗,則實作堆棧中的所有 Required 子產品,但是将傳回第一個錯誤。
- Sufficient:如果标記為 sufficient 的子產品成功并且先前沒有 Required 或 sufficient 子產品失敗,則忽略堆棧中的所有其餘子產品并傳回成功。
- Optional:如果堆棧中沒有一個子產品是 required 并且沒有任何一個 sufficient 子產品成功,則服務/應用程式至少要有一個 optional 子產品成功。
PAM 配置檔案示例
表 1 顯示了各種作業系統中的 PAM 配置檔案的一些示例。
表 1. PAM 配置檔案的世界
系統 | 配置檔案所在位置 | 類型 | Control_flag | 子產品 |
---|---|---|---|---|
Red Hat | /etc/pam.d | auth | required | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | account | sufficient | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | session | required | /lib/security/pam_limit.so |
AIX | /etc/pam.conf | auth | required | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | account | required | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | password | required | /usr/lib/security/pam_aix |
zSUSE 64-bit | 32-bit | /etc/pam.conf | auth | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | account | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | session | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
Solaris | /etc/pam.conf | auth | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | account | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | password | required | /usr/lib/security/pam_unix.so.1 |
HP-UX | /etc/pam.conf | auth | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | account | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | password | required | libpam_unix.so.1 |
PAM 的 “other” 檔案
預設的 PAM 配置檔案
/etc/pam.d
用于沒有明确配置的所有其他服務,并且可能是 PAM 所依賴的最簡單而又最健壯的預設檔案。該檔案内部類似如下所示:
/etc/pam.d/other File
auth required pam_warn.so
auth required pam_deny.so
account required pam_warn.so
account required pam_deny.so
password required pam_warn.so
password required pam_deny.so
session required pam_warn.so
session required pam_deny.so
此檔案非常簡單。對于所有子產品類型,Control_flag 都是一樣的:
required
。調用兩個子產品:
- 首先,調用
來記錄關于正在進行的嘗試的資訊。pam_warn.so
- 然後調用
僅傳回錯誤并防止發生任何類型的連接配接或驗證。pam_deny.so
是以,使用 PAM 的所有服務都必須被明确配置為允許驗證;否則,嘗試将失敗。
設計簡單 PAM 登入應用程式的 10 個步驟
這 10 個步驟可以幫助您實作自己的 PAM 應用程式并幫助您了解 PAM 會話的工作方式:
- 包括 PAM 實作的頭檔案(例如,pam_appl.h、pam_misc.h)。
- 在
函數中,使用惟一的句柄初始化 PAM 庫 libpam.so(該庫将裝入應用程式的配置檔案中指定的子產品)。main
- 嘗試驗證所有子產品并處理失敗場景。
- 檢查使用者憑證和帳戶詳細資訊。
- 打開一個新 PAM 會話。
- 為使用憑證的使用者設定環境。
- 當使用者完成時,取消使用者環境。
- 關閉 PAM 會話。
- 從帶有句柄值的 libpam.so 庫中退出。
- 退出。
結束語
依賴 PAM 來幫助把低級别驗證工作變為更具有管理性的整體,這大大簡化了這種安全機制。在本文中,您了解了:
- 基本的 PAM 架構
- 如何配置 PAM 子產品
- 幫助了解工作原理的 PAM 登入應用程式概述
現在您可以接着了解使用 PAM 子產品的更多進階主題 — 請從下面的 參考資料 開始……
參考資料
學習
- Linux-PAM 指南 将提供關于系統管理問題、子產品編寫和應用程式開發的文檔。
- 這是來自 SUSE Linux Unofficial FAQ 的 PAM 觀點。
- 如果需要更新,Gentoo 提供了一本 Linux-PAM 更新指南。
- 檢視一下 X/Open Single Sign-on Service(XSSO)架構模型。
- 準備好了解使用 PAM 的更多進階主題了麼?
- “A comparison of security subsystems on AIX, Linux, and Solaris”(developerWorks,2005 年 10 月):介紹 PAM 的工作原理。
- “應用挂載名稱空間”(developerWorks,2007 年 9 月):檢視與 PAM 子產品相關的部分。
- “使用 OpenLDAP 集中管理使用者帳号”(developerWorks,2006 年 5 月):檢視 Linux 中的 PAM 如何與 LDAP 協作。
- “使用多執行個體化提高安全性”(developerWorks,2008 年 2 月):使用插入式驗證子產品保護私有資料。
- “LPI 202 考試準備,主題 210:網絡用戶端管理”(developerWorks,2006 年 5 月):配置 PAM 來支援驗證。
- “PAM configuration on SUSE Enterprise Linux 9”(Technote (IBM Tivoli Netcool/OMNIbus),2008 年 10 月):如何配置 PAM 子產品以允許 ObjectServer 驗證本地系統使用者。
- 在 developerWorks Linux 專區 尋找為 Linux 開發人員(包括 Linux 新手入門)準備的更多參考資料,查閱我們 最受歡迎的文章和教程。
- 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。
- 随時關注 developerWorks 技術活動和網絡廣播。
獲得産品和技術
- 使用 IBM 試用軟體 建構下一個 Linux 開發項目,可以從 developerWorks 直接下載下傳獲得。
讨論
- 通過部落格、論壇、podcasts 和空間加入 developerWorks 社群。