基于用户的访问控制
更严格、有效的控制方法还是基于用户和对应的口令对浏览客户进行控制。这使得对这个目录进行强制性的保护,浏 览器用户必须输入合法的用户名和正确的口令才能浏览网页。如果要针对用户对访问服务器的客户进行控制,首先就要设置访 问控制文件为对用户进行认证,因此要允许目录访问控制文件中具备AuthConfig的设置。
设置用户认证需要为这个目录指定AuthName、AuthType和AuthUserFile 指令,AuthUserFile定义一个口令文件,那么此后就可以使用require valid-user命令让客户 输入名字和正确的口令,根据这个口令文件对用户的身份进行验证。AuthName定义这个认证的 标识,用于返回给浏览器用户,起到提示作用。AuthType定义使用的认证加密类型,通常使用 Basic,即使用Unix的标准加密算法进行加密。
AuthUserFile /usr/local/etc/htpasswd AuthName SecurityAuth AuthType Basic require vaild-user |
这个例子里,使用/usr/local/etc/htpasswd作口令文件,使用Basic的加密认证方法 ,并定义AuthName为SecurityAuth。
虽然浏览器访问每个使用这种认证方式保护的网页都需要先进行认证,然而不会每访问一次网页都让用户输入用户名 和口令,因为浏览器会将用户输入的用户和口令数据保存起来,每次需要认证的时候就自动进行认证操作。由于认证是通过H EAD请求来完成的,因此它不会影响浏览器显示的网页。然而,用户有可能使用浏览器访问了多个不同的对用户进行认证的 网页,那么浏览器就会保存了多个不同的用户和口令对,当自动进行认证的时候,浏览器必须区分出应该使用哪个用户名和口 令进行认证,而区分就是通过AuthName的值进行的,服务器将首先将AuthName的值传递给客户浏览器,此后 浏览器就能发送正确的用户和口令进行认证了。
要使用口令文件来认证合法用户,首先就必须生成这个口令文件。当认证类型为Basic时,口令文件与Unix 的passwd文件非常类似,甚至可以直接使用系统passwd文件来作认证文件,当然由于现代Unix使用了sha dow技术,/etc/passwd中并没有保存真实的加密口令,因此直接使用系统passwd文件进行认证只能适合 那些没有使用shadow技术的Unix系统。而使用shadow技术的Unix系统的真实口令文件(FreeBSD 下为master.passwd)被保护起来,读取它需要root权限,而Web服务器通常以普通用户的权限运行,不 能直接使用系统口令对用户进行认证。如果强制使用root权限启动httpd守护进程来访问shadow之后的口令, 那么必然会带来严重的安全漏洞。
因此一般使用与系统口令相分离的口令文件来认证Web服务器用户,这样即使口令被泄露,并被破译,造成的安全 影响也很小,不至于影响系统的正常运行。可以使用Apache附带的htpasswd命令来创建口令文件,并设置用户 及其口令。
$ htpasswd -c .htpasswd user1 Adding PassWord for user1 New password: Re-type new password: |
htpasswd的-c选项告诉htpasswd创建一个新口令文件为.htpasswd,如果没有这个选项 ,htpasswd就将用户及其口令加入已经存在的口令文件中。此后的参数就是口令文件名和需要增加或改变口令的用户 名。
为了便于管理,可以进一步将这些用户分组,组文件的每一行定义了一个组及其成员的名字,然后在.htaccess 中使用AuthGroupFile指定这个目录使用的组文件的名字,例如:
group1: user1 user2 user3 user4 |
这条内容创建了一个口令组group1,包括user1,user2,user3,user4成员。
除了可以使用require valid-user要求输入的用户必须为口令文件中的合法用户之外,也可以设 置要求只有特定的合法用户才能访问的目录,这就需要使用require user或require group指令。 例如使用require user user1要求只有user1用户才能访问,使用require group g roup1就要求必须是group1组的合法成员才能访问。针对具体用户和组的访问控制就进一步增加了访问控制的灵活 性。
当基于用户的认证和基于地址的认证综合使用时,可以通过使用satify参数指定不同的限制条件,如果设置 satify all,那么必须同时通过用户和地址认证才能访问网页,而设置satify any,只需要通过一个认证 客户就能访问这个目录了。缺省情况下Satify参数的值为all。下面为一个综合了地址认证和用户认证的.htaccess 的例子,这个例子允许private.site的计算机可以不需认证访问这台服务器,而其他位置的用户必须是 group1组中的合法用户,或者是user1、user2、user3用户,才能访问这台服务器。
AuthUserFile /usr/local/etc/.htpasswd AuthGroupFile /usr/local/etc/.htgroup AuthName SecurityAuth AuthType Basic <Limit HEAD GET POST> order deny,allow deny from all allow from private.site require group group1 require user user1 user2 user3 </Limit> satify any |
- 其他认证方式
Apache使用AuthType指定加密的方式,AuthType设为Basic时为使用命令htpasswd 创建口令文件并进行口令加密。然而这种方式有两个缺点,一个为浏览器将在Internet上使用明文发送用户名和 口令信息,另一个是htpasswd的口令文件为普通文本文件,这样当用户数目较多时,查找用户的效率就很低。
为了弥补安全性的缺点,可以将AuthType设置为Digest,这样就会使用Digest鉴别方式进行认 证,此时认证口令文件要使用AuthDigestFile来规定,而口令文件必须使用另一个加密程序htdigest 产生和维护,而hdigest的使用方法和htpasswd相同。在Digest认证方式下,浏览器不会直接发送口令 的明文信息,而是在传输口令之前先使用MD5算法进行编码处理。注意,不是所有类型的浏览器都支持Digest类型的 鉴别方式的,只有在浏览器和服务器同时都支持Digest方式时,这种认证才可行。
AuthType为Basic时,是使用系统加密方法,一般是使用DES算法,但在FreeBSD下有可能是 使用的MD5算法,但除非管理员希望在不同系统间共享口令文件,否则不必考虑他们使用的到底是何种算法。需要与其他系 统兼容时,可以重新安装DES算法。但在系统使用时重新安装加密算法,就无法重建整个口令文件,因此不推荐在系统使用 过程中更换认证算法,而应该在系统安装时就确定使用的认证算法。
为了减少用户数量较多时服务器的处理开销,就必须使用数据库技术,这是因为数据库使用了索引技术,对数据的查 找就比较快速。Unix下最简单的数据库为使用系统提供的DB(或DBM)库进行创建数据库文件的技术,Apache 服务器中使用模块mod_auth_db.so对这种数据库口令文件提供支持。htpasswd产生的文本文件在有几 百个用户时就会花费相当大的服务器开销,而DBM格式的认证方式可以高效的支持上万个用户。
BSD风格的Unix系统通常使用DB库,而其他Unix通常使用DBM库。因此其他Unix使用的命令和设 置中应该为dbm而非db。
为了支持这种认证方式,应载入mod_auth_db.so模块,使用Ports Collection安装 的Apache服务器缺省情况就支持这个模块而不需要改动。可以让Apache同时支持多种认证方式,而不会发生冲突 。
此外,配置文件中的认证方式也需要改变,首先要创建数据库文件,这会在通过使用dbmmanage命令第一次 增加用户时创建。
# dbmmanage /usr/local/etc/users adduser user1 pass123 |
这个命令将创建/usr/local/etc/usersdbm数据库文件,并使用pass123为口令在数 据库中增加用户user1。然后就可以针对现有的数据库文件,增加、删除和查看用户信息了:
# dbmmanage /usr/local/etc/httpd/usersdbm delete user2 # dbmmanage /usr/local/etc/httpd/usersdbm vIEw |
在拥有了数据库文件和用户数据之后,就可以使用这种认证方式了:
AuthName DBMTest AuthType Basic AuthDBUserFile /usr/local/etc/usersdbm require valid-user |
可以使用dbmmanage命令也可以用来管理组,例如将user1加入group1组,但必须添加用户的同 时进行设置,需要使用dhmmanage的另一个参数:
# dbmmanage /usr/local/etc/users adduser user1 pass123 group1
这样就能使用AuthDBGroupFile和require group1进行认证管理。
除了使用DBM之外,Apache还可以配置成与匿名ftp认证方式类似的方式,或者使用mSql、Oracle 等SQL数据库进行认证,或者使用Kerboros、LDAP服务器进行认证,这些认证方式更为强大,能使Web 认证与其他网络服务的认证方式相统一。但是这些额外的认证方式必须使用相应的认证模块进行支持。
未完,待续。。。
标签: