LinuxApacheWeb服务器(续3)
八、建立Apache站点的基本安全机制对于WWW服务来说,在WWW服务器和WWW浏览器之间并不始终维持对话过程。办要WWW服务器完成对一个URL请求的服务,连接就断开了。
在这种情况下,在WWW上保证可以使用的唯一认证机制是由HTTP本身提供 的。在标准的Apache服务器实现了这样的认证,它能控制哪些主机可能访问特定的站点或特点的站点的一部分。
这种认证可以分为两种,一种是基于主机的的认证,另一种是基于用户名/口令的认证。由于互联网上的决大多数用户的IP地址是动态获得的,所以基于主机的认证方式并不总适用。所以在大多数情况下,传统的基于用户名/口令的认证方式更为现实。下面我们就对这两种认证的实现做一简要的介绍。
8.1 基于主机的认证方式
在种认证模式顾名思义,访问是用主机名或主机IP地址来控制的。支持这种认证方式的是Apache的mod_access模块,这个模块缺省状态下是被安装了的。该模块用以下几种Apache命令来提供访问控制功能。
allow命令
语法:allow from host1 host2 host3 ...
这个命令定义了允许访问站点或目录的主机清单。主机清单可以用以下几
种形式表示:
ALL:代表所有主机;
主机的全域名,如:www.mot.com;
主机的部分域名,如:.mot.com;
完整的IP地址,如:202.98.2.32;
部分IP地址,如:202.98
网络地址/网络掩码对,如:202.98.0.0/255.255.0.0
网络地址/nn(CIDR定义),如:202.98.0.1/16
deny命令
语法:deny from host1 host2 host3 ...
这个命令定义了禁止访问站点或目录的主机清单,其他与allow命令相似。
order命令
语法:order deny,allow | allow,deny
这个命令定义评价allow和deny命令的先后顺序。
例如:
<Directory /home/httpd/html>
order deny,allow
deny from www.mot.com
allow all
</Directory>
这组命令设置了禁止www.mot.com访问/home/httpd/html目录下的文件。
请大家注意,顺序是先deny后allow,如果是:order allow,deny 那么,先允许所有的主机访问,然后再禁止,这样是无效的,所有主机仍然能够访问。
8.2 基于用户名/口令的认证方式
这种认证方式其实相当简单,当WWW浏览器请求经此认证模式保护的URL
时,将会出现一个对话框,要求用户键入用户名和口令。用户输入后,传给WWW服务器,WWW服务器验证它的正确性,如果正确,返回页面,否则返回401错误。要说明的一点是,这种认证模式是基本的,并不能用于安全性要求极高的场合。
Apache 中有许多模块可以支持这种认证方式,下面我们就介绍一下最基本、最标准的mod_auth模块。正如前面提到的一样,mod_auth模块使用存储在文本文件中的用户名、组名和口令来实现认证。这种方法非常适合处理少量用户,它能工作得很好。如果你需要对大量的用户,如数以千计的用户做认证时,这种方法的性能将急剧下降到不可忍受,所以当这种情况下,就需要考虑使用mod_dbm模块或mod_mysql模块来获得更好的性能。
实例一:需要用户名和口令的访问控制
下面我们就一起来看一下如何建立需要用户名/口令才能进行访问的目录。
基本情况: www.xxx.com
的站点有设置为:
DocumentRoot /home/httpd/html
AccessFileName .htaccess
AllowOverride All
需求:限制/home/httpd/html/backup/目录的访问,只允许用户“super”以口令“fill-06”访问此目录。
实现步骤:
使用htpasswd建立用户文件
htpasswd –c /home/httpd/secr/.htpasswd super
此程序会询问用户“super”的口令,你输入“fill-06”,两次生效。
建立.htaccess文件
用vi在/home/httpd/html/backup/目录下建立一个文件.htaccess,写入
以下几行:
AuthName My Friend Only (注:这个名字是任取的)
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
require user super
设置文件权限,确保Apache用户有读的权限
这样就完成了设置工作,你可以试一试效果了。
实例二:允许一组用户访问一个目录
假设,现在www.xxx.com想让myfriend组中的mf1与mf2两个用户分别能
使用口令“mf001-1”“mf002-2”访问/home/httpd/html/backup/目录。
实现步骤:
使用htpasswd建立用户文件
htpasswd –c /home/httpd/secr/.htpasswd mf1
htpasswd –c /home/httpd/secr/.htpasswd mf2
建立组文件
用vi/home/httpd/secr/目录下建立一个文件.htgroup,写入:
myfriend:mf1 mf2
建立.htaccess文件
用vi在/home/httpd/html/backup/目录下建立一个文件.htaccess,写入
以下几行:
AuthName My Friend Only
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
AuthGroupFile /home/httpd/secr/.htgroup
require group myfriend
配置工作到此结束,试一试吧!
实例三:混合使用基于主机与基于用户名/口令的认证方式
如果你除了只允许让mf1与mf2两个用户访问外,还想禁止除www.mot.com
外的主机访问这个目录的话,就将/home/httpd/html/backup/.htaccess修改成为:
AuthName My Friend Only
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
AuthGroupFile /home/httpd/secr/.htgroup
require group myfriend
order deny,allow
deny from all
allow from www.mot.com
九、解读Apache日志
当你一步步地看到这里的时候,相信你的WWW站点已经建好,并且已经在
Internet上展现出来了。这时你可能就会关心谁造访过你的站点,或者想知道你的Apache服务器现在的运行状态与性能如何。下面我们一起通过解读Apache的日志来实现这个伟大的愿望。
9.1 盯着Apache服务器
Apache允许通过WWW监视服务器的配置信息与运行状态。
1.观看配置信息
如果你的Apache象缺省配置一样加入了mod_info模块的话,你就可以通过访问http://localhost/server-info查看服务器信息。
2.使用状态页
如果你的Apache象缺省配置一样加入了mod_status模块的话,你就可以
通过访问http://localhost/apache-status查看服务器的运行状态信息,其中包括:
¨ 服务器系统的当前时间;
¨ 服务器最近一次重启时间;
¨ 服务器启动后的运行时间;
¨ 到目前为止服务的访问总数;
¨ 到目前为止传输的字节总数;
¨ 服务请求的子进程数;
¨ 空闲子进程数;
¨ 每个进程状态、子进程服务的请求数以及该子进程传输的字节总数;
¨ 每秒平均请求数、每秒传输的字节数、每次请求平均传输字节数;
¨ 目前每个子进程CPU占用及Apache的总的CPU占用率;
¨ 当前主机及处理的请求。
9.2 什么是日志文件
日志文件是Apache工作的记录,Apache包括了mod_log_config模块,它
用来记录日志。在缺省情况下,它用通用日志格式CLF规范来写。
CLF日志文件内对每个请求均有一个单独行,形如:
host ident anthuser date request status bytes
其含义如下:
¨ host客户端主机的全称域名或IP地址;
¨ ident存放客户端报告的识别信息;
¨ authuser如果是基于用户名认证的话,值为用户名;
¨ date请求的日期与时间;
¨ request客户端的请求行;
¨ status返回到客户端的三们数字的HTTP状态码;
¨ bytes除去HTTP头标外,返回给客户端的字节数。
9.3 分析日志文件
有了日志文件后,我们可以利用UNIX的一些工具和一此专门的日志分析工具对日志文件进行分析。
实例一:列出访问过本网站的主机名或IP:
对于这个需求,我们可以通过一个Unix的一个脚本语句来完成:
cat /var/log/httpd/access_log | awk ‘{print $1}’
用上面的方法虽然可以得到访问过本网站的主机名或IP,但是由于有些是多次访问的,我们希望在上面得到的结果的基础上做一些优化,使得列出的表中,每个主机只出现一次。我们可以使用:
cat /var/log/httpd/access_log |