1. 简介
PAM(Pluggable Authentication Modules)是由Sun提出的一种认证机制。
PAM模块的中文全称为可拔插认证模块,从名字就可以看出该模块的一些特性和作用——即可拔插和用于系统认证。
准确的来说,PAM模块通过一套动态链接库和一套统一的API,将系统提供的服务和其认证分离,并将其认证统一托管给PAM模块,来实现更加快捷方便的统一管理不同服务之间的认证机制,另外,使用PAM模块也便于向系统中添加新的认证手段。
PAM模块最初集成在Solaris中,目前已经移植到其他系统中。
2. 结构
PAM模块大致可以分为三个部分。
应用开发者使用PAM SPI(Service Module API)来编写认证模块,将不同的认证机制加入到系统中。
系统管理员通过PAM配置文件来制定认证策略。
PAM库(libpam)则负责读取配置文件,并以此为根据将服务程序的相应的认证方法联系起来。
3. PAM具体配置
PAM的配置文件包括/etc/pam.conf和/etc/pam.d/这两个,其中后者是一个文件夹,并在其中有多个以服务名为名的文件来对不同的服务进行配置(且在RedHat中,后者配置的优先级高于前者)。
在pam.conf中,配置主要有以下几列来完成。
service-name | module-type | control-flag | module-path | arguments |
---|---|---|---|---|
服务名 | 管理方式 | 应当如何处理结果 | 服务程序路径 | 传入参数 |
下面对这几部分进行解释。
-
service-name
正如其名,该列填入的参数正是服务名。而如果该列为OTHER则代表其后的配置适用于任何没有在该pam模块中配置的应用。
-
modeule-type
这一列需要填入PAM所支持的四种管理方式之一,分别是auth,account,session,password,同一个服务可以调用多个PAM模块进行认证,这些模块构成一个stack。
PAM支持的四种管理方式:
-
认证管理(authentication management)
主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。
-
账户管理(account management)
主要是检查账户是否被允许登录系统,账号是否已经过期,账号的登录是否有时间段的限制等。
-
密码管理(password management)
主要是用来修改账户的密码。
-
会话管理(session management)
主要是提供对会话的管理和记账(accounting)。
-
-
control-flag
这一列需要告诉PAM库如何处理与服务相关的PAM模块的成功或失败情况。他有四种可能的值:required,requisite,sufficient,optional。
required表示本模块必须返回成功才能通过认证,但是如果模块返回失败,失败结果也不会立即通知用户,而是要等到同一stack中的所有模块全部执行完毕再将失败结果返回给应用程序。
requisite与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将直接将控制权返回给应用程序。
注:requisite只有RedHat支持,Solaris不支持。
sufficient表示本模块返回成功已经足以通过身份认证的要求,不必再执行统一stack内的其他模块,但是如果本模块返回失败的话可以忽略。
optional表示本模块是可选的,他的成功与否一般不会对身份认证起到关键作用,其返回值一般被忽略。
-
module-path用来指明本模块对应的应用程序的路径名,一般使用绝对路径,而如果没有使用绝对路径的话,默认是/usr/lib/security下的相对路径。
-
argument是用来传递给 该模块的参数,一般来说每个 模块的参数都不相同,可以由该模块的开发者自己定义,但也有以下几个共同的参数:
debug 该模块应当用syslog()将调试信息写入到系统日志文件中。
no_warn表明该模块不应把警告信息发送给应用程序。
use_first_pass表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。
try_first_pass表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
use_mapped_pass该模块不能提示用户输入密码,而是使用映射过的密码。
expose_account允许该模块显示用户的账号名等信息,一般只能在安全的环境下使用,因为泄露用户名会对安全造成一定程度的威胁。
而如果使用/etc/pam.d/来进行配置:
该目录下的每个文件名对应服务名,而其配置文件中并不存在service-name这一栏,其余部分则与使用pam.conf的配置完全相同。