PAM(Pluggable Authentication Modules)認證機制詳情
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.介紹PAM
PAM(Pluggable Authentication Modules)即可插拔式認證模塊,它是一種高效而且靈活的用戶級別的認證方式,它也是當前Linux服務器普遍使用的認證方式。PAM可以根據用戶的網段、時間、用戶名、密碼等實現認證。並不是所有需要驗證的服務都使用PAM來驗證,如MySQL-Server,httpd就沒有安裝相應的PAM文件(因此我們可以說pam只對簡單的應用有認證功能,對於應用機制比較復雜的需要其自己編寫相應的認證機制代碼啦)。當然,程序通過了PAM的驗證之后,PAM程序還會持續跟蹤驗證后的對象,對其做相應的訪問限制。PAM就很像人力資源部門,當你入職一下公司的時候是人力得認證你,等認證成功后你才可以入職,而入職之后並不是人力部門就不管理了,人力資源部門還是會持續監督你在公司從入職到離職的行為並做相應的操作。
二.PAM的原理
1.PAM認證流程
當一個簡單的應用程序需要用到認證功能時,會找到Linux的PAM模塊來進行認證功能。PAM是一個核心模塊,因此它並不負責認證,而是應用程序自定義的PAM配置文件,這個自定的PAM配置文件中記錄了會調用相應的模塊進行認證(當然PAM也是需要依賴“/etc/nsswitch.conf”這個配置文件去找相關的文件喲)。PAM讀取配置文件之后會根據讀取到的內容進行相應的認證操作(會根據認證類型和控制流程進行認證,下面會有介紹),最后會將認真的結構返回給應用程序。

2.PAM配置文件格式
如果我們使用PAM的核心配置文件可以用一個文件來管理(/etc/pam.conf),也可以用多個文件進行管理(/etc/pam.d/service)。
a>./etc/pam.conf
如果我們使用一個配置文件進行認真的話,可以清楚的知道每一行的規則是應用在哪個服務上的,當然如果你這樣做的話會導致配置文件過大!具體格式如下:“Service(服務) type(認證類型) control(控制流程,控制標記) module-path(模塊路徑)module-arguments(模塊參數)”
b>./etc/pam.d/service
如果想要把每個應用程序都單獨用一個配置文件信息管理的話,只需要在“/etc/pam.d/”目錄下建立相應的配置文件名稱並做相應的配置即可。具體格式如下:” type(認證類型) control(控制) module-path(模塊路徑)module-arguments(模塊參數)“
三.PAM模塊認證類型(我們也可以把它理解為”棧“)
1.auth
認證管理,驗證使用者身份,賬號和密碼。
2.account
用戶認證,基於用戶表,時間或密碼有效期來決定是否允許訪問。
3.password
密碼(口令),認證管理 進制用戶方法嘗試登陸,在變更密碼是進行密碼復雜性控制。
4.session
會話管理,進行日志記錄,或者限制用戶登陸的次數,資源限制。
四.PAM模塊的控制流程(控制標記,用於控制認證成功或失敗時要采取相應的動作)
1.required
必要條件。此關不過,仍需檢測同一個棧中的其他模塊,最后返回failure,認證失敗。擁有參考其他模塊意見基礎之上的一票否決權。可以通過其它模塊來檢查為什么驗證沒有通過。
2.requisite
必要條件,驗證失敗時則立即結束整個驗證過程,返回fail,就好比讓你答題100道,如果在答題的過程中有一道做錯了直接讓你出去,不會進行下面的答題過程。擁有一票否決,此關不過,立即返回failure。
3.sufficient
充分條件,驗證成功則立即返回OK,不再繼續驗證,否則忽略sufficient的結果並繼續其它。換句話說,sufficient的驗證失敗對整個驗證沒有任何影響。
4.optional
可選條件,無論驗證結果如何,均不會影響。通常用於session類型。
5.include
包含另外一個配置文件中類型相同的行。換句話說,包含進來指定的其他配置文件中同名棧中的規則,並以之進行驗證。
6.substack
俗稱子棧,這個控制流程俺沒有用過,基本上也用不到,我們可以忽略。
五.常用PAM模塊介紹
1.pam_rootok.so
功能:用戶UID是0,返回成功

