课程表

网络安全课程

工具箱
速查手册

Apache 安全配置

当前位置:免费教程 » 其他 » 网络安全

Apache易于安装并且相当容易管理。不幸的是,许多Apache的安装由于为完全的陌生者提供了关于自己服务器的太多”有帮助”的信息,例如 Apache的版本号和与操作系统相关的信息。通过这种信息,一个潜在的攻击者就可以追踪特定的可以影响你的系统的破坏性漏洞,特别是你没有能够保持所有补丁的更新的话情况更为严重。如此一来,攻击者无需反复试验就可以确切地知道你在运行什么,从而可以调整其攻击方法。


一、Apache 服务器的安全特性

1、 采用选择性访问控制和强制性访问控制的安全策略

从Apache 或Web的角度来讲,选择性访问控制DAC(Discretionary Access Control)仍是基于用户名和密码的,强制性访问控制MAC(Mandatory Access Control)则是依据发出请求的客户端的IP地址或所在的域号来进行界定的。对于DAC方式,如输入错误,那么用户还有机会更正,从新输入正确的的密码;如果用户通过不了MAC关卡,那么用户将被禁止做进一步的操作,除非服务器作出安全策略调整,否则用户的任何努力都将无济于事。

2、Apache 的安全模块

Apache 的一个优势便是其灵活的模块结构,其设计思想也是围绕模块(Modules)概念而展开的。安全模块是Apache Server中的极其重要的组成部分。这些安全模块负责提供Apache Server的访问控制和认证、授权等一系列至关重要的安全服务。

mod_access模块能够根据访问者的IP地址(或域名,主机名等)来控制对Apache服务器的访问,称之为基于主机的访问控制。

mod_auth模块用来控制用户和组的认证授权(Authentication)。用户名和口令存于纯文本文件中。mod_auth_db和mod_auth_dbm模块则分别将用户信息(如名称、组属和口令等)存于Berkeley-DB及DBM型的小型数据库中,便于管理及提高应用效率。

mod_auth_digest模块则采用MD5数字签名的方式来进行用户的认证,但它相应的需要客户端的支持。

mod_auth_anon模块的功能和mod_auth的功能类似,只是它允许匿名登录,将用户输入的E-mail地址作为口令。

SSL(Secure Socket Lager),被Apache所支持的安全套接字层协议,提供Internet上安全交易服务,如电子商务中的一项安全措施。通过对通讯字节流的加密来防止敏感信息的泄漏。但是,Apache的这种支持是建立在对Apache的API扩展来实现的,相当于一个外部模块,通过与第三方程序的结合提供安全的网上交易支持。


二、Apache服务器的安全配置

Apache具有灵活的设置,所有Apache的安全特性都要经过周密的设计与规划,进行认真地配置才能够实现。Apache服务器的安全配置包括很多层面,有运行环境、认证与授权设置等。

要防止服务器广播敏感信息,一定要保证将httpd.conf中的”ServerSignature”指令设置为”off”。一次默认的Apache安装会将此指令设置为”off”,不过许多管理员却启用了它。

同样地,禁用目录浏览也是一个不错的主意。在目录浏览被启用时,访问一个并不包含其所需要文档的目录的用户,会看到此目录中完整的内容列表。无疑,你不应当将敏感材料以纯文本的形式存储到一个Web服务器上,除非你必须这样做,你也不应该允许人们看到超过其需要的内容。

目录浏览默认地是被启用的。要禁用这个特性,应编辑http.conf文件,而且对每一个”Directory”指令,应清除”Indexs”。

例如,在笔者的做实验用的Apache 2.2.4服务器上,这是默认的目录命令: 

代码如下:

  1. <Directory "/usr/local/apache/htdocs">
  2. Options Indexes FollowSymLinks
  3. AllowOverrride None
  4. Order allow,deny
  5. Allow from all
  6. </Directory>

清除Indexes后的样子: 

代码如下:

  1. <Directory "/usr/local/apache/htdocs">
  2. Options Indexes FollowSymLinks
  3. AllowOverrride None
  4. Order allow,deny
  5. Allow from all
  6. </Directory>

