3. PAM (可插拔认证模块)

可插拔认证模块是任何现代 Linux 发行版中用户认证的核心。

3.1. 为什么

回到 Linux 的美好旧时代,如果一个程序,例如 supasswdloginxlock,需要验证用户身份,它会直接从以下位置读取必要的信息:/etc/passwd。如果它需要更改用户密码,它会直接编辑:/etc/passwd。这种简单但笨拙的方法给系统管理员和应用程序开发人员带来了许多问题。随着 MD5 和影子密码变得越来越流行,每个需要用户身份验证的程序都必须知道如何在处理多种不同方案时获取正确的信息。如果您想更改用户身份验证方案,则必须重新编译所有这些程序。 PAM 消除了这种混乱,使程序能够透明地验证用户身份,而无需考虑用户信息的存储方式。

3.2. 是什么

引用自《Linux-PAM 系统管理员指南》:“Linux-PAM 项目的目的是将授权软件的开发与安全和适当的身份验证方案的开发分离开来。这是通过提供一个函数库来实现的,应用程序可以使用该库来请求验证用户身份。” 使用 PAM,您的密码是存储在 /etc/passwd 中还是香港的服务器上都无关紧要。当程序需要验证用户身份时,PAM 会提供一个库,其中包含用于正确身份验证方案的函数。由于此库是动态加载的,因此只需编辑配置文件即可更改身份验证方案。

灵活性是 PAM 最强大的优势之一。 PAM 可以配置为拒绝某些程序验证用户身份的权限,仅允许某些用户通过身份验证,在某些程序尝试进行身份验证时发出警告,甚至剥夺所有用户的登录权限。 PAM 的模块化设计使您可以完全控制用户身份验证的方式。

3.2.1. 支持 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 及更高版本

此列表肯定不完整,并且可能不准确。如果您有任何更正或补充,请发送至:.

3.2.2. 安装 PAM

从头开始安装 PAM 是一个漫长的过程,超出了本 HOWTO 的范围。如果您的系统上未安装 PAM,则您可能正在运行非常旧版本的发行版,以至于有很多其他理由需要升级。如果您真的想自己完成安装,那么您肯定不是需要我提供任何帮助的人。由于所有这些原因,我将假设您已经安装了 PAM。

3.3. 如何

别再说了,让我们深入了解一下。

3.3.1. PAM 配置文件

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
  

在我深入研究此文件之前,我必须提一下一些事情。

3.3.2. 一些小知识

一小部分读者可能在想:“哦,不!我没有 /etc/pam.d 目录!您的发行版列表说我的发行版包含 PAM,但我找不到该目录。没有 PAM,我的生活空虚而毫无意义!我该怎么办?” 别担心,一切都还没结束。如果您知道您的发行版包含 PAM,但您没有/etc/pam.d/目录,那么您的 PAM 配置存储在/etc/pam.conf。您的所有 PAM 配置都存储在一个文件中,而不是分布在多个文件中。这为 PAM 配置增加了一点变化,但在 3.3.4 节中指出了正确的调整方法。

3.3.3. 配置语法

PAM 配置文件具有以下语法:

  type  control  module-path  module-arguments
  

以登录配置文件(见上文)为例,让我们看一下 PAM 配置文件的语法:

PAM 配置令牌

类型

类型令牌告诉 PAM 此模块要使用的身份验证类型。相同类型的模块可以“堆叠”,要求用户满足多个要求才能通过身份验证。 PAM 识别四种类型:

account

确定是否允许用户访问服务,他们的密码是否已过期等。

auth

确定用户是否是他们声称的身份,通常通过密码,但也可能通过更复杂的方式,例如生物识别技术。

password

为用户提供一种更改其身份验证的机制。同样,这通常是他们的密码。

session

在用户通过身份验证之前和/或之后应完成的事情。这可能包括诸如挂载/卸载用户主目录、记录他们的登录/注销以及限制/取消限制用户可用的服务等。

在登录配置文件中,我们看到每种类型至少有一个条目。由于这是允许用户登录的程序(因此得名 :)),因此可以理解它需要访问所有不同类型的身份验证。

control

control 令牌告诉 PAM 如果此模块的身份验证失败应该怎么做。 PAM 识别四种控制类型:

requisite

通过此模块进行身份验证失败会导致立即拒绝身份验证。

required

失败也会导致拒绝身份验证,尽管 PAM 仍会在拒绝身份验证之前调用为此服务列出的所有其他模块。

sufficient

如果此模块的身份验证成功,则 PAM 将授予身份验证,即使之前的必需模块失败也是如此。

optional

此模块是成功还是失败仅在其是此服务的唯一类型模块时才重要。

在 login 的配置文件中,我们看到了几乎所有不同的控制类型。大多数必需模块是 pam_unix.so(主身份验证模块),唯一的 requisite 模块是pam_securetty.so(确保用户在安全控制台上登录),而唯一的 optional 模块是pam_lastlog.so(检索有关用户最近一次登录信息的模块)。

module-path

module-path 告诉 PAM 要使用哪个模块以及(可选)在哪里找到它。大多数配置仅包含模块的名称,就像我们的登录配置文件中的情况一样。在这种情况下,PAM 会在默认的 PAM 模块目录中查找模块,通常是/usr/lib/security。但是,如果您的 Linux 发行版符合文件系统层次结构标准 (FHS),则可以在以下位置找到 PAM 模块:/lib/security.

module-arguments

module-arguments 是要传递给模块的参数。每个模块都有自己的参数。例如,在我们的登录配置中,“nulok”(“null ok”,传递给 pam_unix.so 模块的参数,指示接受空白(“null”)密码(“ok”)。

3.3.4. pam.conf配置

如果您的 PAM 配置存储在/etc/pam.conf而不是/etc/pam.d/,PAM 配置文件行会略有不同。所有配置都存储在 中,而不是每个服务都有自己的配置文件/etc/pam.conf,其中服务名称作为配置文件行中的第一个令牌。例如,以下行在/etc/pam.d/login:

    auth       required   pam_unix.so nulok
    

将变为以下行,在/etc/pam.conf:

    login	auth       required   pam_unix.so nulok
    

除了这个细微的差别之外,所有其余的配置 PAM 语法都适用。

3.4. 获取更多信息

有关配置 PAM 和完整的 PAM 模块参考的更多信息,请查阅《Linux-PAM 系统管理员指南》。本指南是关于 PAM 配置的全面且最新的参考资料。