IT运维管理,创造商业价值!
中国IT运维网首页 | 资讯中心 | 运维管理 | 信息安全 | CIO视界 | 云计算 | 最佳案例 | 运维资源 | 专题策划 | 知识库 | 论坛

Apache服务器配置安全规范及其缺陷

2007年02月12日
赛迪网安全社区/hackmaster

正如我们前言所说尽管Apache服务器应用最为广泛,设计上非常安全的程序。但是同其它应用程序一样,Apache也存在安全缺陷。毕竟它是完全源代码,Apache服务器的安全缺陷主要是使用HTTP协议进行的拒绝服务攻击(denial of service)、缓冲区溢出攻击以及被攻击者获得root权限三缺陷和最新的恶意的攻击者进行“拒绝服务”(DoS)攻击。合理的网络配置能够保护Apache服务器免遭多种攻击。我们来介绍一下主要的安全缺陷。

主要安全缺陷

(1)使用HTTP协议进行的拒绝服务攻击(denial of service)的安全缺陷

这种方法攻击者会通过某些手段使服务器拒绝对HTTP应答。这样会使Apache对系统资源(CPU时间和内存)需求的剧增,最终造成Apache系统变慢甚至完全瘫痪。

(2)缓冲区溢出的安全缺陷

该方法攻击者利用程序编写的一些缺陷,使程序偏离正常的流程。程序使用静态分配的内存保存请求数据,攻击者就可以发送一个超长请求使缓冲区溢出。

(3)被攻击者获得root权限的安全缺陷

该安全缺陷主要是因为Apache服务器一般以root权限运行(父进程),攻击者会通过它获得root权限,进而控制整个Apache系统。

(4)恶意的攻击者进行“拒绝服务”(DoS)攻击的安全缺陷

这个最新在6月17日发现的漏洞,它主要是存在于Apache的chunk encoding中,这是一个HTTP协议定义的用于接受web用户所提交数据的功能。 所有说使用最高和最新安全版本对于加强Apache Web服务器的安全是至关重要的。

正确维护和配置Apache服务器

虽然Apache服务器的开发者非常注重安全性,由于Apache服务器其庞大的项目, 难免会存在安全隐患。正确维护和配置Apache WEB服务器就很重要了。我们应注意的一些问题:

(1)Apache服务器配置文件

Apache Web服务器主要有三个配置文件,位于/usr/local/apache/conf目录下。 这三个文件是:

httpd.conf----->主配置文件
srm.conf------>填加资源文件
access.conf--->设置文件的访问权限

(2)Apache服务器的目录安全认证

在Apache Server中是允许使用 .htaccess做目录安全保护的,欲读取这保护的目录需要先键入正确用户帐号与密码。这样可做为专门管理网页存放的目录或做为会员区等。在保护的目录放置一个档案,档名为.htaccss。

AuthName "会员专区" 
AuthType "Basic"

AuthUserFile "/var/tmp/xxx.pw" ----->把password放在网站外 require valid-user 到apache/bin目录,建password档 % ./htpasswd -c /var/tmp/xxx.pw username1 ----->第一次建档要用参数"-c" % /htpasswd /var/tmp/xxx.pw username2 这样就可以保护目录内的内容,进入要用合法的用户。

注:采用了Apache内附的模组。

也可以采用在httpd.conf中加入: 

options indexes followsymlinks  
allowoverride authconfig  
order allow,deny  
allow from all 

(3)Apache服务器访问控制

我们就要看三个配置文件中的第三个文件了,即access.conf文件,它包含一些指令控制允许什么用户访问Apache目录。应该把deny from all设为初始化指令,再使用allow from指令打开访问权限。

order deny,allow
deny from all
allow from safechina.net
  

设置允许来自某个域、IP地址或者IP段的访问。

(4)Apache服务器的密码保护问题

我们再使用.htaccess文件把某个目录的访问权限赋予某个用户。系统管理员需要在httpd.conf或者rm.conf文件中使用 AccessFileName指令打开目录的访问控制。如:

AuthName PrivateFiles
AuthType Basic
AuthUserFile /path/to/httpd/users
require Phoenix
# htpasswd -c /path/to/httpd/users Phoenix

设置Apache服务器的WEB和文件服务器

我们在Apache服务器上存放WEB服务器的文件,供用户访问,并设置/home/ftp/pub目录为文件存放区域,用http://download.your.com/pub/来访问。在防火墙上设置apache反向代理技术,由防火墙代理访问。 

(1)Apache服务器的设置 

Apache服务器采用默认配置。主目录为/home/httpd/html,主机域名为Phoenix.your.com, 且别名到www.your.com中, 并且设置srm.conf加一行别名定义如下:

Alias /pub /home/ftp/pub/ 

更改默认应用程序类型定义如下: 

DefaultType application/octet-stream 

最后在/etc/httpd/conf/access.conf中增加一项定义

  
Options Indexes  
AllowOverride AuthConfig  
order allow,deny  
allow from all 

注:Options Indexes允许在找不到index.html文件的情况下允许列出目录/文件列表。AllowOverride AuthConfig允许做基本的用户名和口令验证。这样的话,需要在/home/ftp/pub目录下放入.htaccess,内容如下: 

  [root@ pub]# more .htaccess  
  AuthName Branch Office Public Software Download Area  
  AuthType Basic  
  AuthUserFile /etc/.usrpasswd  
  require valid-user 

用# htpasswd -c /etc/.usrpasswd user1  分别创建不同的允许访问/pub下文件服务的外部用户名和口令。

(2)在防火墙上配置反向代理技术.

在/etc/httpd/conf/httpd.conf  中加入 NameVirtualHost xxx.xxx.xxx.xxx # xxx.xxx.xxx.xxx ----->是防火墙外部在互联网上永久IP地址: 

  servername www.your.com  
  errorlog /var/log/httpd/error_log  
  transferlog /var/log/httpd/access_log  
  rewriteengine on  
  proxyrequests off  
  usecanonicalname off  
  rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 Apache服务器的IP地址。 

  servername http://download.your.com/pub/ 
  errorlog /var/log/httpd/download/error_log  
  transferlog /var/log/httpd/download/access_log  
  rewriteengine on  
  proxyrequests off  
  usecanonicalname off  
  rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 同上Apache服务器的IP地址。

设置防火墙上的DNS,让download.your.com和www.your.com 都指向防火墙的外部网地址xxx.xxx.xxx.xxx。

用http://www.your.com访问主页,用http://download.your.com/pub/访问公共文件的下载区。

注:还需要在apache服务器主机上建立目录/var/log/httpd/download/,否则会出错。另外,也可以设置防火墙主机上的/home/httpd/html/index.html的属性为750来阻止访问,这是防外部用户能访问到防火墙上的Apache服务器的http://www.your.com中。 

总结:Apache Server是一个非常优秀,非常棒的服务器,只要你正确配置和维护好Apache服务器,你就会感受到Apache Server 所带来的好处,同样希望你能够通过阅读本文达到理论和实践双丰收的目的。

验证你的Apache来源途径

不要以为在Google上能够搜索到合适的Apache版本。如果你需要下载最新版本的Apache,那么你最好通过一个权威的镜像站点来下载。然而,即使这样也可能有问题,事实上,曾经就有黑客入侵过apache.org官方网站。所以,采用类似PGP的工具来验证Apache的数字签名就显得尤为重要。

保持更新Apache的补丁程序

如果你安装了Apache,你就必须及时更新安全补丁。如果没有及时的更新,那你的系统很容易受到网络上那些高危病毒的攻击。幸好,有几个简便方法可以更新Apache的补丁。参考我们关于保持更新Apache补丁的文章了解更多关于Apache服务器公告列表、Linux包管理系统和RedHat操作系统更新服务的信息。

避免使用.htaccess文件(分布式配置文件)

