认证与授权
身份验证是您用来验证某人是否是其声称的身份的任何过程。授权是允许某人进入其想去的地方或获得其想要的信息的任何过程。
有关常规访问控制,请参见访问控制方法。
相关模块和指令
认证和授权过程涉及三种类型的模块。通常,您需要从每个组中至少选择一个模块。
- 身份验证类型(请参阅
AuthType
指令)mod_auth_basic
mod_auth_digest
- 身份验证提供程序(请参阅
AuthBasicProvider
和AuthDigestProvider
指令)mod_authn_anon
mod_authn_dbd
mod_authn_dbm
mod_authn_file
mod_authnz_ldap
mod_authn_socache
- 授权(请参阅
Require
指令)mod_authnz_ldap
mod_authz_dbd
mod_authz_dbm
mod_authz_groupfile
mod_authz_host
mod_authz_owner
mod_authz_user
除了这些模块之外,还有mod_authn_core
和mod_authz_core
。这些模块实现核心指令,这些指令是所有auth模块的核心。
该模块mod_authnz_ldap
是身份验证和授权提供者。该模块mod_authz_host
根据主机名,IP地址或请求的特征提供授权和访问控制,但它不是身份验证提供程序系统的一部分。为了与mod_access向后兼容,提供了一个新模块mod_access_compat
。
您可能还想看看访问控制方法,它讨论了控制对服务器访问的各种方法。
介绍
如果您的网站上有敏感信息或仅适合一小部分人使用,则本文中的技术将帮助您确保看到这些页面的人就是您想要看到的人。
本文介绍了保护您大多数人将要使用的网站部分的“标准”方法。
注意:
如果您的数据确实需要安全,请考虑使用mod_ssl
除身份验证之外的其他方法。
先决条件
本文讨论的指令将需要放在主服务器配置文件中(通常在一个<Directory>
节中),也可以放在每个目录的配置文件(.htaccess
文件)中。
如果计划使用.htaccess
文件,则需要具有服务器配置,以允许在这些文件中放置身份验证指令。这是通过AllowOverride
伪指令完成的,该伪指令指定可以在每个目录的配置文件中放置哪些伪指令(如果有)。
既然我们在这里谈论认证,那么您将需要一个AllowOverride
类似于以下的指令:
AllowOverride AuthConfig
或者,如果只是将指令直接放入主服务器配置文件中,则当然需要对该文件具有写权限。
而且,您需要稍微了解一下服务器的目录结构,才能知道某些文件的存放位置。这应该不是很困难,当我们谈到这一点时,我会尽力弄清楚这一点。
您还需要确保模块mod_authn_core
和mod_authz_core
已内置到httpd二进制文件中或已由httpd.conf配置文件加载。这两个模块都提供了核心指令和功能,这些指令和功能对于Web服务器中的身份验证和授权的配置以及使用至关重要。
使它工作
这是密码保护服务器上目录的基础。
首先,您需要创建一个密码文件。确切的操作方式将取决于您选择的身份验证提供程序。以后再说。首先,我们将使用文本密码文件。
该文件应放置在无法从网络访问的位置。这样一来,人们就无法下载密码文件。例如,如果您的文档用完了/usr/local/apache/htdocs
,您可能希望将密码文件放在中/usr/local/apache/passwd
。
要创建文件,请使用htpasswd
Apache附带的实用程序。它将位于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
指令。可以使用dbmmanage
和htdbm
程序创建和操纵这些文件。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
现在,如果组中列出的任何人中输入了正确的密码,则GroupName
该password
文件中包含条目的人都可以进入。
还有一种让多个用户参与的方式不太明确。除了创建组文件,您还可以使用以下指令:
Require valid-user
使用该Require user rbowen
行而不是该行将允许密码文件中列出的任何人以及正确输入密码的人。
可能的问题
由于指定了基本身份验证的方式,每次您从服务器请求文档时都必须验证用户名和密码。即使您要重新加载同一页面,也需要重新加载页面上的每个图像(如果它们来自受保护的目录)。可以想象,这会使速度变慢。它使事情变慢的数量与密码文件的大小成正比,因为它必须打开该文件,并向下浏览用户列表,直到获得您的名字为止。并且每次加载页面时都必须这样做。
这样做的结果是,一个密码文件中可以放入多少个用户实际上是有限制的。此限制将根据您特定服务器计算机的性能而有所不同,但是一旦达到几百个条目,您可能会看到速度变慢,并且此时可能希望考虑使用其他身份验证方法。
备用密码存储
因为将密码存储在纯文本文件中存在上述问题,所以您可能希望将密码存储在其他位置,例如数据库中。
mod_authn_dbm
和mod_authn_dbd
两个模块使之成为可能。而不是选择AuthBasicProvider file
,而是可以选择dbm
或dbd
为您的存储格式。
选择一个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>
容器指令中一样进行处理。换句话说,如果任何指定的授权方法成功,则将授予授权。
使用授权提供者进行访问控制
通过用户名和密码进行身份验证只是故事的一部分。通常,您想让别人根据自己的身份而不是别人。诸如它们来自何处的东西。
授权商all
,env
,host
和ip
让你允许或拒绝访问基于其他基于主机的标准,如主机名或机器请求文件的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
,将只允许访问,如果所有的否定条件都满足。换句话说,如果任何否定条件失败,访问将被阻止。
访问控制向后兼容
一个采用的认证供应商基于机制的副作用是,以前的访问控制指令Order
,Allow
,Deny
并Satisfy
不再需要。但是,为了向后兼容旧配置,这些指令已移至mod_access_compat
模块中。
注意
所提供的指令
mod_access_compat
已被弃用mod_authz_host
。从技术上讲,可以将旧指令(例如Order
)Allow
或Deny
新指令(例如)混合使用,Require
但不建议这样做。mod_access_compat
创建该模块是为了支持仅包含旧指令的配置,以促进2.4升级。请查看升级指南以获取更多信息。
身份验证缓存
有时,身份验证会对提供商或网络造成不可接受的负担。这最有可能影响mod_authn_dbd
(或第三方/自定义提供商)的用户。为了解决这个问题,HTTPD 2.3 / 2.4引入了一个新的缓存提供程序mod_authn_socache
来缓存凭据并减少原始提供程序的负载。
这可能会为某些用户带来实质性的性能提升。
更多信息
您还应该阅读的文档mod_auth_basic
,mod_authz_host
其中包含有关所有操作方式的更多信息。该指令<AuthnProviderAlias>
还可以帮助简化某些身份验证配置。
密码加密中说明了Apache支持的用于身份验证数据的各种密码。
您可能需要查看访问控制方法,其中讨论了许多相关主题。