www.hj8828.com 1

第二章 安装

ModSecurity是一个免费、开源的Apache模块,可以充当Web应用防火墙WAF)。它有着丰富功能、强大的社区以及可供选择的商业支持,因而对任何提供非静态内容、需要审查的生产型Apache
Web服务器来说必不可少。

    在安装ModSecurity之前,您需要决定是否要从源代码编译它,还是使用二进制版本——要么是包含在您的操作系统中,要么是由第三方生成的。每个选项都有优点和缺点,如表2.1所列。

Web服务器软件安装顺序:Mysql –>Apache(httpd) –> PHP
Apache下载地址:

ModSecurity的主要功能在于,提供可靠的保护,远离各种网上威胁。它不是将安全重心偏离应用程序,而是增添了全局级别的功能。想对它进行配置,只需为客户机与服务器之间通信的每一个部分用条件和操作来指定规则,这些部分包括请求头、请求主体、响应头和响应主体。因而,ModSecurity可以预防针对Web服务器、PHP、Perl和ASP等解释器以及Web应用程序发动的攻击。

www.hj8828.com 1

解压后进入解压目录,执行:

ModSecurity可以比软件开发商先行一步,缓解零日攻击、针对安全漏洞提供保护,最近它就运用规则有效地防范了Apache字节范围头Range
Header)拒绝服务安全漏洞和Java浮点值拒绝服务攻击。

     
在某些情况下,你没有选择的余地。例如,如果您已经从源代码安装了Apache,那么您也需要从源代码中安装ModSecurity(当然,您将能够重用系统包)。以下的问题可以帮助你做出决定:

./configure –prefix=/home/apache –enable-so –with-mysql=/home/mysql
–enable-track-vars –enable-mods-shared=all –enable-cache
–enable-disk-cache –enable-mem-cache –enable-rewrite
–with-mpm=worker
make
make install

ModSecurity在检查完整通信流的同时,还能够将它记入日志,这意味着该软件可用于审查和排除故障。全面日志功能给Web服务器加大了开销,所以只有当问题需要调试时,才通常开启该功能。不过,全面日志和审查)在一些高度重视安全的企业必不可少。

•你打算认真使用ModSecurity吗?

至此,Apache主程序安装完毕!Apache的主程序会被安装在/home/apache/ 下

一旦ModSecurity遇到了匹配的条件,就能采取极其严格的操作。这些操作可能是破坏性的,比如阻止事务,也可能是非破坏性的,比如将数据记入日志。一旦条件符合,它就能执行Linux命令,这大大扩展了ModSecurity的功能,并且为它提供了Linux用于处理事务的所有能力。它可以将规则串联起来,适用于更复杂的条件。它的会计算法可以用来取代ModEvasive,阻止数量过多的请求和拒绝服务攻击。

•从源代码中编译程序是否合适?

安装完毕后,Apache并不会关机后自动启动,需要手工进行一些设置:
先将apachectl这个文件复制到/etc/init.d下,并更名为httpd
cp /home/apache/bin/apachectl /etc/init.d/httpd
然后编辑此文件,kate /etc/init.d/httpd
并在#!/bin/sh下加入以下几句
# add for chkconfig
# chkconfig: 2345 70 30
# descrīption: Activate/Deactive Apache Web Server
# processname: httpd
保存后退出。
2345是指apache的运行级别,即在2345这4种模式下都可以运行,234都是文本界面,5就是图形界面X
70是指apache的启动顺序号,如果别的程序的启动顺序号比70小,比如34,65,则需要等这些程序都启动以后,才启动apache。建议将apache的启动顺序排在mysql之后!
30是指系统关闭时,apache的停止顺序号。
最后执行 chkconfig –add httpd
,将apache的自启动文件加到rc.d下的对应目录下,只有这样,Linux才能正确完成开机自启动。

ModSecurity的安装

•你有足够的时间花在编译和连续维护一个定制的程序上吗?


只要从基于Debian的发行版的官方存储库下载,即可获得ModSecurity。如果是CentOS及基于红帽的其他发行版,ModSecurity存在于EPEL存储库
6中如何来安装:

•您是否需要更改ModSecurity或编写自己的扩展?

为了优化Apache的性能,我们需要对worker.c这个模块进行配置。不同配置、不同流量的服务器需要有不同的设置方式,以达到性能最优化!
kate /home/apache/conf/httpd.conf
在底部加入以下选项(需要在<VirtualHost>
……</VirtualHost>之前)

  1. 确保httpd和httpd-devel连同它们的所有依赖项都已安装。

普通用户通常应尽量使用二进制包(在大多数分布情况下都可用)。