在清除了FollowSymLinks后,就成为如下的样子:

代码如下:

  1. <Directory "/usr/local/apache/htdocs">
  2. Options Indexes
  3. AllowOverrride None
  4. Order allow,deny
  5. Allow from all
  6. </Directory>

如果一些用户需要跟踪符号连接的能力,可以考虑使用SymLinksIfOwnerMatch代替。

Listen指令具体化

在你第一次安装Apache时,httpd.conf包含一个”Listen 80”指令。应将其改变为 “Listen mn.xx.yy.zz:80”,在这里”mn.xx.yy.zz”是你想让Apache监听其请求的IP地址。如果你的Apache运行在一个拥有多个IP地址的服务器上时,这一点尤其重要。如果你不采取预防措施,默认的”Listen 80”指令告诉Apache监听每一个IP地址的 80端口。

不过,这项措施有可能不适用于你的环境,应根据需要而定。

从httpd.conf中清除默认的注释

Apache 2.2.4中默认的httpd.conf文件有400多行。在这400行中,只有一小部分是实际的Apache指令,其余的仅是帮助用户如何恰当地在httpd.conf中放置指令的注释。根据笔者的经验,这些注释有时起负面作用,甚至将危险的指令留存于文件中。笔者在所管理的许多 Apache服务器上将httpd.conf文件复制为其它的文件,如httpd.conf.orig等,然后完全清除多余的注释。文件变得更加容易阅读,从而更好地解决了潜在的安全问题或者错误地配置文件。

没作任何设置前,查看web服务器请求文件头:

  1. HTTP/1.1 200 OK
  2. Date: Sun, 27 Apr 2008 11:56:46 GMT
  3. Server: Apache/2.2.8 (Unix) DAV/2 PHP/5.2.5 with Suhosin-Patch
  4. Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
  5. ETag: "387a5-2c-3e9564c23b600"
  6. Accept-Ranges: bytes
  7. Content-Length: 44
  8. Content-Type: text/html

几乎把web服务器详细信息都暴出来了,如果没个版本的apache和php爆出严重漏洞,会给攻击者提供最有攻击价值的安全信息,这是非常危险的。

将apache的配置文件加上两行:

  1. ServerTokens ProductOnly
  2. ServerSignature Off

重启apache让设置生效。再次发出apache头信息请求:

  1. HTTP/1.1 200 OK
  2. Date: Sun, 27 Apr 2008 11:57:40 GMT
  3. Server: Apache
  4. Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
  5. ETag: "387a5-2c-3e9564c23b600"
  6. Accept-Ranges: bytes
  7. Content-Length: 44
  8. Content-Type: text/html

可以看到apache版本号于已经没有了。做到这点,我们还可以改变apache的版本,这就要修改apache的源代码了,在apache的源码包中找到ap_release.h 将#defiAP_SERVER_BASEPRODUCT “Apache” 修改为#define AP_SERVER_BASEPRODUCT “Microsoft-IIS/5.0” 或者#define AP_SERVER_BASEPRODUCT “Microsoft-IIS/6.0” 到os/unix下的os.h文件,将其#define PLATFORM “Unix”修改为#define PLATFORM “Win32”。然后重新编译,安装apache。 最后修改httpd.conf配置文件,添加两行:

  1. ServerTokens Prod
  2. ServerSignature Off

在发送头请求,会有什么,就不用我说了吧,嘿嘿,这叫偷天换日,从这点来说,php也是一样,同样可以通过这种方式改变一些系统信息,不过根据GPL开源的精神,这样做貌似不太好,还是保留apache和php版权信息吧。


三、配置示例

Apache具有灵活的设置,所有Apache的安全特性都要经过周密的设计与规划,进行认真地配置才能够实现。

1、以Nobody用户运行

一般情况下,Apache是由Root 来安装和运行的。如果Apache Server进程具有Root用户特权,那么它将给系统的安全构成很大的威胁,应确保Apache Server进程以最可能低的权限用户来运行。通过修改httpd.conf文件中的下列选项,以Nobody用户运行Apache 达到相对安全的目的。

  1. User nobody
  2. Group# -1

2、ServerRoot目录的权限

