可插拔驗證模塊(Pluggable Authentication Module,PAM)是大多數Linux系統上的用戶驗證機制。PAM也是一個抽象層,它允許應用程序驗證用戶,而不需要了解底層系統的細節。PAM是模塊化的,模塊可以按照需要來添加和刪除。 簡單地說,PAM允許應用程序使用各種不同的底層方法來驗證用戶或者進程,這些方法對於應用程序來說都是透明的。應用程序只需要知道PAM API,就可以利用被添加到PAM的任何模塊,而不需要對應用程序進行任何修改。例如,密碼的驗證和智能卡的驗證都能夠按照同PAM相同的方式進行處理。 多個Linux發行版裡缺省地都裝有PAM,包括RedHat、Mandrake和我最喜歡的Gentoo。如果你的系統裡沒有安裝它,你還可以通過源代碼或者二進制代碼的形式獲得PAM。你可以從你Linux發行版的下載網站得到它,或者從PAM的主頁下載。 以輕松方式的驗證 要做的第一件事是通過調用pam_start來初始化PAM系統。為了清除由PAM系統所分配的資源,就要調用pam_end。要進行簡單的驗證,你就要調用pam_authenticate。為了核實用戶是否具有訪問權,你要調用pam_accnt_mgmt。要記住,這些只是最基本的;系統所需要的要遠比這個多。一個基本驗證的完整例子就像下面這樣: #include <stdio.h> #include <securite/pam_appl.h> #include <security/pam_misc.h> strUCtpam_convconvstn = { misc_conv,/*built in conversation function*/ NULL }; int Authenticate(const char *uname){ pam_handle_t *hPAM = NULL;/*Handle for use with all PAM functions*/ intrslt = 0; /*The first parameter is the service name used in pam.conf*/ rslt = pam_start("pamdemo", uname, &convstn, &hPAM); if (rslt != PAM_SUCCESS){ return -1; } /*authenticate the user*/ rslt = pam_authenticate(hPAM, 0); if (rslt != PAM_SUCCESS){ return -1; } /*does the user have Access*/ rslt = pam_acct_mgmt(hPAM, 0); if (rslt != PAM_SUCCESS){ return -1; } if (pam_end(hPAM, rslt) != PAM_SUCCESS){ printf("PAM cleanup failed."); } return 0; } 為了讓上面的代碼正確地運行,你需要把下面的命令加到/etc/pam.conf文件裡: pamdemo auth required /usr/lib/security/pam_unix_auth.so pamdemo account required /usr/lib/security/pam_unix_acct.so 一個重要的概念是對話函數,它負責提示用戶正確地進行輸入,並獲取其輸入的內容。所有的PAM應用程序都必須具有對話函數。在pam_misc.h裡有一個叫做misc_conv的對話函數,應用程序可以使用它而不需要自己實現它。這個函數能夠很好地用在大多數控制台應用程序裡,但是當你需要為X-Windows應用程序進行驗證的時候,你將需要實現自己的函數。這個函數必須具有下列簽名。 int (*conv)(intnum_msg, const structpam_message **msgm, structpam_response **response, void *appdata_ptr) 該函數被分派給pam_conv::conv member。然後conv member就被用作PAM系統的回調(callback)。 PAM為Linux裡的驗證提供了一個非常完整但是相對簡單的API。傳統的用於向應用程序加入驗證功能的方式需要將你的驗證代碼寫成特定的驗證方法。如果驗證方法發生了改變,你就必須重新編寫你應用程序的驗證代碼。有了PAM,你可以更改底層的驗證方法,而不會影響到你的系統。