1、為什麼要使用PAM 為了讓用戶更合理地使用系統,應用程式或服務(如sshd、login、su、password、ftp等)不可避免地需要對用戶進行安全認證,若按照各自的規則去配置非常耗費時間和精力且不能重用。 而PAM提供了統一的API,使應用程式的訪問控制變得簡單方便。 2、介紹 官網:htt ...
1、為什麼要使用PAM
為了讓用戶更合理地使用系統,應用程式或服務(如sshd、login、su、password、ftp等)不可避免地需要對用戶進行安全認證,若按照各自的規則去配置非常耗費時間和精力且不能重用。
而PAM提供了統一的API,使應用程式的訪問控制變得簡單方便。
2、介紹
2.1 流程說明
當某個應用程式或服務需要使用PAM來進行認證時,只要它支持PAM,就可以通過修改其相應的PAM配置文件,加放所需要的認證方式。當重新訪問時,PAM就會讀取相應的配置文件來提供認證功能。
2.2 PAM配置文件
PAM配置文件可能是/etc/pam.conf,或者是 /etc/pam.d/目錄下對應服務名稱的文件(本文以此形式進行介紹)。
PAM配置文件是由一系列規則組成,一個規則對應一行。
(1)規則語法
service type control module-path module-arguments
(2)欄位說明
service (服務名稱)
註:在/etc/pam.d/目錄下的配置文件,是不包含service部分的,而文件的名字就是service,且文件名必須是小寫。
type(account/auth/password/session)
- account
帳戶管理,它主要用來限制/允許用戶對某個服務的訪問時間、當前可用的系統資源(用戶的最大數量)或者用戶的位置訪問服務(例如:root用戶只能從控制台登錄) - auth
識別用戶身份,比如:提示用戶輸入密碼 - password
升級用戶的認證標記,比如:密碼強度性檢測 - session
處理為用戶提供服務之前/後需要做的一些事情,比如:記錄登錄連接信息,掛載目錄等
control(required/requisite/sufficient/optional/include/substack)
- required
若當前行認證失敗,認證過程仍舊繼續,整個棧運行完畢之後返回認證失敗;若成功,繼續下一個認證。 - requisite
若當前行認證失敗,則立即中止並返回認證失敗;若成功,繼續下一個認證。 - sufficient
若當前行認證成功,並且之前沒有任何required認證失敗,則立即返回認證成功;若失敗,不對結果造成影響併進行下一個認證。 - optional
僅當整個棧中只有這一個認證時才有決定性作用,否則當前行的認證跟最終結果無關。 - include
將其他配置文件中的所有行包含在當前的位置並運行。 - substack
類似include,但substack所包含的行將作為一個子棧,其運行過程不會影響到母棧,子棧的運行結果將作為當前行認證的結果輸出。
module-path(模塊路徑)
如果以“/”開頭,則表示模塊的全路徑,否則表示相對於/lib/security/或/lib64/security/的相對路徑。
[root@iZwz9catu2mrq92b07d1d0Z ~]# ls -l /lib64/security/
total 732
-rwxr-xr-x 1 root root 18552 Mar 22 2017 pam_access.so
-rwxr-xr-x. 1 root root 7504 Dec 8 2011 pam_cap.so
-rwxr-xr-x 1 root root 10272 Mar 22 2017 pam_chroot.so
-rwxr-xr-x 1 root root 27080 Mar 22 2017 pam_console.so
-rwxr-xr-x 1 root root 14432 Mar 22 2017 pam_cracklib.so
-rwxr-xr-x 1 root root 10168 Mar 22 2017 pam_debug.so
-rwxr-xr-x 1 root root 5952 Mar 22 2017 pam_deny.so
...
module-arguments(模塊參數)
3、可用模塊
官方介紹:http://www.linux-pam.org/Linux-PAM-html/sag-module-reference.html
pam_access - 日誌監控風格的訪問控制
pam_access.so [ debug ] [ nodefgroup ] [ noaudit ] [ accessfile=file ] [ fieldsep=sep ] [ listsep=sep ]
(1)使用介紹
當用戶要訪問應用程式時,accessfile(預設是/etc/security/access.conf)就會被掃描來檢測用戶是否具有訪問許可權並返回結果。
accessfile中的每一行都包括三個域,以冒號隔開,如下所示:
permission:users/groups:origins
- 第一個域,permission,值為+或-,+表示允許訪問,-表示拒絕訪問;
- 第二個域,users/groups,列出一個或多個用戶名/組名,或者直接使用ALL(代表所有用戶和組)。為了區分用戶名和組名,組名應加上括弧,例如:(group);
- 第三個域,origins,列出一種或多種登錄方式,如:tty名稱(tty是本地虛擬終端,比如:在阿裡雲CentOS實例的遠程連接中可以切換到不同的虛擬終端,CTRL+ALT+F1代表切換到tty1,CTRL+ALT+F2代表切換到tty2,如此類推),IP地址,ALL(代表所有登錄方式)等
(2)參數說明
- debug
大量的調試信息會被syslog記錄下來 - nodefgroup
只有寫在括弧內的名稱才會去匹配組文件,例如:(wheel),若沒有設置該參數,則先匹配用戶文件再匹配組文件 - noaudit
當有用戶從未被允許的主機或終端登錄時,事件不會被報告 - accessfile=/path/to/access.conf
設置配置文件路徑,主要用於不同的服務對應不同的配置 - fieldsep=separators
配置文件的域分隔符,預設的域分隔符是英文冒號,如果fieldsep=|,那麼|將作為域分隔符,而英文冒號則被看作普通字元 - listsep=separators
每個域都是一個列表,該選項改變配置文件的列表分隔符,預設的列表分隔符是空格,如果listsep=,,那麼逗號將作為列表分隔符,而空格則被看作普通字元,這可能用於用戶名或組名含有空格的情況,但必須要註意的是此時欄位值與分隔符之間也不能存在空格!
(3)應用場景
例1:限制用戶的SSH登錄
[root@iZwz9catu2mrq92b07d1d0Z ~]# cp /etc/pam.d/sshd /etc/pam.d/sshd_backup
//修改SSH對應的PAM配置文件,新增pam_access模塊認證
[root@iZwz9catu2mrq92b07d1d0Z ~]# vi /etc/pam.d/sshd
#%PAM-1.0
account requisite pam_access.so nodefgroup accessfile=/etc/mypam/access_ssh.conf fieldsep=| listsep=,
[root@iZwz9catu2mrq92b07d1d0Z ~]# mkdir /etc/mypam
//編輯accessfile(註:匹配的順序從第一行開始)
[root@iZwz9catu2mrq92b07d1d0Z ~]# vi /etc/mypam/access_ssh.conf
#允許root和組mygroup1的成員登錄
+|root (mygroup1)|ALL
#拒絕root和組mygroup1的成員以外的用戶登錄
-|ALL EXCEPT root (mygroup1)|ALL
#拒絕指定用戶從非指定的ip進行登錄
-|cjh|ALL EXCEPT 120.231.146.242
pam_nologin - 防止非root用戶登錄
http://www.linux-pam.org/Linux-PAM-html/sag-pam_nologin.html
pam_tally2 - 登錄計數器
http://www.linux-pam.org/Linux-PAM-html/sag-pam_tally2.html