2007-04-06

Apache下进行Web页面访问权限控制

Posted in Apache at 21:48 Author:仲远

标签:

今天下午做一个WISA2007的论文库,专门存放WISA2007收到的论文,但是这些论文又不能让任何人都访问到,因此需要做一个访问权限的控制。原来打算使用 Order Deny,Allow 这套机制,结果发现不好使,而且即使允许了一些ip,安全性仍然不高。但是查了一些这方面的资料,觉得还比较有用,所以以下也稍微介绍一下:


今天又被这两个参数小小的耍了一把,痛下决心整理一下,免得再被耽误时间。

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。

所以,最常用的是:
Order Deny,Allow
Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问:
Order Allow,Deny
Deny from All

如果要禁止部分内容的访问,其他的全部开放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

Order Deny,Allow
Allow from all
Deny from domain.org
错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。
解决方法:Order Allow,Deny,后面两句不动,即可。

Order Allow,Deny
Allow from ip1
Deny from all
错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
解决方法一:直接去掉第三句。
解决方法二:
Order Deny,Allow
Deny from all
Allow from ip1

以下说说我所采用的解决办法:

1、修改httpd.conf
  假设你想控制/usr/local/apache/htdocs下各目录的不同访问权限,你可以在与之间加入一行:

AllowOverride All

  意思是在/usr/local/apache/htdocs下不同目录的访问权限由该目录下的.htaccess文件来控制,而且不同目录的权限策略可互相覆盖。需要注意的是,在httpd.conf文件中要将所有涉及到该文件夹(以及父文件夹)的权限都设置为 AllowOverride All !!!! 这点很重要,否则会发现设置好的权限控制不起作用。

2、编辑你想要控制的目录下的.htaccess文件
  假设你的phpmyadmin目录在/usr/local/apache/htdocs下,你可以这样在/usr/local/apache/htdocs/phpmyadmin/目录下创建一个.htaccess文件,内容如下:

AuthUserFile /usr/local/apache/htdocs/phpmyadmin/.htpasswd
AuthType Basic
AuthName "Protected Area"
ErrorDocument 401 /catchErrors/err_401.html
require valid-user

该文件说明了几个问题:
(1) 用户信息存放在/usr/local/apache/htdocs/phpmyadmin/.htpasswd中.
(2) 认证类型为基本型(此外还有一些其他的加密类型).
(3) ErrorDocument 所指向的html文件.
(4) 认证方式:用户认证(valid-user)或组认证(valid-group).

3. 生成用户密码文件
有一个用户密码生成程序:htpasswd(在/usr/local/apache/bin下), 它可以生成加密过的密码(好像是MD5加密),使用方法如下:

htpasswd -nb test 123456

这样就生成了一对用户名和密码,用户名为test,密码为123456,不过显示出来的密码是经过加密的,我们需要把这个加密的密码保存起来,在/usr/local/apache/htdocs/phpmyadmin/下新建一个.htpasswd文件,将上面那行命令所生成的代码拷到文件中,保存退出即可。当然,好像htpasswd这个命令是可以直接将密码写入文件的,但我没有仔细研究,呵呵

4. 重起apache deamon
/usr/local/apche/bin/apachectl restart

5. 测试
用IE浏览受保护的页面,如http://ip/phpmyadmin/ (可能需要refresh几次才能凑效),这时应该出现一个身份认证窗口,你需要输入用户名test和密码123456才能访问这个页面。

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

5 Comments »

  1. Leon.Gao said,

    2007年June20日 at 12:01

    最近在用apache配置一个版本控制软件,想了解一下apache可否控制密码的规则。不知老兄可否有高见。有办法的话mail给我 leon.gao@goertek.com
    or leino11121@163.COM

  2. 仲远 said,

    2007年June20日 at 19:51

    没太理解你想做什么…
    apache权限控制一般只能做对文件夹访问权限的控制吧。更复杂的我也没有做过:)

  3. 皮卡西 said,

    2007年July21日 at 10:38

    文章很精辟,赞一个!
    不过.htaccess其中的”/usr/local/apache/htdocs/phpmyadmin/.htpasswd”替换为”.htpasswd”应该会更加简洁吧~~

  4. 仲远 said,

    2007年July22日 at 22:48

    在Unix中,有许多错误都是由于相对路径问题导致,尤其使用crontab时。为了避免这些错误,所以我比较喜欢使用绝对路径,而且清晰明了一些:)

  5. 彻底屏蔽SosoSpider的方法 仲子说 Apache, Freebsd/Unix服务器, Spiders, 实验室, 搜索引擎, 网络安全, 网络爬虫 蜘蛛 said,

    2008年December4日 at 14:13

    […] 如果你使用的是Apache来提供Web服务,那么可以在Order deny,allow中加入对于这些ip段的访问控制。我曾经在《Apache下进行Web页面访问权限控制》一文中做过详细介绍。以下是我在Apache上设置的访问控制代码,供大家参考: […]

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word