可插拔认证模块是任何现代 Linux 发行版中用户认证的核心。
回到 Linux 的美好旧时代,如果一个程序,例如 su、passwd、login 或 xlock,需要验证用户身份,它会直接从以下位置读取必要的信息:/etc/passwd。如果它需要更改用户密码,它会直接编辑:/etc/passwd。这种简单但笨拙的方法给系统管理员和应用程序开发人员带来了许多问题。随着 MD5 和影子密码变得越来越流行,每个需要用户身份验证的程序都必须知道如何在处理多种不同方案时获取正确的信息。如果您想更改用户身份验证方案,则必须重新编译所有这些程序。 PAM 消除了这种混乱,使程序能够透明地验证用户身份,而无需考虑用户信息的存储方式。
引用自《Linux-PAM 系统管理员指南》:“Linux-PAM 项目的目的是将授权软件的开发与安全和适当的身份验证方案的开发分离开来。这是通过提供一个函数库来实现的,应用程序可以使用该库来请求验证用户身份。” 使用 PAM,您的密码是存储在 /etc/passwd 中还是香港的服务器上都无关紧要。当程序需要验证用户身份时,PAM 会提供一个库,其中包含用于正确身份验证方案的函数。由于此库是动态加载的,因此只需编辑配置文件即可更改身份验证方案。
灵活性是 PAM 最强大的优势之一。 PAM 可以配置为拒绝某些程序验证用户身份的权限,仅允许某些用户通过身份验证,在某些程序尝试进行身份验证时发出警告,甚至剥夺所有用户的登录权限。 PAM 的模块化设计使您可以完全控制用户身份验证的方式。
几乎所有流行的发行版都已支持 PAM 一段时间了。这是一个支持 PAM 的发行版的不完整列表:
Redhat,版本 5.0 及更高版本
Mandrake,版本 5.2 及更高版本
Debian,版本 2.1 及更高版本(2.1 中为部分支持 -- 2.2 中为完全支持)
Caldera,版本 1.3 及更高版本
Turbolinux,版本 3.6 及更高版本
SuSE,版本 6.2 及更高版本
此列表肯定不完整,并且可能不准确。如果您有任何更正或补充,请发送至:<petehern@yahoo.com>.
别再说了,让我们深入了解一下。
PAM 配置文件存储在/etc/pam.d/目录中。(如果您没有/etc/pam.d/目录,请不要担心,我将在下一节中介绍)让我们去那里看看。
~$ cd /etc/pam.d /etc/pam.d/$ ls chfn chsh login other passwd su xlock /etc/pam.d/$ |
您的系统在此目录中可能有一些或多或少的文件,具体取决于系统上安装的内容。无论细节如何,您可能都看到了系统上每个验证用户身份的程序的文件。正如您可能已经猜到的那样,每个文件都包含以其命名的程序的 PAM 身份验证配置(除了other文件,我们稍后会讨论)。让我们看一下 login 的 PAM 配置文件(为了简单起见,我已经压缩了该文件):
/etc/pam.d/$ cat login # PAM configuration for login auth requisite pam_securetty.so auth required pam_nologin.so auth required pam_env.so auth required pam_unix.so nullok account required pam_unix.so session required pam_unix.so session optional pam_lastlog.so password required pam_unix.so nullok obscure min=4 max=8 |
在我深入研究此文件之前,我必须提一下一些事情。
一小部分读者可能在想:“哦,不!我没有 /etc/pam.d 目录!您的发行版列表说我的发行版包含 PAM,但我找不到该目录。没有 PAM,我的生活空虚而毫无意义!我该怎么办?” 别担心,一切都还没结束。如果您知道您的发行版包含 PAM,但您没有/etc/pam.d/目录,那么您的 PAM 配置存储在/etc/pam.conf。您的所有 PAM 配置都存储在一个文件中,而不是分布在多个文件中。这为 PAM 配置增加了一点变化,但在 3.3.4 节中指出了正确的调整方法。
PAM 配置文件具有以下语法:
type control module-path module-arguments |
以登录配置文件(见上文)为例,让我们看一下 PAM 配置文件的语法:
PAM 配置令牌
类型令牌告诉 PAM 此模块要使用的身份验证类型。相同类型的模块可以“堆叠”,要求用户满足多个要求才能通过身份验证。 PAM 识别四种类型:
确定是否允许用户访问服务,他们的密码是否已过期等。
确定用户是否是他们声称的身份,通常通过密码,但也可能通过更复杂的方式,例如生物识别技术。
为用户提供一种更改其身份验证的机制。同样,这通常是他们的密码。
在用户通过身份验证之前和/或之后应完成的事情。这可能包括诸如挂载/卸载用户主目录、记录他们的登录/注销以及限制/取消限制用户可用的服务等。
在登录配置文件中,我们看到每种类型至少有一个条目。由于这是允许用户登录的程序(因此得名 :)),因此可以理解它需要访问所有不同类型的身份验证。
control 令牌告诉 PAM 如果此模块的身份验证失败应该怎么做。 PAM 识别四种控制类型:
通过此模块进行身份验证失败会导致立即拒绝身份验证。
失败也会导致拒绝身份验证,尽管 PAM 仍会在拒绝身份验证之前调用为此服务列出的所有其他模块。
如果此模块的身份验证成功,则 PAM 将授予身份验证,即使之前的必需模块失败也是如此。
此模块是成功还是失败仅在其是此服务的唯一类型模块时才重要。
在 login 的配置文件中,我们看到了几乎所有不同的控制类型。大多数必需模块是 pam_unix.so(主身份验证模块),唯一的 requisite 模块是pam_securetty.so(确保用户在安全控制台上登录),而唯一的 optional 模块是pam_lastlog.so(检索有关用户最近一次登录信息的模块)。
module-path 告诉 PAM 要使用哪个模块以及(可选)在哪里找到它。大多数配置仅包含模块的名称,就像我们的登录配置文件中的情况一样。在这种情况下,PAM 会在默认的 PAM 模块目录中查找模块,通常是/usr/lib/security。但是,如果您的 Linux 发行版符合文件系统层次结构标准 (FHS),则可以在以下位置找到 PAM 模块:/lib/security.
module-arguments 是要传递给模块的参数。每个模块都有自己的参数。例如,在我们的登录配置中,“nulok”(“null ok”,传递给 pam_unix.so 模块的参数,指示接受空白(“null”)密码(“ok”)。
有关配置 PAM 和完整的 PAM 模块参考的更多信息,请查阅《Linux-PAM 系统管理员指南》。本指南是关于 PAM 配置的全面且最新的参考资料。