PAM的长处和使用

PAM(可插入认证模块)是很多商业Unix(AIX,HP-UX……)和开源*NIX系统的认证机制和工具,使用便利,管理方便!
以下内容简单介绍PAM的长处和使用情况,基于Linux平台,其他Unix平台略有不同。PAM实现了系统服务认证的功能,可以做到针对某个系统服务的权限设定。服务或应用开发者只要开发相应的PAM插件,系统管理员对PAM做出相应的配置就可以完成系统服务认证工作,最大的特点是系统管理员只要知道PAM怎么用就行了,不必去为每个不同的服务的不同配置而烦恼!
PAM通过不同的模块就可以为不同的程序提供各式认证功能:认证管理; 帐号管理; 会话期间管理;和密码管理

区分程序使用PAM与否:
1.使用ldd命令,如果这个程序的使用的动态连接库没有libpam和libpam_misc,那它肯定不使用PAM验证。
2./etc/pam.d/下相应文件一般和该程序同名。

PAM的配置文件(6.5以后基于目录的配置方式)
位置:/etc/pam.d/
内容样例:
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_nologin.so
auth sufficient /lib/security/pam_ldap.so
auth required /lib/security/pam_unix_auth.so try_first_pass
account sufficient /lib/security/pam_ldap.so
account required /lib/security/pam_unix_acct.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_ldap.so

格式:module-type control-flag module-path arguments
每个服务对应一个配置文件,如以上一段是截自/etc/pam.d/login文件的例子,
文件最左侧列为PAM管理类型,
* auth
这种类型的模块为用户验证提供两方面的服务。
1. 让应用程序提示用户输入密码或者其它的标记,确认用户的合法性;
2. 通过它的凭证许可权限,设定组成员关系(不同于上面讨论的/etc/groups文件)或者其它优先权。
* account
这类模块执行基于非验证的帐户管理。它主要用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)。
* session
这类模块的主要用途是处理为用户提供服务之前/后需要做的一些事情,包括:记录打开/关闭交换数据的信息,监视目录等。
* password
用来升级用户验证标记。

第二项是控制参数,对于PAM验证完成(失败或成功)后的反应。
# required

表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕之后,PAM才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。
# requisite

如果特定的模块对用户的验证失败,PAM马上返回一个错误信息,把控制权交回应用程序,不再执行其它模块进行验证。
# sufficient

表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息,把控制权交会应用程序。后面的层叠模块即使使用requisite或者required控制标志,也不再执行。如果验证失败sufficient的作用和optional相同。
# optional

表示即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用这个标志,PAM框架会忽略这这个模块产生的验证错误,继续顺序执行下一个层叠模块。

通用参数
debug等用于调试和测试。

更复杂(新)的语法则更明确,使管理员有更多的控制用户认证的空间. 这种控制符以方括号包含,由一系列的value=action 对组成:


[value1=action1 value2=action2 ...]

这里的 valueI 有以下值 return values: success; open_err; symbol_err;
service_err; system_err; buf_err; perm_denied; auth_err;
cred_insufficient; authinfo_unavail; user_unknown; maxtries;
new_authtok_reqd; acct_expired; session_err; cred_unavail;
cred_expired; cred_err; no_module_data; conv_err; authtok_err;
authtok_recover_err; authtok_lock_busy; authtok_disable_aging;
try_again; ignore; abort; authtok_expired; module_unknown; bad_item;
conv_again; incomplete; 和 default. 最后的 (default) 被用来定义当没有明确定义时的默认动作.

actionI 可以是一个正数或者是以下标识: ignore; ok; done; bad; die; 和 reset.
当以一个正数J 作为action 时,它的作用是指示以下J个模块将被跳过. 通过这种手段,
管理员可以开发出适度复杂的模块堆叠,它以许多不同的路径执行. 至于以何种路径则决定于某个模块的反应.

* ignore - 此类模块的返回状态将不会影响应用程序所得到的返回值.

* bad - 这表示相应的返回值将被认为是模块失败. 如果此模块是堆叠中的第一个失败的模块, 它的状态值将作为整个堆叠的状态.

* die - 和 bad 相同,不过会终止整个模块堆叠,PAM立即返回到应用程序.

* ok - 这告诉PAM 管理员要让此返回值直接作用于整个模块堆叠的返回. 换句话说, 如果堆叠的原先状态会导致返回
PAM_SUCCESS, 这模块的返回值将会覆盖这结果.
请注意:如果堆叠的原先状态保存着一些意为模块失败的值,这'ok'将不会用来覆盖那样的值.

* done - 和 ok 一样, 不过会终止整个模块堆叠, PAM立即返回到应用程序.

* reset - 清除储存模块堆叠状态的内存并且重新开始下一组堆叠.

常用模块参考:
LinuxAid - 常见的PAM认证模块简介

实例:
/etc/pam.d/login文件注释;
auth required pam_securetty.so #
auth required pam_stack.so service=system-auth #
auth required pam_nologin.so #

account required pam_stack.so service=system-auth #
password required pam_stack.so service=system-auth #
session required pam_selinux.so multiple #
session required pam_stack.so service=system-auth #
session optional pam_console.so #

Comments

Popular posts from this blog

Freeware Software Top 300 from winAddons.Com!

What is DevOPS?

RPM Build Tips!