一、什麼是pam
PAM(Pluggable Authentication Modules ) Sun公司於1995 年開發的一種與認證相關的通用框架機制, 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認證原理
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將失效
通用配置文件/etc/pam.conf格式:application type control module-path arguments
專用配置文件/etc/pam.d/* 格式 :type control module-path arguments
3.1、PAM的模塊類型(module-type)
認證管理(auth),賬號管理(account),會話管理(session)和密碼(password)管理,一個類型可能有多行,它們按順序依次由PAM模塊調用.
auth | 用來對用戶的身份進行識別.如:提示用戶輸入密碼,或判斷用戶是否爲root等. |
account | 對帳號的各項屬性進行檢查.如:是否允許登錄,是否達到最大用戶數,或是root用戶是否允許在這個終端登錄等. |
session | 這個模塊用來定義用戶登錄前的,及用戶退出後所要進行的操作.如:登錄連接信息,用戶數據的打開與關閉,掛載文件系統等. |
password | 使用用戶信息來更新.如:修改用戶密碼. |
3.2、PAM的控制標記
PAM使用控制標記來處理和判斷各個模塊的返回值.(在此只說明簡單的認證標記)
控制標記 | 說明 |
required | 表示即使某個模塊對用戶的驗證失敗,也要等所有的模塊都執行完畢後,PAM 才返回錯誤信息。這樣做是爲了不讓用戶知道被哪個模塊拒絕。如果對用戶驗證成功,所有的模塊都會返回成功信息。 |
requisite | 與required相似,但是如果這個模塊返回失敗,則立刻嚮應用程序返回失敗,表示此類型失敗.不再進行同類型後面的操作. |
sufficient | 表示如果一個用戶通過這個模塊的驗證,PAM結構就立刻返回驗證成功信息(即使前面有模塊fail了,也會把 fail結果忽略掉),把控制權交回應用程序。後面的層疊模塊即使使用requisite或者required 控制標誌,也不再執行。如果驗證失敗,sufficient 的作用和 optional 相同 |
optional | 表示即使本行指定的模塊驗證失敗,也允許用戶接受應用程序提供的服務,一般返回PAM_IGNORE(忽略). |
四、模塊路徑( module-path)
– 相對路徑: /lib64/security目錄下的模塊可使用相對路徑 如:pam_shells.so、pam_limits.so
– 絕對路徑:模塊通過讀取配置文件完成用戶對系統資源的使用控制 /etc/security/*.conf
注意:修改PAM配置文件將馬上生效,編輯pam規則時,保持至少打開一個root會話,以防止root身份驗證錯誤
五、實例
pam_shells.so模塊的意思是如果用戶想登錄系統,那麼它的shell必須是在/etc/shells文件中之一的shell
1.創建一個用戶zhaoyun指定其sheLL爲/bin/csh,然後再/etc/shells文件中刪除/bin/csh,該操作會實現趙雲用戶無法成功登錄。
配置etc/pam.d/sshd文件
配置成功後趙雲用戶以ssh的方式登陸系統,處出現拒絕登陸一直讓重新輸入密碼,如下圖。
模塊pam_securetty.so其功能爲只允許root用戶在/etc/securetty列出的安全終端上登陸
2. 允許root在telent登陸(默認telent是不安全的登陸,拒絕root身份登陸)
修改/etc/securetty配置文件,將要指定的終端添加進去,該次實驗指定終端pts/4。又或者vim /etc/pam.d/login把auth required pam_securetty.so這一行加上註釋。
再次telnet即可成功登陸。