Linux-PAM

PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些
動態鏈接庫和一套統一的API,將系統提供的服務 和該服務的認證方式分開,使得系統管理
員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便於
向系 統中添加新的認證手段。
PAM最初是集成在Solaris中,目前已移植到其它系統中,如Linux、SunOS、HP-UX 9.0等。

一、PAM的結構

PAM的整個框架結構如下圖所示:


系統管理員通過PAM配置文件來制定認證策略,即指定什麼服務該採用什麼樣的認證方法;應
用程序開發者通過在服務程序中使用PAM API而實現對認證方法的調用;而PAM服務模塊(se
rvice module)的開發者則利用PAM SPI(Service Module API)來編寫認證模塊(主 要是
引出一些函數pam_sm_xxxx( )供libpam調用),將不同的認證機制(比如傳統的UNIX認證方
法、Kerberos等)加入到系統中;PAM核 心庫(libpam)則讀取配置文件,以此爲根據將服
務程序和相應的認證方法聯繫起來。
二、PAM支持的四種管理界面:

1、認證管理(authentication management)
主要是接受用戶名和密碼,進而對該用戶的密碼進行認證,並負責設置用戶的一些祕密
信息。
2、帳戶管理(account management)
主要是檢查帳戶是否被允許登錄系統,帳號是否已經過期,帳號的登錄是否有時間段的
限制等等。
3、密碼管理(password management)
主要是用來修改用戶的密碼。
4、會話管理(session management)
主要是提供對會話的管理和記賬(accounting)。

三、PAM的文件:

/usr/lib/libpam.so.* PAM核心庫
/etc/pam.conf或者/etc/pam.d/ PAM配置文件
/usr/lib/security/pam_*.so 可動態加載的PAM service module
對於RedHat,其目錄不是/usr/lib,而是/lib。

四、PAM的配置:

PAM的配置是通過單個配置文件/etc/pam.conf。RedHat還支持另外一種配置方式,即通過配
置目錄/etc/pam.d/,且這種的優先級要高於單 個配置文件的方式。

1、使用配置文件/etc/pam.conf

該文件是由如下的行所組成的:
service-name module-type control-flag module-path arguments

service-name 服務的名字,比如telnet、login、ftp等,服務名字“OTHER”代表所有沒有
在該文件中明確配置的其它服務。
module-type 模塊類型有四種:auth、account、session、password,即對應PAM所支持的
四種管理方式。同一個服務可以調用多個 PAM模塊進行認證,這些模塊構成一個stack。
control-flag 用來告訴PAM庫該如何處理與該服務相關的PAM模塊的成功或失敗情況。它有四
種可能的 值:required,requisite,sufficient,optional。
required 表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗的話,失敗
結果也不會立即通知用戶,而是要等到同一stack 中的所有模塊全部執行完畢再將失敗結果
返回給應用程序。可以認爲是一個必要條件。
requisite 與required類似,該模塊必須返回成功才能通過認證,但是一旦該模塊返回
失敗,將不再執行同一stack內的任何模塊,而是直 接將控制權返回給應用程序。是一個必
要條件。注:這種只有RedHat支持,Solaris不支持。
sufficient 表明本模塊返回成功已經足以通過身份認證的要求,不必再執行同一stack
內的其它模塊,但是如果本模塊返回失敗的話可以 忽略。可以認爲是一個充分條件。
optional表明本模塊是可選的,它的成功與否一般不會對身份認證起關鍵作用,其返回
值一般被忽略。
對於control-flag,從Linux-PAM-0.63版本起,支持一種新的語法,具體可參看Linux
PAM文檔。
module-path 用來指明本模塊對應的程序文件的路徑名,一般採用絕對路徑,如果沒有給出
絕對路徑,默認該文件在目錄/usr/lib/security下 面。
arguments 是用來傳遞給該模塊的參數。一般來說每個模塊的參數都不相同,可以由該模塊
的開發者自己定義,但是也有以下幾個共同 的參數:
debug 該模塊應當用syslog( )將調試信息寫入到系統日誌文件中。
no_warn 表明該模塊不應把警告信息發送給應用程序。
use_first_pass 表明該模塊不能提示用戶輸入密碼,而應使用前一個模塊從用戶那裏
得到的密碼。
try_first_pass 表明該模塊首先應當使用前一個模塊從用戶那裏得到的密碼,如果該
密碼驗證不通過,再提示用戶輸入新的密碼。
use_mapped_pass 該模塊不能提示用戶輸入密碼,而是使用映射過的密碼。
expose_account 允許該模塊顯示用戶的帳號名等信息,一般只能在安全的環境下使用
,因爲泄漏用戶名會對安全造成一定程度的威 脅。

2、使用配置目錄/etc/pam.d/(只適用於RedHat Linux)

該目錄下的每個文件的名字對應服務名,例如ftp服務對應文件/etc/pam.d/ftp。如果名爲x
xxx的服務所對應的配置文件/etc/pam.d/xxxx不存 在,則該服務將使用默認的配置文件/et
c/pam.d/other。每個文件由如下格式的文本行所構成:
module-type control-flag module-path arguments
每個字段的含義和/etc/pam.conf中的相同。

3、配置的例子

例一:用/etc/pam.conf配置默認的認證方式。

下面的例子將拒絕所有沒有在/etc/pam.conf中明確配置的服務。OTHER代表沒有明確配置的
其它所有服務,pam_deny模塊的作用只是簡 單地拒絕通過認證。
OTHER auth required /usr/lib/security/pam_deny.so
OTHER account required /usr/lib/security/pam_deny.so
OTHER password required /usr/lib/security/pam_deny.so
OTHER session required /usr/lib/security/pam_deny.so


例二:通過/etc/pam.d/rsh文件配置rsh服務的認證方式。

rsh服務認證用戶時,先使用/etc/hosts.equiv和.rhosts文件的認證方式,然後再根據/etc
/nologin文件的存在與否來判斷是否允許該用戶使用 rsh,最後使用password database來認
證用戶。

auth required /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so


例三:通過/etc/pam.conf配置ftpd的認證方式。

下面是ftpd服務利用PAM模塊進行用戶認證的三個步驟。首先用pam_ftp模塊檢查當前用戶是
否爲匿名用戶,如果是匿名用戶,則 sufficient控制標誌表明無需再進行後面的認證步驟,
直接通過認證;否則繼續使用pam_unix_auth模塊來進行標準的unix認證,即用/etc/ passw
d和/etc/shadow進行認證;通過了pam_unix_auth模塊的認證之後,還要繼續用pam_listfil
e模塊來檢查該用戶是否出現在文件/etc/ ftpusers中,如果是則該用戶被deny掉。
ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so
onerr=succeed item=user sense=deny file=/etc/ftpuser
s

五、密碼映射(password-mapping)

密碼映射允許用戶在不同的認證機制下使用不同的密碼,其中有一個主密碼(primary pass
word),其它密碼爲次密碼(secondary passwords,可能有多個)。主密碼用來對次密碼進
行加密。在主密碼認證通過後,認證模塊利用主密碼將加密過的次密碼(也稱爲 mapped pa
ssword)解密,並對次密碼進行認證。
注:如果使用了一次性密碼的機制,就不使用密碼映射。

所有服務模塊必須支持如下4個映射選項(在第四部分已經簡單解釋過):

1、use_first_pass

這個選項指示本模塊不能提示用戶輸入密碼,而是使用已有的密碼,即從第一個向用戶提示
輸入密碼的模塊那裏取得密碼,並對該密碼進 行認證。

2、try_first_pass

這個選項指示本模塊首先嚐試使用已有的密碼,即從第一個向用戶提示輸入密碼的模塊那裏
取得密碼,並對該密碼進行認證。如果密碼認 證失敗,則再提示用戶輸入密碼。

3、use_mapped_pass

這個選項指示本模塊不能向用戶提示輸入密碼,而應使用映射過的密碼,即利用主密碼將加
密過的次密碼解密出來並進行認證。

4、try_mapped_pass

這個選項指示本模塊首先嚐試使用映射過的密碼,即利用主密碼將加密過的次密碼解密出來
並進行認證。如果密碼認證失敗,則再提示用 戶輸入密碼。

密碼映射的例子:

下面是/etc/pam.conf中關於login服務的配置。這裏login共有3種認證機制:Kerberos、UN
IX和RSA認證,兩個required控制標誌表明用戶必 須通過Kerberos認證和UNIX認證才能使用
login服務,optional選項則說明RSA認證是可選的。首先用戶輸入主密碼進行Kerberos認 證
;use_mapped_pass選項指示UNIX認證模塊利用主密碼將用於UNIX認證的次密碼解密出來並對
該次密碼進行認證;try_first_pass選項 指示RSA認證模塊先使用第一個模塊(即Kerberos
模塊)的密碼作爲進行認證的密碼,當對該密碼認證失敗時才提示用戶輸入用於RSA認 證的
次密碼。
login auth required pam_kerb_auth.so debug
login auth required pam_unix_auth.so use_mapped_pass
login auth optional pam_rsa_auth.so try_first_pass

六、PAM API

1、框架API:

任何一個支持PAM的服務程序在進行認證時必須以pam_start( )開始進行初始化,最後以pam
_end( )結束以便進行清理工作。

2、認證管理API:

pam_authenticate( )對用戶名/密碼進行認證。
pam_setcred( )用來修改用戶的祕密信息。

3、帳戶管理API:

pam_acct_mgmt( )檢查帳戶本身是否有權限登錄系統、帳戶是否過期、帳戶是否有登錄時間
限制等。

4、密碼管理API:

pam_chauthtok( )修改用戶的密碼。

5、會話管理API:

一個會話以pam_open_session( )開始,最後以pam_close_session( )結束。

6、其它:

pam_get_item( )、pam_set_item( )用來讀寫PAM事務(transaction)的狀態信息。
pam_get_data( )、pam_set_data( )用來取得和設置PAM模塊及會話的相關信息。
pam_putenv( )、pam_getenv( )、pam_getenvlist( )用來讀寫環境變量。
pam_strerror( )返回相關的錯誤信息。
例子程序(摘自Sun的白皮書):

下面的例子使用PAM API寫了一個簡單的login服務程序(注:這不是個完整的程序,所以省
略了對pam_close_session的調用)。

#include <security/pam_appl.h>

/* 回調函數 */
static int login_conv(int num_msg, struct pam_message **msg, struct pam_response
**response, void *appdata_ptr);
struct pam_conv pam_conv = {login_conv, NULL};
pam_handle_t *pamh; /* 進行認證的PAM句柄 */

void main(int argc, char *argv[], char **renvp)
{
/* 初始化,並提供一個回調函數 */
if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)
login_exit(1);

/* 設置一些參數 */
pam_set_item(pamh, PAM_TTY, ttyn);
pam_set_item(pamh, PAM_RHOST, remote_host);

while (!authenticated && retry < MAX_RETRIES)
{
status = pam_authenticate(pamh, 0); /* 密碼認證管理,檢查用戶輸入
的密碼是否正確 */
authenticated = (status == PAM_SUCCESS);
}

if (status != PAM_SUCCESS)
{
fprintf(stderr,"error: %s ", pam_strerror(pamh, status)); /* 顯示錯誤原
因 */
login_exit(1);
}

/* 通過了密碼認證之後再調用帳戶管理API,檢查用戶帳號是否已經過期 */
if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
{
if (status == PAM_AUTHTOK_EXPIRED)
{
status = pam_chauthtok(pamh, 0); /* 過期則要求用戶更改密碼 */
if (status != PAM_SUCCESS)
login_exit(1);
}
}

/* 通過帳戶管理檢查之後則打開會話 */
if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)
login_exit(status);

/* 設置用戶組 */
setgid(pwd->pw_gid);

/*
* Initialize the supplementary group access list before
* pam_setcred because PAM modules might add groups
* during the pam_setcred call
*/
initgroups(user_name, pwd->pw_gid);

status = pam_setcred(pamh, PAM_ESTABLISH_CRED);
if (status != PAM_SUCCESS)
login_exit(status);

/* 設置真實的用戶ID(或者有效的用戶ID)*/
setuid(pwd->pw_uid);

pam_end(pamh, PAM_SUCCESS); /* PAM事務的結束 */


/*
此處可用來實現與login有關的其它內容
*/
}

/* 出錯則清理現場並退出 */
static void login_exit(int exit_code)
{
if (pamh)
pam_end(pamh, PAM_ABORT);
exit(exit_code);
}


/* 這個回調函數被PAM認證模塊調用以便顯示錯誤信息或者或者用來取得用戶輸入,採用圖
形界面的服務程序則應使用圖形界面來取得 用戶輸入或顯示提示信息*/
int login_conv(int num_msg, struct pam_message **msg, struct pam_response **resp
onse, void *appdata_ptr)
{
while (num_msg--)
{
switch (m->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
r->resp = strdup(getpass(m->msg));
break;
case PAM_PROMPT_ECHO_ON:
(void) fputs(m->msg, stdout);
r->resp = malloc(PAM_MAX_RESP_SIZE);
fgets(r->resp, PAM_MAX_RESP_SIZE, stdin);
/* add code here to remove from fputs */
break;
case PAM_ERROR_MSG:
(void) fputs(m->msg, stderr);
break;
case PAM_TEXT_INFO:
(void) fputs(m->msg, stdout);
break;
default:
log_error();
break;
}
}
return (PAM_SUCCESS);
}

七、PAM SPI

當服務程序(ftpd、telnetd等)調用PAM API函數pam_xxx( )時,由PAM 框架(libpam)根
據該服務在/etc/pam.conf文件中的配置調用指 定的PAM模塊中對應的SPI函數pam_sm_xxx(
)。如下:




API函數的名字爲pam_xxx( ),對應的SPI函數的名字爲pam_sm_xxx( ),即每個服務模塊需要
引出相應的函數以供libpam調用。爲方便對 照,再列一下。


API 對應的 SPI

帳號管理 pam_acct_mgmt( ) pam_sm_acct_mgmt( )

認證管理 pam_authenticate( ) pam_ sm_authenticate( )

密碼管理 pam_chauthtok( ) pam_ sm_chauthtok( )

會話管理 pam_open_session( ) pam_ sm_open_session( )

會話管理 pam_close_session( ) pam_ sm_close_session( )

認證管理 pam_setcred( ) pam_ sm_setcred( )




八、常用的PAM服務模塊

下面是Linux提供的PAM模塊列表(只是其中一部分):

模塊文件 模塊功能描述 相關配置文件

pam_access 提供logdaemon風格的登錄控制 /etc/security/access.conf

pam_chroot 提供類似chroot命令的功能


pam_cracklib 對密碼的強度進行一定的檢查 庫文件libcrack和字典文件
/usr/lib/cracklib_dict

