1. 程式人生 > >PAM - 可插拔認證模塊

PAM - 可插拔認證模塊

用戶名 掃描 權限 nor 規則 安全 6.2 htm ip地址

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、可用模塊

官方文檔:

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用戶登錄

pam_tally2 - 登錄計數器

PAM - 可插拔認證模塊