1 [root@yinzhengjie ~]# more /etc/pam.d/su | grep pam_rootok.so 2 #auth sufficient pam_rootok.so 3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# su yinzhengjie 5 Password: 6 [yinzhengjie@yinzhengjie root]$ exit 7 exit 8 [root@yinzhengjie ~]# 9 [root@yinzhengjie ~]# more /etc/pam.d/su | grep pam_rootok.so 10 auth sufficient pam_rootok.so 11 [root@yinzhengjie ~]# su yinzhengjie 12 [yinzhengjie@yinzhengjie root]$ 13 [yinzhengjie@yinzhengjie root]$ exit 14 exit 15 [root@yinzhengjie ~]#
2.pam_access.so
功能:訪問控制,默認配置文件為“/etc/security/access.conf ”,通常作用於登陸程序,如su,login,gdm,sshd等等。

1 [root@yinzhengjie ~]# more /etc/pam.d/sshd | grep pam_access.so 2 auth required pam_access.so 3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# tail -4 /etc/security/access.conf 5 #Add by yinzhengjie 6 -:root:ALL EXCEPT 10.0.0.0/24 #只讓root從10.0.0.0/24的網段訪問 7 #-:root:10.0.0.0/24 #拒絕從10.0.0.0/24這個C的地址訪問過來。 8 #-:root:ALL EXCEPT 10.10.0.161 #拒絕從10.10.0.161這個IP訪問過來。 9 [root@yinzhengjie ~]#
3.pam_listfile.so
功能:基於自定義文件允許或拒絕訪問資源限制

1 [root@yinzhengjie ~]# grep listfile /etc/pam.d/sshd 2 auth required pam_listfile.so item=user sense=allow file=/etc/yinzhengjie_ssh_users onerr=fail #注意,“onerr=fail”表示當文件“/etc/yinzhengjie_ssh_users”不存在時,默認為fail。 3 [root@yinzhengjie ~]# > /var/log/secure 4 [root@yinzhengjie ~]# tail -10f /var/log/secure 5 Feb 4 23:13:36 yinzhengjie sshd[6509]: reverse mapping checking getaddrinfo for bogon [10.0.0.161] failed - POSSIBLE BREAK-IN ATTEMPT! 6 Feb 4 23:13:36 yinzhengjie sshd[6509]: pam_listfile(sshd:auth): Couldn't open /etc/yinzhengjie_ssh_users 7 Feb 4 23:13:38 yinzhengjie sshd[6509]: Failed password for root from 10.0.0.161 port 55937 ssh2 8 Feb 4 23:13:44 yinzhengjie sshd[6510]: Received disconnect from 10.0.0.161: 13: The user canceled authentication. 9 ^C 10 [root@yinzhengjie ~]# echo root > /etc/yinzhengjie_ssh_users 11 [root@yinzhengjie ~]# 12 [root@yinzhengjie ~]# tail -10f /var/log/secure 13 Feb 4 23:13:36 yinzhengjie sshd[6509]: reverse mapping checking getaddrinfo for bogon [10.0.0.161] failed - POSSIBLE BREAK-IN ATTEMPT! 14 Feb 4 23:13:36 yinzhengjie sshd[6509]: pam_listfile(sshd:auth): Couldn't open /etc/yinzhengjie_ssh_users 15 Feb 4 23:13:38 yinzhengjie sshd[6509]: Failed password for root from 10.0.0.161 port 55937 ssh2 16 Feb 4 23:13:44 yinzhengjie sshd[6510]: Received disconnect from 10.0.0.161: 13: The user canceled authentication. 17 Feb 4 23:14:13 yinzhengjie sshd[6513]: Accepted password for root from 10.0.0.161 port 55960 ssh2 18 Feb 4 23:14:13 yinzhengjie sshd[6513]: pam_unix(sshd:session): session opened for user root by (uid=0) 19 ^C 20 [root@yinzhengjie ~]#
4.pam_time.so
功能:基於時間的訪問控制,默認文件“/etc/security/time.conf ”

