Apache 服务简介html
Web 服务器也称为 WWW 服务器或 HTTP 服务器 (HTTP Server),它是 Internet 上最多见也是使用最频繁的服务器之一,Web 服务器可以为用户提供网页浏览、论坛访问等等服务。linux
因为用户在经过 Web 浏览器访问信息资源的过程当中,无须再关心一些技术性的细节,并且界面很是友好,于是 Web 在 Internet 上一推出就获得了爆炸性的发展。如今 Web 服务器已经成为 Internet 上最大的计算机群,Web 文档之多、连接的网络之广,也使人难以想像。所以,Web 服务器软件的数量也开始增长,Web 服务器软件市场的竞争也愈来愈激烈。本文所讨论的就是一款最经常使用的 Web 服务器软件—— Apache。web
Apache 是一个免费的软件,用户能够免费从 Apache 的官方网站下载。任何人均可以参加其组成部分的开发。Apache 容许世界各地的人对其提供新特性。当新代码提交到 Apache Group 后,Apache Group 对其具体内容进行审查并测试和质量检查。若是他们满意,该代码就会被集成到 Apache 的主要发行版本中。算法
Apache 的其余主要特征有:数据库
通常说来,Apache 服务器主要面临以下几种网络威胁:apache
要应对上述这些安全威胁,要从 Apache 服务器端配置、运行环境、通讯链路安全保障、安全模块使用、日志管理等各方面、全方位的进行保障,下面将进行分门别类的详细介绍。编程
通常状况下,在 Linux 下启动 Apache 服务器的进程 httpd 须要 root 权限。因为 root 权限太大,存在许多潜在的对系统的安全威胁。一些管理员为了安全的缘由,认为 httpd 服务器不可能没有安全漏洞,于是更愿意使用普通用户的权限来启动服务器。http.conf 主配置文件里面有以下 2 个配置是 Apache 的安全保证,Apache 在启动以后,就将其自己设置为这两个选项设置的用户和组权限进行运行,这样就下降了服务器的危险性。浏览器
User apache安全
Group apache服务器
须要特别指出的是:以上 2 个配置在主配置文件里面是默认选项,当采用 root 用户身份运行 httpd 进程后,系统将自动将该进程的用户组和权限改成 apache,这样,httpd 进程的权限就被限制在 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”。在主配置文件中,用户能够看到以下配置语句:
Alias /icons/ "/var/www/icons/"
Alias /manual "/var/www/manual"
在实际使用过程当中,用户能够本身建立虚拟目录。好比,建立名为 /user 的虚拟目录,它所对应的路径为上面几个例子中经常使用的 /var/www/html/rhel5:
Alias /test "/var/www/html/rhel5"
若是须要对其进行权限设置,能够加入以下语句:
1 2 3 4 5 6 |
|
设置该虚拟目录和目录权限后,可使用客户端浏览器进行测试验证,采用别名对该目录中的文件进行访问,浏览结果如图 3 所示。
图 3. 使用虚拟目录的测试结果
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 |
|
jail 软件包提供了几个 Perl 脚本做为其核心命令,包括 mkjailenv、addjailuser 和 addjailsw,他们位于解压后的目录 jail/bin 中。这几个命令的基本用途以下所示:
采用 jail 建立监牢的步骤以下所示;
(1)首先须要中止目前运行的 httpd 服务,而后创建 chroot 目录,命令以下所示。该命令将 chroot 目录创建在路径 /root/chroot/httpd 下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
(2)为“监牢”添加 httpd 程序,命令以下:
1 2 3 4 5 6 7 8 9 10 11 |
|
在上述过程当中,用户不须要在乎那些警告信息,由于 jail 会调用 ldd 检查 httpd 用到的库文件。而几乎全部基于共享库的二进制可执行文件都须要上述的几个库文件。
(3)而后,将 httpd 的相关文件拷贝到“监牢”的相关目录中,命令以下所示:
1 2 3 |
|
添加后的目录结构以下所示:
1 2 3 4 5 6 7 8 9 |
|
(4)从新启动 httpd,并使用 ps 命令检查 httpd 进程,发现该进程已经运行在监牢中,以下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Apache 的一个优点即是其灵活的模块结构,其设计思想也是围绕模块(module)概念而展开的。安全模块是 Apache Server 中的极其重要的组成部分。这些安全模块负责提供 Apache server 的访问控制和认证,受权等一系列相当重要的安全服务。
Apache 下有以下几类与安全相关的模块:
为了可以使用模块功能,模块一般以 DSO(Dynamic Shared Object)的方式构建,用户应该在 httpd.conf 文件中使用 LoadModule 指令,使得可以在使用前得到模块的功能。以下为主配置文件中各个模块的状况,开启安全模块很是简单,即去掉在各安全模块所在行前的“#”符号便可,以下所示:
1 2 3 4 5 |
|
只有将上述安全模块进行开启后 ,Apache 才能实现相应的访问控制和通讯加密功能。
在开启了相应的安全模块后,还须要对 Apache 的访问控制策略进行设定。
目前,有两种常见的认证类型,基本认证和摘要认证:
(1)基本认证(Basic):使用最基本的用户名和密码方式进行用户认证。
(2)摘要认证(Digest):该认证方式比基本认证要安全得多,在认证过程当中额外使用了一个针对客户端的挑战(challenge)信息,能够有效地避免基本认证方式可能遇到的“重放攻击”。值得注意的是:目前并不是全部的浏览器都支持摘要认证方式。
全部的认证配置指令既能够出如今主配置文件 httpd.conf 中的 Directory 容器中,也能够出如今单独的 .htaccess 文件中,这个能够由用户灵活地选择使用。在认证配置过程当中,须要用到以下指令选项:
使用上述的认证指令配置认证以后,须要为 Apache 服务器的访问对象,也就是指定的用户和组进行相应的受权,以便于他们对 Apache 服务器提供的目录和文件进行访问。为用户和组进行受权须要使用 Require 指令,它主要可使用以下三种方式进行受权:
要实现用户认证功能,首先要创建保存用户名和口令的文件。Apache 自带的 htpasswd 命令提供了创建和更新存储用户名、密码的文本文件的功能。须要注意的是,这个文件必须放在不能被网络访问的位置,以免被下载和信息泄漏。建议将口令文件放在 /etc/httpd/ 目录或者其子目录下。
下面的例子在 /etc/httpd 目录下建立一个文件名为 passwd_auth 的口令文件,并将用户 rhel5 添加入认证口令文件。使用如下命令创建口令文件(过程当中还会提示输入该用户的口令):
1 2 3 4 5 |
|
命令执行的过程当中系统会要求用户为 rhel5 用户输入密码。上述命令中的 -c 选项表示不管口令文件是否已经存在,都会从新写入文件并删去原有内容。因此在添加第 2 个用户到口令文件时,就不须要使用 -c 选项了,以下命令所示
1 |
|
配置指令
Apache 实现访问控制的配置指令包括以下三种:
(1)order 指令:用于指定执行容许访问控制规则或者拒绝访问控制规则的顺序。order 只能设置为 Order allow,deny 或 Order deny,allow,分别用来代表用户先设置容许的访问地址仍是先设置禁止访问的地址。Order 选项用于定义缺省的访问权限与 Allow 和 Deny 语句的处理顺序。Allow 和 Deny 语句能够针对客户机的域名或 IP 地址进行设置,以决定哪些客户机可以访问服务器。Order 语句设置的两种值的具体含义以下:
(2)allow 指令:指明容许访问的地址或地址序列。如 allow from all 指令代表容许全部 IP 来的访问请求。
(3)deny 指令:指明禁止访问的地址或地址序列。如 deny from all 指令代表禁止全部 IP 来的访问请求。
应用实例
下面举几个简单的例子对上述 order、allow 和 deny 命令的使用进行示范。
(1)在下面的例子中,admin.org 域中全部主机都容许访问网站,而其余非该域中的任何主机访问都被拒绝,由于 Deny 在前,Allow 在后,Allow 语句覆盖了 Deny 语句:
1 2 3 |
|
(2)下面例子中,admin.org 域中全部主机,除了 db.admin.org 子域包含的主机被拒绝访问之外,都容许访问。而全部不在 admin.org 域中的主机都不容许访问,由于缺省状态是拒绝对服务器的访问(Allow 在前,Deny 在后,Deny 语句覆盖了 Allow 语句):
1 2 3 |
|
使用主配置文件配置用户认证及受权
在本例子中,用户能够在 Apache 的主配置文件 httpd.conf 中加入如下语句创建对目录 /var/www/html/rhel5 访问的用户认证和受权机制:
1 2 3 4 5 6 7 |
|
在上述例子中,使用了以下指令:
须要注意的是:在 AuthUserFile 选项定义中,还须要使用以下语句事先创建认证用户 patterson 和 testuser,该选项中的定义才能生效:
1 2 |
|
使用 .htaccess 文件配置用户认证和受权
在本例子中,为了完成如上述例子一样的功能,须要先在主配置文件中加入以下语句:
1 2 3 |
|
上述语句中的 AllowOverride 选项容许在 .htaccess 文件中使用认证和受权指令。、、而后,在 .htaccess 文件中添加以下语句便可:
1 2 3 4 |
|
同理,在 AuthUserFile 选项定义中,还须要使用以下语句事先创建认证用户 patterson 和 testuser,该选项中的定义才能生效:
#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_auth testuser
在 SSL 通讯中,首先采用非对称加密交换信息,使得服务器得到浏览器端提供的对称加密的密钥,而后利用该密钥进行通讯过程当中信息的加密和解密。为了保证消息在传递过程当中没有被篡改,能够加密 Hash 编码来确保信息的完整性。服务器数字证书主要颁发给 Web 站点或其余须要安全鉴别的服务器,证实服务器的身份信息,一样客户端数字证书用于证实客户端的身份。
使用公用密钥的方式能够保证数据传输没有问题,但若是浏览器客户访问的站点被假冒,这也是一个严重的安全问题。这个问题不属于加密自己,而是要保证密钥自己的正确性问题。要保证所得到的其余站点公用密钥为其正确的密钥,而非假冒站点的密钥,就必须经过一个认证机制,能对站点的密钥进行认证。固然即便没有通过认证,仍然能够保证信息传输安全,只是客户不能确信访问的服务器没有被假冒。若是不是为了提供电子商务等方面对安全性要求很高的服务,通常不须要如此严格的考虑
。
下面给出使用 SSL 进行通讯的过程(参见图 4):
(1)客户端向服务器端发起对话,协商传送加密算法。例如:对称加密算法有 DES、RC5,密钥交换算法有 RSA 和 DH,摘要算法有 MD5 和 SHA。
(2)服务器向客户端发送服务器数字证书。好比:使用 DES-RSA-MD5 这对组合进行通讯。客户端能够验证服务器的身份,决定是否须要创建通讯。
(3)客户端向服务器传送本次对话的密钥。在检查服务器的数字证书是否正确,经过 CA 机构颁发的证书验证了服务器证书的真实有效性以后,客户端生成利用服务器的公钥加密的本次对话的密钥发送给服务器。
(4)服务器用本身的私钥解密获取本次通讯的密钥。
(5)双方的通讯正式开始。
图 4. SSL 通讯流程示意
在通常状况下,当客户端是保密信息的传递者时,他不须要数字证书验证本身身份的真实性,如用户一般使用的网上银行交易活动,客户须要将本身的隐秘信息——帐号和密码发送给银行,所以银行的服务器须要安装数字证书来代表本身身份的有效性,不然将会使得信息泄露。固然,在某些安全性要求极高的 B2B(Business to Business)应用,服务器端也须要对客户端的身份进行验证,这时客户端也须要安装数字证书以保证通讯时服务器能够辨别出客户端的身份,验证过程相似于服务器身份的验证过程。另外,在一些电子商务的应用中,可能还会使用到电子签名,或者为了信息交换的更加安全,会增长电子签名和消息校验码(MAC)。而在一般状况下,浏览器都会经过交互的方式来完成上述的通讯过程,下面在 Linux 中对 Apache 采用 SSL 也会做详细地介绍。
安装 SSL
虽然 Apache 服务器不支持 SSL,但 Apache 服务器有两个能够自由使用的支持 SSL 的相关计划,一个为 Apache-SSL,它集成了 Apache 服务器和 SSL,另外一个为 Apache+mod_ssl,它是经过可动态加载的模块 mod_ssl 来支持 SSL,其中后一个是由前一个分化出的,并因为使用模块,易用性很好,所以使用范围更为普遍。还有一些基于 Apache 并集成了 SSL 能力的商业 Web 服务器,然而使用这些商业 Web 服务器主要是北美,这是由于在那里 SSL 使用的公开密钥的算法具有专利权,不能用于商业目的,其余的国家没必要考虑这个专利问题,而能够自由使用 SSL。
Apache+mod_ssl 依赖于另一个软件:OpenSSL,它是一个能够自由使用的 SSL 实现,首先须要安装这个软件。用户能够从网站 http://www.openssl.org/source/ 上下载 Linux 下 OpenSSL 的最新稳定版本:openssl-1.0.1c.tar.gz。
下载源代码安装包后,使用以下的步骤安装便可:
(1)用 openssl-1.0.1c.tar.gz 软件包安装 OpenSSL 以前,首先需要对该软件包进行解压缩和解包。用如下命令完成软件包的解压缩和解包:
#tar xvfz openssl-1.0.1c.tar.gz
(2)解压缩后,进入源码的目录 openssl-1.0.1c ,并使用配置脚本进行环境的设置。相应的命令为:
1 2 3 4 5 |
|
(3)在执行 ./configure 以后,配置脚本会自动生成 Makefile。若是在设置的过程当中没有任何的错误,就能够开始编译源码了。相应的命令及其显示结果以下:
1 |
|
安装好 OpenSSL 以后,就能够安装使用 Apache+mod_ssl 了。然而为了安装彻底正确,须要清除原先安装的 Apache 服务器的其余版本,而且还要清除全部的设置文件及其缺省设置文件,以免出现安装问题。最好也删除 /usr/local/www 目录(或改名),以便安装程序能创建正确的初始文档目录。若是是一台没有安装过 Apache 服务器的新系统,就能够忽略这个步骤,而直接安装 Apache+mod_ssl 了。
启动和关闭 SSL
启动和关闭该服务器的命令以下所示:
此时使用 start 参数为仅仅启动普通 Apache 的 httpd 守护进程,而不启动其 SSL 能力,而 startssl 才能启动 Apache 的 SSL 能力。若是以前 Apache 的守护进程正在运行,便须要使用 stop 参数先中止服务器运行。
在采用 OpenSSL 进行 Apache 通讯加密前,须要先产生与加密相关的认证凭证(也就是证书),以下步骤所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
通过上述步骤后,将会产生三个文件 apache.csr, apache.key 和 apache.crt,而后把这三个文件拷贝到 /etc/httpd/conf/ca 目录下便可。
而后,就能够启动 Mozilla、IE 或其余支持 SSL 的浏览器,输入 URL 为:https://ssl_server/来查看服务器是否有相应,https 使用的缺省端口为 443,若是一切正常,服务器将会返回给客户端证书,由客户端进行验证而且判断,是否接受该证书并进行下一步的通讯过程。
下面以 Linux 下的 Mozilla Firefox 浏览器为例,来简要说明使用 Apache+SSL 服务器的过程。首先,图 5 给出了查看和验证该证书的相关提示;最后,图 6 则给出了证书验证成功后,采用 SSL 进行保密传输的具体界面示意:
图 5. 验证证书示意
图 6. 证书经过验证,正常通讯开始
日志文件是用户管理和监控 Apache 安全的很是好的第一手资料,它清晰地记录了客户端访问 Apache 服务器资源的每一条记录,以及在访问中出现的错误信息,能够这样说,Apache 能够记录 Web 访问中感兴趣的几乎全部信息。
当运行 Apache 服务器时生成 4 个标准的日志文件:
其中比较常见的是访问日志(access_log)和错误日志(error_log),其中传输日志和 cookie 日志被 Apache 2.0 以上的版本丢弃,因此本文不讨论这两种日志。固然,若是使用 SSL 服务的话,还可能存在 ssl_access_log、ssl_error_log 和 ssl_request_log 三种日志文件。
另外,值得注意的是:上述几种日志文件若是长度过大,还可能生成注入 access_log.1,error_log.2 等的额外文件,其格式与含义与上述几种文件相同,只不过系统自动为其进行命名而已。
Apache 中提供以下 4 条与日志相关的配置指令:
在上述几个文件当中,除了 error_log 和 ssl_error_log 以外,全部日志文件以由 CustomLog 和 LogFormat 指令指定的格式生成。这些指令在 httpd.conf 文件中出现。使用 LogFormat 指令能够定义新的日志文件格式:
1 |
|
假定使用的是 common 日志格式或者 combined 日志格式,这两种格式都在默认的配置文件中定义。表 1 列出了 LogFormat 语句可使用的变量:
表 1. LogFormat 语句的变量
变 量 | 含 义 |
---|---|
%b | 发送字节,不包括 HTTP 标题 |
%f | 文件名 |
%{VARIABLE}e | 环境变量 VARIABLE 的内容 |
%h | 远程主机 |
%a | 远程 IP 地址 |
%{HEADER}i | HEADER 内容;发送到服务器的请求的标题行 |
%l | 远程登陆名(若是提供该值,则从 identd 得到) |
%{NOTE}n | 来自另外一个模块的 NOTE 通知的内容 |
%{HEADER}o | HEADER 的内容,回复中的标题行 |
%p | 服务器服务于请求的规范端口 |
%P | 服务于请求的子进程的 ID |
%r | 请求的第一行 |
%s | 状态。对于内部重定向的请求,该状态为初始请求—最后是 %>s |
%t | 时间,格式为 common 日志格式中的时间格式 |
%{format}t | 时间,格式由 format 给出。能够是 strftime(3)格式 |
%T | 服务请求花费的时间,以秒计 |
%u | 来自 auth 的远程用户;若是返回的状态(%s)为 401 则多是假的 |
%U | 请求的 URL 路径 |
%v | 服务于该请求的服务器的规范 ServerName |
在每一个变量中,能够在前面设置一个条件,决定是否显示该变量。若是不显示,则显示 -。这些条件是数值返回值列表的形式。另外,还可使用 CustomLog 指令指定日志文件的位置和格式。若是没有指定日志文件的绝对路径,则日志文件的位置假定为相对于 ServerRoot。下面是 httpd.conf 文件中指定日志文件的语句:
1 2 3 4 5 6 7 8 9 10 |
|
通常说来,Apache 中的错误日志记录等级有如表 2 所示的八类:
表 2. 错误日志记录的等级
紧急性 | 等级 | 解释 |
---|---|---|
1 | Emerg | 出现紧急情况使得系统不可用 |
2 | Alert | 须要当即引发注意的情况 |
3 | Crit | 危险状况的警告 |
4 | Error | 除上述 3 种状况以外的其余错误 |
5 | Warn | 警告信息 |
6 | Notice | 须要引发注意的状况,不如第 4 和第 5 类重要 |
7 | Info | 须要报告的通常消息 |
8 | Debug | 运行于 debug 模式的程序产生的消息 |
另外,在 Apache 中,将访问日志分为以下 4 类:
在实际的使用过程当中,因为综合日志格式有效地结合了其余 3 种日志格式和信息,因此在配制访问日志时,能够有两种方式:
(1)分别使用 3 个文件进行分别记录,相应配置示例以下:
1 2 3 4 5 6 |
|
(2)使用一个综合文件进行记录,相应配置示例以下:
1 2 3 |
|