pam_deny 總是無條件地使認證失敗

pam_env 設置或取消環境變量 /etc/security/pam_env.conf

pam_filter 對輸入輸出流進行過濾 filters

pam_ftp.so 對匿名ftp用戶進行認證

pam_group 當用戶在指定的終端上請求指定的 /etc/security/group.conf
服務時賦予該用戶相應的組權限

pam_issue 在提示用戶輸入用戶名之前顯示 /etc/issue
/etc/issue文件的內容

pam_krb4 對用戶密碼進行Kerberos認證 相應的Kerberos庫文件

pam_lastlog 在用戶登錄成功後顯示關於 /var/log/lastlog
用戶上次登錄的信息,並維護
/var/log/lastlog文件。

pam_limits 限制用戶會話所能使用的系統資源 /etc/security/limits.conf

pam_listfile 根據指定的某個文件決定是否 例如/etc/ftpusers
允許或禁止提供服務

pam_mail 檢查用戶的郵箱中是否有新郵件 /var/spool/mail/xxxx

pam_mkhomedir 爲用戶建立主目錄 /etc/skel/

pam_motd 顯示/etc/motd文件的內容 /etc/motd

pam_nologin 根據/etc/nologin文件的存在與否 /etc/nologin
來決定用戶認證是否成功

pam_permit 總是無條件地使認證成功


pam_pwdb 作爲pam_unix_xxxx模塊的一個替代。/etc/pwdb.conf
使用Password Database通用接口
進行認證。

pam_radius 提供遠程身份驗證撥入用戶服務
(RADIUS)的認證


pam_rhosts_auth 利用文件~/.rhosts和 /etc/hosts.equiv和~/.rhosts
/etc/hosts.equiv對用戶進行認證。

pam_rootok 檢查用戶是否爲超級用戶,如果
是超級用戶則無條件地通過認證。


pam_securetty 提供標準的Unix securetty檢查 /etc/securetty

pam_time 提供基於時間的控制,比如限制 /etc/security/time.conf
用戶只能在某個時間段內才能登錄

pam_unix 提供標準的Unix認證 /etc/passwd和 /etc/shadow

pam_userdb 利用Berkeley DB數據庫來檢查 Berkeley DB
用戶/密碼

pam_warn 利用syslog( )記錄一條告警信息


pam_wheel 只允許wheel組的用戶有超級用戶
的存取權限

參考資料:

1、DCE/OSF-RFC 86.0
2、Linux-PAM documentation & source code
3、Sun Solaris PAM documentation




@@

Linux- PAM(Pluggable Authentication Modules). 有人翻譯成“可插拔式認證模塊”, 或是“可插入式認證模塊”. 它表示一種性能健碩而且靈活方便的用戶級認證方式。目前,PAM已經成爲了Linux, BSD和其他一些*Nix操作系統的首選認證方式。特別是在Linux上,幾乎所有的daemon和一些與授權有關的命令都通過PAM來進行驗證。他們在 編譯時都無一例外的加入了對PAM的支持。PAM可以說是Linux系統的安全守護神。那麼,PAM到底是怎樣運作的呢?

PAM主要是由一組共享庫文件(share libraries, 也就是.so文件)和一些配置文件組成的。當你在請求服務的時候,具有PAM認證功能的應用程序將與這些.so文件進行交互,以便得知是否可以授權給發起 請求的用戶來使用服務,比如su, vsftp, httpd,等。如果認證成功了,那麼這個用戶便可以使用服務或完成命令,如果認證失敗了,那麼這個用戶將不能使用服務,同時,PAM將向指定的log文 件寫入警告信息。我們可以將PAM看作是一箇中間裁判,它不依賴於任何應用或服務。你完全可以升級這些應用或服務而不必管PAM的共享庫的更新或升級,反 之亦然。所以它非常的靈活。

PAM的認證過程是通過對一些服務或應用的配置文件來控制的。通常,這些配置文件在/etc/pam.d目錄下。cd到這個目錄,你會看到很多你很熟悉的 應用或服務的名稱。比如說login. 那麼當用戶login的時候,PAM到底做了什麼呢?我們看看這個login的PAM配置文件:

代碼:

#%PAM-1.0
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_stack.so service=system-auth
password   required     pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
#session    required    pam_selinux.so close
session    required     pam_stack.so service=system-auth
session    optional     pam_console.so
# pam_selinux.so open should be the last session rule
#session    required    pam_selinux.so multiple open

這裏有些PAM的術語:
首先是配置文件的格式:

代碼:

service	module-type	control_flag	module_path	args

service - 由於現代的PAM配置文件都是以服務程序的名字分開配置,所以基本上service這個項已經省去了。但在有些還使用一個pam.conf大文件配置所有的PAM服務的BSD上,還有這一項。

module_type – 控制使用什麼類型的管理機制。
auth – 認證管理。做兩件事:1.檢驗用戶是否是真正聲稱的那個用戶,比如,要求用戶輸入用戶名和密碼來聲明自己。2.這個模塊可以通過PAM自身的印證機制賦予用戶一些特權,或是加入組。
account – 用戶管理。 是非認證式的對用戶賦予/阻止使用一些系統資源。比如說,用戶登錄的時間限制,密碼的期限等。
password – 密碼認證管理。是用來管理用戶的密碼認證標記(token)的。比如,用戶密碼的嘗試次數等。
session – 會話管理。比如在會話前中後所要執行的一些事情,如記錄會話信息, 對如可展開會話的控制等。

control_flag – 可以理解成對PAM認證的流程控制。比如說如果成功,下一步應該怎麼辦?如果不成功,又應該怎麼辦?還有就是按怎樣的順序來進行認證,等等。
required – 表示這一模塊的認證是必須成功的,但如果失敗,認證過程不會即刻終止,PAM將繼續下一個同類型的模塊認證。
requisite – 和required類似,只是如果失敗,認證過程將立即終止。
sufficient – 表示如果認證成功,那麼對這一類的模塊認證是充足的了,其他的模塊將不會再檢驗。
optional – 表示這一模塊認證是可選的,也不會對認證成功或失敗產生影響。我沒怎麼用過這個。
include - 有點類似於DNS或xinetd的include。表示將包括其他的一些認證,這樣就可以建立一個分離式的配置文件管理機制。

module_path
使用的認證模塊的位置,最爲保險的是使用絕對路徑。不過PAM有自己的PATH環境,在RHEL4中,大部分是使用的相對路徑。如果你是缺省安裝,有沒有挪動過那些.so文件的位置,使用相對路徑是沒問題的。(缺省路徑一般是:/lib/security)

args – 在認證時傳給模塊的一些變量。比如用什麼文件,對於什麼uid, 失敗的處理等等。類似於賦給一個命令一些參數。

好了,對於PAM的結構有了基本的瞭解,我們來看看PAM是如果控制login的。從上至下對於login的PAM配置文件的翻譯可以爲:
1.用pam_stack.so這個認證模塊檢測system-auth服務的每一項,看這個請求用戶是否能通過認證。這一項是必須檢驗成功的。 system-auth可以理解爲一個 “systemwide“全局性的PAM配置文件,也就是說所有的PAM文件都將首先檢測system-auth。這就是通過pam_stack.so service=system-auth這一語句來完成的。
2.如果第一項失敗了,則整個認證將失敗,但無論認證是否成功失敗,繼續檢測第二項,pam_nologin.so.看看系統是否有nologin文件存在。一般在/etc/nologin.如果這個文件存在,則只有root才能登錄,其他任何用戶都不能。
3.繼續檢測第三項,用system-auth來檢測對用戶的管理。
4.繼續檢測第四項,用system-auth來檢測對密碼的管理。
5.繼續檢測第五項,用system-auth來檢測會話的控制。
6.繼續檢測第六項,用pam_console.so來檢測用戶的登錄來源,如果從console,則配置一些console下的資源。這一項是可選的。

按照這個認證過程,我們可以舉個例子: userA 和userB。UserA是系統用戶而userB是個虛擬用戶,只給vsftp用的。那麼當userA和userB登錄的時候,PAM將利用 pam_unix.so來檢測用戶是否在/etc/passwd和/etc/shadow中。顯然userA將成功,而userB將失敗。成功的用乎將繼 續檢測其諸如password已經retry的次數,是否sync了passwd和shadow文件,是否是nis 用戶,password的加密方式,登錄後的系統資源利用情況(pam_limits.so)等等。最後是pam_console.so,如果用戶是從 vt或本地的X 會話登錄,PAM將如何配置文件權限...

幾個常用的PAM認證模塊的介紹
1.pam_access.so – 缺省配置文件是/etc/security/access.conf (當然,通過“accessfile=/path/to/file” argument, 還可以自行指定配置文件。 通過加入這個認證模塊到你想要控制的服務器PAM配置文件,你可以實現對某些服務的userbase級控制。如vsftp, samba,等。編輯/etc/security/access.conf文件,加入你想要控制的用戶,可以賦予/阻止他們從特定的來源登錄服務器。
2.pam_cracklib.so – 用字典方式檢測password的安全性。有一些很有用的arguments, 比如准許retry的次數,多少個字符可以和上次的密碼重複,最小的密碼長度等等。
3.pam_deny.so – 一個特殊的PAM模塊,這個模塊將永遠返回否。類似大多數的安全機制配置準則,一個嚴謹的安全規則的最後一項永遠是否。
4.pam_limits.so – 類似Linux的ulimit命令,賦給用戶登錄某個會話的資源限度。如core文件的大小,memory的用量,process的用量,等等。
5.pam_listfile.so – 高度自定義的一個認證模塊。理論上你可以用這個模塊來控制任何服務。Arguments有:

代碼:

item=[tty|user|rhost|ruser|group|shell]
sense=[allow|deny]
file=/path/to/the/file
apply=[usre|@group]

比如,我想在pop3服務的PAM配置文件中加入:

代碼:

auth       required     pam_listfile.so item=user sense=deny file=/etc/security/dovecot.deny onerr=fail

然後我建立/etc/security/dovecot.deny文件,在裏面我加上userA的用戶名。這樣,userA就無法登錄pop3服務器了。 原因是“sense=deny“。當然,你也可以配置成“sense=allow“,這樣在這個文件裏的用戶就成了可以登錄的用戶了,不過你得加入所有你 想賦予登錄權限的用戶,因爲不在這個文件中的用戶將被DENY!
6.pam_permit.so – 和pam_deny.so正好相反,這個模塊將永遠返回真。自己從沒用過,也許你可以告訴我爲什麼我需要這個模塊?!
7.pam_rootok.so – root用戶將通過認證。
8.pam_securetty.so – 將用/etc/securetty文件來檢測root用戶的登錄來源,不在securetty文件中的來源一律禁止!
9.pam_tally.so – 主要用來記錄,重置,和阻止失敗的登錄(次數)。
10.pam_wheel.so – 如果有這個模塊,那個只有在wheel組裏的用戶可以得到root權限。
11.pam_xauth.so – 如果有這個模塊,那麼在su, sudo的時候,xauth的cookies將同時傳到那個用戶。(是不是想起來什麼了?)



@@@

1. 介紹

Linux-PAM (Linux下的可插入式認證模組) 是一套共享函數庫,允許系統管理員來決定應用程式如何識別用戶.

換句話說,就是用不着(重寫和)重新編譯一個(支援PAM的)程式,就可以切換它所用的認證機制. 你可以整個的升級你的認證系統而不用去管應用程式本身.

傳統上,當一個應用程序有身份識別的需求,它就不得不把某一種驗證算法寫進去. 例如,就傳統的UN*X系統而言,覈對使用者身份的方法就是要求用戶輸入正確的密碼. 這密碼,除了開頭的兩個字符作爲"salt",剩下的是加密過的(經由crypt(3)). 接著用戶被驗證這個加密過的密碼是否與他在密碼檔(就是/etc/passwd文件)中他的那筆記錄的第二欄相符.在這樣的系統裏,絕大部份權限的授予是 基於這種單一的認證機制. 權限決定於個人的識別碼(uid)和不同羣組的成員.服務和程式是否可用由個人和羣組的識別碼決定.傳統上,羣組關係經由/etc/group文件中的記 錄來賦予.

不幸的是,隨着計算機速度的不斷提高,再加上滿世界的關於網路計算的介紹,使得象這樣曾是安全的驗證機制,變得易受***了.面對這樣的現實,新的驗證方法正在持續的開發中.

Linux-PAM項目的目標是把賦權部分的開發以可靠的合適的鑑定模式從軟件中分離出來。這目標已經通過提供一組庫函數實現了,應用程序可以用這些函數 來請求驗證某個用戶。這個 PAM 由特定的系統文件配置,/etc/pam.conf (或者是在/etc/pam.d/裏的一系列配置文件) 以經由特定的可用的認證模組來鑑定某個用戶的請求。這些個模組通常位於/usr/lib/security目錄並且以可動態加載的目標文件的形式出現(參 見 dlopen(3)).
2. 文中的說明

在繼續閱讀之前, 請記住本文假定提到的文件位於默認的目錄。這個默認的目錄我們遵循RFC(RFC-86.0,見 bibliography)中的約定。如果你正用一個支持PAM但是卻選擇以不同的方式發佈這些文件的發佈版的Linux(或是其他的OS) (Red Hat就是這樣的發佈版), 那你從文章中直接拷貝例子的時候就要注意一下了.

舉個例子, where it is explicit, 本文假定PAM可加載目標文件(就是 模塊)位於這個目錄: /usr/lib/security/. 可是, Red Hat Linux, 爲遵循Linux文件系統標準(the FSSTND),把這些文件放在/lib/security. 在使用本文的例子時請小心的做一些轉換的工作。
3. 概觀

For the uninitiated,我們開始於考慮一個例子。我們來說說一個應用程序提供一些服務給用戶; login 就是這樣的程序。 Login 做兩件事,它首先確認提出請求的用戶正是他們自己,第二步提供給他們所請求的服務:就login而言服務即是一個命令行外殼(command shell)(如bash,tcsh,zsh之類。)以這個用戶的身份去跑。

傳統上,前一個步驟通過login提示用戶輸入密碼然後確認系統是否同意登入;接着確認(就係統而言)用戶確實是提出要求的那人。這類工作就是Linux-PAM的典型應用。

從應用程序員的角度看(在這個例子裏就是寫login程序的人), Linux-PAM處理認證的工作——確認用戶的身份。

Linux-PAM的*性在於,你,系統管理員有權來決定實施怎樣的驗證方案。你有權來設定你的系統裏的任何支持PAM的應用程序的驗證方案。就是說,你 可以將驗證方案設計成單純的信任>任何人(pam_permit)到像偏執狂似的通過視網膜掃描,聲音識別和一個密碼!

舉例說明你所面對的*性,考慮以下情形:系統管理員(家中的父母)希望提高他的使用者(孩子們)的算術能力。她可以設置他們喜歡玩的“Shoot 'em up”(遊戲,當然得支持PAM)通過提問小於12的一對隨機數的乘積的辦法來進行認證。很明顯不管遊戲本身如何,他們會很快學會乘法表。等他們再大些, 認證可以升級到包括多位除法!(譯者:我已經準備用這種辦法來教我寶貝女兒學加減乘除了。)

Linux-PAM處理四種獨立的(管理)工作。它們是: 認證管理; 帳號管理; 會話期間管理;和密碼管理。 The association of the preferred management scheme with the behavior of an application is made with entries in the relevant Linux-PAM configuration file. 管理的功能由配置文件中指定的模塊 來完成。這文件的語法在 below部分討論。

下面的插圖描述了Linux-PAM的整個組織結構。

+----------------+
| application: X |
+----------------+ / +----------+ +================+
| authentication-[---->--\--] Linux- |--<--| PAM config file|
| + [----<--/--] PAM | |================|
|[conversation()][--+ \ | | | X auth .. a.so |
+----------------+ | / +-n--n-----+ | X auth .. b.so |
| | | __| | | _____/
| service user | A | | |____,-----'
| | | V A
+----------------+ +------|-----|---------+ -----+------+
+---u-----u----+ | | |
| auth.... |--[ a ]--[ b ]--[ c ]
+--------------+
| acct.... |--[ b ]--[ d ]
+--------------+
| password |--[ b ]--[ c ]
+--------------+
| session |--[ e ]--[ c ]
+--------------+

By way of explanation, 圖的左邊表示一個應用程序:X. 這應用程序有和Linux-PAM 庫的接口並且在認證方面沒有什麼特別之處. Linux-PAM 函數庫 (圖的中部) 查詢PAM配置文件的內容並且裝入適用於程序 X 的模塊. 這些模塊進入四個管理組( 圖的中下部)中的一個,並且以它們出現在配置文件中的順序堆疊起來 . 這些模組由Linux-PAM呼叫後,爲應用程序執行不同的認證工作 . 需要用戶提供或提供給用戶的文本信息,可以通過使用應用程序提供的conversation函數來交換.

3.1 Getting started

以下段落由Seth Chaiklin供稿:

到現在爲止,我們描述了PAM如何工作在一個理想世界裏,
在這兒所有應用程序都被正確編寫.
然而,到此時(1998年10月), 這距離現實還太遠.
因此,在你試圖把PAM用於你的系統時,還得考慮一些實際因素.

Why bother, is it really worth all the trouble?

如果你運行Linux作爲單用戶系統, 或者在一個所由用戶都可信任的環境, 那麼用PAM就沒什麼實際優勢.

Ed: 事實上還是有一個好處, 你可以令認證變啞, 就象沒有任何認證....像Win95.

在網絡環境裏, 很顯然,關於用戶你必需多想點, it is clear that you need to think a little more about how users etc., are authenticated:]

如果運行Linux作爲服務器, 提供一些不同的服務 (e.g., 經由密碼控制的WWW區域限制, PPP),
那PAM就有一些實際的和有趣的價值. 尤其是, 通過使用使用模塊, PAM 能夠使
一個程序經過幾個不同的密碼庫來查找, 哪怕那個程序沒有專爲那密碼庫寫的代碼.
下面有一些例子Here are some examples of the possibilities
that this enables.

o Apache 有一個模塊提供PAM服務. 認證特定的目錄權限可以讓PAM來控制,
這意味着,所有PAM能調用的模塊都可以被Apache使用,包括RADIUS,NIS,NCP
(NCP用來經由Novell的密碼庫認證).

o pppd 有一個PAM化了的版本(來自 RedHat) 現在有可能用一系列的數據庫來驗證
ppp用戶. 作爲對基於Linux的密碼庫(/etc/passwd,/etc/shadow)的擴充, 你可以
用PAM模塊來進行基於Novell密碼庫或NT(NTLM)密碼庫的認證.

o 以上兩則例子可以有組合應用.想象一下你辦公室/部門的用戶已經經過用戶名/密碼
認證登入Novell或NT.如果你想要他在Linux下的應用也用相同的用戶名/密碼
(爲PPP登入,web服務,或者只是普通的shell登入),你可以通過PAM進行基於這些已
存在的數據庫(譯者注:Novell的或者NT的)的用戶認證,而無須在Linux和LAN服務器裏
各自維護獨立的數據庫.

我可以讓所有需要有用戶認證的程序都來用PAM嗎?

有的可以,有的不行.可以的是那些你能得到源代碼,並且可以加入適當的PAM函數的程序.
不行的是那些你無法得到源代碼,並且可執行程序沒有加入PAM的功能.

也就是說, 如果一個程序打算要用PAM,那麼它必須在程序裏直接的包含PAM函數.
不這樣做就不可能用PAM.

我怎麼知道程序是否已經含有PAM的代碼了呢?

一個快速的(但不總是可靠)的方法是執行ldd <程序>
如果 libpam 和 libpam_misc 不在程序所需的函數庫之列,那麼它將不會用PAM.
然而,這兩個函數庫還是可能已經包含進程序了,不過問題依然存在,因爲把PAM
寫死在程序不會如你期望的工作.所以一個更可靠的方法是做一下的測試:

在/etc/pam.d目錄裏,需要爲程序設有一個配置文件.具體的文件名是寫死在程序裏的.
通常和程序名一樣,但卻不總是這樣.爲舉例說明,假設程序名字叫"pamprog",配置文件
是/etc/pam.d/pamprog.

在/etc/pam.d/pamprog裏寫這兩行:

auth required pam_permit.so
auth required pam_warn.so


現在試着執行pamprog. 配置文件的第一行是說所有用戶都被允許. 第二行會在你的
syslog 文件(或者其它你的syslog會寫的文件) 裏寫一個warning.
如果這測試是成功的,那麼你就知道你有一個"懂"pam的程序,並且你可以開始更有趣的工作:
決定如何在你的/etc/pam.d/pamprog裏堆徹PAM模塊.

4. Linux-PAM的設定檔

Linux-PAM 給系統管理員提供了相當大的*性來設定系統里程式的權限賦予. 由PAM控制的系統安全的本地配置可以包含在以下兩個地方: 或者是一個單一的系統文件: /etc/pam.conf; 或者是/etc/pam.d/ 目錄下的文件. 本章我們來討論這些文件的語法和一般的選項.
4.1 設定檔的語法

請注意, 在這些文件裏 Linux-PAM 特有的符號是不區分大小寫的. 而模塊的路徑,是大小寫敏感的,因爲它標識的是Linux下的文件的名字. 而任何模塊參數的大小寫分別由各個模塊定義.

除以下的行之外,爲系統管理員方便,還有兩個特殊的字符: 註解由'#'開頭,結束於行結束,另外,模塊的描述行可以以 '\'脫字符延續到下一行.

通常/etc/pam.conf裏的每一行有以下格式:

service-name module-type control-flag module-path arguments

接下來,我們來解釋每個欄位的意思.另一種(也是常被採用的)設置Linux-PAM 的方法是通過/etc/pam.d/裏的文件來實現.在我們解釋完上面的那行之後, 我們就來討論這種方法.

service-name

這筆記錄相關的服務名稱.通常這服務名稱是特定應用程序的名字.比如, `ftpd', `rlogind' 和 `su' 這些. .

有一個保留的服務名稱,它是用來定義默認的認證機制的. 它就是`OTHER',大小寫無關.注意,當已經有爲指定服務定義了模塊,那麼 `OTHER' 記錄會被忽略.
module-type

模塊的四種(目前是)類型.這四種類型是:

* auth; 這種模塊類型確定有關用戶認證的兩方面. 第一,它確認用戶就是他們自己,這通過指示應用程序提示用戶輸入密碼或者其它證實身份的方法.第二,這類模塊會賦予成員資格 Secondly, the module can grant group membership (independently of the /etc/groups file discussed above) or other privileges through its credential granting properties.
* account; 這些模塊處理非認證級的帳號管理. 典型的用法是基於一天的不同時間段來限制/允許訪問某服務,當前可用的系統資源 (最大用戶數)或者限制特定用戶---'root只能從控制檯登錄.
* session; 首先, 這類模塊和一系列動作有關,指在用戶得到/失去服務時要做的事. 這包括記錄用戶的登錄/登出,掛載必須的目錄等等.
* password; 這最後一種類型在更新用戶的認證標誌時需要. 通常,各個基於"質問/回答"(譯註:指傳統的用戶名/密碼的認證方法)的認證方法(auth)有一個對應的此模塊.

control-flag

控制符用來指示當某一模塊返回成功或失敗時PAM如何動作. 既然模塊可以被堆疊 (同種類型的模塊按先後順序執行,一個接一個), 控制符決定每個模塊的重要程度.應用程序不會直接接收'/etc/pam.conf' 裏列出的每一個模塊的成功或失敗的結果. 相應的是,它只從Linux-PAM接收一個 成功 或 失敗 的結論. 這些模塊的執行順序就是它們在 /etc/pam.conf裏的記錄的順序;排在前面的記錄在排在後的記錄之前被執行. 在Linux-PAM 0.60版本里, 這個control-flag 可以有兩種語法來定義.

簡單一些(也是過去的)語法是用一個限定詞指示相關模塊的重要程度. 有四個關鍵字: required, requisite, sufficient 和 optional.

Linux-PAM 將這四個關鍵字解釋爲:

* required; 需要的,這表明此模塊返回成功值對於整個module-type的成功是必要的. 此模塊的返回失敗並不會傳回給用戶直到剩下的模塊(同樣module-type)都執行過.
* requisite; 必要的,類似 required, 只不過, 當這類模塊返回失敗時,整個控制會立刻回到應用程序. 返回值同第一個需要的 或 必要的模塊返回的失敗. 注意,這標誌可以用來防止 required or requisite module to fail. Note, this flag can be used to protect against the possibility of a user getting the opportunity to enter a password over an unsafe medium. It is conceivable that such behavior might inform an attacker of valid accounts on a system. This possibility should be weighed against the not insignificant concerns of exposing a sensitive password in a hostile environment.
* sufficient; 充分的,這模塊返回的成功會被認爲已經 充分滿足Linux-PAM 庫確認這類模塊(module-type)是成功的條件. 如果沒有先前的requisite 模塊返回了失敗,那麼不再會有其它'堆疊' 的模塊被呼叫. (注意, 這種情況下,隨後的requisite 模塊就不會 被呼叫.). 這模塊返回的失敗不會看作是致命的錯誤而至影響應用程序從這module-type 得到成功的結果.
* optional; 可選的,正如這名字一樣,此?control-flag 致使模塊對最終的成功或失敗的結果不會產生決定性的影響. 一般,Linux-PAM 在確定整個模塊堆成功活失敗時忽略這模塊. 然而, 當從之前或後續的模塊得不到明確的成功或失敗的結果時,這模塊將決定返回給應用程序的狀態. 後種情況會出現在比如當其它模塊返回PAM_IGNORE 時.

更復雜(新)的語法則更明確,使管理員有更多的控制用戶認證的空間. 這種控制符以方括號包含,由一系列的value=action 對組成:

[value1=action1 value2=action2 ...]

這裏的 valueI 有以下值 return values: 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; conv_again; incomplete; 和 default. 最後的 (default) 被用來定義當沒有明確定義時的默認動作.

actionI 可以是一個正數或者是以下標識: ignore; ok; done; bad; die; 和 reset. 當以一個正數J 作爲action 時,它的作用是指示以下J個模塊將被跳過. 通過這種手段, 管理員可以開發出適度複雜的模塊堆疊,它以許多不同的路徑執行. 至於以何種路徑則決定於某個模塊的反應.

* ignore - 此類模塊的返回狀態將不會影響應用程序所得到的返回值.
* bad - 這表示相應的返回值將被認爲是模塊失敗. 如果此模塊是堆疊中的第一個失敗的模塊, 它的狀態值將作爲整個堆疊的狀態.
* die - 和 bad 相同,不過會終止整個模塊堆疊,PAM立即返回到應用程序.
* ok - 這告訴PAM 管理員要讓此返回值直接作用於整個模塊堆疊的返回. 換句話說, 如果堆疊的原先狀態會導致返回 PAM_SUCCESS, 這模塊的返回值將會覆蓋這結果. 請注意:如果堆疊的原先狀態保存着一些意爲模塊失敗的值,這'ok'將不會用來覆蓋那樣的值.
* done - 和 ok 一樣, 不過會終止整個模塊堆疊, PAM立即返回到應用程序.
* reset - 清除儲存模塊堆疊狀態的內存並且重新開始下一組堆疊.

來體會一下這種新語法的強大之處, 從 Linux-PAM-0.63起, 客戶插件**的概念被引進. 這多少使PAM支援從C/S應用程序固有的傳輸協議進行機器-機器的認證成爲可能.(?) 通過 ``[ ... value=action ... ]'' 的語法, 使應用程序對支援binary prompt?的客戶端採用binary prompt?, 而對舊有的客戶端則向後兼容的採用另一種認證模式. 夠靈活吧?
module-path

是可動態加載目標文件的路徑; 也即可插入式模塊 本身. 如果路徑的首字符是 `/', 那它被作爲一個完整路徑. 如果不是這樣, 那模塊的路徑則會加上默認的模塊路徑: /usr/lib/security (見 above).
args

args 是一組傳給模塊的參數. 類似一般Linux的指令的參數. 通常, 合法的參數是可選的並且是模塊特有的. 無效的參數會被模塊忽略, 可是, 當抓到一個無效參數, 模塊被要求寫一個錯誤信息到 syslog(3). 下一節有一個一般 選項的列表.

設定檔裏如果有任一行有格式錯誤, 那通常會導致認證流程失敗. 相應的錯誤信息會通過呼叫syslog(3)寫入系統日誌.
4.2 基於目錄的設定

從0.56版開始有比單個配置文件更靈活的做法, 可以通過/etc/pam.d/裏的文件來配置libpam. 這種方法,/etc/pam.d/裏的文件名和服務名(service-name)相同(小寫): 這是各服務的個性化設置檔.

Linux-PAM 可以編譯成兩種模式之一. 首選的模式是使用/etc/pam.d/ 或/etc/pam.conf設定,但不是同時兩者皆可.也就是說, 如果</etc/pam.d/目錄存在那麼libpam僅使用這目錄裏的文件當作設定檔. 當/etc/pam.d/不存在時就用/etc/pam.conf. 另一種模式是(是RedHat4.2以上版本的模式)按順序同時用/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

唯一的差別是service-name不再出現.service-name是給定的配置文件名. 例如,/etc/pam.d/login 裏包含了login的配置.

此種設置方法比起處理單個文件有很多優點. 列舉如下以幫助讀者來決定採用何種方案:

* 遺漏應用程序的配置的機會比較小. 當手工編輯設定檔時也少設定一個欄位.
* 更易於維護. 配置某個應用程序不會有妨礙到別的應用程序的危險.
* 建立不同的服務的配置文件爲到某個文件的符號連接也是可能的. 這使保持不同的應用程序採用一致的系統策略變得容易些. (It should be noted, to conserve space, it is equally possible to hard link a number of configuration files. However, care should be taken when administering this arrangement as editing a hard linked file is likely to break the link.)
* 更快的配置文件解析,只有和此服務相關的條目纔會解析.
* 採用文件系統的文件權限可以限制個別Linux-PAM設定檔的讀權限.
* 包管理變得更簡單. 每次當有新程序安裝時,只需要附上/etc/pam.d/xxxxxx.

4.3 通用的可選參數

一下是一些基本所有模塊都識別的可選參數.參數(包含這些)通常是可選的.

debug

呼叫 syslog(3) 函數在系統日誌裏記錄下debug信息.
no_warn

指示模塊不要丟warning信息給應用程序.
use_first_pass

這模塊將不會提示用戶輸入密碼,它可以得到前面輸入過的密碼(從上一個auth模塊)並且用它.如果那密碼不正確,那麼用戶就不被認證.(這模塊只對auth和password模塊有意義.)
try_first_pass

這模塊會先拿前面輸入過的密碼來認證(從上一個auth模塊).如果通不過認證,就提示用戶輸入密碼.(這模塊只對auth模塊有意義.)
use_mapped_pass

這參數目前沒有任何Linux-PAM發佈的模塊支援,因爲可能會違反美國加密軟件出口限制.在美國國內,模塊開發者當然可以自由的實現它(他國的開發者 也一樣). For compatibility reasons we describe its use as suggested in the DCE-RFC 86.0, see section bibliography for a pointer to this document.

use_mapped_pass 指示模塊拿前一個模塊生成的認證明文來產生一個加/解密的的鍵 ,以這鍵來安全的存儲/取得此模塊所需的認證標識. In this way the user can enter a single authentication token and be quietly authenticated by a number of stacked modules. Obviously a convenient feature that necessarily requires some reliably strong encryption to make it secure. This argument is intended for the auth and password module types only.
expose_account

通常模塊暴露用戶帳號的有關信息不是個安全的策略. 有時象用戶名,用戶的家目錄,首選的shell這些信息可被用來***這帳號. 可是,這些信息不被視爲威脅:在一個可信的環境裏當要求輸入密碼時顯示用戶的全名, 這被叫做"易用性".expose_account是個標準的模塊參數,當管理員覺得合適(譯註: 指暴露用戶帳號的信息)時可以使模塊和帳戶信息少些離散.

4.4 設定檔的範例

在這章,我們給出一些可以出現在Linux-PAM的設定檔裏的條目的範例. 作爲第一次嘗試配置你的系統,你可能會得的比實現它們更糟糕.
默認策略

對於關鍵的系統,最好是有個適度安全的OTHER條目.以下是個"偏執狂"的設定 (以此開始不是個壞想法!):

#
# default; deny access
#
OTHER auth required /usr/lib/security/pam_deny.so
OTHER account required /usr/lib/security/pam_deny.so
OTHER password required /usr/lib/security/pam_deny.so
OTHER session required /usr/lib/security/pam_deny.so

Whilst fundamentally a secure default, this is not very sympathetic to a misconfigured system. For example, such a system is vulnerable to locking everyone out should the rest of the file become badly written.

pam_deny (在後面的章節裏解釋)不夠複雜.比如,它被呼叫時不會記錄任何信息, 如此除非用戶告訴管理員說他不能執行某應用程序,管理員可能因爲不知道他的系統被錯誤配置而已經遠遠的走開了.

把下面的兩行加在前面的例子之前就可給管理員提供合適的警告.

#
# default; wake up! This application is not configured
#
OTHER auth required /usr/lib/security/pam_warn.so
OTHER password required /usr/lib/security/pam_warn.so

兩行 ``OTHER auth''是堆疊的範例.

如果用/etc/pam.d/下的文件來設定,相應的設定檔如下:

#
# default configuration: /etc/pam.d/other
#
auth required /usr/lib/security/pam_warn.so
auth required /usr/lib/security/pam_deny.so
account required /usr/lib/security/pam_deny.so
password required /usr/lib/security/pam_warn.so
password required /usr/lib/security/pam_deny.so
session required /usr/lib/security/pam_deny.so

這是唯一完整的配置/etc/pam.d的例子, 大體上能說明如何轉換剩下的例子到這種配置方案.

對於不重要的主機,管理員不想要Linux-PAM的強大能力,以下(從/etc/pam.conf)裏節選的行仿效了歷史上的Linux的設定.

#
# default; standard UNIX access
#
OTHER auth required /usr/lib/security/pam_unix_auth.so
OTHER account required /usr/lib/security/pam_unix_acct.so
OTHER password required /usr/lib/security/pam_unix_passwd.so
OTHER session required /usr/lib/security/pam_unix_session.so

通常這提供了大多數應用程序一個能執行的環境.不過大多數不代表所有. 如果想要提供anonymous-ftp,就要對ftpd多加幾行.

要開放anonymous-ftp, 得用下面幾行來替換默認(OTHER)設定.

#
# ftpd; add ftp-specifics. These lines enable anonymous ftp over
# standard UNIX access (the listfile entry blocks access to
# users listed in /etc/ftpusers)
#
ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ftpusers

注意,第二行是必須的,因爲如果某特定的服務在/etc/pam.conf裏存在任何條目, 那麼默認的設定就會被服務程序(這裏指ftpd)忽略. 又一次,這還是個模塊堆疊的例子. 用了sufficient控制符.這是說 ``如果這個模塊認證了用戶,就忽略會面的auth模塊 ''. 還有它用了``use_first_pass''參數, 這指示UNIX認證模塊不要提示用戶輸入密碼,而是採用ftp模塊已經獲得的那個密碼.

5. Linux-PAM的安全問題

這一章討論以安全的方式使用Linux-PAM的一些好習慣. 目前還可憐的少....歡迎提供建議!
5.1 如果弄錯了

Linux-PAM 有可能嚴重改變你係統的安全級別.你可以選擇沒有防護或絕對安全 (不允許訪問).通常, Linux-PAM 容易犯後種錯誤. 任何設定檔的錯誤將會部分或完全禁止對系統的訪問.

在配置Linux-PAM時最可能遭遇的最生動的問題是刪除設定檔: /etc/pam.d/* 和/或 /etc/pam.conf. 這將會把你關在自己的系統門外.

爲了恢復, 最好賭一下重開機進入單用戶模式然後設定正確的文件. 下面是從David Wood的救生email改寫而來:

注意: 一下假定進入單用戶模式不需要輸入密碼. 然而, Debian和其他一些發佈版不是這樣的. Init會呼叫sulogin來要求輸入root的密碼.程序sulogin 不用PAM,所以毀壞掉的PAM設定不會破壞這程序.

> 那我先在還能做些什麼苦差呀?

好,不要驚慌. 你首先要認識到的是這種事情會發生在50%的從未碰過PAM的用戶身上.
這已經不止發生一兩次了,每次都不一樣,但是最終,每次解決方法總是一樣的.

首先,我希望你設定了LILO的延時.如果是的,重開機,按下shift或者tab或其它什麼鍵,
然後輸入:

LILO boot: linux single

(把 'linux' 替換成你的linux啓動字串).
這會把你帶進系統而不用登入. 想知道從控制檯破掉一臺Linux主機是多容的事?
現在知道了吧.

如果沒法那樣做,那你就要一個啓動軟盤和一個根文件系統盤象slachware的rescue.gz.
(Red Hat的安裝盤有這樣的模式.)

總之,重點是要進入到root提示符.

然後, 我假設你還沒有完全打爛你的PAM安裝包 - 僅僅是破壞了設定檔.
這裏是重新設定PAM的步驟:

cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d

然後用vi在這目錄下創建一個叫"other"的文件.包含下面四行:

auth required pam_unix_auth.so
account required pam_unix_acct.so
password required pam_unix_passwd.so
session required pam_unix_session.so

現在你有了PAM的最簡單的設置了, 這象你以前用的方式一樣工作.
所有的事情又魔法似的能運作了.
來試着按ALT-F2從另一控制檯登入. 如果無法登入, 你就有了***煩了,或者打錯了什麼.
奇怪的是如果你在設定檔裏輸錯了東西, 你不會從控制檯得到任何錯誤 - 錯誤只會記錄
在日誌檔裏. 所以看看那兒!(tail /var/log/messages.)

從現在起你可以回頭做實際設定, 但願這首次經歷沒把你搞懵了. :/

一些要點 (to make everything "right" with Red Hat...):

從RedHat安裝目錄安裝最新的pam, pamconfig, and pwdb , 下一個指令

rpm -Uvh [或需要加上 --force too] pam-* pamconfig-* pwdb-*

然後確認你安裝(或重裝)了最新版的libc, util-linux, wuftp, 和 NetKit. 或許
還有相關的x應用程序, 像xlock,但我還從沒有用過.(注:這篇文章寫的比較早,那時候
X程序很少)

5.2 防止採用一個脆弱的"other"設定.

擁有一個脆弱的默認設定(OTHER)是件壞事. OTHER是所有面向PAM的程序的默認設定,如果它很脆弱, 你的系統就有可能變得易受***.

這裏有個"other"設定的例子.pam_deny 模塊會拒絕所有訪問同時pam_warn模塊會在在系統日誌裏記下auth.notice:

#
# The PAM configuration file for the `other' service
#
auth required pam_deny.so
auth required pam_warn.so
account required pam_deny.so
account required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
session required pam_warn.so

6. 可用模塊的參考指南

以下是目前Linux-PAM可用的各種模塊的具體說明. 通常這些模塊可以自由使用. 除非特別指出.

在拷貝下面的例子時也請注意 on text conventions above裏的備註.
6.1 access 模塊
概要

模塊名:

pam_access
作者:

Alexei Nogin <[email protected]>
維護者:

作者
提供的管理組:

account
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要一個設定檔:/etc/security/access.conf
網絡接口:

如果設定了就通過PAM_TTY , 否則嘗試呼叫ttyname()從標準輸入文件描述符得到tty名字.標準的 gethostname(), yp_get_default_domain(), gethostbyname() 呼叫. NIS 用來提供網絡用戶組的支持.

概述

提供logdaimon(?)類型的登錄訪問控制.
Account component

識別的參數:
描述:

這模塊提供基於登錄名稱和主機(或域名),internet地址(或網絡數),或者非網絡登錄的終端名字的錄訪問控制.診斷信息通過syslog(3)記 錄. 來自Wietse Venema的logdaemon-5.6裏的login_access.c經過A. Nogin修改後採用.
例子/建議用法:

推薦使用. 例如,在管理像NIS服務器和郵件服務器時, 你需要有一些活動的帳號, 但卻不想所有這些帳號都有登錄的權限.

對於/etc/pam.d類型的設定方式,你的模塊放在/lib/security裏, 把下面一行加在 /etc/pam.d/login, /etc/pam.d/rlogin, /etc/pam.d/rsh 和 /etc/pam.d/ftp前面:

account required /lib/security/pam_access.so

注意, 除非你的系統忽略.rhosts, 否則這模塊不會產生作用. 見pam_rhosts_auth的文檔.

在發佈包裏包含有一個 access.conf 的樣本.

6.2 Chroot
概要

模塊名:

pam_chroot
作者:

Bruce Campbell <[email protected]>
維護者:

Author; proposed on 20/11/96 - email for status
提供的管理組:

account; session; authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:

Unwritten.
系統依賴:
網絡接口:

要求是 localhost.

概述

這模塊的目的是對一般用戶進行透明的包裹, 這可以把他們置於一個僞裝的文件系統 (比如, 他們的'/' 實際上是 /some/where/else).

如果你有幾個不同類的用戶, 並且你對於安全性有一點點偏執, 那這模塊將非常有用. 這可以用來限制哪些用戶能看到什麼, 並且限制他們只能執行哪些程序.
Account component:

Need more info here.
Authentication component:

Need more info here.
Session component:

Need more info here.

識別的參數:

Arguments and logging levels for the PAM version are being worked on.
描述:
範例/建議用法:

提供一組合理的程序 - 僅放入 'cat', 'ls', 'rm', 'cp' 和 'ed' 有點...

不要太極端 (比如, 你可以爲每個用戶設定各自分開的環境, 但這樣會太浪費磁盤空間.)

6.3 Cracklib 可插入的密碼強度檢查程序
概要

模塊名:

pam_cracklib
作者:

Cristian Gafton <[email protected]>
維護者:

作者.
提供的管理組:

password
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要系統庫 libcrack 和系統字典: /var/cache/cracklib/cracklib_dict.
網絡接口:

概述

這模塊可以插入給定程序的password堆疊來提供密碼的強度檢驗.

這模塊以以下流程運行: 它首先呼叫Cracklib例程來檢查密碼的強度; 如果Cracklib認可, 那麼模塊會經行額外一些檢查. 這包括:

* Palindrome - 新密碼是否爲舊密碼的迴文?
* Case Change Only - 新密碼是否只是拿舊密碼改了些大小寫?
* Similar - 新密碼是否太像舊密碼? 這由一個參數控制, difok 這是新舊密碼的相差字符能被接受的最小個數, 模式是10個或者新密碼的1/2長, 二者取小的那個.
* Simple - 新密碼是否太簡單? 這由五個參數控制: minlen, dcredit, ucredit, lcredit 和 ocredit. 這些參數如何生效以及默認值是什麼見參數一節.
* Rotated - 新密碼是否爲舊密碼的輪轉?
* Already used - 密碼是否曾經用過? 先前用過的密碼保存在/etc/security/opasswd裏.

不帶參數的配置這模塊可以很好的工作在標準的unix密碼加密環境. 對於MD5加密, 密碼可以長於8個字符,那麼這模塊的默認設定就使用戶選擇一個滿意的密碼變得困難了. 顯然, 對於新密碼不能包含多於一半的舊密碼的字符的要求就成了一個不一般的限制了. 比如, 舊密碼"the quick brow fox jumped over the lazy dogs" 將難於更改... 此外, 默認設定允許密碼短至5個字符. 對於採用md5加密算法的系統, 加大允許的最短密碼長度會是個好主意. One can then allow more credit for different kinds of characters but accept that the new password may share most of these characters with the old password.
Password component

識別的參數:

debug; type=XXX; retry=N; difok=N; minlen=N; dcredit=N; ucredit=N; lcredit=N; ocredit=N;
描述:

這部件的動作是提示用戶輸入密碼然後通過比對系統字典和一連串規則來檢查它的強度以識別出差勁的選擇.

默認動作是提示用戶輸入一個密碼, 檢查強度, 然後, 如果通過檢查, 提示第二次輸入密碼 (用來檢驗第一次的輸入是正確的). 這之後, 密碼被當作新的認證標識傳送給隨後的安裝的模塊.

默認的動作可以用一些參數改成許多不同的方式:

* debug - 這選項令此模塊寫入信息到syslog(3)以顯示此模塊的現爲(此選項不會 把密碼信息寫入日誌檔).
* type=XXX - 提示用戶輸入密碼的默認提示符是: ``New UNIX password: '' 和 ``Retype UNIX password: ''. 用此參數可以把 "UNIX" 替換成 XXX.
* retry=N - 本模組要求新密碼(用來檢查強度)的默認次數是1次. 用這參數可以增加到N次.
* difok=N - 這參數會改變允許新舊密碼的字符差異爲至少10個這樣的默認值. 此外, 如果有一半的字符不同, 新密碼就會被採用.
* minlen=N - 可接受的最短的密碼長度+1. 此外對於新密碼的長度, 對於每個不同種的字符 (其它,大寫,小寫 和數字),會得到"加分" (長度+1). 此參數的默認值是9, 這對於舊的UNIX密碼體系已經夠了, 但是對於利用md5的額外安全性或許太小了. 注意, Cracklib本身有一對長度的限制: 4, 寫死在程序裏的"路太短"的限制;6,定意的限制.這兩個限制會不經過參考minlen 而被檢查出來. 如果你要允許密碼長度短至5, 你要麼不要使用此模塊要麼重新編譯crack庫並重新編譯此模塊.
* dcredit=N - 這是對於新密碼因包含數字而得到"加分"的限制. 如果你有小於或等於N個數字, 每個數字將會對整個長度+1來迎合當前minlen 的值. dcredit的默認是1, 對於小於10的minlen 推薦此值.
* ucredit=N - 這是對於新密碼因包含大寫字符而得到"加分"的限制. 如果你有小於或等於N個大寫字符, 每個大寫字符將會對整個長度+1來迎合當前minlen 的值. ucredit的默認是1, 對於小於10的minlen 推薦此值.
* lcredit=N - 這是對於新密碼因包含小寫字符而得到"加分"的限制. 如果你有小於或等於N個小寫字符, 每個小寫字符將會對整個長度+1來迎合當前minlen 的值. lcredit的默認是1, 對於小於10的minlen 推薦此值.
* ocredit=N - 這是對於新密碼因包含其它字符而得到"加分"的限制. 如果你有小於或等於N個其它字符, 每個其它字符將會對整個長度+1來迎合當前minlen 的值. ocredit的默認是1, 對於小於10的minlen 推薦此值.

範例/建議用法:

爲舉例說明如何使用此模塊, 我們列出如何將此模塊和pam_unix 部件堆疊:

#
# 下面兩行堆疊了兩個password類型的模塊. 在這例子裏, 用戶有3次機會輸入健壯的密碼.
# "use_authok"參數確保pam_unix模塊不再另外提示輸入密碼,
# 而是採用由pam_cracklib提供的密碼.
#
passwd password required pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok

另外一個例子(以/etc/pam.d/passwd的格式)是用md5密碼加密的情形:

#%PAM-1.0
#
# 下面兩行採用MD5系統, 密碼長度最少14+出現數字的最多2個"加分"+
# 出現其它字符的最多2個"加分", 並且至少有3個字符沒有出現在舊密碼中.
#
password required pam_cracklib.so \
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_unix.so use_authtok nullok md5

6.4 死鎖模塊
概要

模塊名:

pam_deny
作者:

Andrew G. Morgan <[email protected]>
維護者:

current Linux-PAM maintainer
提供的管理組:

account; authentication; password; session
Cryptographically sensitive:
安全等級:
代碼清潔度:

清潔的.
系統依賴:
網絡接口:

概述

這模塊用來拒絕訪問. 它永遠透過PAM架構告知程序失敗. 正如概述 above裏提到的, 這模塊適合用在默認(OTHER)條目.
Account component

識別的參數:
描述:

這部件除了返回失敗外不做任何動作, 返回類型是 PAM_ACCT_EXPIRED.
範例/建議用法:

把這模塊堆疊在account 裏將會阻止用戶通過應用程序(引用Linux-PAM的帳戶管理函數pam_acct_mgmt())獲取訪問.

下面的例子使登入變得不可能:

#
# add this line to your other login entries to disable all accounts
#
login account required pam_deny.so

Authentication component

識別的參數:
描述:

這部件除了返回失敗什麼也不做, 當pam_authenticate()被呼叫(當應用程式試圖認證用戶時)時返回值是PAM_AUTH_ERR; 當pam_setcred()被呼叫(當建立連接並設置用戶證書時 -- 在具體實現中這函數不太可能被呼叫)時返回 PAM_CRED_UNAVAIL .
範本/建議用法:

爲拒絕默認程序的訪問, 在你的Linux-PAM裏包含下面一行:

#
# add this line to your existing OTHER entries to prevent
# authentication succeeding with default applications.
#
OTHER auth required pam_deny.so

Password component

識別的參數:
描述:

模塊的這部件會阻止用戶有機會修改密碼. 它總是返回PAM_AUTHOK_ERR.
範本/建議用法:

這模塊可以用來阻止應用程序更新申請者的密碼. 比如, 爲阻止login 在用戶的舊密碼過期後自動提示輸入新密碼, 應該把下面一行放在你的設定檔裏:

#
# add this line to your other login entries to prevent the login
# application from being able to change the user's password.
#
login password required pam_deny.so

Session component

識別的參數:
描述:

模塊的這一方面會阻止應用程序在主機上開啓會話.
範本/建議用法:

和其它的session模塊一起工作, 那模塊也許顯示一下"當日消息". 這模塊可以用來阻止用戶開啓shell. 如有pam_motd在先, 我們或可用下面的設置來阻止用戶登錄並提示用戶現在是系統維護時間:

#
# An example to see how to configure login to refuse the user a
# session (politely)
#
login session required pam_motd.so \
file=/etc/system_time
login session required pam_deny.so

6.5 Set/unset 環境變量
概要

模塊名:

pam_env
作者:

Dave Kinchlea <[email protected]>
維護者:

Author
提供的管理組:

Authentication (setcred)
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

/etc/security/pam_env.conf
網絡接口:

概述

這模塊允許(取消)設定環境變量. Supported is the use of previously set environment variables as well as PAM_ITEMs such as PAM_RHOST.
Authentication component

識別的參數:

debug; conffile=configuration-file-name; envfile=/env-file-name; readenv=/0|1
描述:

這模塊允許你(取消)設定任意的環境變量爲固定字串, 先前的環境參數和/或PAM_ITEM.

通過設定檔(默認是,/etc/security/pam_env.conf, 但是可由connfile 參數改變) 進行所有的控制. 每行由變量名開始, 每個變量有兩個可選項: DEFAULT和OVERRIDE. DEFAULT 用來設定變量的默認值, 如果沒有指定默認值則設爲空字串. OVERRIDE 告訴pam_env如果變量以設定就覆蓋(覆蓋" "默認值). 如果未設定OVERRIDE, 則假定爲""並且不會覆蓋其它值.

VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]

