一. 簡單了解一下pam
pam用了進行驗證的資料稱為模組(modules),然而每個pam模組的功能也不相同,例如輸入passwd,如果隨便資料就好報如下圖一樣的錯誤.
passwd進行報錯的原因是pam的pam_cracklib.so 模組的功能, 它能夠判斷密碼是否在字典裡面,並將錯誤資訊返回給修改程式.
二. pam模組設定語法
pam通過乙個與程式相同檔名的配置檔案來進行一連串的認證分析需求,例如passwd這個命令呼叫pam,當執行passwd的時候,這個程式就會呼叫pam.
具體的呼叫流程:
1. 使用者開始執行passwd這個程式(/usr/bin/passwd),並輸入密碼;
2. passwd呼叫pam模組進行驗證;
3.pam模組會到/etc/pam.d/中找尋與程式(passwd)同名的檔案
4. 根據/etc/pam.d/passwd內的設定, 引用相關的pam模組逐步進行驗證分析.
5.將驗證結果(成功,失敗以及其他的資訊) 回傳給passwd這個程式.
6. passwd 這個程式會根據pam返回結果決定下一步操作,例如重新輸入密碼,或者通過.
1.整理一下關係, 上文提到的/etc/pam.d/ 下的配置檔名與呼叫的程式同名, 而配置檔案會呼叫pam模組進行驗證 . 看一下/etc/pam.d/passwd這個配置檔案的內容.
第一行是版本說明,#號開頭的都是批註, 而以下每一行都是乙個獨立的驗證流程, 每一行分三個區段, 第一列是驗證型別 (type),第二列是控制標準(flag),第三列是pam模組與該模組的引數.
注意:inlude(包括) 這個關鍵字 代表呼叫後面的檔案作為這個類別的驗證,所以上述第一 二行呼叫的是/etc/pam.d/system-auth 這個檔案來進行驗證.
驗證型別概況(type):
1.auth主要用於檢驗使用者的身份憑證,這種型別通常需要密碼來校驗, 所以後續接的模組是用來檢驗使用者身份的
2.accountaccount(賬號)則大部分是進行授權,這種型別則主要在檢驗使用者是否具有正確的許可權, 例如,當你使用乙個過期的密碼登入是,就會無法正確的登入.
3.sessionsession是會議期間的意思,所以session 管理的就是使用者在這次登入期間pam所給予的環境設定, 在這個型別通常用於記錄使用者登入已登出的資訊. 例如使用su或者sudo命令的話,那麼應該可以在/var/log/secure裡面發現很多關於pam的說明.
4.password這種類別主要用於提供驗證的修訂工作,例如 修改/更改密碼
驗證的控制標誌(flag)
1.required此驗證如果驗證成功就會帶有成功的標誌(success), 若是失敗則帶有失敗的標誌(failure),但是無論成功還是失敗都會繼續進行驗證流程,因此相當有利於資料的登陸日誌.
2. requisite若驗證失敗則返回failure的標誌,並且終止後續的驗證流程,如果返回成功(success)的標誌,並繼續後續驗證流程
3. sufficient若驗證成功立即回傳success給原程式,並終止後續流程; 若驗證失敗帶有failure標誌並繼續後續驗證流程.
4.optional這個模組目的大多是顯示資訊而已,並不是用在驗證方面
簡易的流程圖如下:
三. 常用模組大概介紹
/etc/pam.d/* 每個程式個別的pam配置檔案
/lib/security/* pam 模組檔案的實際放置目錄
/etc/security/* 其他pam環境的配置檔案
/usr/share/doc/pam-*/ 詳細的pam說明
舉個修改密碼驗證樣例:
1. 檢視passwd配置檔案的內容
2. 檢視模組相關的內容
3.進行相關驗證
3.1 驗證階段(auth), 首先會經過pam_env.so 設定額外的環境變數;再通過pam_fprintd.so進行驗證成功終止進行失敗繼續;再通過pam_unix.so檢驗密碼,若通過則回報給passwd程式,失敗則繼續往下以pam_succeed_if.so判斷uid是否大於500,若小於500則回報失敗,否則再往下以pam_deny.so拒絕連線.
3.2 授權驗證(account); 先用pam_unix.so檢驗賬戶許可證,再用pam_localuser.so要求使用者在/etc/passwd給予認可,如若通過則回報給passwd程式,失敗繼續往下以pam_succeed_if.so判斷uid是否小於500,若小於500則不記錄登記資訊.最後以pam_permit.so允許該賬戶登陸
3.3密碼階段(password);先以pam_cracklib.so設定密碼僅能嘗試錯誤3次;接下來pam_unix.so通過sha512,shadow等功能進行密碼校驗,若是通過則回報passwd程式, 若不通過則以pam_deny.so拒絕登入.
有個舉例:
4. 為什麼root無法以telnet直接登入系統, 但是卻能用ssh直接登入?
一般來說,telnet會引起login的pam模組,而login的驗證階段會有/etc/securetty的限制. 由於遠端連線屬於pts/n(n為數字)的動態終端介面裝置名稱,並沒有寫入到/etc/securetty,因此root無法通過telnet登入遠端主機, 然而ssh 使用的是/etc/pam.d/sshd這個模組, 而這個模組驗證階段並沒有假如pam_securetty, 因此就沒有/etc/securetty的限制, 所以可以遠端直接聯機到伺服器.
Pam認證模組
pam 認證模組 pam 做認證的,nss 做使用者 像ldap lib64 security 所有pam模組都在這裡存放著。64位系統便是在 lib64存放著 etc pam.d pam服務的配置檔案。模組呼叫必須放在 lib64 security 這個目錄下。每個模組有 4個功能的認證 auth...
Linux中pam模組詳解
pam簡介 linux pam linux可插入認證模組 是一套共享庫,使本地系統管理員可以隨意選擇程式的認證方式。換句話說,不用重新編譯乙個包含pam功能的應用程式,就可以改變它使用的認證機制。這種方式下,就算公升級本地認證機制,也不用修改程式.pam使用配置 etc pam.d 下的檔案,來管理...
PAM模組介紹(超詳細)
pam模組介紹 超詳細 etc pam.d 每個程式個別的 pam 配置檔案 lib64 security pam 模組檔案的實際放置目錄 etc security 其他 pam 環境的配置檔案 usr share doc pam usr share doc pam 1.1.8 txts 詳細的 p...