可插入式認證模組 Pluggable Authentication Modules (PAM)
可插入式認證模組 ( PAM ) 顧名思義就是認證的方法以模組的方式提供,想使用什麼認證方法就插入什麼模組,透過 PAM 認證方法可以隨意組合,稱之為 PAM 堆疊 ( PAM Stack ),如帳密、指紋、結合 IC 卡認證。
使用 PAM,應用程式可以呼叫 libpam 函式來使用,其中一個模組當然包含了傳統的 NSS 驗證方式,可透過 libc 函式來呼叫,不管使用多少模組,整個驗證結果只會有一個,就是通過或失敗。
PAM 的模組存放在 /lib/security 底下: ()
# ls /lib/security/ (例出所有模組)
pam_access.so pam_krb5 pam_permit.so pam_tally.so
pam_ccreds.so pam_krb5afs.so pam_pkcs11.so pam_time.so
pam_chroot.so pam_krb5.so pam_postgresok.so pam_timestamp.so
pam_console.so pam_lastlog.so pam_rhosts_auth.so pam_umask.so
pam_cracklib.so pam_ldap.so pam_rhosts.so pam_unix_acct.so
pam_debug.so pam_limits.so pam_rootok.so pam_unix_auth.so
pam_deny.so pam_listfile.so pam_rps.so pam_unix_passwd.so
pam_echo.so pam_localuser.so pam_securetty.so pam_unix_session.so
pam_env.so pam_loginuid.so pam_selinux.so pam_unix.so
pam_exec.so pam_mail.so pam_shells.so pam_userdb.so
pam_filter pam_mkhomedir.so pam_smb_auth.so pam_warn.so
pam_filter.so pam_motd.so pam_smbpass.so pam_wheel.so
pam_ftp.so pam_namespace.so pam_stack.so pam_winbind.so
pam_group.so pam_nologin.so pam_stress.so pam_xauth.so
pam_issue.so pam_oddjob_mkhomedir.so pam_succeed_if.so
pam_keyinit.so pam_passwdqc.so pam_tally2.so
也可以外加一些設定檔來控制驗證結果的反應,這些外加的設定檔在 /etc/security/:
# ls /etc/security/
access.conf console.handlers group.conf namespace.init time.conf
chroot.conf console.perms limits.conf opasswd
console.apps console.perms.d namespace.conf pam_env.conf
PAM 的堆疊存放在 /etc/pam.d/ 之中:
# ls /etc/pam.d/
atd gnome-system-log postgresql smtp.sendmail system-config-lvm
authconfig halt poweroff squid system-config-network
authconfig-gtk kbdrate ppp sshd system-config-network-cmd
authconfig-tui kcheckpass pup su system-config-nfs
chfn kdm radiusd sudo system-config-printer
chsh kdm-np reboot sudo-i system-config-rootpassword
config-util klaptop_acpi_helper remote su-l system-config-samba
cpufreq-selector kppp rhn_register system-auth system-config-securitylevel
crond kscreensaver ricci system-auth-ac system-config-selinux
cups login run_init system-cdinstall-helper system-config-services
cvs neat runuser system-config-authentication system-config-soundcard
dateconfig newrole runuser-l system-config-cluster system-config-time
dovecot other sabayon system-config-date system-config-users
eject passwd samba system-config-display system-install-packages
gdm pirut screen system-config-httpd vmware-guestd
gdm-autologin pm-hibernate serviceconf system-config-kdump vsftpd
gdmsetup pm-powersave setup system-config-keyboard wbem
gnome-screensaver pm-suspend smtp system-config-language
每一個檔案就是一個 PAM 認證堆疊,也就是該服務的認證方式的組合,如 sshd 的認證堆疊在 /etc/pam.d/sshd 檔案裡面,如果該服務的堆疊遺失了,則以 /etc/pam.d/other 作為該服務的 PAM 堆疊。
==============================
PAM 驗證階段
PAM 驗證分成 4 個階段:
.auth : 驗證階段,驗證帳號密碼是否正確。
.account : 授權階段,判斷是否可以授權給該使用者,如密碼是否過期。
.password : 密碼變更方法,決定如何變更密碼。
.session : 工作階段,在程式的啟動或關閉階段要進行的工作,如登錄記錄檔。
雖然 PAM 的驗證分成 4 個階段,但是並不需要全部具備,有些甚至可能不適合使用某個階段,那就不能加到堆疊中。
==============================
PAM 控制旗標
PAM 堆疊是由數個模組所組成,模組的執行順序是由上而下循序執行,控制旗標是用來決定某個模組要如何影響堆疊的執行順序和最後驗證結果,控制旗標共有 5 種:
.required : 一定要通過的驗證模組,不管驗證通過或失敗,繼續執行以下的模組。
.requisite : 一定要通過的驗證模組,如果驗證通過則繼續執行以下的模組,驗證失敗則不再執行底下的模組,且回覆整個堆疊的驗證結果為失敗。
.sufficient : 如果此模組驗證通過,且前面的模組驗證都通過,則不用再驗證底下的模組,直接回覆整個堆疊的驗證結果為通過;如果此模組驗證失敗,則勿略此模組的驗證結果,且繼續執行底下的模組。
.optional : 與整個堆疊通過與否無關,通常做為初始化用的,如登錄記錄檔。
.include : 將別的檔案中「相同驗證階段」的模組內容包含進來當作堆疊的一部份,並執行驗證。
除了這 5 種控制旗標外,另有進階的控制旗標語法:
[default=bad success=ok ignore=ignore user_unknown=ignore]
此行旗標的意思是,在這個模組驗證中,因為 default 是 bad,所以模組中的所有驗證項目一定要通過 (即 required ),通過則為 ok,如果發生了「user_unknown」這個錯誤,則予以勿略,不會影響此模組的驗證結果。
也就是:除了 user_unknown 的錯誤以外,此模組是 required。
==============================
PAM 堆疊的檔案結構
# cat /etc/pam.d/login
#%PAM-1.0
auth required pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so close
session include system-auth
session required pam_loginuid.so
session optional pam_console.so
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
欄一 欄二 欄三 欄四
驗證階段 控制旗標 使用的模組名稱 模組的參數
PAM 相關的說明文件可在 /usr/share/doc/pam-xxxx/html/ 或 /usr/share/doc/pam-xxxx/txts/ 之中找到。
==============================
system-auth 堆疊
/etc/pam.d/system-auth 是最常被 include 的 PAM 堆疊, 它的內容:
# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
system-auth 可用 system-config-authentication 指令來修改內容,它是 X 視窗的應用程式:
#system-config-authentication
自動引用通知: ISHM Blog » 使用者管理(三)