如何在 Ubuntu 12.04 VPS 上使用 PAM 配置身份验证

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


PAM(或插入式身份验证模块)是Linux和Unix类型操作系统上存在的抽象层,用于允许各种服务之间的身份验证。

作为身份验证服务和需要用户身份验证的应用程序之间的中介,该系统允许这两个层以优雅的方式集成并改变身份验证模型,而无需重写代码。

在本指南中,我们将看看Ubuntu 12.04 VPS上的PAM系统,尽管大多数现代Linux发行版应该以类似的方式运作。

舞台背后:PAM的坚果和子


插入式身份验证如何工作


在Linux环境中,我们每天互动的许多正常应用实际上都使用PAM。

要获得系统上可以以某种方式使用 PAM 的应用程序列表,请键入:

1ldd /{,usr/}{bin,sbin}/* | grep -B 5 libpam | grep '^/'

 1/bin/login:
 2/bin/su:
 3/sbin/mkhomedir_helper:
 4/sbin/pam_tally2:
 5/usr/bin/chfn:
 6/usr/bin/chsh:
 7/usr/bin/passwd:
 8/usr/sbin/atd:
 9/usr/sbin/chpasswd:
10/usr/sbin/cron:
11/usr/sbin/newusers:
12/usr/sbin/sshd:

您可以通过键入来检查特定应用程序的 PAM 功能:

ldd $(which prog_name) | grep libpam

如果它返回任何东西,那么它可以使用PAM。

正如你所看到的,许多常见的实用程序和工具实际上使用PAM作为中介来执行他们的任务。

PAM 组织


Linux 的 PAM 版本将模块功能分为不同的类别,取决于它们所涉及的过程的哪个部分。

  • 身份验证功能:身份验证模块验证用户的身份验证凭证,这意味着它检查用户是否可以根据预先确定的标准提供有效身份验证。
  • 帐户功能:这些模块负责决定试图登录的帐户是否可以访问此时所要求的资源。 PAM允许您根据预先确定的标准指定可以拒绝或允许用户的控制。
  • 会话功能:这些模块确定用户登录或登录后将建立和拆除的环境。

这些模块类别中的前两类将被引用每次一个程序成功使用PAM进行身份验证. 会话模块将在前两类之后必要时运行。

在目录结构方面,PAM配置文件存储在 `/etc/pam.d:

1ls /etc/pam.d

1atd chsh common-password cron other su
2chfn common-account common-session login passwd sudo
3chpasswd common-auth common-session-noninteractive newusers sshd

此目录通常为每个应用程序提供一个配置文件,请求PAM身份验证. 如果应用程序呼叫PAM,但没有相关的配置文件,则应用其他配置文件。

在配置文件中,通常有呼叫,包括以共同开头的配置文件,这些是一般配置文件,其规则应该应用于大多数情况。

在配置文件中引用的模块可以用这个命令定位:

1ls /lib/*/security

1pam_access.so pam_keyinit.so pam_permit.so pam_tally.so
2pam_debug.so pam_lastlog.so pam_pwhistory.so pam_time.so
3pam_deny.so pam_limits.so pam_rhosts.so pam_timestamp.so
4pam_echo.so pam_listfile.so pam_rootok.so pam_umask.so
5. . .

看看这个目录,看看有哪些类型的模块可用. 几乎所有的模块都有人页面,可以描述它们的使用。

PAM如何评估身份验证


当应用程序对 PAM 系统进行验证时,PAM 会读取相应的 PAM 配置文件。

配置文件包含一个列表的PAM模块,以及如何处理它们. 每个模块被调用,每个调用一个模块产生一个成功或失败的结果。

基于这些值,配置文件然后决定是否应该返回认证好消息给呼叫者,或者发送认证失败消息。

配置可能会在从调用模块返回第一个故障时失败,或者可以配置替代策略. 例如,系统可能允许LDAP用户进行身份验证。

每个配置文件的行被评估从顶部到底部,除非行评估导致配置文件的其余部分被跳过。

如何阅读政策线条


配置文件中的每个行都包含以下语法,每个字段由白色空间划界。

1[service] type control module-path [module-arguments]

位於 /etc/pam.d 內的檔案排除服務欄位,而不是以它所服務的應用程式命名配置檔案. 如果沒有 pam.d 目錄,則需要一個 /etc/pam.conf 檔案,而相應的應用程式必須列出每行開始。

Type是提供的服务类型,是上文列出的四个类别之一(身份验证、帐户、密码、会话)。

Control 指定在收到模块调用返回状态时所采取的操作. 它可以是这些值中的任何一个(并且还可以采取更复杂的语法,这不会在这里涵盖):

  • ** 需要**:如果模块调用导致失败,将导致认证失败. 然而,其余的指定模块仍被称作。
  • ** 需要**: 这行为与要求完全相同,但立即导致认证失败,而不是调用其余模块.
  • ** 足够** : 这种控制意味着,如果此行成功(提供不存在已经要求的模块失败),认证将立即返回,作为成功,而不运行其余模块. 此行的失败只是跳过到下一个模块调用.
  • ** 可选** : 这些行的成败对总体认证的成败没有任何影响,除非它们是其类型中唯一的模块调用.
  • ** 包括**: 本行表示某一特定类型的行应从另一个配置脚本读取. 这常被用来参考"common-"文件.
  • ** 实质** : 这与包含类似,但失败或成功不会导致整个文件的退出,只是子存储. (英语)

模块路径是要调用的 pam 模块的名称。

模块参数是向模块传递的可选参数,有时这些参数是必要的,以便模块知道如果成功时该采取什么行动。

单个文件也可能引用其他文件,必须使用以下语法检查:

@include config_file

这将读取整个配置文件,这与包括控件类型不同,该控件只读取相同类型的行。

查看配置示例


我们可以通过查看 `/etc/pam.d 目录中的某些示例来了解客户端的配置方式。

打开描述了atd的身份验证要求的文件,这是一个日程示威者。

1less /etc/pam.d/atd

1auth	required		pam_env.so
2@include common-auth
3@include common-account
4@include common-session-noninteractive
5session		required	pam_limits.so

第一行称为pam_env模块. 如果你看男人页面,你会看到这个模块被用来设置一些环境变量,这些变量默认存储在 `/etc/security/pam_env.conf 中。

接下来的三行读到共用帐户,共用帐户共用会话非互动文件,以处理各自的角色。

最后一行称呼pam_limits模块,该模块检查/etc/security/limits.conf文件或/etc/security/limits.d/目录。

我们可以通过查看所引用的文件来更好地了解所有正在进行的检查。

检查共用文件


我已经从文件中删除了评论,以便凝聚信息。

1less /etc/pam.d/common-auth

1auth	[success=1 default=ignore] 		pam_unix.so nullok_secure
2auth	requisite						pam_deny.so
3auth	required						pam_permit.so
4auth	optional						pam_ecryptfs.so unwrap

我们可以说它正在调用pam_unix模块,它提供了通过/etc/nsswitch.conf文件配置的标准unix身份验证。

nullok_secure参数传递给 unix 模块,说明没有密码的帐户是正常的,只要登录信息检查了 `/etc/securetty’ 文件。

具有[success=1 default=ignore]的控制场是本示例的奇怪部分,它取代了简化的必要足够等参数,并允许更精细的控制。

在这种情况下,如果模块返回成功,它会跳过下一个1行。


第二行要求的控制值,这意味着如果它失败,整个配置会立即返回故障,它还会调用pam_deny模块,每个调用都会返回故障。

唯一的例外是当这个行被跳过时,这发生在第一个行成功返回时。


** 需要第三行**,并调用pam_permit模块,该模块每次返回成功,这只会重置当前的pass/fail记录,以确保以前没有一些奇怪的值。


第四行列为可选,并呼叫pam_ecryptfs模块与unwrap选项. 这被用来使用提供的密码解包一个密码,然后用于安装私人目录。

查看共用帐户文件


我们将看看在atd配置中引用的下一个文件. 再次,我会为了简短而删除评论。

1less /etc/pam.d/common-account

1account [success=1 new_authtok_reqd=done default=ignore] 	pam_unix.so
2account	requisite		pam_deny.so
3account	requisite		pam_permit.so

这个文件中的几乎所有内容都类似于common-auth文件中的文件,第一行呼吁使用pam_unix模块进行帐户检查。

对于帐户呼叫,pam_unix 会检查帐户没有过期,并且不受时间限制的登录限制控制。

如果它通过,它会跳过其下面的pam_deny呼叫,然后在末尾处理许可规则. 如果,另一方面,它失败,它将移动到否定行,并失败。

检查共用会话非互动文件


下一节为非交互式程序或环境提供会话检查。

1less /etc/pam.d/common-session-noninteractive

1session [default=1] 		pam_permit.so
2session	requisite			pam_deny.so
3session	required			pam_permit.so
4session	optional			pam_umask.so
5session	required			pam_unix.so
6session	optional			pam_ecryptfs.so unwrap

前三行可能看起来很奇怪,你应该能够理解程序的流程,但他们可能看起来是任意的和多余的。第一行总是成功的,下一行是跳过的蚂蚁,第三行总是成功的。

他们是这样做的,因为许多PAM配置是自动生成的,并将被修改为提供更多的实质性规则,当额外的PAM认证方法可用。

第四行是调用pam_umask模块,并被标记为可选。这为会话设置了文件创建面具。它将检查一些不同的文件位置,以尝试找到相关的umask位置。

第五行是要求再次调用pam_unix模块,因为这是一个会话类型的调用,所以unix模块行为不同,但又一次。

最后一行是pam_ecryptfs呼叫,它在auth文件中执行类似的功能。

结论


但是,对系统如何运作以及如何将不同组件连接在一起的基本理解对于开发健全的身份验证程序至关重要。

虽然您可能不了解配置PAM规则的一切,但要知道哪些系统可以保护您免受计算机的非法使用。

了解PAM在实施新身份验证方案时尤为重要,例如LDAP。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus