PAM認證機制
PAM認證機制
PAM:Pluggable Authentication Modules
認證庫:文本文件,MySQL,NIS,LDAP等
PAM 是關註如何為服務驗證用戶的API,通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開
使得系統管理員可以靈活地根據需要給不同的服務配置不 同的認證方式而無需更改服務程序
它提供了對所有服務進行認證的中央機制,適用於login,遠 程登錄(telnet,rlogin,fsh,ftp,點對點協議(PPP)),su等 應用程序中。系統管理員通過PAM配置文件來制定不同應用 程序的不同認證策略;應用程序開發者通過在服務程序中使 用PAM API(pam_xxxx( ))來實現對認證方法的調用;而 PAM服務模塊的開發者則利用PAM SPI來編寫模塊(主要是 引出一些函數pam_sm_xxxx( )供PAM接口庫調用),將不 同的認證機制加入到系統中;PAM接口庫(libpam)則讀取 配置文件,將應用程序和相應的PAM服務模塊聯系起來。
PAM架構
PAM認證原理
1、PAM認證一般遵循這樣的順序:Service(服務)→PAM(配置文 件)→pam_*.so
2、PAM認證首先要確定那一項服務,然後加載相應的PAM的配 置文件(位於/etc/pam.d下),最後調用認證文件(位於 /lib/security下)進行安全認
PAM相關文件
模塊文件目錄:/lib64/security/*.so
環境相關的設置:/etc/security/
主配置文件:/etc/pam.conf,默認不存在
為每種應用模塊提供一個專用的配置文件: /etc/pam.d/APP_NAME ü
註意:如/etc/pam.d存在,/etc/pam.conf將失效
PAM認證過程:
1.使用者執行/usr/bin/passwd 程序,並輸入密碼
2.passwd開始呼叫PAM模塊,PAM模塊會搜尋passwd程序的 PAM相關設定文件,這個設定文件一般是在/etc/pam.d/裏邊的與程序同名的文件,即PAM會搜尋/etc/pam.d/passwd 這個設置文件
3.經由/etc/pam.d/passwd設定文件的數據,取用PAM所提 供的相關模塊來進行驗證
4.將驗證結果回傳給passwd這個程序,而passwd這個程序會 根據PAM回傳的結果決定下一個動作(重新輸入密碼或者通 過驗證)
通用配置文件/etc/pam.conf格式
application type control module-path arguments
專用配置文件/etc/pam.d/* 格式
type control module-path arguments
說明:
服務名(application) telnet、login、ftp等,服務名字“OTHER”代表所有沒 有在該文件中明確配置的其它服務
模塊類型(module-type)
control PAM庫該如何處理與該服務相關的PAM模塊的成 功或失敗情況 ü module-path 用來指明本模塊對應的程序文件的路徑名
Arguments 用來傳遞給該模塊的參數
模塊類型(module-type)
Auth 賬號的認證和授權
Account 與賬號管理相關的非認證類的功能,如:用來限 制/允許用戶對某個服務的訪問時間,當前有效的系統資源 (最多可以有多少個用戶),限制用戶的位置(例如:root用 戶只能從控制臺登錄)
Password 用戶修改密碼時密碼復雜度檢查機制等功能
Session 用戶獲取到服務之前或使用服務完成之後需要進 行一些附加的操作,如:記錄打開/關閉數據的信息,監視 目錄等
-type 表示因為缺失而不能加載的模塊將不記錄到系統日 誌,對於那些不總是安裝在系統上的模塊有用
Control:
PAM庫如何處理與該服務相關的PAM模塊成功或失敗情況
兩種方式實現:簡單和復雜
簡單方式實現:一個關健詞實現
required :一票否決,表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗,失敗結果也不會立即通知用戶,而是要等到同一type中的所有模塊全部執行完畢 再將失敗結果返回給應用程序。即為必要條件
requisite :一票否決,該模塊必須返回成功才能通過認證, 但是一旦該模塊返回失敗,將不再執行同一type內的任何模 塊,而是直接將控制權返回給應用程序。是一個必要條件
sufficient :一票通過,表明本模塊返回成功則通過身份認 證的要求,不必再執行同一type內的其它模塊,但如果本模 塊返回失敗可忽略,即為充分條件
optional :表明本模塊是可選的,它的成功與否不會對身份 認證起關鍵作用,其返回值一般被忽略
include: 調用其他的配置文件中定義的配置信息
比如我們查看一下/etc/pam.d中的一個配置文件,第一列就是模塊的類型,第二列就是control,第三列就是我們所要調用的庫,有些文件的配置格式中只有這三項,但是有些文件是四項。
module-path: 模塊路徑
相對路徑:
/lib64/security目錄下的模塊可使用相對路徑
如:pam_shells.so、pam_limits.so
絕對路徑:
模塊通過讀取配置文件完成用戶對系統資源的使用控制
/etc/security/*.conf
註意:修改PAM配置文件將馬上生效
建議:編輯pam規則時,保持至少打開一個root會話,以防止 root身份驗證錯誤
Arguments 用來傳遞給該模塊的參數
模塊:pam_shells
功能:檢查有效shell
如果修改vim /etc/pam.d/login只要和登陸相關的程序都受影響,因為用戶一登陸就會調用這個login程序
如果只修改vim /etc/pam.d/sshd這個配置文件,那就只會影響ssh的連接
實驗
1、創建一個用戶並且這個用戶的shells類型是/bin/csh
useradd -s /bin/csh test
可以在查看一下/etc/passwd是否設置正確
2、在/etc/shells中刪除/bin/csh這一行
3、然後在其他主機試著用ssh連接這個用戶,註意,必須是連接這個用戶,因為只是修改了這個用戶的shells
看見如上字樣那就說明我們的實驗是成功的,因為在172.18.77.7這臺主機上設置了sshd這個服務,且在/etc/pam.d/sshd中定義了用戶用sshd連接是檢查shells的類型。(調用了pam_shells.so這個庫)這個庫的作用就是檢查/etc/shells這個文件中有沒有對應的shells類型,沒有/bin/sch這樣的shells類型就會拒絕。
現在在嘗試做另一個小實驗修改vim /etc/pam.d/login文件,將同樣的設置放在這個配置文件中
切換普通用戶登錄,依然會登上去,因為可能沒有調用login程序
采用本地登錄的方式就會看到明顯的效果了,如下圖所示
兩個小實驗已經做完了,收獲不小吧!還可以查看日誌cat /var/log/secure
如果還不明白,也可以將上述設置放入到/etc/pam.dsu這個文件裏,看看效果
可以直接切換用戶就可以看到明顯的效果
模塊:pam_securetty.so v
功能:只允許root用戶在/etc/securetty列出的安全終端上登陸
cat /etc/securetty
這裏面放置的是限制root用戶登錄在特定的設備上,安全的登陸tty終端
示例:
允許root在telnet登陸
vi /etc/pam.d/login #auth required pam_securetty.so
#將這上面一行加上註釋
如果登錄不成功,可能是其他的文件配置中也有上面那一行,搜索註釋就可以了
經過實驗證明只要註釋掉remote這個文件中的那一行就可以登錄,看來登錄的時候沒有啟動login這個文件,remote文件是負責遠程登錄的。
或者/etc/securetty文件中加入 pts/0,pts/1…pts/n
也可以用第一種方法用telnet登錄上去後看看tty是什麽,然後在/etc/securetty中加上就可以
模塊:pam_nologin.so
功能:如果/etc/nologin文件存在,將導致非root用戶不能登陸,如果用戶shell是/sbin/nologin 時,當該用戶登陸時會顯示/etc/nologin.txt文件內容,並拒絕登陸
默認/etc/nologin這個文件是不存在的,若果將改文件創建則不是root用戶就不能登錄,該文件中有內容的話,會顯示該文件中的內容。
示例:
echo "do not allow access" > /etc/nologin
在做一個小實驗證明一下,將/etc/pam.d/su文件中加上一行下面的字樣
這樣的話用su - wang 切換也是不可以的
如果
/etc/nologin
這個文件不在默認路徑下,將它移到/app/下,則普通用戶是可以登錄的,想要普通用戶不能登錄,則要在login指定文件路徑,如下所示
時間有限,就介紹這幾個模塊,謝謝!
PAM認證機制