LAMP下的脚步声
看憨狗撑着LAMP,一步一步


Apache安全步步高之一
Time:2005-09-05
本文通过一步一步的演示,来展示如何利用Apache 1.3.X的安装和配置,达到即使出现新漏洞的恶劣情况下,也能够最小化甚至避免服务器的入侵的目的。

功能

安装加固我们的Apache之前, 我们必须明确:到底我们需要Apache的哪些功能?
Apache各种各样的用途使我们很难做一个通用加固方案,作为一个 例子,本文基
于Apache的以下功能来讨论Apache的安全加固:

  • 可以从Internet访问本Web服务器
  • 而Apache只提高静态的HTML文档处理
  • Apache支持基于名字的虚拟主机
  • 自定义的web文档访问限制:利用basic authentication实现基于IP或者用户名的限制
  • 服务器记录所有的请求,包括一些浏览器的信息

需要特别注意的是该服务器并不提供PHP、Perl、JSP、CGI等等与服务器交互的动态网
页技术,因为每增加一项这些功能,Apache的安全就会多一份威胁:一个小小的不安
全的脚本都可能给整个服务器留下安全隐患(千里之堤、决于蚁穴):一,提供服务
的PHP/CGI程序有可能有安全漏洞(SQL注入、CSS等。二这些功能 (PHP、Perl模块)
本身也有可能出现安全问题。所以强烈建议这些能够只有在绝对需要的情况下才启用。

安全要求

和每个计算机项目一样,在项目完成之前都必须实现的安全要求,我们的Web服务器也有如的安全要求:

  • 提供Web服务的操作系统必须尽可能的安全, 以防范本地或者远程的攻击者;
  • 除了Web(只包括80/TCP,不包括443/TCP)之外不提供其他的任何服务;
  • 服务器的远程访问必须在防火墙的完全控制之下以阻止所有的出站连接和只允许针对80/TCP的入站连接;
  • Apache服务是该系统中唯一的服务;
  • 只允许绝对需要的Apache模块;
  • 任何起诊断作用的页面和自动目录索引服务必须关闭;
  • 服务器透露出来的信息必须尽可能的少;
  • Apache服务进程必须运行于唯一的UID/GID下,改UID/GID不能由于系统的其他进程使用;
  • 严格控制Apache进程对文件系统的访问(chrooting);
  • Apache的chrooted环境中不能出现任何shell (/bin/sh, /bin/csh 等等)。

操作系统的安装

在安装Apache之前必须选择一个可以之上运行的操作系统, 由于Apache几乎可以在任何系统上编译、安装 ,所以在这个问题上我们有非常大的选择余地, 本文接下来演示如何在 FreeBSD(4.7上)加固Apache, 当然这些演示同样适用于大多数的UNIX/Linux系统,本是同根生嘛。只是操作系统的问题上由于安全、性能等方面的限制不推荐MS Windows .

Web服务器安全加固的一步是操作系统的加固,这方面的文档,在网络上到处都有,就不做多余的讨论,各位大可可以照猫画虎来加固它。

在操作系统安装和加固之后,我们需要添加一个新的普通用户和组给Apache服务器使用,
以 FreeBSD为例:

groupadd apache
useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin

默认情况下, Apache进程是以nobody用户权限(当然Apache主进程出外,它要监听80端口,须root权限下执行) 和nogroup组来执行的。 这就有可能出现安全问题了,因为这样的话,一旦Apache出现问题,入侵者就有访问所有运行于nobody用户和nogroup组之下的进程,进一步危害服务器安全,所以最优的办法就是让Apache运行于独立的UID/GID之下。

准备软件

下一步就是下载最新的Apache Web server ,由于许多选项只能在编译时打开或者关闭,所以当仁不让的是下载源代码而非二进制文件。

在下载解压之后。我们必须决定需要启用Apache的哪些模块? 关于Apache 1.3.X的模块说明参见: http://httpd.apache.org/docs/mod/ .

Apache的模块选择

Apache的模块选择是加固Apache的关键步骤之一。 我们所遵循的规则无非是老生常谈的:越少越好. 为了实现我们的功能和安全要求,以下模块必须启用:

<><><>模块名称           描述
httpd_core Apache的核心模块,在Apache的每个拷贝中都必须有
mod_access 提供基于客户端主机名、IP或者其他客户端特征的访问控制。 由于本
模块对需要使用'order'、'allow'、'deny'等指令来说是必须的,所有启用
mod_auth 提供用户认证功能 (HTTP Basic Authentication)
mod_dir 提供查找并发送"index.html", "default.htm",这些index文件功能
mod_log_config 实现Web服务器的日子功能
mod_mime 用来设置HTML文档的字符集、内容编码、处理句柄 和MIME 类型等功能

除此之外所有的Apache模块都予以禁用。因为我们不需要它们。禁用那些模块后,进一步避免因为那些模块出现问题而导致服务器出现危险。

另外单独注一笔的是另外两个Apache的模块: mod_autoindex和mod_info . 前者给目录提供自动索引,默认情况下是启用的,这导致没有index文件的服务器目录(比如http://server_name/icons/)内容很容易就被泄漏,而后者:mod_info , 由于它的作用就是报告apache的配置,也不能启用。

接下来的问题就是我们怎样编译这些启用的模块?一般地是选择动态模块,而此处我们选择静态编译,因为一旦出现新的漏洞,我们最好是重新编译整个Web服务器而不是仅仅编译那个出现问题的模块,这样的话,我们又有一个模块无需编译进Apache了:mod_so

编译Apache

好了,使用如下命令开始编译:

./configure --prefix=/usr/local/apache --disable-module=all --server- uid=apache --server-gid=apache --enable-module=access --enable- module=log_config --enable-module=dir --enable-module=mime --enable-module=auth
make
su
umask 022
make install
chown -R root:sys /usr/local/apache

 

接下来就是实现Apache服务器对文件系统的受限访问了。





HackGou   撰写于2005-09-05 20:42| 发布于之下 |编辑 | Trackback(0)

评论
bill (http://bobostreet.net) 在2007-03-07 17:56:57时指点道:
谢谢分享。

最新更新


关注的话题