PAM
Linux 可插拔認證模塊(PAM,Pluggable Authentication Modules)提供了系統級的用戶認證框架。如下描述引用自項目介紹:
- PAM 將程序開發與認證方式進行分離,程序在運行時調用附加的「認證模塊」完成自己的工作。本地系統管理員可通過配置選擇要使用哪些認證模塊。
本文描述在 Arch Linux 下用於認證本地和遠程用戶的基礎默認設置。對默認設置的更改在連結的專門文章內展開。
安裝
pam包 包受 base包 元軟體包依賴,默認已經安裝在系統。PAM 模塊放置於 /usr/lib/security 目錄。
軟體倉庫中還包括其它一些可選的 PAM 包,詳見 #配置方法。
配置文件
/etc 目錄有多個子目錄與 PAM 相關,使用命令 pacman -Ql pam | grep /etc 查看創建的默認配置文件。這些配置與模塊的 #安全性參數或 #PAM 基礎配置有關。
安全性參數
/etc/security 包含了對認證方法參數的系統級配置,基礎安裝使用上游默認配置。
注意 Arch Linux 沒有對這些配置文件進行定製。例如 /etc/security/pwquality.conf 可用於配置系統級的密碼強度要求,但需要手動將 pam_pwquality.so 模塊加入到 #PAM 基礎棧內(Arch Linux 默認沒有包含該模塊)。
詳見 #安全性參數配置。
PAM 基礎棧
/etc/pam.d/ 目錄專門用於存放 PAM 配置,用於為具體的應用程式設置獨立的認證方式。配置文件由以下安裝包提供:
- pambase包。包含供應用程式使用的特定於 Arch Linux 的 PAM 基礎配置。
- 其它基礎包。例如 util-linux包 添加了為
login及其它一些應用的認證配置, shadow包 提供 Arch Linux 默認的用戶資料庫認證方式(參見用戶和用戶組)。
基礎安裝的不同配置文件相互連結,在運行時「堆疊」,稱為「PAM 棧」。例如,在用戶登錄時,login 程序將加載 system-local-login 策略,而該策略又會加載其他策略:
/etc/pam.d/
login -> system-local-login -> system-login -> system-auth
不同的應用程式加載配置的鏈路可能不同。例如,openssh包 加載 sshd PAM 策略的鏈路如下:
/etc/pam.d/
sshd -> system-remote-login -> system-login -> system-auth
因此,需要從鏈路中選擇合適的配置文件。對於上述示例,可以通過 sshd 設置其特殊的驗證方式,或者通過 system-remote-login 更改所有遠程登錄的驗證方式。這兩種方式不影響本地登錄,修改 system-login 或 system-auth 則會同時影響本地和遠程登錄。
如 sshd 的例子,任何接入 PAM(pam-aware)的應用程式都需要在 /etc/pam.d 目錄下安裝的單獨策略,以便正確集成並依賴 PAM 棧。否則應用程式將使用默認配置 /etc/pam.d/other,拒絕認證並在日誌中記錄警告。
接入 PAM 的程序在運行時動態連結 PAM,例如:
$ ldd /usr/bin/login | grep pam
libpam.so.0 => /usr/lib/libpam.so.0 (0x000003d8c32d6000) libpam_misc.so.0 => /usr/lib/libpam_misc.so.0 (0x000003d8c30d2000)
login 程序接入了 PAM,因此相應的認證策略必須存在。
PAM 的手冊頁 pam(8) 和 pam.d(5) 描述了配置文件的標準規範。其中解釋了四個 PAM 管理組⸺帳戶管理(account)、認證管理(auth)、密碼管理(password)、會話管理(session)⸺和各種控制值(用於配置模塊堆疊方式和行為)。
此外,詳盡的文檔安裝在 /usr/share/doc/Linux-PAM/index.html,包含多個指南,其中提供每個標準模塊的手冊頁。
配置方法
本節提供了一個目錄,包括關於如何修改 PAM 配置和如何添加特殊的 PAM 模塊的文章/章節。注意,模塊的 man 手冊通常與模塊名一致(不包括 .so 後綴)。
安全性參數配置
下面的章節描述如何修改 PAM 默認參數配置:
- 更改允許空密碼的默認設置。
- 使用
pam_crackib.so強制使用強密碼。
- 使用
pam_tally.so限制嘗試登錄次數。
- 使用
pam_wheel.so限制用戶登錄。
- 使用
pam_limits.so來配置系統進程限制。
- 使用
pam_env.so設置環境變量的示例。
PAM 棧和模塊配置
下面的章節說明對於具體的用例,如何修改 #PAM 基礎棧:
- 使用
pam_mount.so在用戶登錄時自動掛載加密目錄。
- 使用
pam_ecryptfs.so自動掛載加密目錄。
- 使用
pam_exec.so在用戶登錄時執行自定義腳本。
- 使用
pam_ldap.so集成 LDAP 客戶端或服務端認證。
- 使用 U2F(
pam_u2f.so)和 YubiKey 提供的專有 Yubico OTP 實現(pam_yubico.so)。
- 使用
pam_oath.so進行軟體雙因素認證。
- 使用
pam_fprintd.so進行指紋認證。
- 保存用戶名和密碼以自動登錄。
- 使用
pam_usb.so通過 USB 設備進行(可作為雙因素)認證。
- 使用
pam_ssh.so認證遠程用戶身份。
- 使用
pam_abl.so限制通過 ssh 的暴力破解攻擊。
- 使用
pam_encfs.so自動掛載加密目錄。
- 使用
pam_google_authenticator.so進行雙因素認證。
- 使用
pam_pwdfile.so配置 FTP chroot,以便在沒有本地系統帳戶的情況下對用戶進行身份驗證。
更多 PAM 包
除了上面提到的包,AUR 中還包括許多另外的 PAM 模塊和工具:
- Pamtester — PAM 測試工具集
注意,AUR中有一個 PAM 關鍵詞標籤,但並不是所有可用的相關軟體包都包含。因此,可能還是需要搜索軟體包描述。
提示與技巧
被封鎖
如果被 PAM 封鎖,可能是密碼輸錯太多次了,參見安全#在三次登錄嘗試失敗後封鎖用戶。
參閱
- linux-pam.org⸺項目主頁
- Understanding and configuring PAM⸺一篇入門文章
- Login managers: An introduction⸺結合顯示管理器說明 PAM 的必要性