1 [root@yinzhengjie ~]# tail -2 /etc/security/time.conf 2 #Add by yinzhengjie 3 sshd;*;*;SaSu0900-1800 #表示sshd服務的所有終端的所有用戶只能在8-18點可以正登陸。 4 [root@yinzhengjie ~]#
5.pam_tally2.so
功能:登陸統計

1 [root@yinzhengjie ~]# grep pam_tally2.so /etc/pam.d/sshd 2 auth required pam_tally2.so deny=2 even_deny_root root_unlock_time=60 unlock_time=60 #表示當用戶輸入次數超過2次時,鎖定用戶60秒,因此這里的“even_deny_root ”表示包括root用戶,“root_unlock_time”表示root用戶鎖定的時間,“unlock_time”表示其他用戶鎖定的時間。 3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# pam_tally2 --reset -u root #這里表示手動解鎖。 5 Login Failures Latest failure From 6 root 0 7 [root@yinzhengjie ~]#
6.pam_limits.so
功能:限制用戶會話過程中對各種資源的使用情況。缺省情況下該模塊的配置文件是“/etc/security/limits.conf ”或“/etc/security/limits.d/*.conf”

1 [root@yinzhengjie ~]# ulimit -a 2 core file size (blocks, -c) 0 3 data seg size (kbytes, -d) unlimited 4 scheduling priority (-e) 0 5 file size (blocks, -f) unlimited 6 pending signals (-i) 3810 7 max locked memory (kbytes, -l) 64 8 max memory size (kbytes, -m) unlimited 9 open files (-n) 1024 10 pipe size (512 bytes, -p) 8 11 POSIX message queues (bytes, -q) 819200 12 real-time priority (-r) 0 13 stack size (kbytes, -s) 10240 14 cpu time (seconds, -t) unlimited 15 max user processes (-u) 3810 16 virtual memory (kbytes, -v) unlimited 17 file locks (-x) unlimited 18 [root@yinzhengjie ~]# ulimit -n 19 1024 20 [root@yinzhengjie ~]# 21 [root@yinzhengjie ~]# tail -5 /etc/security/limits.conf 22 #Add by yinzhengjie 23 * soft nofile 10240 24 * hard nofile 10240 25 * soft nproc 10240 26 * soft cpu 1 27 [root@yinzhengjie ~]# 28 [root@yinzhengjie ~]# exit 29 logout 30 Last login: Sun Feb 4 23:31:27 2018 from 10.0.0.161 31 [root@yinzhengjie ~]# ulimit -n 32 10240 33 [root@yinzhengjie ~]#
六.查看進程文件是否支持PAM認證
注意:PAM資源限制僅針對用戶,不針對進程。換句話說,通一個進程如果被不同的用戶執行,他們的影響是不一樣的。如果進程以root運行,就不會受到PAM的限制。
1 [root@yinzhengjie ~]# which sshd 2 /usr/sbin/sshd 3 [root@yinzhengjie ~]# which login 4 /bin/login 5 [root@yinzhengjie ~]# ldd /usr/sbin/sshd | grep pam 6 libpam.so.0 => /lib64/libpam.so.0 (0x00007f2c196cf000) 7 [root@yinzhengjie ~]# 8 [root@yinzhengjie ~]# ldd `which login` | grep pam #注意,ldd命令是查看進程文件支持的動態庫,而ldconfig是可以查看已經加載的動態庫。我們可以用“ldconfig -p”來打印當前操作系統已經加載的動態庫。 9 libpam.so.0 => /lib64/libpam.so.0 (0x000000323b200000) 10 libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x0000003230a00000) 11 [root@yinzhengjie ~]#