在Linux中執行有些程序時,這些程序在執行前首先要對啟動它的用戶進行認證,符合一定的要求之后才允許執行,例如login, su等
在Linux中進行身份或是狀態的驗證程序是由PAM來進行的,PAM(Pluggable Authentication Modules)可動態加載驗證模塊,因為可以按需要動態的對驗證的內容進行變更,所以可以大大提高驗證的靈活性。
Linux各個發行版中,PAM使用的驗證模塊一般存放在/lib/security/目錄下,可以使用ls命令進行查看本計算機支持哪些驗證控制方式,一般的PAM模塊名字例如pam_unix.so,模塊可以隨時在這個目錄下添加和刪除,這不會直接影響程序運行,具體的影響在PAM的配置目錄下。
PAM的配置文件位於/etc/pam.d文件下面。ls命令可以看到所有的文件配置
root@zhf-maple:/etc/pam.d# ls -al
總用量 124
drwxr-xr-x 2 root root 4096 11月 27 21:31 .
drwxr-xr-x 133 root root 12288 11月 27 21:31 ..
-rw-r--r-- 1 root root 384 11月 20 2014 chfn
-rw-r--r-- 1 root root 92 11月 20 2014 chpasswd
-rw-r--r-- 1 root root 581 11月 20 2014 chsh
-rw-r--r-- 1 root root 1208 11月 26 20:23 common-account
-rw-r--r-- 1 root root 1249 11月 26 20:23 common-auth
-rw-r--r-- 1 root root 1480 11月 26 20:23 common-password
-rw-r--r-- 1 root root 1470 11月 26 20:23 common-session
-rw-r--r-- 1 root root 1435 11月 26 20:23 common-session-noninteractive
-rw-r--r-- 1 root root 606 8月 21 07:54 cron
-rw-r--r-- 1 root root 69 9月 14 00:53 cups
-rw-r--r-- 1 root root 884 9月 30 2015 lightdm
-rw-r--r-- 1 root root 551 9月 30 2015 lightdm-autologin
-rw-r--r-- 1 root root 727 8月 24 2015 lightdm-greeter
-rw-r--r-- 1 root root 4905 11月 27 21:31 login
-rw-r--r-- 1 root root 92 11月 20 2014 newusers
-rw-r--r-- 1 root root 520 4月 22 2017 other
-rw-r--r-- 1 root root 92 11月 20 2014 passwd
-rw-r--r-- 1 root root 270 5月 24 2017 polkit-1
-rw-r--r-- 1 root root 168 1月 28 2016 ppp
-rw-r--r-- 1 root root 143 7月 11 09:19 runuser
-rw-r--r-- 1 root root 138 7月 11 09:19 runuser-l
-rw-r--r-- 1 root root 2257 11月 20 2014 su
-rw-r--r-- 1 root root 239 6月 13 03:51 sudo
-rw-r--r-- 1 root root 317 10月 3 11:24 systemd-user
-rw-r--r-- 1 root root 57 9月 13 09:14 ukui-screensaver
-rw-r--r-- 1 root root 319 5月 8 2014 vsftpd
我們看下文件里面的格式是什么:
root@zhf-maple:/etc/pam.d# cat ./login
#
# The PAM configuration file for the Shadow `login' service
#
# Enforce a minimal delay in case of failure (in microseconds).
# (Replaces the `FAIL_DELAY' setting from login.defs)
# Note that other modules may require another minimal delay. (for example,
# to disable any delay, you should add the nodelay option to pam_unix)
auth optional pam_faildelay.so delay=3000000
auth required pam_securetty.so
配置文件的格式主要有4列組成:
第一列代表模塊類型,類型分為4種:
auth: 用來對用戶的身份進行識別.如:提示用戶輸入密碼,或判斷用戶是否為root
account:對帳號的各項屬性進行檢查.如:是否允許登錄,是否達到最大用戶數,或是root用戶是否允許在這個終端登錄等
session:這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作.如:登錄連接信息,用戶數據的打開與關閉,掛載文件系統等.
passwd:使用用戶信息來更新.如:修改用戶密碼.
第二列代表控制標記:也有4種類型:
required: 表示即使某個模塊對用戶的驗證失敗,也要等所有的模塊都執行完畢后,PAM 才返回錯誤信息。這樣做是為了不讓用戶知道被哪個模塊拒絕。如果對用戶驗證成功,所有的模塊都會返回成功信息
requisite: 與required相似,但是如果這個模塊返回失敗,則立刻向應用程序返回失敗,表示此類型失敗.不再進行同類型后面的操作.
sufficient:表示如果一個用戶通過這個模塊的驗證,PAM結構就立刻返回驗證成功信息(即使前面有模塊fail了,也會把 fail結果忽略掉),把控制權交回應用程序。后面的層疊模塊即使使用requisite或者required 控制標志,也不再執行。如果驗證失敗,sufficient 的作用和 optional 相同
optional:表示即使本行指定的模塊驗證失敗,也允許用戶接受應用程序提供的服務,一般返回PAM_IGNORE(忽略).
第三列代表模塊路徑:要調用模塊的位置。一般是在/lib/security文件中。但是每個版本都不太一樣,比如我是用的ubuntun17.10。模塊位於/lib/x86_64-linux-gnu/security文件夾下面
zhf@zhf-maple:/lib/x86_64-linux-gnu/security$ ls -al
總用量 1064
drwxr-xr-x 2 root root 4096 11月 26 20:05 .
drwxr-xr-x 3 root root 12288 11月 26 20:08 ..
-rw-r--r-- 1 root root 18672 4月 22 2017 pam_access.so
-rw-r--r-- 1 root root 10080 10月 11 16:26 pam_cap.so
-rw-r--r-- 1 root root 10376 4月 22 2017 pam_debug.so
-rw-r--r-- 1 root root 6000 4月 22 2017 pam_deny.so
-rw-r--r-- 1 root root 10336 4月 22 2017 pam_echo.so
-rw-r--r-- 1 root root 14536 4月 22 2017 pam_env.so
-rw-r--r-- 1 root root 14728 4月 22 2017 pam_exec.so
-rw-r--r-- 1 root root 60368 4月 22 2017 pam_extrausers.so
-rw-r--r-- 1 root root 10368 4月 22 2017 pam_faildelay.so
-rw-r--r-- 1 root root 14576 4月 22 2017 pam_filter.so
-rw-r--r-- 1 root root 10304 4月 22 2017 pam_ftp.so
-rw-r--r-- 1 root root 42984 7月 31 21:21 pam_gnome_k
第四列是模塊參數:參數可以用多個,之間用空格隔開。例如:password required pam_unix.so nullok obscure min=4 max=8 md5
我們再來看下配置文件里面的內容:比如下面兩種。其中紅色的字體注釋已經寫明了對應的模塊需要做那些配置
# Uncomment and edit /etc/security/access.conf if you need to
# set access limits.
# (Replaces /etc/login.access file)
# account required pam_access.so
# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session required pam_limits.so
下面我們介紹集中常用的PAM模塊,如下表:
PAM模塊 |
結合管理類型 |
說明 |
pam_unix.so |
auth |
提示用戶輸入密碼,並與/etc/shadow文件相比對.匹配返回0 |
account |
檢查用戶的賬號信息(包括是否過期等).帳號可用時,返回0. |
|
password |
修改用戶的密碼. 將用戶輸入的密碼,作為用戶的新密碼更新shadow文件 |
|
pam_shells.so |
auth account |
如果用戶想登錄系統,那么它的shell必須是在/etc/shells文件中之一的shell |
pam_deny.so |
account auth password session |
該模塊可用於拒絕訪問 |
pam_permit.so |
auth account password session |
模塊任何時候都返回成功. |
pam_securetty.so |
auth |
如果用戶要以root登錄時,則登錄的tty必須在/etc/securetty之中. |
pam_listfile.so |
auth account password session |
訪問應用程的控制開關 |
pam_cracklib.so |
password |
這個模塊可以插入到一個程序的密碼棧中,用於檢查密碼的強度. |
pam_limits.so |
session |
定義使用系統資源的上限,root用戶也會受此限制,可以通過/etc/security/limits.conf或/etc/security/limits.d/*.conf來設定 |
我們用pam_securetty.so這個模塊來做個測試。這個模塊的作用是如果用戶要以root登錄時,則登錄的tty必須在/etc/securetty之中。我們知道我們在鍵盤上可以用ctrl+alt+f1-ctrl+alt+f6來登錄各個終端。現在我們來限制root的登錄終端
第一步:首先在/etc/pam.d/login文件中配置如下,表明當用戶為root的時候需要用pam_securetty.so來進行驗證
auth required pam_securetty.so
第二步:在/etc/securetty中將tty2給注釋掉
# Virtual consoles
tty1
#tty2
第三步:在用root用戶登錄tty2的時候則會提示login incorrect.