# 认证、授权、访问控制
认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。
## 相关模块和指令
认证和授权涉及到三组模块。通常,你需要从每一组中选择至少一个模块。
* 认证类型模块(参见`AuthType`指令)
* `mod_auth_basic`
* `mod_auth_digest`
* 认证支持模块
* `mod_authn_alias`
* `mod_authn_anon`
* `mod_authn_dbd`
* `mod_authn_dbm`
* `mod_authn_default`
* `mod_authn_file`
* `mod_authnz_ldap`
* 授权支持模块(参见`Require`指令)
* `mod_authnz_ldap`
* `mod_authz_dbm`
* `mod_authz_default`
* `mod_authz_groupfile`
* `mod_authz_owner`
* `mod_authz_user`
`mod_authnz_ldap`模块既包含认证功能也包含授权功能。`mod_authn_alias`模块自身并不实现认证功能,但是允许其它认证支持模块以更灵活的方式进行配置。
`mod_authz_host`模块提供基于主机名、IP地址、请求特征的访问控制,但并不属于认证支持系统。
## 简介
如果网站上有些敏感信息或只希望为一个小群体所访问,本文阐述的方法能确保用户只能访问被允许的资源。
本文涵盖了保护站点资源的"标准"方法,大多数管理员将要用到这些方法。
## 先决条件
本文中讨论的指令应该被放进主配置文件(通常在`<Directory>`段中)或者针对单个目录的配置文件(`.htaccess`文件)中。
如果你打算使用`.htaccess`文件,则必须设置服务器以允许在这些文件中使用认证指令,即用`AllowOverride`指令指定哪些指令在针对单个目录的配置文件中有效。
既然本文讨论认证,就应该对`AllowOverride`这样设置:
```
AllowOverride AuthConfig
```
如果你希望把这些指令直接写入主配置文件,当然就需要具有对主配置文件的写权限。
而且,你需要对服务器的目录结构有所了解,以确定某些文件的位置。这个并不难,需要时我们会做适当的说明。
## 启用认证
先介绍用密码来保护服务器上的目录。
首先需要建立一个密码文件。这个文件应该放在不能被网络访问的位置,以避免被下载。例如,如果`/usr/local/apache/htdocs`以外的空间不能被网络访问,那么可以考虑把密码文件放在`/usr/local/apache/passwd`目录中。
Apache在其安装目录的`bin`子目录中提供了`htpasswd`工具,用于建立密码文件,可以这样使用:
```
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/apache/bin/htpasswd`
然后修改`httpd.conf`或`.htaccess`文件,指示服务器允许哪些用户访问并向用户索取密码。若要保护`/usr/local/apache/htdocs/secret`目录,则可以将下列指令写入`/usr/local/apache/htdocs/secret/.htaccess`或者`httpd.conf`的<Directory /usr/local/apache/apache/htdocs/secret>段。
```
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/local/apache/passwd/passwords
Require user rbowen
```
让我们逐个解释这些指令。`AuthType`指令选择对用户实施认证的方法,最常用的是由`mod_auth_basic`提供的`Basic` 。必须认识到的很重要的一点是,Basic认证方法并不加密来自用户浏览器的密码,因此,不应该用于高度敏感的数据。Apache中还有另一种更安全的认证方法"`AuthType Digest`",即由`mod_auth_digest`供的摘要认证。目前,只有最新的浏览器版本才支持摘要认证。
`AuthName`指令设置了使用认证的<dfn class="calibre27">域(Realm)</dfn>,它起两个作用,首先,此域会出现在显示给用户的密码提问对话框中,其次,也帮助客户端程序确定应该发送哪个密码。
所以,如果一个用户已经在`"Restricted Files"`域通过了认证,则客户端就可以尝试使用同样的密码来访问同一个服务器上任何名为`"Restricted Files"`域的其他部分,从而使多个受限区域使用同一个密码,以避免用户重复输入。当然,出于安全考虑,如果服务器变了,客户端始终会要求重新输入密码。
`AuthUserFile`指令设置了密码文件的位置,也就是刚才我们用`htpasswd`建立的文件。如果用户很多则认证速度会很慢,因为对每个请求都必须搜索这个纯文本文件,对此,Apache还支持把用户信息存入快速的数据库文件,`mod_authn_dbm`模块提供了`AuthDBMUserFile`指令,并可以用`dbmmanage`程序建立和操作这些数据库。[Apache模块数据库](http://modules.apache.org/)中还提供了许多其他第三方模块提供的认证选项。
最后,`Require`指令设置了允许访问受保护区域的用户,下一节将对`Require`指令作详细说明。
## 允许多人访问
上述指令只允许一个人(一个叫`rbowen`的用户)访问这个目录,但是多数情况下,都需要允许多人访问,所以就要用到`AuthGroupFile`指令。
如果想允许多人访问,那么就必须建立一个组文件以确定组中的用户。其格式很简单,可以用你喜欢的编辑器建立,例如:
```
GroupName: rbowen dpitts sungo rshersey
```
它只是每组一行的一个用空格分隔的组成员列表。
向已有的密码文件中增加一个用户,可以输入:
```
htpasswd /usr/local/apache/passwd/passwords dpitts
```
程序的提示和上面的一样,但是它会追加到已有的文件中,而不是建一个新文件(参数 `-c` 可以强制建立新的密码文件)。
现在,需要将`.htaccess`文件修改成这样:
```
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName
```
现在,`GroupName`组中的成员都在`password`文件中有一个相应的记录,从而允许他们输入正确的密码进行访问。
除了建立组文件,还有另一种途径允许多人访问,就是使用如下指令:
```
Require valid-user
```
使用上述指令,而不是 `Require user rbowen` ,可以允许密码文件中的所有用户使用正确的密码进行访问。通过为每个组建立一个密码文件,这里甚至允许列举各个组,其优点是Apache只需要检查一个文件(而不是两个),其缺点是,必须维护众多密码文件,而且要确保`AuthUserFile`指定了一个正确的密码文件。
## 可能存在的问题
由于采用了Basic认证的方法,每次向服务器请求甚至刷新一个受保护的页面或图片时都必须校验用户名和密码,为此,必须打开密码文件并逐行搜索用户名,因此,服务器响应速度会受一些影响,受影响的程度与密码文件的大小成正比。
所以,对密码文件中的用户总数存在一个实际上的上限,此上限取决于特定的服务器机器的性能,但是一般有几百个用户就会对响应速度有非常明显的影响,在这种情况下,可以考虑用其他认证方法。
## 其他认证方法
基于用户名和密码的认证只是方法之一,时常会有不需要知道来访者是谁,只需要知道来自哪里的情况。
`Allow`和`Deny`指令可以允许或拒绝来自特定主机名或主机地址的访问,同时,`Order`指令告诉Apache处理这两个指令的顺序,以改变过滤器。
这些指令的用法:
```
Allow from <var class="calibre40">address</var>
```
address可以是一个IP地址(或者IP地址的一部分),也可以是一个完整的域名(或者域名的一部分),还可以同时指定多个IP地址和域名。
比如,要拒绝不受欢迎的兜售垃圾的站点:
```
Deny from 205.252.46.165
```
这样,这个指令所管辖的区域将拒绝所有来自该地址的访问。除了指定IP地址,也可以指定域名,如:
```
Deny from <var class="calibre40">host.example.com</var>
```
另外,还可以指定地址或域名的一部分来阻止一个群体:
```
Deny from <var class="calibre40">192.101.205</var>
Deny from <var class="calibre40">cyberthugs.com</var> <var class="calibre40">moreidiots.com</var>
Deny from ke
```
`Order`可以组合`Deny`和`Allow`指令,以保证在允许一个群体访问的同时,对其中的一些又加以限制:
```
Order deny,allow
Deny from all
Allow from <var class="calibre40">dev.example.com</var>
```
只列出`Allow`指令不会得到你想要的结果,因为它在允许指定对象访问的同时_并不禁止_其他未列出的对象的访问。所以上例使用的方法是:首先拒绝任何人,然后允许来自特定主机的访问。
## 更多信息
`mod_auth_basic`和`mod_authz_host`文档中有更多的有关资料。`mod_authn_alias`同样有助于简化认证配置。
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航