PAM介绍
Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制
PAM只关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证
PAM相关文件
模块文件目录:
/lib64/security/*.so
特定模块相关的设置文件:
/etc/security/
应用程序调用PAM模块的配置文件
主配置文件:
/etc/pam.conf #默认不存在,一般不使用主配置
为应用模块提供单独的配置文件:
/etc/pam.d/APP_NAME
注意:
如果/etc/pam.d存在,/etc/pam.conf将失效
查看程序是否支持pam:
ldd `which sshd`|grep pa
PAM工作原理:
PAM认证一般遵循这样的顺序:
Service(服务)→PAM(配置文件)→pam_*.so
例:
- 使用者执行/usr/bin/passwd 程序,并输入密码
- passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
- 经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
- 将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
PAM配置文件格式说明:
注意:
修改PAM配置文件将马上生效
编辑pam规则时,至少保持打开一个root会话,以防止root身份验证错误
通用配置文件:/etc/pam.conf格式:
application type control module-path arguments
子配置文件/etc/pam.d/*.conf格式:
type control module-path arguments
配置文件字段说明:
| 字段 |
作用 |
| application |
指服务名,如:telnet、login、ftp等,服务名字"OTHER"代表所有没有在该文件中明确配置的其它服务 |
| type |
指模块类型,即功能 |
| control |
PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现 |
| module-path |
用来指明本模块对应的程序文件的路径名 |
| Arguments |
用来传递给该模块的参数 |
字段二:模块类型(module-type)
| 模块类型 |
作用 |
| Auth |
账号的认证和授权 |
| Account |
帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录) |
| Password |
用户修改密码时密码复杂度检查机制等功能 |
| Session |
用户会话期间的控制,如:最多打开的文件数,最多的进程数等 |
| -type |
表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用 |
字段三: Control
| 控制类型 |
作用 |
| required |
一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,=再将失败结果返回给应用程序,即为必要条件 |
| requisite |
一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件 |
| sufficient |
一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite |
| optional |
表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略 |
| include |
调用其他的配置文件中定义的配置信息 |
字段四:module-path
模块文件所在绝对路径
模块文件所在相对路径 : /lib64/security目录下的模块可使用相对路径,如:pam_shells.so、pam_limits.so
有些模块有自已的专有配置文件,在/etc/security/*.conf目录下
字段五:Arguments
| 参数 |
作用 |
| debug |
该模块应当用syslog()将调试信息写入到系统日志文件中 |
| no_warn |
表明该模块不应把警告信息发送给应用程序 |
| use_first_pass |
该模块不能提示用户输入密码,只能从前一个模块得到输入密码 |
| try_first_pass |
该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户输入新密码 |
| use_mapped_pass |
该模块不能提示用户输入密码,而是使用映射过的密码 |
| expose_account |
允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁 |