虽然Linux-PAM和OpenPAM是分开实现的,但它们的开发人员使用Solaris PAM作为模型。两者都包含许多与旧版本Solaris中的模块在概念上相似的模块。
本章将带您了解许多常见模块,它们是如何工作的,以及您可以用它们做什么。其中许多都很小,只提供一个功能,但我简要介绍了它们,以便您开始了解PAM是如何将所有不同的Unix身份验证功能粘合在一起的。
让我们从随处可见的课程开始。
pam_unix 模块处理与系统密码文件 /etc/passwd 以及 /etc/group 、 /etc/master.passwd、 /etc/shadow 等相关文件的所有交互。它还支持网络信息服务(Network Information Service —— NIS),这是管理分布式身份验证的传统方法。不使用LDAP或Kerberos等集中式身份验证系统的主机几乎肯定会使用 pam_unix
。即使是使用集中式身份验证的主机也经常使用 pam_unix
来查找本地应用程序的无特权帐户。
身份验证、帐户和密码PAM类型使用 pam_unix
。它不用于会话(session)类型。
密码身份验证比PAM早几十年。pam_unix
模块有一个令人羡慕的任务,那就是在各种选项标志的控制下,拖着这些年积累的功能。
auth 选项是调试选项的更详细和详细的版本。它使用设施身份验证和优先级调试向syslog发送非常详细的日志记录。
根据操作系统、PAM版本和服务器程序的不同,审核日志(audit log)可能不包含太多有用信息。例如,OpenSSH服务器根本不一定使用PAM。
身份验证的一般规则是:没有密码,就没有访问权限(no password, no access)。没有密码的帐户通常不用于交互使用。应用程序帐户,如MySQL或nginx等,通常没有密码。(应用程序帐户也被锁定,禁止登录。)新用户帐户可能没有密码。
在某些情况下,您可能希望允许某人以这些用户之一的身份登录。nullok 选项允许在没有密码的情况下访问此类帐户。
一些实现,特别是CentOS,在身份验证规则中使用nullok,允许用户在没有密码的情况下登录。然后,他们将nullok添加到密码规则中,如下所示。该组合允许新用户登录,但强制他们立即更改密码。如果您对此功能感兴趣,请查看您的PAM安装是否支持此行为。
xxxxxxxxxx
auth sufficient pam_unix.so nullok try_first_pass
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
这种行为的缺点是,任何人都可以登录新用户的帐户并分配密码。您无法保证新帐户确实会转到预期的人手中。但其他选择都很糟糕:给所有新用户分配相同的密码,比如“剑鱼?” 生成随机字符串,并希望倒霉的人能正确输入?
Debian的Linux-PAM支持 nullok_secure 选项,如果在安全终端上使用,则允许使用空密码进行访问。安全终端是指您确定位于物理安全空间(如锁定的数据中心)的终端。对于您确定为安全的位置来说,这是一种便利。安全终端通常仅限于控制台、虚拟终端和各种类型的串行端口,并在 /etc/securetty 中列出。
大多数Linux系统都希望PAM配置本地密码数据库。它们使用系统范围的PAM配置来告诉系统使用影子密码文件,使用哪种哈希算法作为密码,等等。
我强烈建议大家将这些设置保留为默认值。您希望主机使用影子密码文件。你对加密哈希算法的了解与为你的操作系统做出这些选择的人相比很差。你可能听说过Blowfish很酷,但Linux发行版使用SHA 512是有充分理由的。如果你认为必须更改密码配置,那你就错了。
更改密码的用户通常会尝试进行细微的更改,例如打乱字母或添加数字。Debian在更改密码时使用 obscure (模糊)选项来检查这些基本问题。CentOS或OpenPAM不支持此选项,但质量检查模块提供了更好的服务。
一个真正共同的目标是限制组的身份验证。最著名的例子是,有多少系统只允许组 wheel 的成员使用 su(1)
成为 root 。Linux-PAM的 pam_wheel 和OpenPAM系统中包含的 pam_group 允许您检查组成员资格。尽管名称不同,但您以几乎相同的方式配置它们。
首先,你要检查哪一组?正如您从名称中猜到的那样,pam_wheel 检查 wheel 组中的成员资格,而 pam_group 没有默认值。对于任一模块,使用 group 选项指定所需的组。
xxxxxxxxxx
auth requisite pam_group.so group=wheel
只允许某些用户访问 root 帐户是有意义的,但您可能希望用户能够访问其他帐户。例如,在Oracle数据库服务器上,数据库团队可能需要定期切换到Oracle用户。取消DBA的su(1)
访问权限会给你带来很多麻烦。root_only 选项告诉两个模块只有在用户试图成为 root 时才应用此语句。
您还可以使用组检查来阻止基于组的访问。deny 选项颠倒了组检查的含义,因此如果用户是组的成员,他就无法访问该服务。例如,您可以在 /etc/pam.d/sshd 中使用这样的条目阻止客户组访问SSH:
xxxxxxxxxx
auth required pam_wheel.so group=customers deny
像这样的负面检查(negative checks)比正面检查(positive checks)风险更大。我建议只允许组成员访问,而不是拒绝组中的人。忘记将新员工添加到 staff 组中,她就无法完成工作了——但你会马上注意到的。忘记将新客户添加到 customer 组,她就会默默地访问被禁止的服务。
Linux-PAM也支持信任选项。如果用户是指定组的一部分,则不必输入密码。有了信任, wheel 组的成员可以在不输入密码的情况下运行 su root
。
组检查通常使用原始用户的组成员身份来执行检查。您可以反转此检查,使用 luser 选项创建“如果 target 是此组的成员,则允许此服务”。因此,您可以创建PAM配置,如“允许 su(1)
访问 oracle 帐户”。
OpenPAM的 pam_group
也有一个 fail_safe 选项。设置 fail_safe 命令会告诉 pam_group
,如果指定的组不存在或没有成员,则应该允许访问。您可以在集中管理PAM配置时使用此功能。但是,您不能将 fail_safe 与 wheel 组一起使用。
标准调试选项很有用,use_first_pass
和 try_first_pass
。但是OpenPAM的 pam_unix
不支持 try_first_pass 。
在制定PAM策略时,以肯定的 yes 或 no 结束策略会有所帮助。PAM包括两个模块。
有时候,你只需要说不。这就是 pam_deny 的作用。
使用 pam_deny 阻止所有请求。通过在策略末尾添加 pam_deny ,您可以声明之前不允许的一切都是禁止的。
在使用 sufficient 语句时,pam_deny 模块尤为重要。sufficient 控制表示“通过此,只要没有其他人反对,你就可以进入。如果失败,你可以尝试其他操作。”如果一个请求到达一堆充分语句的末尾,但没有通过任何语句,但没有任何语句拒绝访问,则在末尾添加 pam_deny 表示权威(authoritative)拒绝(refusal)。
您还将看到 pam_deny 用于请求毫无意义的地方。CentOS提供基于指纹的身份验证。红帽开发人员认为,人们的指纹不会改变,因此他们断然否认更改用户密码的企图。
xxxxxxxxxx
password required pam_deny.so
required 控件指示模块必须返回成功才能授予请求。pam_deny 模块从不返回成功。此PAM配置阻止所有更改用户指纹的尝试。
如果 pam_deny 很紧张,拒绝一切,pam_permit 就是它的镜像双胞胎。就像一个非常糟糕的谈判者,pam_permit 对一切都说“是”。它没有选项,也没有可调的行为。
某些服务需要使用 pam_permit 来明确允许访问。出于这个原因,您会看到许多程序将 pam_permit 与会话策略一起使用。
PAM允许您明确地授予 root 帐户其包罗万象的权限。如果用户是 root ,pam_rootok 模块允许访问。
我经常看到 pam_rootok 与 include 语句一起使用。这是 chfn(1)
的CentOS 7 PAM配置:
xxxxxxxxxx
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
总体而言,这意味着 “root可以始终运行此命令,或在系统身份验证允许的情况下运行其他命令。”
pam_rootok 仅适用于 auth 语句。
类Unix系统认为某些终端比其他终端更安全。虽然SSH可能是一种安全协议,但SSH使用的虚拟终端本身并不安全。物理控制台可能不在安全位置,但如果你有控制台访问权限,你可以对机器进行物理更改,所以你最好称之为安全。如果这些串行端口连接到系统管理员桌面上的本地终端,它们可能是安全的,但如果它们在调制解调器池中,则不那么安全。如果机器及其控制台位于一个由非常严重的锁保护的房间里,那么物理终端就是尽可能安全的。
通常,用户不能以 root 身份直接登录。他们需要以普通用户身份登录,然后使用 su(1)
成为 root。pam_securetty 模块允许以 root 身份直接登录,前提是且仅当(if and only if)用户在安全终端上进行身份验证时。
如果终端设备在 /etc/ttys 中的条目具有 secure 标志,则BSD系统认为该终端设备是安全的。
Linux系统在 /etc/securettys 中列出安全终端设备。Linux-PAM的 pam_securetty 还允许以 root 身份登录内核命令行上列出的控制台设备,以及 /sys/class/tty/console/active 中列出的控制台。pam_securetty 的 noconsole 选项不允许这些额外的设备,将 root 登录限制在 /etc/securetty 中列出的设备上。
PAM通过 pam_lastlog 模块向用户会计系统提供信息。在CentOS和Debian上,用户帐户位于 /var/log/lastlog 中,而FreeBSD将其放在 /var/log/utx.lastlogin 中。当用户登录时,它还会打印欢迎消息,通知他们上次登录的时间。
pam_lastlog 仅作为会话语句的一部分工作。
Linux-PAM支持多种选项来修改 pam_lastlog 的记帐和登录行为。您可以使用 nowtmp 和 noupdate 等选项禁用某些会计功能。noterm 和 nohost 等选项会从用户的登录消息中删除信息,而 showfailed 会显示上次有人登录此帐户失败的时间。最后,inactive 选项允许您在帐户因非活动而被锁定之前设置非活动天数。您可以设置天数,或使用默认值90。
xxxxxxxxxx
session optional pam_lastlog.so showfailed inactive=5
BSD系统在其他地方处理所有这些功能,因此OpenPAM不支持这些功能。
无论你提前多久宣布维护窗口,提醒人们多少次,当你进行精细升级时,都会有人尝试使用该系统。您可能希望系统处于多用户模式,但不允许除系统管理员以外的任何人登录。或者,您可能需要通过暂时不允许人们登录来解决管理问题。pam_nologin 模块就是为你准备的。
您可能认为通过关闭服务可以获得类似的结果——如果SSH守护进程关闭,则没有人可以通过SSH登录到您的主机!您还可以重新配置SSH,只允许系统管理员登录,但触摸配置文件有其自身的风险。pam_nologin 模块并不普遍禁止登录。它禁止除特权用户列表之外的所有人登录。
pam_nologin 检查 nologin 文件是否存在——对于Linux-Pam和OS X,检查 /etc/nologin 或 /var/run/nologin ,对于OpenPAM,检查 /var/run/nologin 。如果 nologin 文件不存在,用户可以正常登录。如果该文件存在,则大多数用户无法登录。pam_nologin 将 nologin 文件的内容作为错误消息发送给应用程序。用户是否看到该消息完全取决于应用程序。
一些系统在启动时删除 nologin 文件,而另一些系统则在启动时将其保留在原位。你的操作系统是做什么的?查看文档以了解它的声明,然后在测试主机上尝试以发现它的真正功能。
OpenPAM和Linux-PAM都建议将 pam_nologin 作为必需的模块,并将其放在策略的前面。在您打算暂时拒绝访问的每个系统服务中使用它。
pam_nologin 控制帐户可用性,仅在帐户策略中有效。帐户策略决定帐户是否可用。
当你有一个使用Linux-PAM的 nologin 文件时,root 用户仍然可以登录。由于 root 通常不能通过SSH登录,这限制了对控制台的登录。
使用OpenPAM时,nologin 文件将登录限制为在 /etc/login.conf 中定义了ignorenologin的用户。在FreeBSD上,默认情况下只有 root ,但有一个带有此功能的 staff 登录类的注释示例。
现在您已经了解了最普遍的模块,让我们来看看PAM用来将所有东西结合在一起的一些内部结构。