Apache 用户身份验证

Apache Web 服务器
自 1996 年 4 月以来,Apache 一直是互联网上最受欢迎的 Web 服务器。Netcraft 2000 年 2 月 Web 服务器调查发现,互联网上超过 58% 的网站正在使用 Apache,使其比所有其他 Web 服务器的总和还要广泛使用。这一成功可归因于 Apache 提供了超文本传输协议 (HTTP) 的强大且商业级的参考实现。此外,它还可靠、可配置、高度可扩展、文档齐全、开源且免费。
首先,您的 Linux 机器上必须安装 Apache 和 htpasswd 实用程序。如果您没有安装,您可以从 Apache 组织网站下载最新版本的 Apache(现在提供 1.3.12 版本)并将其安装在您的机器上。htpasswd 随 Apache 一起提供。
身份验证是一个简单但非常重要的原则——客户端将其名称和密码发送到服务器(参见图 1)。Apache 检查凭据是否有效,如果有效,则返回请求的页面(参见图 2)。
如果用户不允许访问该页面或提供的密码无效,Apache 将返回 401 状态(即,未授权访问)。然后,浏览器将要求用户重试其用户名和密码(参见图 3)。

图 3. 访问失败
限制对文档的访问通常基于浏览器的主机名或用户凭据(用户名和密码)。采用哪种方法的决定取决于您的环境设置。例如,如果您想在有限的环境(如部门)内限制文档,则可以使用客户端主机名。否则,如果您想在个人基础上授予访问权限,或者如果允许访问的人员分散,则需要用户名和密码。
为了使用用户名和密码设置用户身份验证,我们需要遵循两个步骤。首先,我们创建一个包含用户名和密码的文件。然后,我们通知服务器哪些资源需要保护以及允许哪些用户访问它们。
配置身份验证的第一步是设置用户及其对应密码的列表。此列表保存在一个文件中,例如,名为 users。出于安全原因,此文件不应保存在根目录下。因此,对于我的设置,我将其保存在 /etc/httpd 下。为了有组织的设置,您可以在 /etc/httpd 下创建一个目录,可能名为 users-files,并将文件保存在其中。文件格式类似于标准的 UNIX 密码文件,由用户名列表和每个用户的加密密码组成,用冒号分隔。
htpasswd 是 Apache 包提供的实用程序,允许我们创建一个包含用户密码的用户文件,以便添加或修改它们。在我的机器上,由 Red Hat 6.1、Apache 1.3.9 和 htpasswd 提供支持,它们是标准安装的一部分。要查看 htpasswd 的工作方式,请在 shell 提示符下键入 htpasswd,将返回以下消息
Usage: htpasswd [-cmdps] passwordfile username<\n> htpasswd -b[cmdps] passwordfile username password -c Create a new file.<\n> -m Force MD5 encryption of the password. -d Force CRYPT encryption of the password (default). -p Do not encrypt the password (plaintext). -s Force SHA encryption of the password. -b Use the password from the command line rather than prompting for it. On Windows and TPF systems the '-m' flag is used by default. On all other systems, the '-p' flag will probably not work.
根据用法说明,要创建新的用户文件并将用户 ibrahim 添加到文件 /etc/httpd/users,我们键入以下命令
htpasswd -c -b /etc/httpd/users ibrahim LJ*2000-ih-c 标志仅在我们第一次使用 htpasswd 创建新的用户文件时使用。当我们使用 -b 标志运行 htpasswd 时(请参阅“安全问题”部分),系统不会提示您输入 ibrahim 的密码,因为它已从命令行传递。其他用户可以以相同的方式添加到现有文件中,只是不需要 -c 参数,因为该文件已经存在。如果在添加其他用户时使用此选项,则文件将被覆盖,旧用户将丢失。
在我为自己创建了一个“Web 帐户”后,我又添加了一些其他帐户,我的 /etc/httpd/users 文件看起来像
ibrahim:40gvm/lYXsk4a chady:XygEnj0pSDx9A julie:3zwRhLJDrr/9s carla:IfPYPtrekJLxE karine:jeM9XkbalFaTA
现在密码文件已创建,必须通知服务器,访问将根据此文件(/etc/httpd/users)中找到的用户名和密码进行限制。此保护方法提供对单个文件以及目录及其子目录的访问控制。用于创建受保护区域的指令可以放在要保护的目录中的 .htaccess 文件中,也可以放在 access.conf 文件(位于 /etc/httpd/conf 中)的 <Directory> 部分中。
要从 .htaccess 文件中限制目录,首先要确保 access.conf 文件允许在 .htaccess 文件中设置用户身份验证。这由 AuthConfig 覆盖控制。access.conf 文件应包含 AllowOverride AuthConfig 以允许身份验证指令包含在 .htaccess 文件中。现在,要将目录限制为密码文件中列出的任何用户,请创建一个包含以下指令的 .htaccess 文件(在要保护的目录内)
AuthName "Confidential" AuthType Basic AuthUserFile /etc/httpd/users require valid-user
AuthName 指令为此保护指定一个 realm 名称。一旦用户输入了有效的用户名和密码,就可以使用相同的用户名和密码访问 realm 名称内的任何其他资源。这可以用于创建多个共享相同用户名和密码的区域。
AuthType 指令告诉服务器要用于身份验证的协议。另一种方法 Digest 提供了更高的安全功能,也可在 mod_digest 模块中使用。使用 MD5 Digest 身份验证非常简单。使用 AuthType Digest 和 AuthDigestFile 而不是普通的 AuthType Basic 和 AuthUserFile 设置身份验证。其他一切都应保持不变。
AuthUserFile 指令告诉服务器由 htpasswd 创建的用户文件的位置。同样,当使用组文件(在下一节中描述)时,使用 AuthGroupFile 指令告诉服务器组文件的位置。
最后,require 指令告诉服务器文件中哪些用户名对于特定的访问方法是有效的。在本例中,参数 valid-user 告诉服务器可以使用密码文件中的任何用户名。但是,我们可以将其配置为仅允许特定用户。一个例子是
require ibrahim julie carla
此指令仅允许 ibrahim、julie 和 carla 在输入正确密码后访问文档。如果任何其他用户尝试访问此目录,即使密码正确,他们也会被拒绝。这种方法非常有用,原因有二
服务器的不同区域可以使用相同密码文件限制为不同的人。
如果允许用户访问不同的区域,他只需记住一个密码。
在某些情况下,我们只想允许选定的用户访问特定目录。一种简单的方法是在 require 行上列出所有允许的用户名。不鼓励这样做,因为如果用户很多,文件会变得非常大。幸运的是,有一种很好的方法可以解决这个问题——使用组文件,它的操作方式类似于标准的 UNIX 组。任何特定用户都可以是任意数量组的成员。然后,我们可以使用 require 指令行将用户限制为一个或多个特定组。例如,我们可以创建一个名为 research-staff 的组,其中包含允许访问研究部门页面的用户。要将访问权限仅限制为 research-staff 组中的用户,我们将使用此指令
require group research-staff
也可以列出多个组,并且也可以给出 require user,在这种情况下,任何列出的组中的任何用户,或任何显式列出的用户,都可以访问资源。例如
require group research-staff admin-staff require user julia carla允许 research-staff 组或 admin-staff 组中的任何用户,或用户 julia 和 carla,在输入有效密码后访问此资源。
组文件由给出组名的行组成,后跟该组中以空格分隔的用户列表。例如
research-staff:chady karine admin-staff:ibrahim julie
AuthGroupFile 指令用于告诉服务器组文件的位置。使用组文件的诀窍是组文件中的最大行长度为 8KB。但是,为了绕过此限制,我们可以在文件中使用多个具有相同组名的行。
使用纯文本文件来维护用户名和密码既简单又直接。然而,对于大量用户采用此方法会导致服务器端进行大量处理,以在文件中搜索相关凭据;这会增加服务器负载。此外,必须对受保护区域内的每个请求进行处理;即使用户只输入一次密码,由于 HTTP 的无状态性质,服务器也必须在每个请求上重新验证他们。因此,服务器在完成请求后不会记住任何有关请求的信息,并且必须在每个请求上重新发送用户名和密码。
使用 DBM 格式文件可以实现更快的访问。这允许服务器非常快速地查找名称,而无需读取大型文本文件。这种方法的缺点是与管理纯文本文件相比,管理 DBM 文件更加复杂。有各种附加模块允许将用户信息存储在数据库中。除了 DBM 格式 (mod_auth_dbm) 之外,用户和组列表可以存储在 DB 格式文件 (mod_auth_db) 中。也可以使用完整的数据库,例如 mSQL (mod_auth_msql)、Postgres95 (mod_auth_pg95) 或任何 DBI 兼容的数据库 (mod_auth_dbi)。
关于 htpasswd 管理的密码文件,有几个安全注意事项。首先,包含用户信息的文件(如 /etc/httpd/users)应位于服务器的 Web 空间之外——它们不得被浏览器获取。其次,不鼓励将 -b 标志与 htpasswd 一起使用,如图 4 所示,因为使用时,未加密的密码会显示在屏幕上。
身份验证对于大多数 Web 服务器至关重要且必不可少。Apache 已证明其可靠性,并具有稳定的性能和值得信赖的安全性的出色记录。使用 Apache 的身份验证功能,我们可以结合经济高效的方式来使用运行在 Linux 上的最流行的 Web 服务器来保护我们的文档。

Ibrahim F. Haddad (ibrahim.haddad@lmc.ericsson.se) 是爱立信加拿大研究中心(位于蒙特利尔)的高级技术人员。他作为理学博士候选人在康考迪亚大学研究分布式对象技术和 Web 服务器性能。Ibrahim 借此机会感谢他的父母在过去二十五年中给予他的所有帮助和支持,更不用说无数的牺牲了。