Floris Lambrechts - 语言更改,各种小修复 (v0.8)。
2000-05-02
修订历史 | ||
---|---|---|
修订 0.8 | 2003-02-20 | 修订者:fl |
语言更改,各种小修复 | ||
修订 0.5 | 2000-05-15 | 修订者:ph |
添加了关于保护 pam 的章节,添加了资源章节 | ||
修订 0.1 | 2000-05-02 | 修订者:ph |
初始版本 |
当尝试向我现有的家庭网络添加一些(大部分是不必要的 :) )网络服务时,我一直遇到身份验证问题,所以我决定弄清楚身份验证在 Linux 系统上是如何工作的,编写一个 HOWTO,并将其称为我的高级项目。我希望本文档能帮助您理解系统管理中这个经常被遗忘但非常重要的方面。
(c) 2000 Peter Hernberg
本手册可以完整或部分复制,无需费用,但须遵守以下限制
上述版权声明和本许可声明必须完整地保留在所有完整或部分副本上
任何翻译或衍生作品在分发前必须经作者书面批准。
如果您部分分发本作品,则必须包含获取本手册完整版本的说明,并提供获取完整版本的方式。
在评论或其他作品中,可以复制少量部分作为插图或引文,而无需本许可声明,但须注明出处。出于学术目的,可以批准对这些规则的例外情况:请写信给作者并询问。这些限制是为了保护我们作为作者,而不是限制您作为学习者和教育者。本文档中的任何源代码(SGML 文档除外)均受 GNU 通用公共许可证约束,可通过 GNU 存档的匿名 FTP 获取。
感谢我的家人容忍了我 18 年。感谢 Debian 团队制作了如此棒的发行版供我玩耍。感谢 CGR 付钱让我成为一名技术人员。感谢 Sandy Harris 的有益建议。最后,我要感谢方便面的制造商,因为我不知道没有它们我该如何生活。
在几乎所有 Linux 发行版(以及商业 *nix 系统)上,用户信息都存储在/etc/passwd,一个文本文件中,其中包含用户的登录名、他们的加密密码、唯一的数字用户 ID(称为 uid)、数字组 ID(称为 gid)、可选的注释字段(通常包含诸如他们的真实姓名、电话号码等项目)、他们的主目录和他们首选的 shell。一个典型的条目/etc/passwd看起来像这样
pete:K3xcO1Qnx8LFN:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash |
如您所见,它非常简单明了。每个条目包含我上面描述的六个字段,每个字段用冒号分隔。如果用户身份验证像这样简单,就不需要这份 HOWTO 了。
查看您的/etc/passwd,您很可能实际看到的是这样的内容
pete:x:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash |
加密密码去哪儿了?在我告诉您它去哪儿之前,需要一些解释。
该/etc/passwd文件包含有关所有用户的信息,包括他们的加密密码,所有用户都可以读取该文件,这使得任何用户都可以获取系统上每个人的加密密码。虽然密码已加密,但密码破解程序已广泛可用。为了应对日益增长的安全威胁,开发了影子密码。
当系统启用影子密码时,/etc/passwd中的密码字段被“x”替换,用户的真实加密密码存储在/etc/shadow中。因为/etc/shadow只有 root 用户可读,所以恶意用户无法破解其同伴用户的密码。/etc/shadow中的每个条目都包含用户的登录名、他们的加密密码以及一些与密码过期相关的字段。一个典型的条目看起来像这样
pete:/3GJllg1o4152:11009:0:99999:7::: |
组信息存储在/etc/group中。格式类似于/etc/passwd,条目包含组名、密码、数字 ID (gid) 和以逗号分隔的组成员列表的字段。/etc/group中的条目看起来像这样
pasta:x:103:spagetti,fettucini,linguine,vermicelli |
从密码字段中的“x”可以看出,组密码也可以被影子化。尽管组几乎从不拥有自己的密码,但值得注意的是,影子组密码信息存储在/etc/gshadow.
可插拔身份验证模块是任何现代 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文件,我们稍后会讨论)。让我们看一下登录的 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 配置令牌
type 令牌告诉 PAM 此模块要使用哪种类型的身份验证。相同类型的模块可以“堆叠”,要求用户满足多个要求才能通过身份验证。PAM 识别四种类型
确定是否允许用户访问服务,他们的密码是否已过期等。
确定用户是否是他们声称的身份,通常通过密码,但也可能通过更复杂的方式,例如生物识别技术。
为用户提供一种更改其身份验证的方式。同样,这通常是他们的密码。
在用户通过身份验证之前和/或之后应完成的事情。这可能包括挂载/卸载用户主目录、记录他们的登录/注销以及限制/取消限制用户可用的服务等。
在登录配置文件中,我们看到了每种类型的至少一个条目。由于这是允许用户登录的程序(因此得名 :)),因此可以理解它需要访问所有不同类型的身份验证。
control 令牌告诉 PAM 如果此模块的身份验证失败应该怎么做。PAM 识别四种控制类型
未能通过此模块进行身份验证会导致立即拒绝身份验证。
失败也会导致拒绝身份验证,尽管 PAM 仍然会在拒绝身份验证之前调用为此服务列出的所有其他模块。
如果此模块的身份验证成功,即使之前的 required 模块失败,PAM 也会授予身份验证。
此模块是成功还是失败仅在其是此服务的唯一类型模块时才重要。
在登录的配置文件中,我们看到了几乎所有不同的控制类型。大多数 required 模块是 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
配置/etc/pam.conf如果您的 PAM 配置存储在/etc/pam.d/而不是/etc/pam.conf中,则 PAM 配置行会略有不同。所有配置都存储在中,而不是每个服务都有自己的配置文件,配置行的第一个令牌是服务名称。例如,:
auth required pam_unix.so nulok |
/etc/pam.d/login/etc/pam.conf:
login auth required pam_unix.so nulok |
中的以下行将变为
除了这个微小的差异之外,所有其余的 PAM 配置语法都适用。
有关配置 PAM 和完整的 PAM 模块参考的更多信息,请查阅 Linux-PAM 系统管理员指南。本指南是关于 PAM 配置的全面且最新的参考。
4.1. 强大的/etc/pam.d//etc/pam.d/other许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。中的所有文件都包含特定服务的配置。此规则的显著例外是文件。此文件包含任何没有自己配置文件的服务的配置。例如,如果(虚构的)xyz 服务尝试身份验证,PAM 将查找/etc/pam.d/xyz许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。文件。如果找不到,则 xyz 的身份验证将由许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。文件确定。由于许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。是 PAM 服务回退到的配置,因此确保其安全非常重要。我们将讨论
4.1.1. 偏执狂配置许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。一个偏执狂的
auth required pam_deny.so auth required pam_warn.so account required pam_deny.so account required pam_warn.so password required pam_deny.so password required pam_warn.so session required pam_deny.so session required pam_warn.so |
配置如下中,而不是每个服务都有自己的配置文件,配置行的第一个令牌是服务名称。例如,使用此配置,每当未知服务尝试访问四种配置类型中的任何一种时,PAM 都会拒绝身份验证(通过 pam_deny.so 模块),然后记录 syslog 警告(通过 pam_warn.so 模块)。除了 PAM 中的错误之外,此配置非常安全。这种残酷性的唯一问题是,如果您不小心删除了另一个服务的配置,可能会导致问题。如果您的
auth required pam_unix.so auth required pam_warn.so account required pam_unix.so account required pam_warn.so password required pam_deny.so password required pam_warn.so session required pam_unix.so session required pam_warn.so |
这是一个不太苛刻的配置
4.2. 禁用空密码用户的登录中,而不是每个服务都有自己的配置文件,配置行的第一个令牌是服务名称。例如,:
auth required pam_unix.so nullok |
在大多数 Linux 系统上,都有许多“虚拟”用户帐户,用于为某些系统服务(如 ftp、Web 服务器和邮件网关)分配特权。拥有这些帐户可以使您的系统更安全,因为如果这些服务受到威胁,攻击者将仅获得虚拟帐户可用的有限特权,而不是以 root 身份运行的服务的全部特权。但是,允许这些虚拟帐户登录特权存在安全风险,因为它们通常具有空白(空)密码。启用空密码的配置选项是“nullok”模块参数。您需要从允许登录的服务的任何“auth”类型的模块中删除此参数。这通常是登录服务,但也可能包括 rlogin 和 ssh 等服务。因此,
auth required pam_unix.so |
4.3. 禁用未使用的服务/etc/pam.d/查看许多 Linux 发行版附带的用户身份验证安全性不足。本节讨论使系统上的用户身份验证安全的一些方法。虽然这样做会使您的系统更安全,但不要天真地认为它们会使您无懈可击。中的文件,您可能会看到许多您不使用的程序的配置文件,甚至可能是一些您从未听说过的程序。虽然允许对这些服务进行身份验证可能不会打开任何巨大的安全漏洞,但最好拒绝它们进行身份验证。禁用这些程序的 PAM 身份验证的最佳方法是重命名这些文件。如果找不到以请求身份验证的服务命名的文件,PAM 将回退到(希望)非常安全的
虽然密码破解工具可能被攻击者用来危害系统,但系统管理员也可以使用它们作为主动工具来确保系统上密码的强度。“crack”和“John the Ripper”是两种最常用的密码破解工具。Crack 可能包含在您最喜欢的发行版中。John the Ripper 可以从 http://www.false.com/security/john/index.html 获取。针对您的密码数据库运行这些工具,您可能会对它们的结果感到惊讶。
~# tar xzf mod_auth_pam.tar.gz ~# cd mod_auth_pam-1.0a ~/mod_auth_pam-1.0a# make ~/mod_auth_pam-1.0a# make install |
首先,您需要从 http://blank.pages.de/pam/mod_auth_pam/ 下载 mod_auth_pam。以下命令将编译 mod_auth_pam(您必须以 root 身份登录)
~# /etc/init.d/apache restart |
5.4. 配置 PAMApache 的 PAM 配置存储在/etc/pam.d/httpd中。默认配置(在您安装 mod_auth_pam 时安装)是安全的,但它使用了一个模块(pam_pwdb.soApache 的 PAM 配置存储在),该模块可能在许多系统上不可用。(此外,从头开始配置它会很有趣!)因此,删除
5.4.1. 决定如何配置 PAM如果我们要配置 PAM 如何处理 Apache 的身份验证请求,我们需要弄清楚我们需要 PAM 检查什么。首先,我们希望 PAM 确保用户的密码与标准 Unix 密码数据库中的密码匹配。这听起来像是 'auth' 类型和pam_unix.soApache 的 PAM 配置存储在模块。我们希望将模块的控制类型设置为“required”,以便在没有正确密码的情况下身份验证将失败。这是我们的
auth required pam_unix.so |
的第一行如果我们要配置 PAM 如何处理 Apache 的身份验证请求,我们需要弄清楚我们需要 PAM 检查什么。首先,我们希望 PAM 确保用户的密码与标准 Unix 密码数据库中的密码匹配。这听起来像是 'auth' 类型和其次,我们必须确保用户帐户有效(即他们的密码未过期或任何类似的糟糕情况)。这是 'account' 类型,也由Apache 的 PAM 配置存储在模块提供。同样,我们将此模块的控制类型设置为“required”。添加此行后,我们的
auth required pam_unix.so account required pam_unix.so |
配置如下所示
5.5. 配置 Apache我们的目标是配置我们 Web 服务器的受限区域,即现在 PAM 已配置为验证 Apache 的请求,我们将配置 Apache 以正确利用 PAM 身份验证来限制对目录的访问。为此,请将以下行添加到您的httpd.conf(通常存储在/etc/apache/或):
<Directory /var/www/family> AuthPAM_Enabled on AllowOverride None AuthName "Family Secrets" AuthType "basic" require group family </Directory> |
/etc/httpd您可能需要替换/var/www/为 Web 文档的默认位置,通常是/home/httpd/。无论在哪里,您都需要创建family
目录。
6. 资源<petehern@yahoo.com>