PAM (Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便于向系統中添加新的認證手段。PAM最初是集成在Solaris中,目前已移植到其它系統中,如Linux、SunOS、HP-UX 9.0等。
module-type
control-flagmodule_path
optional
在/etc/pam.d/
下的文件中,與服務名稱相對應的文件,為該服務的pam驗證文件,例如服務為sshd,則在/etc/pam.d
下存在sshd這個文件,里面包含sshd驗證規則。其中有個一特殊的文件為other,如果有的服務與之沒有向對應的文件,則對應other。
服務類型,即 auth、account、session 或 password。
驗證模塊(auth)用于驗證用戶或設置/銷毀憑證。
帳戶管理模塊(account)將執行與訪問、帳戶及憑證有效期、密碼限制/規則等有關的操作。
會話管理模塊(session)用于初始化和終止會話。
密碼管理模塊(passwd)將執行與密碼更改/更新有關的操作。
用于指明在確定服務的集成成敗值過程中模塊所起的作用。有效的控制標志包括 include、optional、required、requisite 和 sufficient。
required 表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗的話,失敗結果也不會立即通知用戶,而是要等到同一stack 中的所有模塊全部執行完畢再將失敗結果返回給應用程序。可以認為是一個必要條件。
requisite 與required類似,該模塊必須返回成功才能通過認證,但是一旦該模塊返回失敗,將不再執行同一stack內的任何模塊,而是直 接將控制權返回給應用程序。是一個必要條件。
sufficient 表明本模塊返回成功已經足以通過身份認證的要求,不必再執行同一stack內的其它模塊,但是如果本模塊返回失敗的話可以 忽略。可以認為是一個充分條件。
optional表明本模塊是可選的,它的成功與否一般不會對身份認證起關鍵作用,其返回值一般被忽略。
用于實現服務的庫對象的路徑,一般都只寫庫名,庫的路徑一般為/lib/security(32位),/lib64/security(64位)
傳遞給服務模塊的選項,可選。
幾個公用的參數:
debug 該模塊應當用syslog( )將調試信息寫入到系統日志文件中。
no_warn 表明該模塊不應把警告信息發送給應用程序。
use_first_pass 表明該模塊不能提示用戶輸入密碼,而應使用前一個模塊從用戶那里得到的密碼。
try_first_pass 表明該模塊首先應當使用前一個模塊從用戶那里得到的密碼,如果該密碼驗證不通過,再提示用戶輸入新的密碼。
use_mapped_pass 該模塊不能提示用戶輸入密碼,而是使用映射過的密碼。
expose_account 允許該模塊顯示用戶的帳號名等信息,一般只能在安全的環境下使用,因為泄漏用戶名會對安全造成一定程度的威脅。
圖1:PAM形成堆棧的過程(solaris,有的linux不包含)
圖2:PAM如何確定最終的返回值(solaris)
0x04 常用PAM模塊
從官方文檔翻譯出來的(/usr/share/doc/pam-1.1.1
),翻譯可能有不對的地方
類型:auth
作用:只對root有限定,限定root登陸的終端,系統默認的“安全”中斷保存在/etc/securetty中。
類型:account
作用:基于登錄名,主機名或者所屬域,ip地址或者網絡
終端編號(類似于/etc/securetty)。默認的配置文件為/etc/security/access.conf
類型: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中關于這個用 戶的記錄就會清空
類型: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:最多與上一個密碼重復
類型:session
作用:限制資源的使用,默認的配置文件為/etc/security/limits.conf是全局的,/etc/security/limits.d/下存放各個子文件
類型: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中的用戶,是不允許的。
類型:auth
作用:用于拒絕除root外的不同用戶的登陸(當/etc/nologin存在,或者重新制定file的情況下)
參數:auth
file=/path/nologin:如果文件存在,當拒絕用戶登陸的時候,同時會輸出該文件中保存的內容。默認文件為/etc/nologin。
測試環境CentOS 6.2 64位
rpm –aq | grep pam
下載對應的版本
下載地址:
http://www.linux-pam.org/library/
https://fedorahosted.org/releases/l/i/linux-pam/
#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c
在PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,int argc, const char **argv)中定義FILE *fp;
PS:網上的那種后門補丁也就是修改這些
解決依賴性
#!bash
yum install gcc make flex –y
configure&&make
編譯出來的pam_unix.so在
/mnt/Linux-PAM-1.1.1/modules/pam_unix/.libs
對/lib64/security中的文件進行替換(32位系統放入/lib/security)
PS:但是兩個文件的大小是不同的
對于這種修改的方法,在/var/log/secure中和正常登錄的是有差距
#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/pam_unix_auth.c
#!bash
vim /mnt/Linux-PAM-1.1.1/modules/pam_unix/support.c
登錄測試后的日志
一致了,o(∩_∩)o
正常日志
PS:為什么能登錄,好好看前面的基礎部分就知道了