为了确保所有的配置是适当的和安全的,需要严格控制Apache 主目录的访问权限,使非超级用户不能修改该目录中的内容。Apache 的主目录对应于Apache Server配置文件httpd.conf的Server Root控制项中,应为:

  1. Server Root /usr/local/apache

3、SSI的配置

在配置文件access.conf 或httpd.conf中的确Options指令处加入Includes NO EXEC选项,用以禁用Apache Server 中的执行功能。避免用户直接执行Apache 服务器中的执行程序,而造成服务器系统的公开化。

  1. Options Includes Noexec

4、阻止用户修改系统设置

在Apache 服务器的配置文件中进行以下的设置,阻止用户建立、修改 .htaccess文件,防止用户超越能定义的系统安全特性。

  1. AllowOveride None
  2. Options None
  3. Allow from all

然后再分别对特定的目录进行适当的配置。

5、改变Apache 服务器的默认访问特性

Apache 的默认设置只能保障一定程度的安全,如果服务器能够通过正常的映射规则找到文件,那么客户端便会获取该文件,如http://local host/~ root/ 将允许用户访问整个文件系统。在服务器文件中加入如下内容:

  1. order deny,ellow
  2. Deny from all

将禁止对文件系统的缺省访问。

6、CGI脚本的安全考虑

CGI脚本是一系列可以通过Web服务器来运行的程序。为了保证系统的安全性,应确保CGI的作者是可信的。对CGI而言,最好将其限制在一个特定的目录下,如cgi-bin之下,便于管理;另外应该保证CGI目录下的文件是不可写的,避免一些欺骗性的程序驻留或混迹其中;如果能够给用户提供一个安全性良好的CGI程序的模块作为参考,也许会减少许多不必要的麻烦和安全隐患;除去CGI目录下的所有非业务应用的脚本,以防异常的信息泄漏。

7、几个常见的安全配置

ServerSignature有三个选项:On|Off|EMai,主要起开关作用。

ServerTokens 四个选项:Minimal|ProductOnly|OS|Full,四个选项隐藏信息依次增加

下面对php的配置文件php.ini进行配置,默认情况下expose_php = On ,将其改为 expose_php = Off。为什么,可以看这段解释

  1. ; Decides whether PHP may expose the fact that it is installed on the server
  2. ; (e.g. by adding its signature to the Web server header). It is no security
  3. ; threat in any way, but it makes it possible to determine whether you use PHP
  4. ; on your server or not.

然后禁止一些涉及php安全的函数:

  1. disable_functions = phpinfo, get_cfg_var //禁止phpinfo和get_cfg_var等函数
  2. display_errors = Off //禁止爆出错误
  3. allow_url_fopen = Off //这个关闭,就没有办法取远程内容了,但是可以用变通,用curl远程读取的方法做到
  4. safe_mode = On //开启安全模式,这个开了,可能会有些php功能没办法使用了

无论如何,还是要我们的程序设计的完美,一般来说,单纯的发动对 Apache系统的攻击很难,如果是程序有漏洞,那攻击就简单了。

以上这些常用的举措可以给Apache Server 一个基本的安全运行环境,显然在具体实施上还要做进一步的细化分解,制定出符合实际应用的安全配置方案。


四、Apache Server基于主机的访问控制

Apache Server默认情况下的安全配置是拒绝一切访问。假定Apache Server内容存放在/usr/local/apache/share 目录下,下面的指令将实现这种设置:

  1. Deny from all
  2. Allow Override None

则禁止在任一目录下改变认证和访问控制方法。

同样,可以用特有的命令Deny、Allow指定某些用户可以访问,哪些用户不能访问,提供一定的灵活性。当Deny、Allow一起用时,用命令Order决定Deny和Allow合用的顺序,如下所示:

1、 拒绝某类地址的用户对服务器的访问权(Deny)

如:

  1. Deny from all
  2. Deny from test.cnn.com
  3. Deny from 204.168.190.13
  4. Deny from 10.10.10.0/255.255.0.0

2、 允许某类地址的用户对服务器的访问权(Allow)

