服务器 频道

Web实战之五:服务器安全访问控制

三、限制对Web服务器的访问

    目前,很多的网站都限制了客户对Web服务器的访问权限。当客户访问站点的某些资源时,就需要输入“用户名/口令”。如果输入正确,则可以访问资源;否则服务器将拒绝服务。访问也可以针对IP地址、域名或者网段进行控制。这样可以大大加强Web服务器的安全。

    1、基本HTTP格式的认证

    基本的HTTP认证提供了一种基于用户名/口令的认证方式。Apache大部分模块的格式都支持基本HTTP认证。使用Apache的多个认证模块可以使Web站点更加安全。对于Apache服务器,我们通过使用mod_access和mod_auth模块来实现对web服务器的访问控制。

    如果需要对某一目录下的文件,例如/usr/local/apache2/conf使用用户认证,则在Apache配置文件httpd.conf中加入如下指令:
<Directory /usr/local/apache2/conf>
Options Indexes FOIIOwSymLinks
AllowOverride AuthConfig
Order Allow,Deny
Allow from all
</Directory>

    其中,<Directory directory>……</Directory>用来封装指令,使这些指令应用在directory目录及其子目录当中。Directory可以是所设定目录的完整路径名,或者是带有通配符的。可对不同的目录提供不同的保护,但这样的设置必须重新启动才能生效,灵活性较差。

    通过AccessFile指令指定访问控制文件的方式则较为灵活。AllowOverride AuthConfig表示允许对/usr/local/apache2/conf目录下的文件进行用户认证,这是关键的设置。Order指令的参数是用逗号隔开的指令列表,Order指令告诉Apache处理deny和allow这两个指令的顺序。

    然后,在目录/usr/local/apache2/conf下创建.htaccess文件,其文件内容如下:
AuthType Basic
AuthName “SecretFiles”
AuthUserFile /usr/local/apache/conf/.htpasswd
Require user song

    其中,AuthType指令说明用户验证的类型。此处的认证类型为基本认证。最常用的是mod_auth模块提供的Basic,还有更安全的Digest认证。Digest认证由mod_auth_digest模块提供支持。
 
    AuthName指令设置了使用认证的领域。AuthUserFile指令指定了用户文件名。Require指令指定了允许访问的用户,此处说明只有名为song的用户才可以访问该目录。

    最后,建立密码文件。Apache在其安装目录的bin子目录中提供了名为htpasswd的工具,以建立密码文件。如果我们是第一次创建用户密码,命令格式如下:htpasswd –c 密码文件名字 用户名称

    在上面的例子中,可以进行如下操作:
htpasswd –c /usr/local/apache2/conf/.htpasswd song

    这样,重新启动httpd后,进行该Web目录时就会弹出一个对话框,要求输入用户名和口令。上面我们仅允许一个人(一个名为song的用户)访问这个目录,但是在许多情况下,需允许多人访问,则需用到AuthGroupFile指令。

    2、利用MySQL为Web服务器做用户验证

    使用Apache的主要优势之一就是它各种功能部件的模块化。换言之,就是用户可以选择在Apache服务器中应具备或排除的功能,并由此选择安装合适的模块,这为安装Apache提供了很大的灵活性。

    目前,Apache、PHP、MySQL三者是Linux下构建Web网站的非常好的组合。下面,我们就利用MySQL为Web服务器做用户验证。假设编译、安装MySQL到usr/local/mysql目录,mod_auth_mysql模块(支持使用MySQL数据库实现基本HTTP认证)编译安装完成。

    编辑httpd.conf,添加LoadModulemysql_auth_modulelibexec/mod_auth_mysq1.so和AddModulemod_auth_mysq1.c,让Apache启动时加载mod_auth_mysql模块。然后进入MySQL:
mysql>creat data base auth;
mysql>use auth;
mysql>create table user(->user_name char(30) not null,
->user_password char(20) not null,
->primary key(user_name)
->);
mysql>insert into user values(‘song’,encrypt(‘2004233’));

    这里2004233是口令,用encrypt函数来进行加密。最后在我们要保护的目录创建.htaccess文件,其文件内容如下:
AuthName “SecretFiles”
AuthType Basic
AuthMySQL User authuser  ————mysql用户
AuthMySQL Password password ————mysql用户口令
AuthMySQLDB auth   ————我们所建立的库
AuthMySQLUserTable user  ————所用到的表
AuthMySQLNameField user_name
AuthMySQLPasswordField user_password
Require user song

    这样,重新启动httpd后,进入该Web目录时就会弹出一个对话框,要求输入用户名和口令。这里我们所讨论的是采用MySQL模块,若采用Oracle模块也类似。

    3、Digest认证

    由于在使用基本HTTP认证时,口令是以UU编码的格式通过网络发送出去的,这些口令是没有加密的,所以很不安全。针对基本HTTP认证的弱点,HTTP/1.1提出了改进的用户认证和鉴权方案,称为Digest认证。与基本认证类似,Digest认证也是收发双方都知道一个密码,但是密码的传输不是明文传输,而是加密后传输。

    在Digest认证过程中,网络发送的是一些基于用户输入口令和其他基本相关请求信息而生成的数值,这些数值采用MD5加密算法进行组合,最终产生的结果称为“digest”,并通过网络发送出去,然后再将它与服务器的其他消息进行组合,并同服务器储存的digest进行比较。服务器则根据digest是否匹配来确定允许或拒绝用户访问。

    4、基于主机的认证

    通过用户名,口令的认证只是方法之一,我们还可以用Allow和Deny指令允许和拒绝来自某个IP地址或者域名的访问。Order指令告诉Apache处理指令的顺序,以改变过滤器。这些指令能够提供对访问的控制和支持。
    例如:
允许IP地址为210.42.151.198的主机访问:
Allow from 210.42.151.98
拒绝所有包含部分域名scuec.edu.cn的主机访问:
Deny from scuec.edu.cn
Order可以组合Deny和Allow指令,以保证在允许一个群体访问的同时,对其中的一些加以限制。如:
Order deny,allow
Deny from scuec.edu.cn
Allow from all

    拒绝所有包含部分域名scuec.edu.cn的主机访问,但允许其他所有主机访问。

四、结束语

    安全问题是一个很复杂的问题。Web安全所涉及的内容很广泛。这里通过设置Web服务器有关目录的权限和限制对Web服务器的访问来加强Web服务器安全。

0
相关文章