PAM認證機制詳情


               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 ~]# 
案例展示:(限制root切換用戶也需要密碼)
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 ~]# 
案例展示:(控制訪問的源IP地址)
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 ~]# 
案例展示:(sshd的黑名單或白名單)
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 ~]# 
案例展示:(基於時間限制sshd的訪問)
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 ~]# 
案例展示:(實現防止對sshd暴力破解)
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 ~]# 

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM