Home  >  Article  >  php教程  >  实例学习Apache服务器的安全防护知识

实例学习Apache服务器的安全防护知识

WBOY
WBOYOriginal
2016-06-21 08:48:351068browse

Apache 一直是世界上使用率排名前三的 Web 服务器软件。企业使用其构建 Web 应用,从很大程度上都需要对其安全性进行综合考虑,以保证能够应对拒绝服务攻击、流量窃听、数据泄漏等网络威胁,从而保证企业门户网站的安全。除了使用业界流行的防火墙、IDS/IPS(入侵检测系统 / 入侵防御系统)、WAF(Web 应用防火墙)、UTM(统一威胁管理)等外部安全设备对 Apache 服务进行安全防护外,作为一种优秀的开源服务器软件,Apache 本身就具有很多优秀的特性可以为服务器管理员提供安全配置,以防范各种网络攻击。因此,充分、高效地挖掘 Apache 服务器的自身安全能力也是企业安全工作者一个必备的技能。基于此,本文将通过大量的实例,从服务器安全设置、运行环境安全保障、安全模块保护、日志管理等 6 个方面详细剖析 Apache 服务器的安全防护要点。

Apache 服务简介

Web 服务器也称为 WWW 服务器或 HTTP 服务器 (HTTP Server),它是 Internet 上最常见也是使用最频繁的服务器之一,Web 服务器能够为用户提供网页浏览、论坛访问等等服务。

由于用户在通过 Web 浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而 Web 在 Internet 上一推出就得到了爆炸性的发展。现在 Web 服务器已经成为 Internet 上最大的计算机群,Web 文档之多、链接的网络之广,也令人难以想像。因此,Web 服务器软件的数量也开始增加,Web 服务器软件市场的竞争也越来越激烈。本文所讨论的就是一款最常用的 Web 服务器软件—— Apache。

Apache 是一个免费的软件,用户可以免费从 Apache 的官方网站下载。任何人都可以参加其组成部分的开发。Apache 允许世界各地的人对其提供新特性。当新代码提交到 Apache Group 后,Apache Group 对其具体内容进行审查并测试和质量检查。如果他们满意,该代码就会被集成到 Apache 的主要发行版本中。

Apache 的其他主要特征有:

  • 支持最新的 HTTP 协议:是最先支持 HTTP1.1 的 Web 服务器之一,其与新的 HTTP 协议完全兼容,同时与 HTTP1.0、HTTP1.1 向后兼容。Apache 还为支持新协议做好了准备。
  • 简单而强大的基于文件的配置:该服务器没有为管理员提供图形用户界面,提供了三个简单但是功能异常强大的配置文件。用户可以根据需要用这三个文件随心所欲地完成自己希望的 Apache 配置。
  • 支持通用网关接口(CGI):采用 mod_cgi 模块支持 CGI。Apache 支持 CGI/1.1 标准,并且提供了一些扩充。
  • 支持虚拟主机:是首批既支持 IP 虚拟主机又支持命名虚拟主机的 Web 服务器之一。
  • 支持 HTTP 认证:支持基于 Web 的基本认证。它还有望支持基于消息摘要的认证。
  • 内部集成 Perl:Perl 是 CGI 脚本编程的事实标准。Apache 对 Perl 提供了良好的支持,通过使用其 mod_perl 模块,还可以将 Perl 的脚本装入内存。
  • 集成代理服务器:用户还可以选择 Apache 作为代理服务器。
  • 支持 SSL:由于版本法和美国法律在进出口方面的限制,Apache 本身不支持 SSL。但是用户可以通过安装 Apache 的补丁程序集合(Apache-SSL)使得 Apache 支持 SSL。
  • 支持 HTTP Cookie:通过支持 Cookie,可以对用户浏览 Web 站点进行跟踪。

Apache 服务面临的网络威胁

一般说来,Apache 服务器主要面临如下几种网络威胁:

  1. 使用 HTTP 协议进行的拒绝服务攻击:攻击者会通过某些手段使服务器拒绝对 HTIP 应答。这样会使 Apache 对系统资源(CPU 时间和内存)需求巨增,造成 Apache 系统变慢甚至完全瘫痪,从而引起 HTTP 服务的中断或者合法用户的合法请求得不到及时地响应;
  2. 缓冲区溢出攻击:由于 Apache 源代码完全开放,攻击者就可以利用程序编写的一些缺陷,使程序偏离正常流程。程序使用静态分配的内存保存请求数据,攻击者就可以发送一个超长请求使缓冲区溢出,从而导致缓冲区溢出攻击;
  3. 被攻击者获得 root 权限,威胁系统安全:由于 Apache 服务器一般以 root 权限运行,攻击者通过它获得 root 权限,进而控制整个 Apache 系统;
  4. Apache 服务器与客户端通信安全:如果采用明文传输,则服务器与客户端的敏感通信信息将有可能被黑客或者不法用户获取;
  5. 由于 Apache 配置文件设置不当引起的安全问题:恶意者可以随意下载或修改删除系统文件。这主要涉及到对访问者的内容和权限的限制。

要应对上述这些安全威胁,要从 Apache 服务器端配置、运行环境、通信链路安全保障、安全模块使用、日志管理等各方面、全方位的进行保障,下面将进行分门别类的详细介绍。

Apache 服务器端安全设置

限制 root 用户运行 Apache 服务器

一般情况下,在 Linux 下启动 Apache 服务器的进程 httpd 需要 root 权限。由于 root 权限太大,存在许多潜在的对系统的安全威胁。一些管理员为了安全的原因,认为 httpd 服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器。http.conf 主配置文件里面有如下 2 个配置是 Apache 的安全保证,Apache 在启动之后,就将其本身设置为这两个选项设置的用户和组权限进行运行,这样就降低了服务器的危险性。

User apache

Group apache

需要特别指出的是:以上 2 个配置在主配置文件里面是默认选项,当采用 root 用户身份运行 httpd 进程后,系统将自动将该进程的用户组和权限改为 apache,这样,httpd 进程的权限就被限制在 apache 用户和组范围内,因而保证了安全。

向客户端隐藏 Apache 服务器的相关信息

Apache 服务器的版本号可以作为黑客入侵的重要信息进行利用,他们通常在获得版本号后,通过网上搜索针对该版本服务器的漏洞,从而使用相应的技术和工具有针对性的入侵,这也是渗透测试的一个关键步骤。因此,为了避免一些不必要的麻烦和安全隐患,可以通过主配置文件 httpd.conf 下的如下两个选项进行:

(1)ServerTokens:该选项用于控制服务器是否响应来自客户端的请求,向客户端输出服务器系统类型或者相应的内置模块等重要信息。Red Hat Enterprise Linux 5 操作系统在主配置文件中提供全局默认控制阈值为 OS,即 ServerTokens OS。它们将向客户端公开操作系统信息和相关敏感信息,所以保证安全情况下需要在该选项后使用“ProductOnly”,即 ServerTokens ProductOnly。

(2)ServerSignature:该选项控制由系统生成的页面(错误信息等)。默认情况下为 off,即 ServerSignature off,该情况下不输出任何页面信息。另一情况为 on,即 ServerSignature on,该情况下输出一行关于版本号等相关信息。安全情况下应该将其状态设为 off。

图 1 和图 2 为安全设定这两个选项前后正常情况下和错误情况下的输出页面(通过 Rhel5 中的 Mozilla Firefox 浏览器访问 Rhel5 中的 Apache 服务器)的详细对比。可以清楚看到,安全设定选项后,可以充分地向客户端用户隐藏 Linux 操作系统信息和 Apache 服务器版本信息。

图 1. 错误情况下未设定安全选项前示意

图 2. 操作情况下使用安全设定后的对比

设置虚拟目录和目录权限

要从主目录以外的其他目录中进行发布,就必须创建虚拟目录。虚拟目录是一个位于 Apache 的主目录外的目录,它不包含在 Apache 的主目录中,但在访问 Web 站点的用户看来,它与位于主目录中的子目录是一样的。每个虚拟目录都有一个别名,用户 Web 浏览器中可以通过此别名来访问虚拟目录,如 http:// 服务器 IP 地址 / 别名 / 文件名,就可以访问虚拟目录下面的任何文件了。

使用 Alias 选项可以创建虚拟目录。在主配置文件中,Apache 默认已经创建了两个虚拟目录。这两条语句分别建立了“/icons/”和“/manual”两个虚拟目录,它们对应的物理路径分别是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用户可以看到如下配置语句:

1

2

3

Alias /icons/ /var/www/icons/

  

Alias /manual /var/www/manual

在实际使用过程中,用户可以自己创建虚拟目录。比如,创建名为 /user 的虚拟目录,它所对应的路径为上面几个例子中常用的 /var/www/html/rhel5:

1

Alias /test /var/www/html/rhel5

如果需要对其进行权限设置,可以加入如下语句:

1

2

3

4

5

6

Directory “/var/www/html/rhel5”>

     AllowOverride None

     Options Indexes

     Order allow,deny

     Allow from all

 Directory>

设置该虚拟目录和目录权限后,可以使用客户端浏览器进行测试验证,采用别名对该目录中的文件进行访问,浏览结果如图 3 所示。

图 3. 使用虚拟目录的测试结果

 

限制 Apache 服务的运行环境

Apache 服务器需要绑定到 80 端口上来监听请求,而 root 是唯一有这种权限的用户,随着攻击手段和强度的增加,这样会使服务器受到相当大的威胁,一但被利用缓冲区溢出漏洞,就可以控制整个系统。为了进一步提高系统安全性,Linux 内核引入 chroot 机制,chroot 是内核中的一个系统调用,软件可以通过调用函数库的 chroot 函数,来更改某个进程所能见到的根目录。

chroot 机制即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。在这种情况下,即使出现黑客或者不法用户通过该软件破坏或被侵入系统,Linux 系统所受的损坏也仅限于该设定的根目录,而不会影响到整个系统的其他部分。

将软件 chroot 化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到 chroot 目录中,通常称这个目录为 chroot“监牢”。如果在“监牢”中运行 httpd,那么用户根本看不到 Linux 文件系统中那个真正的目录,从而保证了 Linux 系统的安全。

在使用该技术的时候,一般情况下需要事先创建目录,并将守护进程的可执行文件 httpd 复制到其中。同时,由于 httpd 需要几个库文件,所以需要把 httpd 程序依赖的几个 lib 文件同时也拷贝到同一个目录下,因此手工完成这一工作是非常麻烦的。幸运的是,用户可以通过使用开源的 jail 软件包来帮助简化 chroot“监牢”建立的过程,具体步骤如下所示:Jail 官方网站是:http://www.jmcresearch.com/projects/。

首先将其下载,然后执行如下命令进行源代码包的编译和安装:

1

2

3

#tar xzvf jail_1.9a.tar.gz

 #cd jail/src

 #make

jail 软件包提供了几个 Perl 脚本作为其核心命令,包括 mkjailenv、addjailuser 和 addjailsw,他们位于解压后的目录 jail/bin 中。这几个命令的基本用途如下所示:

  • mkjailenv:用于创建 chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。
  • addjailsw:用于从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。
  • addjailuser:创建新的 chroot“监牢”用户。

采用 jail 创建监牢的步骤如下所示;

(1)首先需要停止目前运行的 httpd 服务,然后建立 chroot 目录,命令如下所示。该命令将 chroot 目录建立在路径 /root/chroot/httpd 下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# service httpd stop

 # mkjailenv /root/chroot/httpd

 kjailenv

 A component of Jail (version 1.9 for linux)

  

http://www.gsyc.inf.uc3m.es/~assman/jail/

  

 Juan M. Casillas  

  

 Making chrooted environment into /root/chroot/httpd

        Doing preinstall()

        Doing special_devices()

        Doing gen_template_password()

        Doing postinstall()

 Done.

(2)为“监牢”添加 httpd 程序,命令如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

# ./addjailsw  /root/chroot/httpd/ -P /usr/sbin/httpd 

  

 addjailsw

 A component of Jail (version 1.9 for linux)

  

http://www.gsyc.inf.uc3m.es/~assman/jail/

  

 Juan M. Casillas  

  

 Guessing /usr/sbin/httpd args(0)

 Warning: can"t create /proc/mounts from the /proc filesystem 

  

 Done.

在上述过程中,用户不需要在意那些警告信息,因为 jail 会调用 ldd 检查 httpd 用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。

(3)然后,将 httpd 的相关文件拷贝到“监牢”的相关目录中,命令如下所示:

1

2

3

# mkdir -p /root/chroot/httpd/etc

 # cp – a /etc/httpd /root/chroot/httpd/etc/

。。。。。。

添加后的目录结构如下所示:

1

2

3

4

5

6

7

8

9

# ll

总计 56

 drwxr-xr-x 2 root root 4096 03-23 13:44 dev

 drwxr-xr-x 3 root root 4096 03-23 13:46 etc

 drwxr-xr-x 2 root root 4096 03-23 13:46 lib

 drwxr-xr-x 2 root root 4096 03-23 13:46 selinux

 drwsrwxrwx 2 root root 4096 03-23 13:46 tmp

 drwxr-xr-x 4 root root 4096 03-23 13:46 usr

 drwxr-xr-x 3 root root 4096 03-23 13:46 var

(4)重新启动 httpd,并使用 ps 命令检查 httpd 进程,发现该进程已经运行在监牢中,如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# ps -aux grep httpd

 Warning: bad syntax, perhaps a bogus "-"? See/usr/share/doc/procps-3.2.7/FAQ

 root      3546  0.6  0.3   3828  1712 pts/2   S    13:57   0:00/usr/sbin/nss_pcache off

 /etc/httpd/alias

 root      3550 14.2  3.6  49388 17788 ?       Rsl  13:57   0:00/root/chroot/httpd/httpd

 apache    3559  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3560  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3561  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3562  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3563  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3564  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3565  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 apache    3566  0.2  1.4  49388  6888 ?       S    13:57   0:00/root/chroot/httpd/httpd

 root      3568  0.0  0.1   4124   668 pts/2   

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn