来源:modsecurity handbook second edition
在安装ModSecurity之前,您需要决定是否要从源代码编译它,还是使用二进制版本——要么是包含在您的操作系统中,要么是由第三方生成的。每个选项都有优点和缺点,如表2.1所列。
在某些情况下,你没有选择的余地。例如,如果您已经从源代码安装了Apache,那么您也需要从源代码中安装ModSecurity(当然,您将能够重用系统包)。以下的问题可以帮助你做出决定:
•你打算认真使用ModSecurity吗?
•从源代码中编译程序是否合适?
•你有足够的时间花在编译和连续维护一个定制的程序上吗?
•您是否需要更改ModSecurity或编写自己的扩展?
普通用户通常应尽量使用二进制包(在大多数分布情况下都可用)。
2.1 从源代码安装
当我们构建专用的反向代理安装时,我们倾向于从源代码构建所有的东西,因为这允许我们访问最新的Apache和ModSecurity版本,并且在我们想要的时候更容易调整元素(通过更改Apache或ModSecurity的源代码)。
2.1.1下载发布
要下载ModSecurity,请访问其网站或GitHub项目页面。您将需要源代码的主要发行版和它的加密签名:
$ wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
$ wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz.asc
在做其他事情之前先验证签名,确保你刚刚下载的包不包含第三方植入的特洛伊木马,并且在传输过程中没有被损坏。
$ 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的克隆命令来获得它:
$ git clone https://github.com/SpiderLabs/ModSecurity.git modsecurity-master
在modsecurity主文件夹中,您可以使用与下载版本时获得的内容相同的内容。不过,有些文件需要首先通过一个特殊的命令生成。此外,文档可能不同步。主文档保存在一个wiki中,其中包含了发布的wiki副本。
2.1.3在Unix下安装
在开始编译ModSecurity之前,您必须确保已经安装了完整的开发工具链。请参考您正在使用的操作系统的文档。如果您要将ModSecurity添加到操作系统提供的Apache中,您可能还需要安装特定的Apache开发包。例如,在Debian和Ubuntu中,您需要使用apache2-dev。
如果已经安装了Apache,则只需要处理libcurl、libxml2、Lua、ssdeep和YAJL。通过从源代码编译的Apache,您还需要PCRE库。Apache不再与它捆绑在一起。要解决这个问题,请分别安装PCRE,然后告诉Apache使用外部副本;我将在本节后面解释如何做。
如果您是从源代码安装,请访问包的web站点并下载并安装tarball。如果您使用的是托管包,那么您只需要确定调用了哪些缺失的包。在Debian家族的发行版中,以下命令安装缺失的包:
# apt-get install libcurl3-dev liblua5.3-dev libxml2-dev libfuzzy-dev libyajl-dev
请参阅您的平台使用的包管理系统的文档,以确定如何搜索包数据库。
请注意
用于远程登录的Libcurl,可以被编译为使用OpenSSL或GnuTLS。建议您使用OpenSSL,因为当使用GnuTLS时,存在关于远程登录问题的投诉。APR-Util通常是在不支持加密操作的情况下编译的。如果您想要使用带有参数密码的指令秘密,您需要自己编译APR-Util。
从这里开始,这个过程应该很简单。如果您克隆了GitHub存储库并没有下载一个版本,那么您需要生成配置脚本,该脚本用于准备编译过程:
$ ./autogen.sh
如果您下载了一个版本,那么您可以跳过这一步并直接执行以下命令:
$ ./configure
$ make
这组命令假设您不需要任何编译时选项。如果有,请参见下面的小节。
请注意
在编译后运行额外的测试(make test和make test-regression)始终是一个好主意,在使用ModSecurity的开发版本时尤其是个好主意。如果您有任何问题,您希望在安装之前发现他们,而不是之后。
在构建完ModSecurity之后,还需要进行安装:
$ sudo make install
该命令将模块添加到Apache安装中,但不激活它;你必须手动操作。(当您这样做时,请确认是否启用了mod_unique_id;ModSecurity需要它。)该命令还将创建一个文件夹(默认为/usr/local/modsecurity),并存储其中的各种运行时文件。以下是你得到的:
bin/
mlogc
mlogc-batch-load.pl
rules-updater.pl
lib/
mod_security2.so
编译时选择
前一节的配置示例假设这些依赖项都是作为系统库安装的。它还假设configure脚本将自己处理所有事情。它可能会,也可能不会,但很有可能你偶尔需要做一些不同的事情;这就是表2.3中列出的编译时选项派上用场的地方。
对于ModSecurity的审计日志格式,还有一些其他选项。它们很少在实践中使用,但请查看configure脚本以获得概述。
自定义编译Apache安装
使用带有定制编译版本的Apache的ModSecurity非常简单。在Apache 2.2中,曾经出现过PCRE和mod_unique_id模块在默认情况下无法启用的问题,但是这些问题都是在Apache 2.4中解决了。
要配置ModSecurity,可以使用- with_apxs编译时选项来指定Apache安装的位置。在下面的例子中,我假设Apache安装在/usr/local/apache:
$ ./configure \
--with-apxs=/usr/local/apache/bin/apxs
从这里开始,按照上一节的描述安装ModSecurity。
在安装了Apache和ModSecurity之后,您应该确认两个产品都链接到同一个PCRE库,使用ldd:
$ ldd /usr/local/apache/bin/httpd | grep pcre
libpcre.so.3 => /lib64/libpcre.so.3 (0x00007ff2a11fd000)
编译ModSecurity时,应该得到相同的结果:
$ ldd /usr/local/apache/modules/mod_security2.so | grep pcre
libpcre.so.3 => /lib64/libpcre.so.3 (0x00007f85995c5000)
提示
Mac OS X没有ldd,但是您可以通过运行otool与选项-L来获得等价的功能。如果您确实遇到了瓶颈,请考虑使用install_name_tool在ModSecurity编译后更改库依赖项。
很可能有一个配置,在这个配置中,Apache使用其绑定的PCRE,而ModSecurity使用系统上可用的另一个PCRE版本。
ModSecurity报告在启动时检测到的库版本号(在错误日志中),并将它们与编译时使用的数据进行比较。如果发现不匹配,将发出一个或多个警告。这个特性对于解决各种库冲突(可能发生在奇怪的情况下)来说特别方便。
ModSecurity for Apache/2.9.1 (http://www.modsecurity.org/) configured.
ModSecurity: APR compiled version="1.5.2"; loaded version="1.5.2"
ModSecurity: PCRE compiled version="8.39 "; loaded version="8.39 2016-06-14"
ModSecurity: LUA compiled version="Lua 5.2"
ModSecurity: YAJL compiled version="2.0.4"
ModSecurity: LIBXML compiled version="2.9.1"
2.2从二进制文件安装
正如前面所讨论的,使用ModSecurity的二进制版本通常是最简单的选择,因为它是有效的。不幸的是,您在安装时所获得的便利,有时会被限制在较旧版本上。此外,packager通常不包括mlogc,这有助于远程日志集中化。一般来说,如果您对模块的编译方式没有问题,那么您就可以使用二进制包了。
2.3Fedora Core, CentOS,红帽企业Linux。
如果您是Fedora用户,您可以直接从官方发行版安装ModSecurity,使用yum:
# yum install mod_security
在CentOS和Red Hat Enterprise Linux上,您必须使用来自企业Linux的额外软件包(EPEL)的包,这是Fedora社区的一部分。安装过程与Fedora相同。
2.4Debian和Ubuntu
Debian是第一个包含ModSecurity的发行版。Alberto Gonzalez Iniesta一直是Debian的ModSecurity的长期支持者,在他自己的(非官方的)存储库中支持ModSecurity,后来成为官方的包装器。
如果您运行的是Debian家族的版本,安装很简单:
# apt-get install libapache2-mod-security2
此单个命令将下载软件包并安装,然后激活Apache配置中的模块。
请注意
不要忘记Debian使用了一个特殊的命名配置文件系统来管理Apache模块和站点。要激活和停用模块,分别使用a2enmod和a2dismod。为了管理Apache,使用apache2ctl。
2.5在Windows上安装
ModSecurity早在2003年就被移植到Windows上,此后一直运行良好。Windows二进制包的ModSecurity由Steffen Land维护,他管理Apache Lounge,这个社区是为那些在Windows上运行Apache的人提供的,除了ModSecurity之外,Steffen还维护了他自己的Apache版本,以及许多第三方模块。
您可能想在Windows上运行。ModSecurity二进制包一直都是最新的,所以如果你想运行最新版本,你会遇到一点麻烦。下载包括ModSecurity和mlogc。
请注意
虽然可以使用其他地方生成的Apache版本来运行Steffen的ModSecurity二进制文件,但您实际上应该只使用那些打算一起使用的单个位置的包。否则,您可能会遇到异常行为和web服务器崩溃。
安装很简单。首先,下载包并将动态库复制到模块/文件夹(Apache安装)中。然后,修改Apache配置以激活ModSecurity:
LoadModule security2_module modules/mod_security2.so
您还需要激活mod_unique_id。这个模块可能没有被激活,但是在您的配置中应该已经有一个注释了的行。你只需要找到它并取消注释。如果没有,只需添加以下内容:
LoadModule unique_id_module modules/mod_unique_id.so
2.6总结
安装ModSecurity从来都不是件容易的事,因为它包含了许多操作系统和发行版。虽然从源代码安装可以保证访问最新版本,也可以访问尚未发布的代码,但是如果您不习惯使用它,它可能会很费时间;每个人都有不同的习惯。使用提供的版本有一些事情需要说明,不必考虑升级(并节省升级所需的时间)。
在下一章中,我将解释每一个配置选项,教你如何设置每一个选项,一步一步地,让一切都是你喜欢的方式。