1、理論知識
1.1、PAM模塊
1.1.1、PAM的介紹
Pluggable Authentication Modules簡稱PAM,是一個微縮的可插入認證模塊(PAM is an acronym for Pluggable Authentication Modules)
1.1.2、PAM的結構
1)模塊層(PAM服務模塊) - PAM結構最底層
作用:為接口層提供用戶鑒別等服務
1 2 | --?驗證用戶名、密碼、賬號是否過期等 --?完成賬戶管理、會話管理和口令管理等 |
2)應用程序接口層(PAM API) - PAM結構中間層
作用:
1 2 | --?向上屏蔽用戶鑒別等過程的細節 --?向下調用模塊層的具體模塊提供特定的服務 |
接口分類:
接口與模塊相對應類型(調用下層特定接口):
1 2 3 4 5 6 7 8 9 10 | --?鑒別類接口 ? --?pam_authenticate()?鑒別用戶 ? --?pam_setcred()?修改用戶密碼信息 --?賬號類接口 ? --?pam_acct_mgmt()?鑒別用戶賬號是否有權限登錄以及賬號是否過期 --?會話類接口 ? --?pam_open_session() ? --?pam_close_session() --?口令類接口 ? --?pam_chauthok() |
接口與模塊不相對應(對底層模塊提供支持以及實現應用程序與模塊的通訊):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | --?管理性接口 ? --?pam_start()?標記PAM事務開始 ? --?pam_end()?標記PAM事務結束 ? --?pam_get_item()?獲取PAM事務狀態信息 ? --?pam_set_item()?設置PAM事務狀態信息 ? --?pam_str()?輸出PAM事務錯誤信息 --?應用程序與模塊間通訊接口 ? --?pam_start()?應用程序初始化可調用此函數存放用戶名之類的信息到PAM接口層 ? --?pam_putenv()?向應用程序傳遞特定的環境變量 ? --?pam_getenv()?獲取應用程序環境變量 ? --?pam_getenvlist()?獲取應用程序環境變量 --?用戶與模塊間的通訊接口 ? --?pam_start()函數可通過會話式回調函數,讓底層模塊通過他讀寫模塊相關的鑒別信息 --?模塊間通訊接口 ? --?相互獨立的模塊可通過調用?pam_get_item()與pam_set_item()共享某些與鑒別會話有關的公共信息。 --?讀寫模塊狀態信息接口 ? --?接口pam_get_data()和pam_set_data()用于按照PAM句柄要求獲取和設置特定的模塊信息。 |
1 2 | 3)應用程序層?-?PAM結構最上層 靈活調用中間層的各種鑒別功能接口 |
1.1.3、PAM驗證文件配置目錄
1 | ls ?/etc/pam .d/ |
顯示如下:
1 2 3 4 5 6 7 | chfn?????????????????newrole???????????runuser???????????? ssh -keycat chsh?????????????????other?????????????runuser-l?????????? su config-util?????????? passwd ????????????smartcard-auth????? sudo crond????????????????password-auth?????smartcard-auth-ac?? sudo -i fingerprint-auth?????password-auth-ac??smtp??????????????? su -l fingerprint-auth-ac??remote????????????smtp.postfix???????system-auth login????????????????run_init??????????sshd???????????????system-auth-ac |
如上所示,其中sshd是sshd服務的驗證文件(定義驗證規則,服務找不到相應的驗證文件則會與other匹配)
1.1.4、驗證文件的語法
1)PAM的格式
vim編輯/etc/pam.d/sshd
配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #%PAM-1.0 auth???????required?????pam_sepermit.so auth???????include??????password-auth account????required?????pam_nologin.so account????include??????password-auth password???include??????password-auth #?pam_selinux.so?close?should?be?the?first?session?rule session????required?????pam_selinux.so?close session????required?????pam_loginuid.so #?pam_selinux.so?open?should?only?be?followed?by?sessions?to?be?executed?in?the?user?context session????required?????pam_selinux.so? open ?env_params session????optional?????pam_keyinit.so?force?revoke session????include??????password-auth |
由以上可知PAM驗證文件格式分為四列:
1 | module_type???control_flag???module_path???module_optional |
2)module-type(模塊類型)
1 2 3 4 | --?auth(驗證模塊)?-?用于驗證用戶或設置/銷毀憑證 --?account(賬戶管理模塊)?-?執行訪問、賬戶及憑證有效期、密碼限制/規則等操作 --?session(會話管理模塊)?-?初始化或終止會話 --? passwd (密碼模塊)?-?執行密碼更改或更新操作 |
3)control-flag(控制標記)
1 2 3 4 5 | --?required?-?模塊須有返值才通過驗證,成功繼續下一模塊;失敗需待同一stack中所有模塊執行完才返值到應用程序 --?requisite?-?模塊須有返值才通過驗證,成功繼續下一模塊;失敗將不再執行同一stack內任何模塊而返值給應用程序 --?sufficient?-?模塊返成功值則通過驗證,成功則停止執行;失敗值可忽略,繼續執行下一模塊 --?optional?-?模塊可選,模塊返值對認證不起關鍵作用,無論成敗都繼續執行下一模塊,返值一般被忽略 --?include?- |
4)module-path(模塊路徑)
模塊的位置查找
1 | find ?/?-name?pam_sepermit.so |
顯示如下:
1 | /lib64/security/pam_sepermit .so |
如上所示:
模塊位于“/lib64/security/”目錄下(可只寫模塊名稱,32位系統位置不同)
5)module-optional(模塊選項,可選)
常見公用選項如下:
1 2 3 4 5 6 | --?debug?-?該模塊調用syslog()將調試信息寫入系統日志 --?no_warn?-?該模塊不向應用程序發送警告信息 --?use_first_pass?-?使用同一stack首次獲取的密碼(不向用戶提示) --?try_first_pass?-?嘗試使用同一stack首次獲取的密碼(不通過則向用戶提示) --?use_mapped_pass?-?使用映射過的密碼(不向用戶提示) --?expose_account?-?允許該模塊顯示用戶賬號等信息 |
1.2、PAM-MySQL的介紹
----------------------------------------------------------------------