了解和配置 linux PAM
对于 Linux 用户,安全地共享文件是一项麻烦的任务。例如,需要费力地回想多个密码,并且重新设计系统访问应用程序(如 login 、su 、password 、ftp 等)十分耗费时间。增加这一复
对于 Linux 用户,安全地共享文件是一项麻烦的任务。例如,需要费力地回想多个密码,并且重新设计系统访问应用程序(如 login 、su 、password 、ftp 等)十分耗费时间。增加这一复杂度的是验证 过程,在该过程中,系统将识别用户并为该用户提供相应的访问控制。
PAM 的使用历史记录
PAM 是关注如何为服务验证用户的 API。在使用 PAM 之前,诸如 login (和 rlogin 、telnet 、rsh )之类的应用程序在 /etc/passwd 中查找用户名,然后将两者相比较并验证用户输入的名称。所有应用程序使用了这些共享服务,但是并未共享实现细节和配置这些服务的权限。
接下来,应用程序开发人员尝试编写自定义过程代码。在此过程中,需要分离应用程序与安全模块(通用安全模块可以在应用程序之间共享并且可以根据需求进行配置)。
PAM 机制将把多个低级别验证模式集成到高级别 API 中,该 API 将允许以独立于底层验证模式的方式编写使用验证的程序。PAM 的主要特征表现为通过 /etc/pam.d 或 /etc/pam.conf 文件实现动态验证配置。
PAM 可以被配置为拒绝某些程序对用户进行验证,或者在某些程序尝试验证时发出警告。PAM 程序将使用 PAM 模块(验证模块):这些模块在运行时与应用程序绑定在一起才能工作。
图 1 显示了 PAM 模块的基本流程。
图 1. PAM 库将解析配置文件并将模块装入其中
哪些操作系统支持 PAM?
PAM 最初是由 Sun Microsystems 于 1995 年开发的,并且以下操作系统版本(及更高版本)都提供支持:
∙
∙
∙
∙
∙
∙