(也許不存在的)環境變量可以指定值爲${string} 並且(也許不存在的)PAM_ITEM 可以用來指定值:&{string} . $和& 可以由反斜線脫意爲一般字符 (成爲\$本生). 雙引號可以用來封裝有空格的值 (但是不可以用作變量名)必須整個被引號包含並且裏面不應該有引號或者脫意的引號.

這模塊還可以解析包含單純的每行是鍵=值格式的文件(默認是/etc/environment). 可以用 envfile 旗標設定默認文件並且可以設定readenv 旗標爲1或0來決定是否啓用這選項.

這模塊的行爲可以由以下旗標來更改: flags:

* debug - 往syslog(3)寫更多的信息.
* conffile=filename - 默認的設定檔是/etc/security/pam_env.conf. 這選項可以覆蓋此默認. 必須提供完整的文件名,目錄+文件名.
* envfile=filename - 默認從/etc/environment 裏讀鍵=值對來設定變量. 這選項覆蓋默認文件. 必須提供完整的文件名,目錄+文件名.
* readenv=0|1 - 打開或關閉讀取envfile指定的文件(0=關閉,1=開啓). 默認是開啓.

範本/建議用法:

更多的用法見pam_env.conf .

6.6 filter 模塊
概要

模塊名:

pam_filter
作者:

Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