<IfModule worker.c>
ServerLimit 20
#服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
ThreadLimit 200
#每个子进程可配置的线程数上限。这个指令设置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是”64″.
StartServers 5
#服务器启动时建立的子进程数,默认值是”3″。
MinSpareThreads 50
#最小空闲线程数,默认值是”75″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads 250
#
设置最大空闲线程数。默认值是”250″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于
MinSpareThreads加上ThreadsPerChild的和
MaxClients 2000
#
允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值是”400″,16
(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加
ServerLimit的值。
ThreadsPerChild 100
#每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild 10000
#设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。
#将MaxRequestsPerChild设置成非零值有两个好处:
#1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
#2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
</IfModule>

2.
启用Apache中的unique_id_module。为此,编辑文件/etc/httpd/conf/httpd.conf,取消含有LoadModule
unique_id_module
modules/mod_unique_id.so的这一行的注释。你必须重新装入Apache,变更才会生效。

2.1  从源代码安装

为了加快客户端的页面读取速度,我们需要安装配置mod_deflate这个网页压缩模块。该模块已被Apache
2.x内置,不需要重新安装,可直接在/home/apache/conf/httpd.conf里进行配置。
kate /home/apache/conf/httpd.conf
加入以下选项

3.
从该项目网站

当我们构建专用的反向代理安装时,我们倾向于从源代码构建所有的东西,因为这允许我们访问最新的Apache和ModSecurity版本,并且在我们想要的时候更容易调整元素(通过更改Apache或ModSecurity的源代码)。

#启用mod_deflate这个网页压缩模块
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
#以下三句是启用deflate的日志
#DeflateFilterNote ratio
#LogFormat “%v %h %l %u %t “%r” %>s %b “%{Referer}i”
“%{User-Agent}i”” (%{ratio}n) deflate
#CustomLog logs/deflate_log deflate
#以上三句是启用deflate的日志
<Location />
# 插入过滤器
SetOutputFilter DEFLATE
# Netscape 4.x 有一些问题…
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 有更多的问题
BrowserMatch ^Mozilla/4.0[678] no-gzip
# MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch MSIE !no-gzip !gzip-only-text/html
# 不压缩图片
SetEnvIfNoCase Request_URI
.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary
</Location>

4.
抽取已下载的软件包,进入到刚创建的目录modsecurity-apache_2.x.x,其中的x.x是ModSecurity的最新分支。

2.1.1下载发布

</IfModule>

为了防止恶意用户对Apache进行攻击,我们需要安装mod_security这个安全模块

mod_security 1.9.x模块的下载与安装

下载地址:

建议使用1.9.x,因为2.x的配置指令与1.x完全不同,解压后进入解压目录,执行:

/home/apache/bin/apxs -cia mod_security.c

编译完成后,/home/apache/modules下会生成一个mod_security.so文件

然后kate /home/apache/conf/httpd.conf

加入以下选项(如果没有的话)

#启用mod_security这个安全模块
LoadModule security_module modules/mod_security.so
(这一句通常会被自动加入)
<IfModule mod_security.c>
# 打开过滤引擎开关。如果是Off,那么下面这些都不起作用了。
SecFilterEngine On
# 把设置传递给字目录
SecFilterInheritance Off
# 检查url编码
SecFilterCheckURLEncoding On
# 检测内容长度以避免堆溢出攻击
#SecFilterForceByteRange 32 126
#
日志的文件和位置。一定要先建立好目录,否则apache重新启动的时候会报错。
SecAuditLog logs/audit_log
# debug的设置
#SecFilterDebugLog logs/modsec_debug_www.hj8828.com,log
#SecFilterDebugLevel 1
#当匹配chmod,wget等命令的时候,重新定向到一个特殊的页面,让攻击者知难而退
SecFilter chmod redirect:
SecFilter wget redirect:
#检测POST数据,注意,请甚用这个开关,可能会导致一些post页面无法访问。详细的信息,请察看www.modsecurity.org的文档,其中有详细的post编码要求。
#SecFilterScanPOST Off
# 缺省的动作
SecFilterDefaultAction “deny,log,status:406”
# 重新定向用户
#SecFilter xxx redirect:
# 防止操作系统关键词攻击
SecFilter /etc/*passwd
SecFilter /bin/*sh
# 防止double dot攻击
SecFilter “../”
# 防止跨站脚本(CSS)攻击
SecFilter “<( | )*scrīpt”
# Prevent XSS atacks (HTML/Javascrīpt injection)
SecFilter “<(.| )+>”
# 防止sql注入式攻击
SecFilter “delete[[:space:]]+from”
SecFilter “insert[[:space:]]+into”
SecFilter “select.+from”
#重定向exe和asp请求
SecFilterSelective REQUEST_URI “.exe”
“redirect:”
SecFilterSelective REQUEST_URI “.asp”
“redirect:”
#下面是限制了upload.php文件只能用来上传jpeg.bmp和gif的图片
#<Location /upload.php>
#SecFilterInheritance On
#SecFilterSelective POST_PAYLOAD “!image/(jpeg|bmp|gif)”
#</Location>
#伪装服务器标识
SecServerSignature “Microsoft-IIS/6.0”
</IfModule>

  1. 完成安全源软件包的标准步骤:配置、编译和安装。

要下载ModSecurity,请访问其网站或GitHub项目页面。您将需要源代码的主要发行版和它的加密签名:

保存后重启apache即可!

为了防止Web服务器被DDoS攻击,我们需要安装mod_evasive这个防DDoS的模块
mod_evasive 1.10.x防DDoS模块的下载与安装

下载地址:

解压后进入解压目录,执行
/home/apache/bin/apxs -cia mod_evasive20.c

编译完成后,/home/apache/modules下会生成一个mod_evasive20.so文件

然后kate /home/apache/conf/httpd.conf

加入以下选项(如果没有的话)

#启用mod_evasive for Apache 2.x防DDoS模块
LoadModule evas

–Apache(httpd) —
PHP Apache下载地址:
解压后进入解压目录,执行: ./configure –prefix=/h…

6.
如果上述命令成功完成执行,ModSecurity就会安装到系统上。一个新的Apache模块会出现在/etc/httpd/modules/mod_security2.so中,而ModSecurity的可执行文件会出现
在/usr/local/modsecurity/bin/中。

$ wget

7.
要装入新的ModSecurity模块,编辑Apache的配置文件/etc/httpd/conf/httpd.conf。寻找LoadModule,找到装入所有模块的那部分。在该部分的末尾,添加LoadModule
security2_module modules/mod_security2.so。

$ wget

  1. 重启Apache。运行apachectl -D DUMP_MODULES |grep
    security,确保ModSecurity已正确安装,寻找输出中的security2_module
    (shared)。

在做其他事情之前先验证签名,确保你刚刚下载的包不包含第三方植入的特洛伊木马,并且在传输过程中没有被损坏。

至此,ModSecurity已安装,但还没有被启用或配置,现在不妨对它进行配置。

$ gpg –verify modsecurity-2.9.1.tar.gz.asc

gpg: Signature made Wed 09 Mar 2016 19:48:15 CET using DSA key ID
E8B11277

gpg: Can’t check signature: public key not found

您的第一次尝试可能没有提供预期的结果,但是可以通过从一个密钥服务器导入引用的密钥轻松地解决这个问题:

$ gpg –keyserver pgp.mit.edu –recv-keys E8B11277gpg: requesting key
E8B11277 from hkp server pgp.mit.edugpg: key E8B11277: public key
“Felipe Zimmerle da Nobrega Costa …” imported

gpg: 3 marginal(s) needed, 1 complete(s) needed, classic trust model

gpg: depth: 0 valid:3 signed:5 trust: 0-, 0q, 0n, 0m, 0f, 3u

gpg: depth: 1 valid:5 signed:5 trust: 2-, 0q, 0n, 2m, 1f, 0u

gpg: depth: 2 valid:4 signed:0 trust: 1-, 0q, 0n, 0m, 3f, 0u

gpg: next trustdb check due at 2018-09-26

gpg: Total number processed: 1

gpg:imported: 1

现在你可以再试一次:

$ gpg –verify modsecurity-2.9.1.tar.gz.ascgpg: Signature made Wed 09
Mar 2016 19:48:15 CET using DSA key ID E8B11277gpg: Good signature from
“Felipe Zimmerle da Nobrega Costa …”

gpg:aka “Felipe Zimmerle”gpg:aka “Felipe Costa”gpg:aka “Felipe Zimmerle
(gmail)”

gpg:aka “[jpeg image of size 7280]”

gpg:aka “[jpeg image of size 14514]”

gpg: WARNING: This key is not certified with a trusted signature!

gpg:There is no indication that the signature belongs to the owner.

Primary key fingerprint: 190E FACC A1E9 FA46 6A8E CD9C E6DF B08C E8B1
1277

前面代码片段中的警告可能看起来很严重,但通常不是问题;这与gpg希望你验证个人身份的方式有关。这个警告基本上告诉你,你从某个地方下载了斐利贝的钥匙,但你并不真正知道它是属于他的。就gpg而言,唯一能确定的方法就是在现实生活中与斐利贝见面,或者与认识他的人见面。如果你想了解更多,在维基百科上查一下信任网。

2.1.2从存储库下载

如果您希望处于最前沿,直接从GitHub存储库下载最新的开发版本(ModSecurity项目使用的源代码控制系统)是可行的。当你这样做的时候,你会得到新的功能,甚至是在他们正式发布之前的几个月就可获得最新功能。话虽如此,但我们称某些版本为“稳定”是有原因的。当您使用存储库版本的ModSecurity时,您需要接受没有任何保证可以确保它能够正常工作。

在安装ModSecurity的开发版本之前,您需要知道在哪里找到它。存储库由GitHub托管,可以通过浏览器查看。GitHub上的默认视图是主源代码树,它显示了最新的开发版本和最新的已被接受的更改。提议的更改可以通过pull请求或通过它们自己的分支来访问。这些活动分支有时可能包含一个未被主源代码所接受的特性或修复。如果您想下载一个发布候选版本或测试版本,您可以通过一个单独的子菜单访问这些存档。

一旦确定了要使用的ModSecurity版本的位置,就可以使用Git的克隆命令来获得它: