Apache HTTP服务器 2.0版本
本文中讨论的指令应该被放进主服务器的配置文件
(通常在<Directory>
段)
或者针对单个目录的配置文件(.htaccess
files)中。
如果希望使用.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认证方法并不加密来自用户浏览器的密码,
因此,不应该用于高度敏感的数据。Apache在最近的版本中还有另一种更安全的认证方法,
即由mod_auth_digest
提供的AuthType Digest
。
AuthName
指令设置了使用认证的领域,
它起两个作用,首先,此领域说明会出现在显示给用户的密码提问对话框中,
其次,也帮助客户端程序确定应该输入哪个密码。
所以,如果一个用户已经在"Restricted Files"
领域通过了认证,
则客户端就可以尝试使用"Restricted Files"
的密码来访问同一个服务器的其他任何领域,
从而使多个受限领域共享密码,以避免用户重复输入。
当然,考虑到安全,如果服务器变了,客户端始终会要求重新输入密码。
AuthUserFile
指令设置了密码文件,
也就是刚才我们已经用htpasswd
建立的。
如果用户很多则认证速度会很慢,因为对每个请求都必须搜索这个纯文本文件,
对此,Apache还支持把用户信息存入快速数据库,
mod_auth_dbm
模块提供了指令AuthDBMUserFile
,
并可以用dbmmanage程序建立和操作这些数据库。
Apache模块数据库中还提供了其他许多认证选项。
上述指令只允许一个人(一个叫rbowen
的用户)访问这个目录,
但是多数情况下,都需要允许多人访问,所以就要用到AuthGroupFile
。
首先,需要建立一个组文件以确定组中的用户。 其格式很简单,可以用你喜欢的编辑器建立,例如:
GroupName: rbowen dpitts sungo rshersey
它只是每组一行的一个用空格分隔的组成员列表。
向已有的密码文件中增加一个用户,可以输入:
htpasswd /usr/local/apache/passwd/password 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
组中的成员都在密码
文件中有一个相应的记录,
从而允许他们输入正确的密码以进入。
除了建立组文件,还有另一种途径允许多人访问,即使用如下指令:
Require valid-user
使用上述指令,而不是require user rbowen
,
可以允许密码文件中的所有用户以正确的密码进行访问。
这里甚至允许列举各个组,而为每个组建立密码文件,
其优点是,Apache只需要校验一个文件,而缺点是,必须维护众多密码文件,
而且要确保AuthUserFile
指令指定了一个正确的密码文件。
由于采用了Basic认证的方法, 每次向服务器请求甚至刷新一个受保护的页面或图片时都必须校验用户名和密码, 为此,必须打开密码文件并逐行搜索用户名,因此,服务器响应速度会受一些影响, 其程度与密码文件大小成正比。
所以,对密码文件中的用户总数存在一个实际上的上限, 此上限取决于特定的服务器机器的性能,但是一般有几百个用户就会对响应速度有明显的影响, 在这种情况下,可以考虑用其他认证方法。
基于用户名和密码的认证只是方法之一,时常会有不需要知道来访者是谁, 只需要知道来自哪里的情况。
Allow
和Deny
指令可以允许或拒绝来自特定主机名或主机地址的访问,
同时,Order
指令告诉Apache处理这两个指令的顺序,
以改变过滤器。
这些指令的用法:
Allow from address
这里的address可以是一个IP地址(或者IP地址的一部分), 也可以是一个完整的域名(或者域名的一部分),还可以同时指定多个IP地址和域名。
比如,要拒绝兜售垃圾的站点:
Deny from 205.252.46.165
如此,这个指令所管辖的区域将拒绝来自该地址的访问。 除了指定IP地址,也可以指定域名,如:
Deny from host.example.com
另外,还可以指定地址或域名的一部分来阻止一个群体:
Deny from 192.101.205
Deny from cyberthugs.com moreidiots.com
Deny from ke
Order
可以组合Deny
和Allow
指令,
以保证在允许一个群体访问的同时,对其中的一些又加以限制:
Order deny,allow
Deny from all
Allow from dev.example.com
上例首先拒绝任何人,然后允许来自特定主机的访问。
mod_auth
和mod_access
的文档中有更多的有关资料。