RedHat 5.0 SUSE 6.2 Debian 2.2 Mandrake 5.2 Caldera 1.3 TurboLinux 3.6
,最新版本的 Solaris™、AIX®、HP-UX 和 Mac OS® X 也支持 PAM。PAM 后来被标准化为 X/Open UNIX® 标准化流程(在 X/Open 单点登录服务(XSSO )架构中)的一部分。
我可以获得哪种 PAM?
虽然没有进行严格划分,但是可以认为有三种 PAM:
1. Linux-PAM :Linux-PAM 涵盖了本文中讨论的所有 PAM。在任何一个 Linux 平台中的 PAM 的主要结构都类似于 Linux-PAM 版本。
2. OpenPAM :OpenPAM 是由 NAI 实验室的 Dag-Erling Smorgrav 开发的另一个 PAM 实现,属于 DARPA-CHATS 研究项目。由于它是开源的,因此它主要由 FreeBSD、NetBSD 及应用程序(加上 Mac OS X)使用。
3. Java ™ PAM 或 JPam:PAM 主要是支持 Linux 和 UNIX 的标准验证模块。JPam 将 Java 部分与普通 PAM 联系了起来。JPam 允许基于 Java 的应用程序使用 PAM 模块或工具(如 auth 、account 、passwd 、session 等)。它提供了 JAAS 和直接 API,并且支持大多数 Unix OS 和架构。
虽然这些是不同的 PAM,但是其主要功能仍然相同。
PAM 模块是什么样子的?
安装 PAM 是一个逐步的过程。要获得安装说明,请参阅 参考资料。
PAM 模块是按模块类型归类的。任何给定的模块至少要实现四种模块类型功能之一:
1. 验证模块用于验证用户或设置/销毁凭证。
2. 帐户管理模块将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作。
3. 会话管理模块用于初始化和终止会话。
4. 密码管理模块将执行与密码更改/更新有关的操作。
PAM 将提供不同的功能,例如单点登录验证、访问控制等。每个功能的实现都是由不同的模块处理的。下面是一些主要模块:
∙
∙
∙
∙
∙
∙
∙
∙ pam_access 将使用登录名/域名,根据 /etc/security/access.conf 中的预定义规则交付日志守护进程样式的登录访问控制。 pam_cracklib 将根据密码规则检查密码。 pam_env sets/unsets 环境变量来自 /etc/security/pam_env_conf。 pam_debug 将调试 PAM。 pam_deny 将拒绝 PAM 模块。 pam_echo 将打印消息。 pam_exec 将执行外部命令。 pam_ftp 是匿名访问模块。
,pam_localuser 要求将用户列于 /etc/passwd 中。
∙ pam_unix 将通过 /etc/passwd 提供传统密码验证。 ∙
还有许多其他模块(pam_userdb、pam_warn、pam_xauth),这些模块将获取返回的一组值(这些模块的详细信息可以在 参考资料 的 PAM 管理指南中找到)。
回页首
配置 PAM
PAM 配置通常是在 /etc/pam.d 或 /etc/pam.conf(用于旧版本)中的配置文件中实现的。
配置文件的结构
对于使用 PAM 的各项服务,目录中都有一个对应的文件,其中包含应当如何获取该服务的验证及帐户信息的规则或说明。通常每一行有一个规则。 PAM 配置文件中的字段包括:
∙
∙
∙
∙
∙ Service_name 将指定服务/应用程序的名称(默认值为 OTHER)。 Module_type 将为 Service_name 字段中的相应服务指定模块类型(auth/account/session/passwd)。 Control_flag 将指定模块的堆栈行为。它可以获取诸如 requisite、required 、sufficient 和 optional 之类的值。 Module_path 将指定实现模块的库对象的路径名称。默认情况下,它将被设为 /lib/security。 Module_options/module_args(可选字段)将指定可以传递给服务模块的选项或实参。
模块将按照在配置文件中列出的顺序被调用,这取决于每个条目允许的 Control_flag 的值。Control_flag 值包括:
Required :堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required 模块失败,则实现堆栈中的所有 Required 模块,但是将返回第一个错误。
∙ Sufficient :如果标记为 sufficient 的模块成功并且先前没有
Required 或 sufficient 模块失败,则忽略堆栈中的所有其余模块并返回成功。
∙ Optional :如果堆栈中没有一个模块是 required 并且没有任何一个 sufficient 模块成功,则服务/应用程序至少要有一个 optional 模块成功。 ∙
,PAM 配置文件示例
表 1 显示了各种操作系统中的 PAM 配置文件的一些示例。
表 1. PAM 配置文件的世界
配置文件所在Control_fla系统 位置 类型 g
Red Hat /etc/pam.d auth required Red Hat /etc/pam.d account sufficient Red Hat /etc/pam.d session required AIX /etc/pam.con
f
auth required AIX /etc/pam.con
f
account required AIX /etc/pam.conpasswor
f d
required zSUSE
64-bit /etc/pam.con| f auth required
32-bit zSUSE
64-bit /etc/pam.con| f account required
32-bit zSUSE
64-bit /etc/pam.con| f session required
32-bit
Solari /etc/pam.cons f auth required
Solari /etc/pam.cons f account required
Solari /etc/pam.conpasswor s f d required
HP-UX /etc/pam.con
f
auth required HP-UX /etc/pam.con
f
account required HP-UX /etc/pam.conpasswor
f d required PAM 的 “other ” 文件
模块
/lib/security/pam_unix.so /lib/security/pam_unix.so /lib/security/pam_limit.so
/usr/lib/security/pam_aix
/usr/lib/security/pam_aix
/usr/lib/security/pam_aix
/lib64/security/pam_unix.so |
/lib/security/pam_unix.so /lib64/security/pam_unix.so |
/lib/security/pam_unix.so /lib64/security/pam_unix.so |
/lib/security/pam_unix.so /usr/lib/security/pam_unix.so.
1 /usr/lib/security/pam_unix.so.
1 /usr/lib/security/pam_unix.so.
1
libpam_unix.so.1
libpam_unix.so.1
libpam_unix.so.1
,默认的 PAM 配置文件 /etc/pam.d 用于没有明确配置的所有其他服务,并且可能是 PAM 所依赖的最简单而又最健壮的默认文件。该文件内部类似如下所示: /etc/pam.d/other File
auth required pam_warn.so
auth required pam_deny.so
account required pam_warn.so
account required pam_deny.so
password required pam_warn.so
password required pam_deny.so
session required pam_warn.so
session required pam_deny.so
此文件非常简单。对于所有模块类型,Control_flag 都是一样的:required 。调用两个模块:
1. 首先,调用 pam_warn.so 来记录关于正在进行的尝试的信息。
2. 然后调用 pam_deny.so 仅返回错误并防止发生任何类型的连接或验证。 因此,使用 PAM 的所有服务都必须被明确配置为允许验证;否则,尝试将失败。 设计简单 PAM 登录应用程序的 10 个步骤
这 10 个步骤可以帮助您实现自己的 PAM 应用程序并帮助您了解 PAM 会话的工作方式:
1. 包括 PAM 实现的头文件(例如,pam_appl.h、pam_misc.h)。
2. 在 main 函数中,使用惟一的句柄初始化 PAM 库 libpam.so(该库将装入应用程序的配置文件中指定的模块)。
3. 尝试验证所有模块并处理失败场景。
4. 检查用户凭证和帐户详细信息。
5. 打开一个新 PAM 会话。
6. 为使用凭证的用户设置环境。
7. 当用户完成时,取消用户环境。
8. 关闭 PAM 会话。
9. 从带有句柄值的 libpam.so 库中退出。
10. 退出。
结束语
依赖 PAM 来帮助把低级别验证工作变为更具有管理性的整体,这大大简化了这种安全机制。在本文中,您了解了:
,基本的 PAM 架构
∙ 如何配置 PAM 模块
∙ 帮助理解工作原理的 PAM 登录应用程序概述 ∙
现在您可以接着了解使用 PAM 模块的更多高级主题 — 请从下面的 参考资料 开始„„
参考资料
学习
∙ 将提供关于系统管理问题、模块编写和应用程序开发的文档。
这是来自 SUSE Linux Unofficial FAQ 的 PAM 观点。
如果需要升级,Gentoo 提供了一本 。
查看一下 。
准备好了解使用 PAM 的更多高级主题了么?
o “A comparison of security subsystems on AIX, Linux, and Solaris ”(developerWorks ,2005 年 10 月):介绍 PAM 的工
作原理。
o “”(developerWorks ,2007 年 9 月):查看
与 PAM 模块相关的部分。
o “”(developerWorks ,2006 年
5 月):查看 Linux 中的 PAM 如何与 LDAP 协作。
o “使用多实例化提高安全性”(developerWorks ,2008 年 2 月):
使用插入式验证模块保护私有数据。
o “LPI 202 考试准备,主题 210:网络客户端管理”
(developerWorks ,2006 年 5 月):配置 PAM 来支持验证。
o “PAM configuration on SUSE Enterprise Linux 9”(Technote
(IBM Tivoli Netcool/OMNIbus),2008 年 10 月):如何配置 PAM
模块以允许 ObjectServer 验证本地系统用户。
∙ ∙ ∙ ∙
∙ 在 寻找为 Linux 开发人员(包括 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。 在 developerWorks 上查阅所有 和 。
随时关注 developerWorks 技术活动和网络广播。 ∙ ∙
,获得产品和技术
∙ 使用 构建下一个 Linux 开发项目,可以从 developerWorks 直接下载获得。 讨论
∙ 通过博客、论坛、podcasts 和空间加入 。