如:

  1. Allow from all
  2. Allow from test.cnn.com
  3. Allow from 204.168.190.13
  4. Allow from 10.10.10.0/255.255.0.0

Deny和Allow指令后可以输入多个变量。

3、简单配置实例:

  1. Order Allow, Deny
  2. Allow from all
  3. Deny from www.test.com

指想让所有的人访问Apache服务器,但不希望来自www.test.com的任何访问。

  1. Order Deny, Allow
  2. Deny from all
  3. Allow from test.cnn.com

指不想让所有人访问,但希望给test.cnn.com网站的来访。


五、Apache Sever的用户认证与授权

概括的讲,用户认证就是验证用户的身份的真实性,如用户帐号是否在数据库中,及用户帐号所对应的密码是否正确;用户授权表示检验有效用户是否被许可访问特定的资源。在Apache中,几乎所有的安全模块实际上兼顾这两个方面。从安全的角度来看,用户的认证和授权相当于选择性访问控制。

建立用户的认证授权需要三个步骤:

1、建立用户库

用户名和口令列表需要存在于文件(mod_auth模块)或数据库(mod_auth_dbm模块)中。基于安全的原因,该文件不能存放在文挡的根目录下。如,存放在/usr/local/etc/httpd下的users文件,其格式与UNIX口令文件格式相似,但口令是以加密的形式存放的。应用程序htpasswd可以用来添加或更改程序:

  1. htpasswd c /usr/local/etc/httpd/users martin

-c表明添加新用户,martin为新添加的用户名,在程序执行过程中,两次输入口令回答。用户名和口令添加到users文件中。产生的用户文件有如下的形式:

  1. martin:WrU808BHQai36
  2. jane:iABCQFQs40E8M
  3. art:FadHN3W753sSU

第一域是用户名,第二个域是用户密码。

2、配置服务器的保护域

为了使Apache服务器能够利用用户文件中的用户名和口令信息,需要设置保护域(Realm)。一个域实际上是站点的一部分(如一个目录、文档等)或整个站点只供部分用户访问。在相关目录下的.htaccess文件或httpd.conf ( acces.conf ) 中的段中,由AuthName来指定被保护层的域。在.htaccess文件中对用户文件有效用户的授权访问及指定域保护有如下指定:

  1. AuthName restricted stuff
  2. Authtype Basic
  3. AuthUserFile /usr/local/etc/httpd/users
  4. Require valid-user

其中,AuthName指出了保护域的域名(Realm Name)。valid-user参数意味着user文件中的所有用户都是可用的。一旦用户输入了一个有效的用户/口令时,同一个域内的其他资源都可以利用同样的用户/口令来进行访问,同样可以使两个不同的区域共用同样的用户/口令。

3、告诉服务器哪些用户拥有资源的访问权限

如果想将一资源的访问权限授予一组客户,可以将他们的名字都列在Require之后。最好的办法是利用组(group)文件。组的操作和标准的UNIX的组的概念类似,任一个用户可以属于一个和数个组。这样就可以在配置文件中利用Require对组赋予某些权限。如:

  1. Require group staff
  2. Require group staff admin
  3. Require user adminuser

指定了一个组、几个组或一个用户的访问权限。

需要指出的是,当需要建立大批用户帐号时,那么Apache服务器利用用户文件数据库将会极大地降低效率。这种情况下,最好采用数据库格式的帐号文件,譬如 DBM数据库格式的文件。还可以根据需要利用db格式(mod_auth_db)的数据文件,或者直接利用数据库,如:mSQL(mod_auth_msql)或DBI兼容的数据库(mod_auth_dbi)。

4、Apache设置目录禁止访问

默认apache在当前目录下没有index.html入口就会显示目录。让目录暴露在外面是非常危险的事,如下操作禁止apache显示目录:

进入apache的配置文件 httpd.conf 找到:

  1. Options Indexes FollowSymLinks

修改为:

  1. Options FollowSymLinks

其实就是将Indexes去掉,Indexes表示若当前目录没有index.html就会显示目录结构。

本章节来源:

http://blog.csdn.net/carechere/article/details/52346776

http://blog.csdn.net/wangshuai6707/article/details/52350783

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号