Linux PAM

轉載:http://drops.wooyun.org/tips/1288

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

0x01 PAM工作流程

wKioL1ZyWqaRjmXFAAEeYP0aulI964.png

0x02 PAM配置文件語法


module-type
control-flagmodule_path
optional

/etc/pam.d/下的文件中,與服務名稱相對應的文件,爲該服務的pam驗證文件,例如服務爲sshd,則在/etc/pam.d下存在sshd這個文件,裏面包含sshd驗證規則。其中有個一特殊的文件爲other,如果有的服務與之沒有向對應的文件,則對應other。

module-type

服務類型,即 auth、account、session 或 password。

驗證模塊(auth)用於驗證用戶或設置/銷燬憑證。  
帳戶管理模塊(account)將執行與訪問、帳戶及憑證有效期、密碼限制/規則等有關的操作。  
會話管理模塊(session)用於初始化和終止會話。
密碼管理模塊(passwd)將執行與密碼更改/更新有關的操作。

control-flag

用於指明在確定服務的集成成敗值過程中模塊所起的作用。有效的控制標誌包括 include、optional、required、requisite 和 sufficient。

required 表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗的話,失敗結果也不會立即通知用戶,而是要等到同一stack 中的所有模塊全部執行完畢再將失敗結果返回給應用程序。可以認爲是一個必要條件。  
requisite 與required類似,該模塊必須返回成功才能通過認證,但是一旦該模塊返回失敗,將不再執行同一stack內的任何模塊,而是直 接將控制權返回給應用程序。是一個必要條件。  
sufficient 表明本模塊返回成功已經足以通過身份認證的要求,不必再執行同一stack內的其它模塊,但是如果本模塊返回失敗的話可以 忽略。可以認爲是一個充分條件。  
optional表明本模塊是可選的,它的成功與否一般不會對身份認證起關鍵作用,其返回值一般

wKiom1ZyWjailIyYAAP12fZFs_M374.jpg

module-path

用於實現服務的庫對象的路徑,一般都只寫庫名,庫的路徑一般爲/lib/security(32位),/lib64/security(64位)

module-options

傳遞給服務模塊的選項,可選。

幾個公用的參數:

debug 該模塊應當用syslog( )將調試信息寫入到系統日誌文件中。  
no_warn 表明該模塊不應把警告信息發送給應用程序。  
use_first_pass 表明該模塊不能提示用戶輸入密碼,而應使用前一個模塊從用戶那裏得到的密碼。  
try_first_pass 表明該模塊首先應當使用前一個模塊從用戶那裏得到的密碼,如果該密碼驗證不通過,再提示用戶輸入新的密碼。  
use_mapped_pass 該模塊不能提示用戶輸入密碼,而是使用映射過的密碼。  
expose_account 允許該模塊顯示用戶的帳號名等信息,一般只能在安全的環境下使用,因爲泄漏用戶名會對安全造成一定程度的威脅。

0x03 PAM 堆棧工作原理

wKioL1ZyWtqAyxI_AAIetYZwd38212.png

圖1:PAM形成堆棧的過程(solaris,有的linux不包含)

wKiom1ZyWwyA1q6oAAFTvuVQTrU347.png

圖2:PAM如何確定最終的返回值(solaris)
0x04 常用PAM模塊

從官方文檔翻譯出來的(/usr/share/doc/pam-1.1.1),翻譯可能有不對的地方

1、pam_securetty.so

類型:auth
作用:只對root有限定,限定root登陸的終端,系統默認的“安全”中斷保存在/etc/securetty中。

2、pam_access.so

類型:account
作用:基於登錄名,主機名或者所屬域,ip地址或者網絡
終端編號(類似於/etc/securetty)。默認的配置文件爲/etc/security/access.conf

3、pam_tally2.so

類型:auth 作用:當用戶輸入密碼的錯誤次數超過指定次數時,鎖定賬戶參數:

onerr=[fail|succeed]:

file=/path/to/counter:當登陸超過允許次數時,日誌保存的地方。默認的爲/var/log/tallylog。當開啓的時候,每當登陸失敗一次,則會寫入一次,使用pam_tally2 可以讀出

audit:如果用戶找不到,則把此用戶名記錄到日誌中
silent:不輸出任何信息
no_log_info:不進行日誌記錄

deny=N:當用戶連續輸錯n次是,在第n+1次鎖定該用戶,沒有 設定解鎖解鎖時間,則鎖定之後需要手工解鎖。

pam_tally.so  -u username --reset

lock_time=n:當輸入密碼錯誤一次時,在N秒內不能再次登陸該賬戶。

unlock_time=n:解鎖時間,當賬戶被鎖定時,過n秒時,該賬戶 被接觸鎖定(清空/var/log/tallylog中的相關信息),配合deny參數使用 magic_root:當uid=0時,不會往/var/log/tallylog中寫入計 數,即這個PAM不生效 even_deny_root:對root用戶生效(不加magic_root參數,對 root也是不處理的) root_unlock_time=n:是針對even_deny_root的,root用戶的解鎖時間 每當用戶成功登陸過一次後,/var/log/tallylog中關於這個用 戶的記錄就會清空

4、pam_cracklib

類型:password
作用:限定更改密碼的長度,複雜度等等。
參數:

dubug:把修改密碼的行爲記錄到日誌中  
retry=N:修改密碼時,允許錯誤的次數,默認是1次  
difok=N:新密碼與舊密碼不同的位數。如果超過一半不同,則通過驗證,則忽略difok的設置  
minlen=N:密碼的最短長度  
dcredit=N:至少有N的數字  
ucredit=N:至少有N的大寫字碼  
lcredit=N:至少有N個小寫字母  
ocredit=N:至少有N個特殊字符  
minclass=N:密碼組成的範圍(數字,大小寫字母,特殊字符)  
maxrepeat=N:最多與上一個密碼重複

5、pam_limits.so

類型:session
作用:限制資源的使用,默認的配置文件爲/etc/security/limits.conf是全局的,/etc/security/limits.d/下存放各個子文件

6、pam_listfile

類型:auth
作用:驗證用戶是否能夠登陸
參數:

item=[tty|user|rhost|ruser|group|shell]:控制的對象  
sense=[allow|deny]:控制的方法  
file=/path/filename:文件的路徑,每個佔一行  
onerr=[succeed|fail]:指定某類事件發生時的返回值。  
實例:  
authrequired pam_listfile.soonerr=succeed item=user sense=deny file=/etc/ftpusers  
保存在/etc/ftpusers中的用戶,是不允許的。

7、pam_nologin.so

類型:auth
作用:用於拒絕除root外的不同用戶的登陸(當/etc/nologin存在,或者重新制定file的情況下)
參數:auth
file=/path/nologin:如果文件存在,當拒絕用戶登陸的時候,同時會輸出該文件中保存的內容。默認文件爲/etc/nologin。

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