<-
Apache HTTP 服务器 2.4 > 认证与授权

认证与授权

身份验证是您用来验证某人是否是他们所声称的身份的任何过程。授权是允许某人进入其想去的地方或获得其想要的信息的任何过程。

有关常规访问控制,请参阅访问控制方法

支持Apache!

也可以看看

最佳

相关模块和指令

身份验证和授权过程涉及三种类型的模块。通常,您需要从每个组中至少选择一个模块。

除了这些模块之外,还有 mod_authn_coremod_authz_core。这些模块实现了所有认证模块的核心指令。

该模块mod_authnz_ldap是身份验证和授权提供者。该模块 mod_authz_host基于主机名,IP地址或请求的特征提供授权和访问控制,但它不是身份验证提供程序系统的一部分。为了与mod_access向后兼容,提供了一个新模块mod_access_compat

您可能还想看看访问控制方法,它讨论了控制对服务器访问的各种方法。

最佳

介绍

如果您的网站上有敏感信息或仅适合一小部分人使用,则本文中的技术将帮助您确保看到这些页面的人就是您想要看到的人。

本文介绍了保护您大多数人将要使用的网站部分的“标准”方法。

注意:

如果您的数据确实需要安全,请考虑使用 mod_ssl除身份验证之外的其他方法。

最佳

先决条件

本文讨论的指令将需要放入主服务器配置文件(通常在一个 <Directory>节中)或按目录的配置文件(.htaccess文件)中。

如果计划使用.htaccess文件,则需要具有服务器配置,以允许在这些文件中放置身份验证指令。这是通过AllowOverride伪指令完成的,该 伪指令指定可以在每个目录的配置文件中放置哪些伪指令(如果有)。

既然我们在这里谈论认证,那么您将需要一个AllowOverride类似于以下的指令:

AllowOverride AuthConfig

或者,如果仅要将指令直接放入主服务器配置文件中,则当然需要对该文件具有写权限。

而且,您需要稍微了解一下服务器的目录结构,才能知道某些文件的存放位置。这应该不会很困难,当我们谈到这一点时,我会尽力弄清楚这一点。

您还需要确保模块 mod_authn_coremod_authz_core 已内置到httpd二进制文件中或已由httpd.conf配置文件加载。这两个模块都提供了核心指令和功能,这些指令和功能对于Web服务器中的身份验证和授权的配置以及使用至关重要。

最佳

使它工作

这是密码保护服务器上目录的基础。

首先,您需要创建一个密码文件。确切的操作方式将取决于您选择的身份验证提供程序。以后再说。首先,我们将使用文本密码文件。

该文件应放置在无法从网络访问的位置。这样一来,人们就无法下载密码文件。例如,如果您的文档用完了/usr/local/apache/htdocs,您可能希望将密码文件放入中 /usr/local/apache/passwd

要创建文件,请使用htpasswdApache附带的实用程序。它将位于bin您安装Apache的任何目录中。如果您是通过第三方软件包安装的,则它可能在您的执行路径中。

要创建文件,请输入:

htpasswd -c /usr/local/apache/passwd/passwords rbowen

htpasswd 会要求您提供密码,然后要求您再次输入以确认:

# htpasswd -c /usr/local/apache/passwd/passwords rbowen
New password: mypassword
Re-type new password: mypassword
Adding password for user rbowen

如果htpasswd不在路径中,则当然必须键入文件的完整路径才能使其运行。使用默认安装,它位于 /usr/local/apache2/bin/htpasswd

接下来,您需要配置服务器以请求密码,并告诉服务器允许哪些用户访问。您可以通过编辑httpd.conf 文件或使用.htaccess文件来执行此操作。例如,如果您希望保护目录 /usr/local/apache/htdocs/secret,则可以使用以下指令,它们位于文件中 /usr/local/apache/htdocs/secret/.htaccess,也可以位于httpd.conf<Directory“ / usr / local / apache / htdocs / secret”>部分中。

AuthType Basic
AuthName "Restricted Files"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
Require user rbowen

让我们分别检查每个指令。的AuthType指令选择该方法,用于对用户进行认证。最常见的方法是Basic,这是由实现的方法mod_auth_basic。但是,重要的是要知道,基本身份验证会将密码从客户端发送到服务器的密码未经加密。因此,除非带有,否则此方法不应用于高度敏感的数据mod_ssl。Apache支持另一种身份验证方法: AuthType Digest。此方法由实施,mod_auth_digest旨在更加安全。情况不再如此,应该使用加密连接mod_ssl

AuthName指令设置的境界在认证中使用。该领域具有两个主要功能。首先,客户端通常将此信息作为密码对话框的一部分提供给用户。其次,客户端使用它来确定要发送给定认证区域的密码。

因此,例如,一旦客户端在该"Restricted Files"区域中进行了身份验证 ,它将自动为同一服务器上标有"Restricted Files"Realm的任何区域重试相同的密码。因此,通过让多个受限区域共享同一领域,可以防止多次提示用户输入密码。当然,出于安全原因,每当服务器的主机名更改时,客户端总是需要再次询问密码。

AuthBasicProvider是,在这种情况下,可选的,因为file是该指令的默认值。如果您选择其他身份验证来源(例如mod_authn_dbm或),则需要使用此伪指令 mod_authn_dbd

AuthUserFile 指令设置的路径,我们只是创建密码文件htpasswd。如果您有大量用户,则通过纯文本文件搜索以对每个请求进行用户身份验证的速度可能会很慢。Apache还具有将用户信息存储在快速数据库文件中的功能。该mod_authn_dbm模块提供AuthDBMUserFile指令。可以使用dbmmanagehtdbm程序创建和处理这些文件。Apache模块数据库中的第三方模块提供了许多其他类型的身份验证选项。

最后,该Require 指令通过设置允许访问服务器此区域的用户来提供过程的授权部分。在下一节中,我们讨论使用Require指令的各种方法 。

最佳

让一个以上的人进入

上面的指令仅允许一个人(特别是用户名为的人rbowen)进入目录。在大多数情况下,您需要让一个以上的人进入。这就是AuthGroupFile进来的地方。

如果要允许多个人进入,则需要创建一个组文件,该文件将组名与该组中的用户列表相关联。该文件的格式非常简单,您可以使用自己喜欢的编辑器来创建它。该文件的内容如下所示:

GroupName: rbowen dpitts sungo rshersey

那只是长行中由空格分隔的组中成员的列表。

要将用户添加到您现有的密码文件中,请键入:

htpasswd /usr/local/apache/passwd/passwords dpitts

您将获得与以前相同的响应,但是它将添加到现有文件中,而不是创建一个新文件。(正是它-c使它创建了一个新的密码文件)。

现在,您需要将.htaccess文件或 <Directory>块修改为如下所示:

AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
AuthGroupFile "/usr/local/apache/passwd/groups"
Require group GroupName

现在,如果组中列出的任何人中输入了正确的密码,则GroupNamepassword文件中包含条目的人都可以进入。

还有一种让多个用户参与的方式不太明确。除了创建组文件,您还可以使用以下指令:

Require valid-user

使用该Require user rbowen 行而不是该行将允许密码文件中列出的任何人以及正确输入密码的人。

最佳

可能的问题

由于指定了基本身份验证的方式,每次您从服务器请求文档时都必须验证用户名和密码。即使您要重新加载同一页面,也需要重新加载页面上的每个图像(如果它们来自受保护的目录)。可以想象,这会使速度变慢。它使事情变慢的数量与密码文件的大小成正比,因为它必须打开该文件,并向下浏览用户列表,直到获得您的名字为止。并且每次页面加载时都必须这样做。

这样做的结果是,一个密码文件中可以放入多少用户是有实际限制的。此限制将根据您特定服务器计算机的性能而有所不同,但是一旦达到几百个条目,您可能会看到速度下降,并且可能希望当时考虑使用其他身份验证方法。

最佳

备用密码存储

因为将密码存储在纯文本文件中存在上述问题,所以您可能希望将密码存储在其他位置,例如数据库中。

mod_authn_dbmmod_authn_dbd两个模块使之成为可能。而不是选择AuthBasicProvider file,而是可以选择dbmdbd为您的存储格式。

选择一个dbm文件而不是一个文本文件,例如:

<Directory "/www/docs/private">
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider dbm
    AuthDBMUserFile "/www/passwords/passwd.dbm"
    Require valid-user
</Directory>

其他选项可用。有关mod_authn_dbm更多详细信息,请查阅 文档。

最佳

使用多个提供商

随着新的基于提供程序的身份验证和授权体系结构的引入,您不再局限于单一的身份验证或授权方法。实际上,可以将任意数量的提供程序进行混合和匹配,以为您提供完全满足您需求的方案。在以下示例中,同时使用了基于文件和LDAP的身份验证提供程序。

<Directory "/www/docs/private">
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider file ldap
    AuthUserFile "/usr/local/apache/passwd/passwords"
    AuthLDAPURL ldap://ldaphost/o=yourorg
    Require valid-user
</Directory>

在此示例中,文件提供者将首先尝试对用户进行身份验证。如果无法验证用户身份,则将调用LDAP提供程序。如果您的组织实施多种类型的身份验证存储,则可以扩大身份验证的范围。其他认证和授权方案可以包括将一种认证类型与另一种认证类型混合。例如,针对密码文件进行身份验证而针对LDAP目录进行授权。

正如可以实现多个身份验证提供程序一样,也可以使用多种授权方法。在此示例中,同时使用了文件组授权和LDAP组授权。

<Directory "/www/docs/private">
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider file
    AuthUserFile "/usr/local/apache/passwd/passwords"
    AuthLDAPURL ldap://ldaphost/o=yourorg
    AuthGroupFile "/usr/local/apache/passwd/groups"
    Require group GroupName
    Require ldap-group cn=mygroup,o=yourorg
</Directory>

为了进一步授权 ,可以使用诸如<RequireAll><RequireAny>允许逻辑之类的授权容器指令 ,以便可以通过配置完全控制处理授权的顺序。有关如何应用它们的示例,请参见授权容器

最佳

超越授权

与仅对单个数据存储进行一次检查相比,现在可以应用授权的方式更加灵活。现在可以进行排序,逻辑和选择授权方式。

应用逻辑和顺序

过去,控制授权的方式和顺序将是一个谜。在Apache 2.2中,引入了基于提供程序的身份验证机制,以将实际的身份验证过程与授权和支持功能脱钩。附带好处之一是可以按照特定顺序配置和调用身份验证提供程序,而该顺序不依赖于auth模块本身的加载顺序。该基于提供者的相同机制也已被引入授权。这意味着Require指令不仅指定应使用的授权方法,还指定调用它们的顺序。以Require伪指令在配置中出现的相同顺序调用多个授权方法 。

通过引入诸如<RequireAll> 和 的授权容器指令 <RequireAny>,该配置还可以控制何时调用授权方法以及确定何时授予访问权限的标准。有关 如何使用它们表示复杂的授权逻辑的示例,请参见 授权容器

默认情况下,所有 Require 指令都像包含在<RequireAny> 容器指令中一样进行处理 。换句话说,如果任何指定的授权方法成功,则将授予授权。

使用授权提供者进行访问控制

通过用户名和密码进行身份验证只是故事的一部分。通常,您想让别人根据自己的身份而不是别人。诸如此类的来源。

授权商allenvhostip让你允许或拒绝访问基于其他基于主机的标准,如主机名或机器请求文件的IP地址。

这些提供程序的用法通过Require指令指定 。此伪指令注册将在请求处理的授权阶段被调用的授权提供者。例如:

Require ip address

其中address是一个IP地址(或部分IP地址)或:

Require host domain_name

其中domain_name是标准域名(或部分域名);如果需要,您可以提供多个地址或域名。

例如,如果您有某人向您的留言板发送垃圾邮件,并且希望将其拒之门外,则可以执行以下操作:

<RequireAll>
    Require all granted
    Require not ip 10.252.46.165
</RequireAll>

来自该地址的访问者将看不到该指令所涵盖的内容。相反,如果您拥有计算机名称而不是IP地址,则可以使用该名称。

<RequireAll>
    Require all granted
    Require not host host.example.com
</RequireAll>

而且,如果您想阻止来自整个域的访问,则可以仅指定地址或域名的一部分:

<RequireAll>
    Require all granted
    Require not ip 192.168.205
    Require not host phishers.example.com moreidiots.example
    Require not host ke
</RequireAll>

使用<RequireAll> 多个<Require>指令,每个否定not,将只允许访问,如果所有的否定条件都满足。换句话说,如果任何否定条件失败,访问将被阻止。

访问控制向后兼容

一个采用的认证供应商基于机制的副作用是,以前的访问控制指令 OrderAllowDenySatisfy不再需要。但是,为了为较早的配置提供向后兼容性,这些指令已移至mod_access_compat模块中。

注意

所提供的指令mod_access_compat已被弃用mod_authz_host。从技术上讲,可以将旧指令(例如OrderAllowDeny新 指令(例如)混合使用,Require但不建议这样做。mod_access_compat创建该模块是为了支持仅包含旧指令的配置,以促进2.4升级。请查看升级指南以获取更多信息。

最佳

身份验证缓存

有时,身份验证会对提供商或网络造成不可接受的负担。这最有可能影响mod_authn_dbd(或第三方/自定义提供商)的用户。为了解决这个问题,HTTPD 2.3 / 2.4引入了一个新的缓存提供程序 mod_authn_socache来缓存凭据并减少原始提供程序的负载。

这可能会为某些用户带来实质性的性能提升。

最佳

更多信息

您还应该阅读的文档 mod_auth_basicmod_authz_host 其中包含有关如何全部工作的更多信息。该指令<AuthnProviderAlias>还可以帮助简化某些身份验证配置。

密码加密中解释了Apache支持的用于身份验证数据的各种密码。

您可能需要查看访问控制方法,其中讨论了许多相关主题。

可用语言: zh  |  es  |  fr  |  ja  |  ko  |  TR 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。