了解基本的插入式验证模块和配置方法并编写一个登录应用程序
插入式验证模块(Pluggable Authentication Module,PAM)API 将公开一组功能,应用程序程序员可以使用这些功能来实现与安全性相关的功能,例如用户验证、数据加密、LDAP 等。在本文中,获得在 Linux 中使用 PAM 模块的基本指南,了解如何配置 PAM,并了解如何通过 10 个简单步骤设计样例 PAM 登录应用程序。

评论:
Vishal Srivistava, 助理软件工程师, IBM
关闭 [x]
Vishal Srivistava 一直在内核级别上从事各种风格的 UNIX 和 Linux 工作。从 2007 年 6 月开始,Srivistava 就已经在 IBM India Software Labs 工作,目前是负责开发 IBM IIS 核心引擎的团队成员。从事该职位让他积累了配置团队应用以在许多 UNIX 平台上使用 PAM 的大量经验。
2009 年 4 月 16 日
- 内容
了解和配置 PAM了解基本的插入式验证模块和配置方法并编写一个登录应用程序 - PAM 的使用历史记录
- 配置 PAM
- 设计简单 PAM 登录应用程序的 10 个步骤
- 结束语
- 参考资料
- 评论
在 IBM Bluemix 云平台上开发并部署您的下一个应用。
开始您的试用
对于 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:
- Linux-PAM:Linux-PAM 涵盖了本文中讨论的所有 PAM。在任何一个 Linux 平台中的 PAM 的主要结构都类似于 Linux-PAM 版本。
- OpenPAM:OpenPAM 是由 NAI 实验室的 Dag-Erling Smorgrav 开发的另一个 PAM 实现,属于 DARPA-CHATS 研究项目。由于它是开源的,因此它主要由 FreeBSD、NetBSD 及应用程序(加上 Mac OS X)使用。
- Java™ PAM 或 JPam:PAM 主要是支持 Linux 和 UNIX 的标准验证模块。JPam 将 Java 部分与普通 PAM 联系了起来。JPam 允许基于 Java 的应用程序使用 PAM 模块或工具(如 auth、account、passwd、session 等)。它提供了 JAAS 和直接 API,并且支持大多数 Unix OS 和架构。
虽然这些是不同的 PAM,但是其主要功能仍然相同。
PAM 模块是什么样子的?
安装 PAM 是一个逐步的过程。要获得安装说明,请参阅 参考资料。
PAM 模块是按模块类型归类的。任何给定的模块至少要实现四种模块类型功能之一:
- 验证模块用于验证用户或设置/销毁凭证。
- 帐户管理模块将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作。
- 会话管理模块用于初始化和终止会话。
- 密码管理模块将执行与密码更改/更新有关的操作。
PAM 将提供不同的功能,例如单点登录验证、访问控制等。每个功能的实现都是由不同的模块处理的。下面是一些主要模块:
-
将使用登录名/域名,根据 /etc/security/access.conf 中的预定义规则交付日志守护进程样式的登录访问控制。pam_access
-
将根据密码规则检查密码。pam_cracklib
-
环境变量来自 /etc/security/pam_env_conf。pam_env sets/unsets
-
将调试 PAM。pam_debug
-
将拒绝 PAM 模块。pam_deny
-
将打印消息。pam_echo
-
将执行外部命令。pam_exec
-
是匿名访问模块。pam_ftp
-
要求将用户列于 /etc/passwd 中。pam_localuser
-
将通过pam_unix
提供传统密码验证。/etc/passwd
还有许多其他模块(
pam_userdb
、
pam_warn
、
pam_xauth
),这些模块将获取返回的一组值(这些模块的详细信息可以在 参考资料 的 PAM 管理指南中找到)。
回页首
配置 PAM
PAM 配置通常是在
/etc/pam.d
或
/etc/pam.conf
(用于旧版本)中的配置文件中实现的。
配置文件的结构
对于使用 PAM 的各项服务,目录中都有一个对应的文件,其中包含应当如何获取该服务的验证及帐户信息的规则或说明。通常每一行有一个规则。
PAM 配置文件中的字段包括:
-
将指定服务/应用程序的名称(默认值为 OTHER)。Service_name
-
将为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_flag | 模块 |
---|---|---|---|---|
Red Hat | /etc/pam.d | auth | required | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | account | sufficient | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | session | required | /lib/security/pam_limit.so |
AIX | /etc/pam.conf | auth | required | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | account | required | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | password | required | /usr/lib/security/pam_aix |
zSUSE 64-bit | 32-bit | /etc/pam.conf | auth | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | account | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | session | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
Solaris | /etc/pam.conf | auth | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | account | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | password | required | /usr/lib/security/pam_unix.so.1 |
HP-UX | /etc/pam.conf | auth | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | account | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | password | required | libpam_unix.so.1 |
PAM 的 “other” 文件
默认的 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
。调用两个模块:
- 首先,调用
来记录关于正在进行的尝试的信息。pam_warn.so
- 然后调用
仅返回错误并防止发生任何类型的连接或验证。pam_deny.so
因此,使用 PAM 的所有服务都必须被明确配置为允许验证;否则,尝试将失败。
设计简单 PAM 登录应用程序的 10 个步骤
这 10 个步骤可以帮助您实现自己的 PAM 应用程序并帮助您了解 PAM 会话的工作方式:
- 包括 PAM 实现的头文件(例如,pam_appl.h、pam_misc.h)。
- 在
函数中,使用惟一的句柄初始化 PAM 库 libpam.so(该库将装入应用程序的配置文件中指定的模块)。main
- 尝试验证所有模块并处理失败场景。
- 检查用户凭证和帐户详细信息。
- 打开一个新 PAM 会话。
- 为使用凭证的用户设置环境。
- 当用户完成时,取消用户环境。
- 关闭 PAM 会话。
- 从带有句柄值的 libpam.so 库中退出。
- 退出。
结束语
依赖 PAM 来帮助把低级别验证工作变为更具有管理性的整体,这大大简化了这种安全机制。在本文中,您了解了:
- 基本的 PAM 架构
- 如何配置 PAM 模块
- 帮助理解工作原理的 PAM 登录应用程序概述
现在您可以接着了解使用 PAM 模块的更多高级主题 — 请从下面的 参考资料 开始……
参考资料
学习
- Linux-PAM 指南 将提供关于系统管理问题、模块编写和应用程序开发的文档。
- 这是来自 SUSE Linux Unofficial FAQ 的 PAM 观点。
- 如果需要升级,Gentoo 提供了一本 Linux-PAM 升级指南。
- 查看一下 X/Open Single Sign-on Service(XSSO)架构模型。
- 准备好了解使用 PAM 的更多高级主题了么?
- “A comparison of security subsystems on AIX, Linux, and Solaris”(developerWorks,2005 年 10 月):介绍 PAM 的工作原理。
- “应用挂载名称空间”(developerWorks,2007 年 9 月):查看与 PAM 模块相关的部分。
- “使用 OpenLDAP 集中管理用户帐号”(developerWorks,2006 年 5 月):查看 Linux 中的 PAM 如何与 LDAP 协作。
- “使用多实例化提高安全性”(developerWorks,2008 年 2 月):使用插入式验证模块保护私有数据。
- “LPI 202 考试准备,主题 210:网络客户端管理”(developerWorks,2006 年 5 月):配置 PAM 来支持验证。
- “PAM configuration on SUSE Enterprise Linux 9”(Technote (IBM Tivoli Netcool/OMNIbus),2008 年 10 月):如何配置 PAM 模块以允许 ObjectServer 验证本地系统用户。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
- 使用 IBM 试用软件 构建下一个 Linux 开发项目,可以从 developerWorks 直接下载获得。
讨论
- 通过博客、论坛、podcasts 和空间加入 developerWorks 社区。