一 什么是PAM?
PAM=Pluggable Authentication Modules,中文就是可插入的认证模块。在这种方式下可以改变用户账号和口令信息的存储方式,例如,可以把用户信息存储在数据库中而不是在文件/etc/passwd中,甚至还可以修改供认证的信息,例如,可以使用智能卡、指纹等而不是用户名和口令认证。大多数主流Linux版本都提供了PAM。
二 PAM的配置文件
PAM配置信息可能在一个单独的叫作/etc/pam.conf的文件里或者存储在目录/etc/pam.d/下的各自的文件里。F7采用了后一种。
目录/etc/pam.d/包含一系列的文件。每一个文件以一个使用PAM做认证的服务命名,包含PAM为这个特定的认证提供服务时必须要用的配置信息。例如,我的F7系统的/etc/pam.d/目录里包含如下文件:
[root@localhost flood]# ls /etc/pam.d/
atd other su-l
authconfig passwd system-auth
authconfig-gtk pirut system-auth-ac
authconfig-tui pm-hibernate system-cdinstall-helper
chfn pm-powersave system-config-authentication
chsh pm-suspend system-config-date
config-util pm-suspend-hybrid system-config-display
crond poweroff system-config-keyboard
cups ppp system-config-language
dateconfig pup system-config-network
eject reboot system-config-network-cmd
gdm remote system-config-printer
gdm-autologin run_init system-config-securitylevel
gdmsetup runuser system-config-selinux
halt runuser-l system-config-services
kbdrate samba system-config-soundcard
kcheckpass serviceconf system-config-time
kdm setup system-config-users
kdm-np smtp system-install-packages
kppp smtp.sendmail vsftpd
kscreensaver sshd xdm
login su xserver
neat sudo
newrole sudo-i
例如 文件vsftpd告诉PAM如何处理来处ftp服务的认证
[root@localhost flood]# more /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ft
pusers onerr=succeed
auth required pam_shells.so
auth include system-auth
account include system-auth
session include system-auth
session required pam_loginuid.so
这个文件包含了一系列的PAM配置指令,每个一行,告诉PAM如何执行来自FTP服务的认证。每条都具有如下的形式:
<module type> <control flag> <module path> <arguments>
这些域的含义如下:
module type是以下4个可能值中的一个:auth(表示这个模块确认谁是授权用户,并肯通过信任凭证授予成员权和其他特权);account(表示这个模块执行非认证账号管理,例如基于用户试图登录时的时间和地点的访问控制);session(表示这个模块在用户登录前登录后为用户执行记录日志信息和加载目录的服务);password(表示这个模块用于更新认证令牌,例如口令)。一般对应每一个auth模块有一个password模块。
Control flag指示PAM应该如何处理这个模块的一次动作的成功或者失败。它的可能值为:required(表示如果没有相同类型的模块成功,就要求这个模块成功);requisite(表示要求这个模块成功,失败意味着整个认证失败,不管是否有其他模块等待尝试);sufficient(表示如果没有required的模块失败的话,这个模块的成功对于整个认证过程就足够了);optional(表示这个模块对于整个认证尝试的成功或者失败并不是关键,如果不清楚其他的模块是否成功,这个模块可以用来判断认证是否成功)。
Module path表示指令要使用的共享目标文件的绝对路径。
arguments是当模块激活时传递给它的一系列选项。这是可选的,而且使用它们是针对每一个具体模块的。