很多情况下需要几个管理员和内容管理者共同管理Apache服务器。一个常用的共享管理办法就是使用.htaccess文件,这样可以很灵活地对管理员以外的用户提供不同的配置控制权限。然而,这些文件也使得在集中安全管理之外还有相当多的安全控制权限——这些文件允许安全专业人士以外的其他用户改变服务器的访问控制许可配置。那些对粒度访问控制根本不熟悉的用户修改的配置可能在无意中会危害到你的系统安全。所以,除非必须使用,否则我们应该尽可能地避免使用这种访问控制系统。

监视系统日志

Apache为管理员提供了很全面的日志管理工具来对服务器的活动进行事后分析。Apache提供了多种不同的记录日志,但是对安全专业人士最重要的是访问日志。这个灵活的工具还具有了相当多的自定义功能,你可以按照你的需要很方便地记录尽可能多或者少的日志,以保证有效的分析。至少,你应该记录那些失败的认证企图和系统产生的错误。使用像AWStats一样的免费工具可以很轻松地完成分析任务。但是必须明确的一点是:监视日志只是一种事后分析手段。你可以利用它回顾和判断对服务器的攻击(和攻击企图),但是希望及时查看日志来对紧急情况做出快速反应是不可能的。如果需要进行预判反应,你应该考虑使用入侵预防系统如信息安全杂志评选的2003年度最新兴技术奖得主:Lucid Security公司的ipAngel系统。

管理文件系统

我们已经讨论了使用(或不使用).htaccess文件对管理文件访问权限的重要性。禁止通过文件系统许可对Apache服务器进行非授权修改也是很重要的。特别值得一提的是,你应该保证只有根用户才能修改存储在“/usr/local/apache ”目录的文件(或者你选择的任何Apache服务器的根目录)。确保只有根用户才能修改日志文件也很关键,这样可以防止用户掩盖他们的操作。

Apache 服务器日常配置

1、如何设 置请求等待时间

在httpd.conf里面设置:

TimeOut n

其中n为整数,单位是秒。

设置这个TimeOut适用于三种情况:

2、如何接收一个get请求的总时间

接收一个post和put请求的TCP包之间的时间

TCP包传输中的响应(ack)时间间隔

3、如何使得apache监听在特定的端口

修改httpd.conf里面关于Listen的选项,例如:

Listen 8000

是使apache监听在8000端口

而如果要同时指定监听端口和监听地址,可以使用:

Listen 192.170.2.1:80
Listen 192.170.2.5:8000

这样就使得apache同时监听在192.170.2.1的80端口和192.170.2.5的8000端口。

当然也可以在httpd.conf里面设置:

Port 80

这样来实现类似的效果。

4、如何设置apache的最大空闲进程数

修改httpd.conf,在里面设置:

MaxSpareServers n

其中n是一个整数。这样当空闲进程超过n的时候,apache主进程会杀掉多余的空闲进程而保持空闲进程在n,节省了系统资源。如果在一个apache非常繁忙的站点调节这个参数才是必要的,但是在任何时候把这个参数调到很大都不是一个好主意。

同时也可以设置:

MinSpareServers n

来限制最少空闲进程数目来加快反应速度。

5、apache如何设置启动时的子服务进程个数

在httpd.conf里面设置:

StartServers 5

这样启动apache后就有5个空闲子进程等待接受请求。

也可以参考MinSpareServers和MaxSpareServers设置。

6、如何在apache中设置每个连接的最大请求数

在httpd.conf里面设置:

MaxKeepAliveRequests 100

这样就能保证在一个连接中,如果同时请求数达到100就不再响应这个连接的新请求,保证了系统资源不会被某个连接大量占用。但是在实际配置中要求尽量把这个数值调高来获得较高的系统性能。

7、如何在apache中设置session的持续时间

在apache1.2以上的版本中,可以在httpd.conf里面设置:

KeepAlive on
KeepAliveTimeout 15

这样就能限制每个session的保持时间是15秒。session的使用可以使得很多请求都可以通过同一个tcp连接来发送,节约了网络资源和系统资源。

8、如何使得apache对客户端进行域名验证

可以在httpd.conf里面设置:

