PAM使用配置文件/etc/pam.conf(或/etc/pam.d/下的文件),來管理對(duì)程序的認(rèn)證方式。應(yīng)用程序調(diào)用相應(yīng)的配置文件,從而調(diào)用本地的認(rèn)證模塊.模塊放置在/lib/security下,以加載動(dòng)態(tài)庫的形式進(jìn)行調(diào)用(dlopen(3))。像我們使用su命令時(shí),系統(tǒng)會(huì)提示你輸入root用戶的密碼。這就是su命令通過調(diào)用PAM模塊實(shí)現(xiàn)的。
二. PAM的配置文件介紹
1.PAM配置文件的格式
PAM配置文件有兩種寫法:
一種是寫在/etc/pam.conf中.格式如下:
ftpd auth required pam_unix.so nullok
ftpd:表示服務(wù)名,即針對(duì)哪一個(gè)服務(wù)進(jìn)行的認(rèn)證配置。required:為模塊類型.PAM有四中模塊類型,分別代表不同的任務(wù)類型。
pam_unix.so:為模塊路徑.即要調(diào)用模塊的位置。nullok:為模塊參數(shù),即傳遞給模塊的參數(shù)。
另一種寫法是,將PAM配置文件放到/etc/pam.d/目錄下,使用應(yīng)用程序名作為配置文件名。如:vsftpd,login等。配置文件的格式與pam.conf類似,只是少了最左邊的服務(wù)名列。如:/etc/pam.d/cups
#%PAM-1.0
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
2.PAM的模塊類型
Linux-PAM有四種模塊類型,分別代表四種不同的任務(wù)。它們是:認(rèn)證管理,賬號(hào)管理,會(huì)話管理和密碼管理。一個(gè)類型可能有多行,它們按順序依次由PAM模塊調(diào)用。
auth
用來對(duì)用戶的身份進(jìn)行識(shí)別.如:提示用戶輸入密碼,或判斷用戶是否為root等。
account
對(duì)帳號(hào)的各項(xiàng)屬性進(jìn)行檢查.如:是否允許登錄,是否達(dá)到最大用戶數(shù),或是root用戶是否允許在這個(gè)終端登錄等。
session
這個(gè)模塊用來定義用戶登錄前的,及用戶退出后所要進(jìn)行的操作。如:登錄連接信息,用戶數(shù)據(jù)的打開與關(guān)閉,掛載文件系統(tǒng)等。
password
使用用戶信息來更新。如:修改用戶密碼。
3.PAM的控制標(biāo)記
PAM使用控制標(biāo)記來處理和判斷各個(gè)模塊的返回值。
required
這個(gè)標(biāo)記表示需要模塊返回一個(gè)成功值。如果返回失敗,則繼續(xù)進(jìn)行同類型的下一個(gè)操作,當(dāng)所有此類型的模塊都執(zhí)行完后.才返回失敗值。
requisite
與required相似,但是如果這個(gè)模塊返回失敗,則立刻向應(yīng)用程序返回失敗,表示此類型失敗。不再進(jìn)行同類型后面的操作。
sufficient
如果此模塊返回成功,則直接向應(yīng)用程序返回成功,表示此類型成功。不再進(jìn)行同類型后面的操作。如果失敗,也不會(huì)影響這個(gè)類型的返回值。
optional
使用這個(gè)標(biāo)記的模塊,將不進(jìn)行成功與否的返回。一般返回一個(gè)PAM_IGNORE(忽略)。
4.模塊路徑
模塊路徑。即要調(diào)用模塊的位置。 一般保存在/lib/security/下,如: pam_unix.so
同一個(gè)模塊,可以出現(xiàn)在不同的類型中。它在不同的類型中所執(zhí)行的操作都不相同。這是由于每個(gè)模塊針對(duì)不同的模塊類型,編制了不同的執(zhí)行函數(shù)。
5.模塊參數(shù)
模塊參數(shù),即傳遞給模塊的參數(shù).參數(shù)可以有多個(gè),之間用空格分隔開,如:
password required pam_unix.so nullok obscure min=4 max=8 md5
三.編寫PAM配置文件
1.PAM模塊介紹
pam_unix.so模塊:
auth類型: 提示用戶輸入密碼,并與/etc/shadow文件相比對(duì)。匹配返回0(PAM_SUCCESS)。
account類型: 檢查用戶的賬號(hào)信息(包括是否過期等)。帳號(hào)可用時(shí),返回0。
password類型: 修改用戶的密碼。將用戶輸入的密碼,作為用戶的新密碼更新shadow文件。
pam_cracklib.so模塊:
password類型: 這個(gè)模塊可以插入到一個(gè)程序的密碼棧中,用于檢查密碼的強(qiáng)度。
這個(gè)模塊的動(dòng)作是提示用戶輸入密碼,并與系統(tǒng)中的字典進(jìn)行比對(duì),檢查其強(qiáng)度。
pam_loginuid.so模塊:
session類型:用來設(shè)置已通過認(rèn)證的進(jìn)程的uid.以使程序通過正常的審核(audit)。
pam_securetty.so模塊:
auth類型: 如果用戶要以root登錄時(shí),則登錄的tty必須在在/etc/securetty中法之前。
pam_rootok.so模塊:
auth類型: pam_rootok模塊用來認(rèn)證用戶id是否為0。為0返回"PAM_SUCCESS"。
pam_console.so模塊:
session類型: 當(dāng)用戶登錄到終端時(shí),改變終端文件文件的權(quán)限。在用戶登出后,再將它們修改回來。
pam_permit.so模塊:
auth,account,password,session類型: pam_permit模塊任何時(shí)候都返回成功。
pam_env.so模塊 :
auth類型: pam_env允許設(shè)置環(huán)境變量.默認(rèn)下,若沒有指定文件,將依據(jù)/etc/security/pam_env.conf進(jìn)行環(huán)境變量的設(shè)置。
pam_xauth.so模塊:
session類型: pam_xauth用來在用戶之間轉(zhuǎn)發(fā)xauth-key。
如果不進(jìn)行pam_xauth,當(dāng)用戶調(diào)用su成為另一個(gè)用戶時(shí),這個(gè)用戶將不可以再訪問原來用戶的X顯示,因?yàn)樾掠脩魶]有訪問顯示的key.pam_xauth解決了當(dāng)會(huì)話建立時(shí),從原始用戶到目標(biāo)用戶轉(zhuǎn)發(fā)key和用戶退出時(shí)銷毀key的問題。
實(shí)驗(yàn):
注釋/etc/pam.d/su中的
"session optional /lib/security/$ISA/pam_xauth.so"行
在桌面終端執(zhí)行su切換到另一個(gè)用戶時(shí),執(zhí)行xterm會(huì)報(bào)錯(cuò),提示無法訪問DISPLAY。
刪除注釋后,再使用su切換到另一個(gè)用戶時(shí),執(zhí)行xterm,會(huì)正常打開一個(gè)xterm終端窗口。
pam_stack.so模塊:
auth,account,password,session: pam_stack可以調(diào)用另一個(gè)服務(wù)。也就是多個(gè)服務(wù)可以包含到一個(gè)設(shè)置中.當(dāng)需要修改時(shí),只修改一個(gè)文件就可以了。
pam_warn.so模塊:
auth,account,password,session: pam_warn用來記錄服務(wù),終端,用戶,遠(yuǎn)程用戶和遠(yuǎn)程主機(jī)的信息到系統(tǒng)日志.模塊總是返回PAM_IGNORE,意指不希望影響到認(rèn)證處理。
2.編寫PAM配置文件
以root身份編輯/etc/pam.d/pamtest,并添加下面內(nèi)容:
#提示用戶輸入密碼
auth required pam_unix.so
# 驗(yàn)證用戶賬號(hào)是否可用
account required pam_unix.so
# 向系統(tǒng)日志輸出一條信息
account required pam_warn.so