account; authentication; password; session
Cryptographically sensitive:

Not yet.
安全等級:
代碼清潔度:

在Linux系統下可以乾淨的被編譯.
系統依賴:

需要安裝filters .
網絡接口:

概述

這模塊用來提供給類似ttysnoop(需要一些參考)的程序一個可選的插件. 因爲還沒有爲這功能所寫的插件出現, 這模塊目前只是個玩具. 提供給這模塊的唯一一個插件僅是對輸入輸出流做大小寫轉換. (這會變得非常討厭並對基於termcap的編輯器不太友好)
Account+Authentication+Password+Session components

識別的參數:

debug; new_term; non_term; runX
描述:

每個組建都有呼叫過濾器的能力. 過濾器總是以所屬應用程序的權限被execv(2) 而 不是 以用戶的權限. 因此這些過濾器並不總能被用戶不經關掉相關會話而殺掉.

這模塊的行爲會被傳給它的參數相當程度的左右:

* debug - 這選項增加模塊被執行時寫進syslog(3)的信息量.
* new_term - 過濾器的默認動作是會設定PAM_TTY 爲用戶連上應用程序時所用的終端代號. 此參數指示過濾器可以設定PAM_TTY 爲一個過濾了的僞終端.
* non_term - 不要試圖設定PAM_TTY .
* runX - 模塊必須得知道何時呼叫過濾器. 這參數告知過濾器何時被呼叫, 參數後面是各自的過濾器的完整路徑和過濾器執行時的參數.

X 所允許的值是 1 和 2. 這指示過濾器執行的確切時間. 閱讀 Linux-PAM的模塊開發指南會對解釋此觀念有所幫助. 基本上, 針對每個管理組都有多至兩個呼叫此模塊的函數.

在 authentication 和 session 部件裏, 實際上有兩個不同的函數. 對於authentication, 這兩個函數是_authenticate 和_setcred -- 此時 run1 意味着在呼叫_authenticate時執行過濾器而run2 意味着呼叫_setcred時運行過濾器. 對於session來說, run1 意指在_open_session 階段運行過濾器, run2 在 _close_session 作用.

對於account部件. run1 和 run2 的任何一個被運行.

對於password部件, run1 用來指示當_chauthtok第一次被執行(PAM_PRELIM_CHECK階段)時呼叫過濾器,run2 指示第二次時(tt/PAM_UPDATE_AUTHTOK/階段)時呼叫.

範本/建議用法:

在寫作本時, 這模塊鮮有實際應用. 如興趣所致, 你可以試着把下面幾行加入你的login的設定.

#
# An example to see how to configure login to transpose upper and
# lower case letters once the user has logged in(!)
#
login session required pam_filter.so \
run1 /usr/sbin/pam_filter/upperLOWER

6.7 匿名訪問模塊
概要

模塊名:

pam_ftp.so
作者:

Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

提示用戶輸入email地址; 易受欺騙的.(XXX - 需要加工)

概述

此模塊的意圖是提供一個可插入式的匿名ftp訪問模式. mode of access.
Authentication component

識別的參數:

debug; users=XXX,YYY,...; ignore
描述:

此模塊會攔截用戶名和密碼. 如果用戶名是 ``ftp'' 或 ``anonymous'', 用戶的密碼以'@'爲分隔符被分解成PAM_RUSER 和 PAM_RHOST 兩部分; these pam-items being set accordingly. The username is set to ``ftp''. In this case the module succeeds. Alternatively, the module sets the PAM_AUTHTOK item with the entered password and fails.

此模塊的行爲可以有以下旗標修改:

* debug - 往syslog(3) 寫更多的信息.
* users=XXX,YYY,... - 替代 ``ftp'' 或 ``anonymous'', 提供給以逗號分開的用戶以匿名訪問; ``XXX,YYY,...''. 申請人可以輸入這些用戶名之一, 返回的用戶名設定爲列表中的第一個用戶;``XXX''.
* ignore - 不關心用戶的email地址(如果提供).

範本/建議用法:

見 above.

6.8 羣組訪問模塊
概要

模塊名:

pam_group
作者:

Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:

對於針對setgid狀態的文件可訪問性敏感.
代碼清潔度:
系統依賴:

需要/etc/security/group.conf 文件. 可被編譯成帶有或不帶libpwdb.
網絡接口:

僅通過正確的PAM_TTY 項.

概述

此模塊提供基於用戶名以及他們從哪個終端請求服務的羣組設定. It takes note of the time of day.
Authentication component

識別的參數:
描述:

此模塊不用於認證用戶, 而是用來賦予用戶組的身份(在認證模塊的憑證設定階段). 這些組身份基於他們請求的服務. 組身份列在/etc/security/group.conf .
範本/建議用法:

爲使這模塊正常運作,必需先要有格式正確的/etc/security/groups.conf . 此文件的格式如下.組身份基於服務應用程序滿足此設定檔的任意行來賦予. 沒一行有如下格式(註解以`#'開頭):

services ; ttys ; users ; times ; groups

前四個欄位和pam_time的etc/security/pam_time.conf語法相同, 最後的欄位, groups, 是以逗號(或者空格)分開的一個組的列表. 如果用戶的應用程序滿足前四個欄位, 用戶就被賦予列表中的組身份.

通常, 這模塊對於分配用戶特有的文件訪問權限有幫助. 問題是一旦用戶得到了組身份, 他就可以創建一個setgid 的屬於某羣組的程序. 這之後, 當用戶不再是這個組的成員時, 他們可以通過這程序獲取組身份. 之所以用戶訪問的文件系統如此重要, 是一旦文件系統被加載爲nosuid時, 這樣的程序就無法執行. 爲使這模塊提供任何級別的安全性, 用戶能有寫權限的所有文件系統都應該被加載成nosuid模式.

pam_group 模塊的功能和/etc/group平行. 如果用戶已被此模塊賦予了任何組身份, 他還另外被賦予/etc/group裏的相關組身份.

6.9 Add issue file to user prompt
概要

模塊名:

pam_issue
作者:

Ben Collins <[email protected]>
維護者:

Author
提供的管理組:

Authentication (pam_sm_authenticate)
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

概述

此模塊在當提示輸入用戶名時顯示發佈文件(/etc/issue).
Authentication component

識別的參數:

issue=issue-file-name; noesc;
描述:

此模塊允許你在提示用戶輸入用戶名之前顯示出發佈信息. 默認狀態下也會解析發佈文件中的脫意代碼,類似有些通用的getty(\x 格式).

識別的脫意代碼:

* d - 當前日期
* s - OS名稱
* l - 當前tty的名字
* m - 本系統的架構(i686, sparc, powerpc, ...)
* n - 主機名
* o - 域名
* r - OS的版本發行號(例如 2.2.12)
* t - 當前時間
* u - 當前登入的用戶數
* U - 類似u, 它能區分用"user" 還是 "users" (比如. "1 user" or "10 users")
* v - OS版本/構建日期(比如. "#3 Mon Aug 23 14:38:16 EDT 1999" on Linux).

以下旗標可以用來改變此模塊的行爲:

* issue - 替換默認發佈文件
* noesc - 不解析脫意代碼

範本/建議用法:

login auth pam_issue.so issue=/etc/issue

6.10 The Kerberos 4 module.
概要

模塊名:

pam_krb4
作者:

Derrick J. Brashear <[email protected]>
維護者:

作者.
提供的管理組:

authentication; password; session
Cryptographically sensitive:

採用相關 API
安全等級:
代碼清潔度:
系統依賴:

相關庫- libkrb, libdes, libcom_err, libkadm; 和一組Kerberos的頭文件.
網絡接口:

從網絡上的Kerberos的票據中心得到Kerberos的票據授權票.

概述

此模塊提供了進行Kerberos密碼認證的界面, 它能從Kerberos的票據授權服務器取得票據授權票, 離線時毀掉票據, 和修改Kerberos密碼.
Session component

識別的參數:
描述:

此部件目前會設定環境變量 KRBTKFILE (雖然目前還沒法export這變量), 以及當登出時刪除用戶的票據(要等到login 支持 PAM_CRED_DELETE ).
範本/建議用法:

直到我們能通過Linux-PAM 改變環境.

Password component

識別的參數:

use_first_pass; try_first_pass
描述:

這部件改變用戶的Kerberos密碼, 它首先憑舊密碼從密碼修改服務得到活動鑰匙, 然後發送新密碼給那服務.
範本/建議用法:

僅能用於真實的real Kerberos v4 kadmind. It cannot be used with an AFS kaserver unless special provisions are made. Contact the module author for more information.

Authentication component

識別的參數:

use_first_pass; try_first_pass
描述:

此模塊通過從Kerberos服務器申請票據授權票來驗證用戶的Kerberos密碼, 並且可選的如果本機鍵文件存在就從嘗試此票據中獲取本機的主機鍵並和本機的鍵文件比對.

它還會把票據記錄在文件以便後序使用, 並且在當離線是刪除票據文件(目前還不行,除非login會呼叫PAM_CRED_DELETE).
範本/建議用法:

此模塊可以同採用MIT v4 的Kerberos服務器協同工作. 可以加以修改已使其支持AFS類型的Kerberos. 爲防止密碼算法的不一致,目前還沒有支持.

6.11 The last login module
概要

模塊名:

pam_lastlog
作者:

Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

auth
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

用到/var/log/lastlog裏保存的信息.
網絡接口:

概述

此模塊用於維護/var/log/lastlog 文件. 當程序呼叫pam_open_session()函數時寫入一個條目並且在呼叫pam_close_session()時完成此條目. 這函數還可以顯示一條關於最後一次登錄的信息. 如果應用程序已經有此功能, 則沒有必要使用此模塊.
Authentication component

識別的參數:

debug; nodate; noterm; nohost; silent; never
描述:

此模塊用於無論用戶從何種支援PAM的應用程序登錄系統都提供"Last login on ..." 這樣的信息. 此外, 此模塊還維護/var/log/lastlog 檔.

可有一下旗標改變此模塊的行爲:

* debug - 往syslog(3)裏寫入更多的信息.
* nodate - 當顯示最後登錄的信息時隱藏具體日期.
* noterm - 當顯示最後登錄的信息時隱藏終端名稱.
* nohost - 當顯示最後登錄的信息時隱藏客戶機名稱.
* silent - 不顯示任何最後登錄信息: 僅僅更新/var/log/lastlog .
* never - 如果/var/log/lastlog 沒有包含此用戶的任何曾經登錄的信息, 則顯示用戶從未登錄的信息: ``welcome..." .

範本/建議用法:

此模塊可以用來在用戶login後顯示是否有新郵件. 下面是一個以/etc/pam.conf配置的樣本:

#
# do we have any mail?
#
login session optional pam_lastlog.so

注意, 有些應用程序也許自己會實現這些功能. 這種情況下就不必使用此模塊了.

6.12 資源限制模塊
概要

模塊名:

pam_limits
Authors:

Cristian Gafton <[email protected]>
Thanks are also due to Elliot Lee <[email protected]> for his comments on improving this module.
維護者:

Cristian Gafton - 1996/11/20
提供的管理組:

session
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要有/etc/security/limits.conf 設定檔並且內核要支持資源限制. 也使用libpwdb 庫.
網絡接口:

概述

此模塊通過Linux-PAM 的 開啓-會話的鉤子來設定用戶會話能夠獲取的資源的限制. 由下面會討論的設定檔來更精確的支配動作.
Session component

識別的參數:

debug; conf=/path/to/file.conf
描述:

通過設定設定檔/etc/security/limits.conf 的內容來設定用戶會話的資源限制. uid=0 的用戶不受此約束.

以下旗標可以用來改變此模塊的行爲:

* debug - 往syslog(3)寫入冗長的記錄.
* conf=/path/to/file.conf - 指定一個替換的limits設定檔.

範本/建議用法:

爲使用此模塊, 系統管理員必須首先建立一個 root只讀 的文件(默認是 /etc/security/limits.conf). 這文件描述了superuser想強迫用戶和用戶組的資源限制. uid=0的帳號不會受限制.

設定檔的每一行描述了一個用戶的限制,以下面的格式:

<domain> <type> <item> <value>

上面列出的欄位可以填下面的值:...
<domain> 可以是:

* 一個用戶名
* 一個組名,語法是@group
* 通配符*, 定義默認條目

<type> 可以有一下兩個值:

* hard 爲施行硬 資源限制. 這些限制由superuser設定,由Linux內核施行. 用戶不能提升他對資源的需求到大於此值.
* soft 爲施行軟 資源限制. 用戶的限制能在軟硬限制之間上下浮動. 這種限制在普通用法下可以看成是默認值.

<item> 可以是以下之一:

* core - 限制core文件的大小(KB)
* data - 最大的資料大小 (KB)
* fsize - 最大的文件尺寸 (KB)
* memlock - 最大能鎖定的內存空間(KB)
* nofile - 最多能打開的文件
* rss - 最大的駐留程序大小(KB)
* stack - 最大的堆棧尺寸(KB)
* cpu - 最大的CPU 時間(分鐘)
* nproc - 最多的進程數
* as - 地址空間的限制
* maxlogins - 用戶的最多登錄數
* priority - 用戶進程執行時的優先級

要完全不限制用戶(或組), 可以用一個(-)(例如: ``bin -'', ``@admin -''). 注意,個體的限制比組限制的優先級高, 所以如果你設定admin組不受限制, 但是組中的某個成員被設定檔中某行限制, 那麼此用戶就會依據這樣被限制.

還應該注意, 所有的限制設定只是每個登錄的設定. 他們際不是全局的,也不是永久的 ; 之存在於會話期間.

在limits 的設定檔中, ``#'' 開頭的行爲註解.

pam_limits 模塊會通過syslog(3)報告它從設定檔中找到的問題.

下面是個設定檔的樣本:

# EXAMPLE /etc/security/limits.conf file:
# =======================================
# <domain> <type> <item> <value>
* soft core 0
* hard rss 10000
@student hard nproc 20
@faculty soft nproc 20
@faculty hard nproc 50
ftp hard nproc 0
@student - maxlogins 4

注意, 對同一個資源(見@faculty)的軟限制和硬限制 - 這建立了用戶可以從指定服務會話中得到的默認和最大允許的資源數.

對於需要進行資源限制的服務例程(如login), 把下面一行放在/etc/pam.conf 裏此服務的設定的最後一行(通常在pam_unix session後面):

#
# Resource limits imposed on login sessions via pam_limits
#
login session required pam_limits.so

6.13 The list-file module
概要

模塊名:

pam_listfile
作者:

Elliot Lee <[email protected]>
維護者:

Red Hat Software:
Michael K. Johnson <[email protected]> 1996/11/18
(if unavailable, contact Elliot Lee <[email protected]>).
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:

clean
系統依賴:
網絡接口:

概述

list-file模塊提供基於任意文件的對服務例程的拒絕或允許的設定
Authentication component

識別的參數:

onerr=succeed|fail; sense=allow|deny; file=filename; item=user|tty|rhost|ruser|group|shell apply=user|@group
描述:

這模塊先獲取指定類型的項目 -- user 指定用戶名, PAM_USER; tty 指定請求建立時的獲取的終端名, PAM_TTY; rhost 指定請求建立的主機 (如果有), PAM_RHOST; ruser指定對方主機中發起連接請求的用戶名(如果可以), PAM_RUSER -- 然後尋找這些項目是否出現在filename中. filename每行包含一個項目. 如果找到對應項目, 那麼如果 sense=allow, 則返回PAM_SUCCESS, 認證請求成功; 否則如果 sense=deny, 就返回PAM_AUTH_ERR, 認證請求失敗.

如果有錯誤發生(比方, 如果 filename 不存在, 或者參數不完整), 那麼如果onerr=succeed, 就返回PAM_SUCCESS , 否則如果onerr=fail, 就返回PAM_AUTH_ERR 或者 PAM_SERVICE_ERR.

附加的參數, apply=, 能夠限制應用程序只對指定的用戶 (apply=username)或指定的組(apply=@groupname)適用本規則. 這個附加的限制只對tty,rhost 和shell有意義.

除了這最後一個參數外, all arguments should be specified; do not count on any default behavior, as it is subject to change.

此模塊不授予任何證書.
範本/建議用法:

傳統的``ftpusers'' 認證可以由/etc/pam.conf下面的條目實現:

#
# deny ftp-access to users listed in the /etc/ftpusers file
#
ftp auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ftpusers

注意,列在/etc/ftpusers 裏的用戶將不允許訪問ftp服務.

要只允許指定的用戶可以登錄, 你可以在pam.conf裏設定以下的條目:

#
# permit login to users listed in /etc/loginusers
#
login auth required pam_listfile.so \
onerr=fail item=user sense=allow file=/etc/loginusers

要什這正常工作, 所有允許登錄的用戶都應該列在/etc/loginusers. 除非你明確的要試着把root所在門外, 否則在你這樣設定好, 登出之前最好確認: 要麼root列在/etc/loginusers, 要麼列表裏有用戶可以su 成root.

6.14 The mail module
概要

模塊名:

pam_mail
作者:

Andrew G. Morgan <[email protected]>
維護者:

Author
提供的管理組:

Authentication (credential) Session (open)
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

默認的郵件目錄:/var/spool/mail/
網絡接口:

概述

此模塊查看用戶的郵件目錄並指示裏面是否有郵件. whether the user has any mail in it.
Session component

識別的參數:

debug; dir=direcory-name; nopen; close; noenv; empty; hash=hashcount; standard; quiet;
描述:

此模塊給用戶提供"you have new mail" 的服務. 它可以嵌入到任何有憑證鉤子的應用程序裏. 它給一個信息指示用戶的郵件目錄中是否有最新的郵件. 此模塊還設定Linux-PAM的環境變量 MAIL 爲用戶的郵件目錄.

以下旗標可以用來改變此模塊的行爲:

* debug - 往syslog(3)裏寫入更多信息.
* dir=pathname - 從給定的pathname查找用戶的郵件. 默認的郵件位置是/var/spool/mail. 注意,如果提供的pathname 以`~'開頭, 意指目錄是在用戶的家目錄裏.
* nopen - 指示當用戶獲取證書時不要打印任何信息, 這旗標用來設定MAIL環境變量而不用顯示任何信息.
* close - 指示模塊當用戶被撤回證書時檢查是否有郵件.
* noenv - 不要設定MAIL 環境變量.
* empty - 當用戶的郵箱是空的時候顯示這狀態.
* hash=hashcount - 郵件目錄的hash深度. 比如, hashcount = 2 意味着郵箱是/var/spool/mail/u/s/user.
* standard - 舊的 "You have..." 格式, 不顯示具體的郵箱位置. 同樣實現"empty".
* quiet - 只在有新郵件時才報告.

範本/建議用法:

此模塊用來當用戶登錄到系統是提示他有新郵件. 下面是/etc/pam.conf 的樣本:

#
# do we have any mail?
#
login session optional pam_mail.so

注意,有些應用程序會自己實現這功能, 這種情形下,就不必使用此模塊了.

Authentication compent

authentication 部件和session部件一樣運作, 除了他在pam_setcred()階段被激活.
6.15 在首次登錄是創建用戶家目錄
概要

模塊名:

pam_mkhomedir
作者:

Jason Gunthorpe <[email protected]>
維護者:

Ben Collins <[email protected]>
提供的管理組:

Session
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

概述

爲通過認證的用戶按需創建家目錄.
Session component

識別的參數:

debug; skel=skeleton-dir; umask=octal-umask;
描述:

此模塊對於帳號集中管理(NIS,NIS+,或LDAP)並且多系統訪問的分佈式系統有用處. 它不需要管理員在每個系統都去建用戶的家目錄,而是當用戶第一次成功登錄時自動創建. skeleton目錄(通常是/etc/skel/)用來拷貝默認文件, 這模塊也爲創建的文件設定umask.

以下旗標可以用來改變此模塊的行爲:

* skel - 從skeleton目錄處拷貝默認文件到新創建的家目錄.
* umask - 和你在shell下設umask同樣格式的八進制數.

範本/建議用法:

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

6.16 輸出motd文件
概要

模塊名:

pam_motd
作者:

Ben Collins <[email protected]>
維護者:

Author
提供的管理組:

Session (open)
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

概述

此模塊在成功登錄時輸出motd文件 (默認是/etc/motd) .
Session component

識別的參數:

debug; motd=motd-file-name;
描述:

此模塊允許你當成功登錄後有任意的motd(當日消息)輸出. 默認的文件是 /etc/motd, 但是可以設定爲任意文件.

以下旗標可以用來改變此模塊的行爲:

* motd - 如果不打算用默認文件, 這裏指定文件.

範本/建議用法:

login session pam_motd.so motd=/etc/motd

6.17 The no-login module
概要

模塊名:

pam_nologin
作者:

Written by Michael K. Johnson <[email protected]>
(based on code taken from a module written by Andrew G. Morgan <[email protected]>).
維護者:

Michael K. Johnson <[email protected]>
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:

1個關於dropping const的警告
系統依賴:
網絡接口:

概述

提供標準的Unix nologin的認證.
Authentication component

識別的參數:
描述:

提供標準的Unix nologin的認證. 如果存在/etc/nologin 文件, 則只有root允許登錄; 其他用戶會得到一個錯誤信息並且不能登入. 所有用戶(root 或 其它用戶) 會顯示/etc/nologin裏的內容.

如果不存在/etc/nologin , 此模塊返回成功.
範本/建議用法:

爲使此模塊生效, 所有登錄方法都要由此模塊來把關. 爲和傳統UNIX的nologin相同作用, 它應該被作爲required方法, 並且放在任何sufficient之前.

6.18 The promiscuous module
概要

模塊名:

pam_permit
作者:

Andrew G. Morgan, <[email protected]>
維護者:

Linux-PAM 維護者.
提供的管理組:

account; authentication; password; session
Cryptographically sensitive:
安全等級:

非常低. 極度小心的使用.
代碼清潔度:

Clean.
系統依賴:
網絡接口:

概述

此模塊非常不安全. 必須謹慎使用. 它的動作是永遠允許訪問. 不做任何其它事情.
Account+Authentication+Password+Session components

識別的參數:
描述:

不管用在哪種管理組, 這模塊的動作只是簡單的返回 PAM_SUCCESS -- 操作成功.

在認證部件裏, 用戶名會被獲取. 很多應用程序在不知道用戶名時會覺得不合理.
範本/建議用法:

很難找到應用此模塊的正當理由. 可是, 它還是有些合理的應用. 比如, 系統管理員想要關閉工作站的帳號管理, 同時又要允許登錄, 那麼她可以用下面的配置條目設定ligin:

#
# add this line to your other login entries to disable account
# management, but continue to permit users to log in...
#
login account required pam_permit.so

6.19 The Password-Database module
概要

模塊名:

pam_pwdb
作者:

Cristian Gafton <[email protected]>
and Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

account; authentication; password; session
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要正確的配置libpwdb
網絡接口:

概述

此模塊是pam_unix_..的可插入式的替代品. 它使用Password Database的通用接口. http://linux.kernel.org/morgan/libpwdb/index.html.
Account component

識別的參數:

debug
描述:

參數 debug 令此模塊的帳號管理功能在動作時syslog(3)更多的信息. (由別的功能支持的參數被忽略掉, 但是會在syslog(3) 記錄下錯誤信息.

基於以下的 pwdb_元件: expire; last_change; max_change; defer_change; warn_change, 此模塊執行確認帳號和密碼狀態的任務. 至於後來, 它可以給用戶提出修改密碼的建議或者, 通過PAM_AUTHTOKEN_REQD的返回, 延遲爲用戶提供服務直到他創建了一個新密碼. 以上列出的條目在Password Database Library Guide裏有解釋. documented in the Password Database Library Guide (見上面的鏈接). 如果用戶記錄不包含一個或者更多這些條目, 對應的shadow 檢查不被執行.
範本/建議用法:

在帳號管理模式, 這模塊可以象下面的用法:

#
# 確保用戶帳號和密碼依然有效
#
login account required pam_pwdb.so

Authentication component

識別的參數:

debug; use_first_pass; try_first_pass; nullok; nodelay; likeauth
描述:

參數 debug 令模塊的認證功能寫入syslog(3)更多的信息.

如果用戶的official密碼爲空, 此模塊的默認動作是不允許用戶訪問服務. 參數nullok 用來使此默認失效.

當給出參數try_first_pass, 在提示用戶輸入密碼之前, 模塊會拿通過之前堆疊的 auth模塊認證的密碼來試. 參數use_first_pass 迫使模塊使用上述的密碼並且永遠不會提示用戶 - 如果沒有可用的密碼或密碼不能通過認證, 用戶將被禁止訪問.

參數 nodelay 用來阻止認證部件在認證失敗時的延時請求. 默認動作是請求一個一秒鐘以上的失敗-延遲.

由別的功能支持的參數被忽略掉, 但是會在syslog(3) 記錄下錯誤信息.

有個幫手程序, pwdb_chkpwd, 用來檢查用戶的密碼(當密碼報存在一個只讀數據庫時). 此程序非常簡單,只檢查當前用戶的密碼. 它被此模塊的認證部件以當前用戶的身份顯式的呼叫. 這樣象xlock這樣的程序就不需被設成setuid-root而可以工作.

The likeauth argument makes the module return the same value when called as a credential setting module and an authentication module. This will help libpam take a sane path through the auth component of your configuration file.
範本/建議用法:

此模塊的完整功能由一個恰當的/etc/pwdb.conf來控制, 指定的用戶數據庫控制用戶認證的來源.

Password component

識別的參數:

debug; nullok; not_set_pass; use_authtok; try_first_pass; use_first_pass; md5; bigcrypt; shadow; radius; unix
描述:

pam_pwdb模塊的這一部分執行更新用戶密碼的任務. 受惠於libpwdb的靈活性, 此模塊可以把用戶密碼從一個數據庫搬到另一個去, 也許以動態的方式使用戶密碼記錄安全 (此時還處於初期ALPHA階段!) - 這正是shadow, radius 和 unix 參數的意圖.

在傳統的UNIX密碼數據庫(這裏保存着用戶的加密密碼)的情況下, 參數md5用來採用MD5的加密算法以取代傳統的 crypt(3)呼叫. 還有種選擇, 參數 bigcrypt 採用DEC(數字設備公司)的對標準UNIX的crypt()的算法進行`C2'擴展的算法以加密超過8位長的密碼.

參數nullok 用來允許改變一個原先爲空的密碼. 如果沒有此參數, 空的密碼會當成是被鎖住的帳號.

參數use_first_pass 用來阻止選擇舊的和新的密碼,而是採用password裏此模塊之前的模塊所保留的密碼. 參數try_first_pass用來防止當pam_pwdb 跟隨另一個password模塊時用戶重複輸入也許是共享的舊密碼 - 如果舊密碼不正確, 再提示用戶輸入. 參數use_authok 用來迫使 此模塊設定新密碼時採用 password堆疊裏先前的模塊提供的值. (這用法在先前介紹的Cracklib一節裏有個範本).

參數 not_set_pass 用來告訴模塊不去關心給/從其它(堆疊的)密碼模塊提供/獲取可用的舊密碼或新密碼.

參數debug 使此模塊的password功能syslog(3)更多的動作的信息. 其它參數會往syslog(3) 寫進錯誤信息.
範本/建議用法:

有關如何將此模塊與可插入式密碼檢查模塊,pam_cracklib一起堆疊的例子, 請見上面的pam_cracklib一節.

Session component

識別的參數:
描述:

模塊的此部件沒有參數. 它的作用就是在用戶會話開始和結束時往syslog(3) 裏記錄用戶名和服務類別.
範本/建議用法:

session部件的用法是單純的:

#
# pwdb - unix like session opening and closing
#
login session required pam_pwdb.so

6.20 The RADIUS session module
概要

模塊名:

pam_radius
作者:

Cristian Gafton <[email protected]>
維護者:

作者.
提供的管理組:

session
Cryptographically sensitive:

此模塊不用來處理密碼
安全等級:
代碼清潔度:

在編譯 /usr/include/rpc/clnt.h時gcc報告一個警告. Hey, is not my fault !
系統依賴:
網絡接口:

是的; 這是個網絡模塊(獨立於應用程序).

概述

此模塊用來提供用戶從RADIUS服務器認證的會話服務. 目前階段, 唯一提供的功能是以RADIUS服務器當一個帳號服務器來使用.
Session component

識別的參數:

debug - 冗餘的信息寫進syslog(3).
描述:

此模塊用來提供用戶從RADIUS服務器認證的會話服務. 目前階段, 唯一提供的功能是以RADIUS服務器當一個帳號服務器來使用.

(There are few things which needs to be cleared out first in the PAM project until one will be able to use this module and expect it to magically start pppd in response to a RADIUS server command to use PPP for this user, or to initiate a telnet connection to another host, or to hang and call back the user using parameters provided in the RADIUS server response. Most of these things are better suited for the radius login application. I hope to make available Real Soon (tm) patches for the login apps to make it work this way.)

當開啓一個會話時, 此模塊發送一個``Accounting-Start'' 消息給RADIUS服務器, 服務器將會記錄/更新此用戶的有關記錄. 而當會話關閉時, 一個``Accounting-Stop'' 消息會發給RADIUS服務器.

此模塊無須其它的必要條件以使其工作. 興趣所致, 你要安裝一個RADIUS服務器, 然後以此服務器爲一個集中的帳號管理服務器, 忘掉wtmp/last/sac這些東西.
範本/建議用法:

爲使服務(例如login)使用此模塊, 把下面一行加入/etc/pam.conf, 放在此服務的最後一行(通常在session段的pam_unix之後):

login session required pam_radius.so

把login替換成你想要的其它服務名.

此模塊大量使用了libpwdb0.54preB或其後版本的API. 默認情況下, 它會從 /etc/raddb/server讀取RADIUS服務器的設定(主機名和加密方法). 這是libpwdb默認編譯時的設定, 目前沒有辦法不經重編譯libpwdb來改變這個默認設定. 我正在爲libpwdb的radius支持進行擴展以使其提供運行時可設定功能.

還請注意libpwdb還需要你提供RADIUS的目錄(/etc/raddb/dictionary).

6.21 The rhosts module
概要

模塊名:

pam_rhosts_auth
作者:

Al Longyear <[email protected]>
維護者:
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:

乾淨.
系統依賴:
網絡接口:

呼叫標準的inet_addr(), gethostbyname() 函數.

概述

此模塊爲傳統的如rlogin和rsh的服務提供基於網絡的認證.
Authentication component

識別的參數:

no_hosts_equiv; no_rhosts; debug; no_warn; privategroup; promiscuous; suppress
描述:

此模塊的認證機制基於兩個文件: /etc/hosts.equiv (或爲_PATH_HEQUIV 定意在#include <netdb.h>) 和 ~/.rhosts. 首先, 列在前一個文件裏的主機會被當成localhost一般對待. 第二, 後一個用戶自己的文件的條目用來對照"遠程主機 遠程用戶"到當前主機的帳號. 如果遠程主機列在/etc/hosts.equiv,並且遠程用戶的帳號和本機用戶一致或者遠程用戶的帳號在個人設定檔中有登記則訪問被允許.

用戶的私人設定檔會有些限制:它必須是一個常規文件(POSIX.1定意爲S_ISREG(x)) ; 它必須屬於superuser或本用戶;出了所有者之外其它用戶必須不可寫.

此模塊認證從遠程主機(內部用PAM_RHOST指定)連線的遠端用戶 (內部用PAM_RUSER指定). 因此, 應用程序如果要兼容此認證模塊, 它們必須在呼叫pam_authenticate()之前設定好這些條目. 模塊本生沒有能力去獨立的偵測這些網絡連接信息.

至於root的訪問, 除非使用hosts_equiv_rootok選項, /etc/host.equiv將被忽略. 替代的是, superuser必須有設定正確的私人設定檔.

此模塊的動作可有一下旗標修改:

* debug - 記錄冗餘的信息到syslog(3). (XXX - 事實上, 此模塊目前不記錄任何信息, 請自願的修復它!)
* no_warn - 不要給用戶發送更多的有關失敗的警告信息. (XXX - 此模塊當前不會發布任何警告信息, 請自願的修復它!)
* no_hosts_equiv - 忽略/etc/hosts.equiv .
* hosts_equiv_rootok - 允許superuser也使用 /etc/hosts.equiv. 如果沒有這選項,/etc/hosts.equiv 不被superuser帳號考慮. 如果同時有no_hosts_equiv, 此選項會失效.
* no_rhosts - 忽略所有用戶的私人設定檔:~/.rhosts.
* privategroup - 通常, ~/.rhosts 必須不能爲除了所有者之外的任何人可寫. 此選項針對組所有者和進行認證的擁有者同名的文件放寬組寫的權限. 爲減小此選項可能帶來的安全隱患, 此模塊還檢查用戶是否爲那個組的唯一成員.
* promiscuous - 有此選項, 以`+' 作爲主機名將導致所有的主機都被賦予訪問權限. 沒有此選項, `+'的記錄會被忽略, debug選項會往syslog裏記錄一個警告.
* suppress - 這將阻止模塊在當認證失敗時syslog(3) 警告信息. 這選項主要用來使日誌免於無意義的錯誤記錄, 尤其是當模塊被當成sufficient模式所用時.

範本/建議用法:

爲允許用戶從信任的遠程主機登錄, 你得把下面一行加入你的/etc/pam.conf, 並且在其他會提示用戶輸入密碼的模塊之前 :

#
# No passwords required for users from hosts listed above.
#
login auth sufficient pam_rhosts_auth.so no_rhosts

注意, 在這個例子裏, 系統管理員關閉了所有個人的 rhosts設定檔. 還請注意, 此模塊可用來設定成只允許在/etc/host.equiv文件裏指定的遠程主機登錄, 只要把sufficient改成required.

6.22 The root access module
概要

模塊名:

pam_rootok
作者:

Andrew G. Morgan <[email protected]>
維護者:

Linux-PAM maintainer
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:

Clean.
系統依賴:
網絡接口:

概述

此模塊用在superuser希望不需要輸入密碼就能獲取訪問權限的情形.
Authentication component

識別的參數:

debug
描述:

此模塊認證uid是0的用戶. 創建成setuid-root的應用程序通常保留用戶的uid但是以有效的-uid的權限執行. 真實的uid會被檢查.
範本/建



【發表回覆】【查看論壇原帖】【添加到收藏夾】【關閉】

--------------------------------------------------------------------------------
ipod 回覆於:2004-08-19 15:14:34
完全版?謝謝樓主先



--------------------------------------------------------------------------------
gentoo 回覆於:2004-08-19 15:46:27
謝謝!



--------------------------------------------------------------------------------
thomassun 回覆於:2004-08-20 11:12:39
Part 2:
議用法:

對於su的傳統的用法是允許superuser不經輸入密碼的變更爲其它次要的用戶的身份. 爲在Linux-PAM裏實現這種行爲, 下面兩行需要加入設定檔:

#
# su authentication. Root is granted access by default.
#
su auth sufficient pam_rootok.so
su auth required pam_unix_auth.so

注意. 對於以superuser執行(或者在系統開機時被開啓)的程序, 應該不要用此模塊去認證用戶.

6.23 The securetty module
概要

模塊名:

pam_securetty
作者:

Elliot Lee <[email protected]>
維護者:

Red Hat Software:
currently Michael K. Johnson <[email protected]>
(if unavailable, contact Elliot Lee <[email protected]>).
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

/etc/securetty file
網絡接口:

爲使此有意義的, 需要應用程序設定正確的PAM_TTY.

概述

提供標準的UNIX的安全的tty的認證.
Authentication component

識別的參數:
描述:

提供標準的Unix安全tty的檢查, 除非PAM_TTY的值列在 /etc/securetty裏, 對root的認證將會失敗. 對所有其他用戶, 則爲成功.
範本/建議用法:

規範的用法, 這模塊應該作爲required的認證方法出現在任何 sufficient 的認證之前.

6.24 Time control
概要

模塊名:

pam_time
作者:

Andrew G. Morgan <[email protected]>
維護者:

Author
提供的管理組:

account
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要一個設定檔:/etc/security/time.conf
網絡接口:

僅通過PAM_TTY

概述

運行一個規範得很好的系統偶爾也會包含對特定服務的有選擇的限制訪問. 此模塊提供了對系統服務的時間上的訪問控制. 它的行爲由一個設定檔決定. 此模塊可以設定成基於用戶名, 時間, 星期, 具體服務和請求服務時的終端名的對(單個)用戶的拒絕訪問.
Account component

識別的參數:
描述:

此模塊基於設定檔中的制定的規則進行動作:/etc/security/time.conf. m每個規則有如下格式,

services;ttys;users;times

每個規則佔一行, 結束於換行符或者註解的開始:`#'. 由分號`;' 分隔成四個欄位. 這些欄位是:

* services - 由此規則影響的服務名的邏輯列.
* ttys - 指示受此規則保護的終端名字的邏輯列表邏輯列表.
* user - 此規則作用到的用戶的邏輯列表.

邏輯列表意味一串符號(和適當的PAM_相關), 包含不超過一個的通配符:`*', 和可選的非操作符的前置:`!'. 這一串表達式由兩個邏輯操作符連接:& (邏輯與)和| 邏輯或). 兩個例子:!morgan&!root, 表示此規則不會應用到用戶morgan和root;tty*&!ttyp*, 表示此規則僅對控制檯終端而不是僞終端適用.
* times - 此規則的適用時間的邏輯列表. 每個元件的格式是周/時間-範圍. 周由兩個字符指定.比如, MoTuSa, 表示週一週二和週六. 注意重複的周被 復位; MoTuMo 表示週二, MoWk 意爲除了週一的所有工作日. 兩個字符的組合可以是,

Mo Tu We Th Fr Sa Su Wk Wd Al

最後兩個詞是週末和 每週的整個7天.

時間範圍部分是一對24時制的時間, HHMM, 以一個連字符隔開 -- 表示開始和結束的時間. 如果結束時間早於開始時間, 就假定是到第二天的這個結束時間. 例如, Mo1800-0300 表示允許的時間是從週一的晚上6點到第二天早上3點.

注意, 時間的限制只有在當前3個欄位都滿足用戶請求服務的應用時才適用.

爲了便利和可讀性, 一條規則可以由`\換行符'結尾以超過一行.
範本/建議用法:

要使用此模塊可以在Linux-PAM的設定檔里加入下面的行:

#
# apply pam_time accounting to login requests
#
login account required pam_time.so

這裏, 我們把這模塊應用在login的服務.

可以放在/etc/security/time.conf裏的規則舉例如下:

login ; tty* & ; !ttyp* ; !root ; !Al0000-2400

除了root,禁止所有用戶在任何時間從控制檯登錄.
games ; * ; !waster ; Wd0000-2400 | Wk1800-0800

games (使用Linux-PAM的某遊戲) 只在非工作時間可以訪問. 此規則不限制用戶waster.

注意, 目前還沒有一個後臺進程去強制終止一個超過時間範圍的會話. 這要有個對策.

錯誤格式的規則會作爲錯誤記錄在 syslog(3).

6.25 The Unix Password module
概要

模塊名:

pam_unix
作者:
維護者:

作者.
提供的管理組:

account; authentication; password; session
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

概述

這是標準Unix的認證模塊. 它從系統庫呼叫標準的調用來獲取和設定帳號信息以及認證信息. 通常這些從/etc/passwd和/etc/shadow文件(如果開啓了shadow功能)獲得.
Account component

識別的參數:

debug; audit
描述:

參數debug 使此模塊的帳戶相關的函數syslog(3)更多的它的動作的信息 (屬於此模塊的其它功能的參數會被直接忽略掉, 但是別的參數會當成錯誤而被 syslog(3)). 參數audit會丟出更多的信息.

基於以下的shadow 元素: expire; last_change; max_change; min_change; warn_change, 此模塊執行確認帳號和密碼狀態的工作. 至於後面, 它可以建議用戶改變密碼或, 通過返回PAM_AUTHTOKEN_REQD, 延遲給用戶提供服務直到其生成一個新密碼. 列在上面的那些元素在GNU Libc的info文檔裏有解釋. 如果用戶的記錄裏沒有包含一個或者更多的這些元素, 相對的shadow檢查將不被執行.
範本/建議用法:

在帳號管理模式下, 可以這樣來安裝此模塊:

#
# Ensure users account and password are still active
#
login account required pam_unix.so

Authentication component

識別的參數:

debug; audit; use_first_pass; try_first_pass; nullok; nodelay
描述:

參數debug 使此模塊的帳戶相關的函數syslog(3)更多的它的動作的信息. 參數audit會丟出更多的信息.

此模塊的默認設定是如果正式的密碼爲空則不允許用戶訪問服務. 參數nullok 用來使此默認設定無效.

當給出參數try_first_pass, 在提示用戶輸入密碼之前, 模塊會拿通過之前堆疊的 auth模塊認證的密碼來試. 參數use_first_pass 迫使模塊使用上述的密碼並且永遠不會提示用戶 - 如果沒有可用的密碼或密碼不能通過認證, 用戶將被禁止訪問.

參數 nodelay 用來阻止認證部件在認證失敗時的延時請求. 默認動作是請求一個一秒鐘以上的失敗-延遲.

屬於此模塊的其它功能的參數會被直接忽略掉, 但是別的參數會當成錯誤而被 syslog(3).

一個幫手程序, unix_chkpwd, 在當用戶的密碼報存在一個讀保護的數據庫裏時提供對用戶密碼的檢查. 這個程序非常簡單, 它僅僅檢查呼叫它的用戶的密碼. 它被此模塊的認證部件以用戶的名義來透明的呼叫. 如此象xlock這樣的程序就不需被設成setuid-root而可以工作.
範本/建議用法:

此模塊的正確功能可以由一個適當的/etc/nsswitch.conf 來支配, 那裏指定的用戶數據庫確定用來認證的用戶記錄的來源.

在帳號管理模式下, 可以這樣來安裝此模塊:

#
# Authenticate the user
#
login auth required pam_unix.so

Password component

識別的參數:

debug; audit; nullok; not_set_pass; use_authtok; try_first_pass; use_first_pass; md5; bigcrypt; shadow; nis; min; max; obscure; remember
描述:

pam_unix 模塊的這一部分執行更新用戶密碼的任務.

對於傳統的UNIX用戶數據庫(同時保存用戶密碼), 參數md5 用來採用MD5的加密法以對抗不安全的傳統的 crypt(3)調用. 還有種選擇, 參數 bigcrypt 採用DEC(數字設備公司)的對標準UNIX的crypt()的算法進行 `C2'擴展的算法以加密超過8位長的密碼.

參數nullok 用來允許改變一個原先爲空的密碼. 如果沒有此參數, 空的密碼會當成是被鎖住的帳號.

參數use_first_pass 用來阻止選擇舊的和新的密碼,而是採用password裏此模塊之前的模塊所保留的密碼. 參數try_first_pass用來防止當pam_pwdb 跟隨另一個password模塊時用戶重複輸入也許是共享的舊密碼 - 如果舊密碼不正確, 再提示用戶輸入. 參數use_authok 用來迫使 此模塊設定新密碼時採用 password堆疊裏先前的模塊提供的值. (這用法在先前介紹的Cracklib一節裏有個範本).

參數 not_set_pass 用來告訴模塊不去關心給/從其它(堆疊的)密碼模塊提供/獲取可用的舊密碼或新密碼.

參數debug 使此模塊的密碼相關的函數syslog(3)更多的它的動作的信息. 其它參數會被當成錯誤信息記錄在syslog(3). 參數audit會丟出更多的信息.

通過設定nis 參數, pam_unix 會試圖採用NIS RPC來設定新密碼.

參數remember 帶有一個值. 這值是爲每個用戶保存的最近使用的密碼的個數. 它們被保存在/etc/security/opasswd 以防止用戶頻繁的交替使用同樣的一組密碼.

參數min 和 max 允許控制密碼的常度. 有個固定的默認值是1到8. 這些值本身算在內.

參數obscure 允許一些額外的密碼檢查. 這效仿原始的shadow包裏的含糊檢查, 這過程和pam_cracklib模塊非常相像(不做字典檢查), 它執行以下一些檢查:

* Palindrome - 新密碼是否爲舊密碼的迴文? 迴文是指順着讀和反着讀都一樣的詞(比如madam和radar).
* Case Change Only - 新密碼是否只是拿舊密碼改了些大小寫?
* Similar - 新密碼是否太像舊密碼?
* Simple - 新密碼是否太簡單? 這決定於密碼的長度和採用不同種字符的個數(比如,字母, 數字...).
* Rotated - 新密碼是否爲舊密碼的輪轉?(比如,"billy"和"illyb")

範本/建議用法:

標準用法:

#
# Change the users password
#
passwd password required pam_unix.so

和可插入式密碼檢查模塊,pam_cracklib 關聯堆疊的例子:

#
# Change the users password
#
passwd password required pam_cracklib.so retry=3 minlen=6 difok=3
passwd password required pam_unix.so use_authtok nullok md5

Session component

識別的參數:
描述:

模塊的此部件沒有參數. 它的作用就是在用戶會話開始和結束時往syslog(3) 裏記錄用戶名和服務類別.
範本/建議用法:

session部件的用法是單純的:

#
# session opening and closing
#
login session required pam_unix.so

6.26 The userdb module
概要

模塊名:

pam_userdb
作者:

Cristian Gafton <[email protected]>
維護者:

作者.
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:

需要有 Berkeley DB.
網絡接口:

概述

在一個.db數據庫裏查找用戶並且與報存在這數據庫中的密碼進行比對.
Authentication component

識別的參數:

debug; icase; dump; db=XXXX;
描述:

此模塊用來與儲存在BerkeleyDB數據庫裏的資料對用戶/密碼進行驗證. 數據庫以用戶名爲索引, 和用戶名對應的欄位是以明碼形式保存的密碼, so caution must be exercised over the access rights to the DB database itself.. 模塊以交互機制從用戶端獲取輸入的密碼. 如果此密碼用在其他認證模塊(象pam_unix )的前面, 那麼你得要告訴那些模塊從PAM_AUTHTOK(由此模塊設定)處讀取輸入的密碼.

模塊的默認動作可以由以下的參數改變:

* debug - 給syslog(3)提供更多的調信息.
* icase - 忽略大小寫的密碼比對.
* dump - 往log裏下載數據庫裏所有的的記錄.(呀, 默認情況下不要這樣做!)
* db=XXXX - 使用XXXX這個數據庫文件. 注意, Berkeley DB通常會在文件名後面加上擴展名, 所以你得像 /etc/foodata 這樣指定文件而不是/etc/foodata.db.

範本/建議用法:

這是一個ftp服務的設定檔(通常是 /etc/pam.d/ftp ), 會接受用戶名/密碼對存放在/tmp/dbtest.db中的用戶登入.

#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth sufficient pam_userdb.so icase db=/tmp/dbtest
auth required pam_unix.so shadow nullok try_first_pass
auth required pam_shells.so
account required pam_unix.so
session required pam_unix.so

6.27 Warning logger module
概要

模塊名:

pam_warn
作者:

Andrew G. Morgan <[email protected]>
維護者:

作者.
提供的管理組:

authentication; password
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

記錄遠程用戶和遠程主機的信息(如果可以知道相關的pam-items)

概述

此模塊主要用來記錄試圖進行認證或者更新密碼的動作.
Authentication+Password component

識別的參數:
描述:

往syslog(3)裏記錄服務名,終端名,用戶名,遠端用戶名和遠程主機. 不是所有的項目都能偵測到, but instead obtained from the standard pam-items.
範本/建議用法:

在設定檔一節 above有一個範本 .

6.28 The wheel module
概要

模塊名:

pam_wheel
作者:

Cristian Gafton <[email protected]>
維護者:

作者.
提供的管理組:

authentication
Cryptographically sensitive:
安全等級:
代碼清潔度:
系統依賴:
網絡接口:

概述

只給屬於whell(gid=0)羣組的用戶授予root的訪問權限.
Authentication component

識別的參數:

debug; trust; deny; group=XXXX
描述:

此模塊用來實現所謂的重要人物 羣組. 默認設定時, 如果請求的用戶是wheel 的組成員就賦予其root的的訪問權限. (首先, 模塊檢查組wheel是否存在. 如果不存在,那麼id=0的組被當作wheel.

模塊的默認動作可以通過在/etc/pam.conf裏設定以下參數來改變:

* debug - 提供更多的調試信息給syslog(3).
* trust - 此選項指示模塊當一個請求root權限的用戶是wheel組的成員時返回PAM_SUCCESS. 這種情況的默認動作是返回 PAM_IGNORE . 使用trust 選項可以使 wheel的組成員未經輸入密碼就能成爲root. 小心使用.
* deny - 這選項用來推翻模塊的行爲邏輯. 如果一個屬於wheel組的用戶試圖得到uid=0 的權限時, 就禁止訪問(wheel這個詞也許就變得毫無意義!): 其目的是爲了接下來的group= 參數而爲.
* group=XXXX - 代替對gid=0的組的眷顧, 而使用用戶自己定意XXXX組. 這裏的XXXX是組的名字而不是組的ID.

範本/建議用法:

爲把能取得superuser權限的用戶限制在wheel裏, 使用下面的設定:

#
# 默認給root賦權限(rootok), 只有wheel的組成員有可能成爲root( wheel), 但仍然必須
# 通過unix_auth的認證.
#
#
su auth sufficient pam_rootok.so
su auth required pam_wheel.so
su auth required pam_unix_auth.so

7. 文件

/usr/lib/libpam.so.*

提供給應用程序訪問Linux-PAM API的共享庫.
/etc/pam.conf

Linux-PAM的設定檔.
/usr/lib/security/pam_*.so

Linux-PAM 的動態可裝載目標文件(模塊)的主要所在位置.


轉載地址:http://blog.csdn.net/yueguanghaidao/article/details/7292065




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章