HostnameLookups on off double

如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。

如果为了安全,建议使用double;为了加快访问速度,建议使用off。

9、如何使得apache只监听在特定的ip

修改httpd.conf,在里面使用

BindAddress 192.168.0.1

这样就能使得apache只监听外界对192.168.0.1的http请求。如果使用:

BindAddress *

就表明apache监听所有网络接口上的http请求。

当然用防火墙也可以实现。

10、apache中如何限制http请求的消息主体的大小

在httpd.conf里面设置:

LimitRequestBody n

n是整数,单位是byte。cgi脚本一般把表单里面内容作为消息的主体提交给服务器处理,所以现在消息主体的大小在使用cgi的时候很有用。比如使用cgi来上传文件,如果有设置:

LimitRequestBody 102400

那么上传文件超过100k的时候就会报错。

11、如何修改apache的文档根目录

修改httpd.conf里面的DocumentRoot选项到指定的目录,比如:

DocumentRoot /www/htdocs

这样http://localhost/index.html就是对应/www/htdocs/index.html

12、如何修改apache的最大连接数

在httpd.conf中设置:

MaxClients n

n是整数,表示最大连接数,取值范围在1和256之间,如果要让apache支持更多的连接数,那么需要修改源码中的httpd.h文件,把定义的HARD_SERVER_LIMIT值改大然后再编译。

13、如何使每个用户有独立的cgi-bin目录

有两种可选择的方法:

(1)在Apache配置文件里面关于public_html的设置后面加入下面的属性:

ScriptAliasMatch ^/~([^/]*)/cgi-bin/(.*) /home/$1/cgi-bin/$2

(2)在Apache配置文件里面关于public_html的设置里面加入下面的属性:
<CENTER><ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2" 
 bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
    <td bgcolor="e6e6e6" class="code" style="font-size:9pt">
    <pre><ccid_code>  
Options ExecCGI
SetHandler cgi-script

14、如何调整Apache的最大进程数

Apache允许为请求开的最大进程数是256,MaxClients的限制是256.如果用户多了,用户就只能看到Waiting for reply....然后等到下一个可用进程的出现。这个最大数,是Apache的程序决定的--它的NT版可以有1024,但Unix版只有256,你可以在src/include/httpd.h中看到:

#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#else
#define HARD_SERVER_LIMIT 256
#endif
#endif

你可以把它调到1024,然后再编译你的系统。

15、如何屏蔽来自某个Internet地址的用户访问Apache服务器

可以使用deny和allow来限制访问,比如要禁止202.202.202.xx网络的用户访问:

order deny,allow
deny from 202.202.202.0/24

  

16、如何在日志里面记录apache浏览器和引用信息

你需要把mod_log_config编译到你的Apache服务器中,然后使用下面类似的配置:

CustomLog logs/access_log "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i""

17、如何修改Apache返回的头部信息

问题分析:当客户端连接到Apache服务器的时候,Apache一般会返回服务器版本、非缺省模块等信息,例如:

Server: Apache/1.3.26 (Unix) mod_perl/1.26

解决:

你可以在Apache的配置文件里面作如下设置让它返回的关于服务器的信息减少到最少:

ServerTokens Prod

注意:

这样设置以后Apache还会返回一定的服务器信息,比如:

Server: Apache

但是这个不会对服务器安全产生太多的影响,因为很多扫描软件是扫描的时候是不顾你服务器返回的头部信息的。你如果想把服务器返回的相关信息变成:

Server: It iS a nOnE-aPaCHe Server

那么你就要去修改源码了。

发表评论请到:http://bbs.cnitom.com

相关阅读

图文热点

Power架构产品创新 IBM推动其本土化发展
Power架构产品创新 IBM推动其本土化发展自从1990年,IBM推出基于RISC系统的新产品线RS/6000(现称eServer p系列)之后,...
WAF:高校Web应用安全守护者
WAF:高校Web应用安全守护者最近几年高校网站被攻击的事件时有发生,造成了不良影响,因此越来越多的高校开始...

本类热点