ModSecurity的配置
当你开始配置ModSecurity时,首先使用主配置文件/etc/httpd/conf/crs/modsecurity_crs_10_config.conf中的全局指令,比如SecRuleEngine,我在后面会详细探讨。不过,对于大多数配置而言,你可以用指令SecRule来创建安全规则。后者对ModSecurity进行微调,往往变得非常复杂。
ModSecurity规则示例看起来像这样:
SecRule Target Operator [Actions]
Target定义了要检查的对象——比如说REQUEST_URI。Operator表明了应该如何进行检查。可选的Actions指定了一旦条件满足,执行什么操作。
从ModSecurity入手并非易事,自行编写安全规则也并非易事。这就是为什么你应该一开始从开放式Web应用程序安全项目(OWASP)发行的核心规则集(https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project)入手。你可以对它进行定制,以满足自己的要求,但是这套规则集很可靠、很成熟,而且涵盖了许多流行的恶意攻击。尽管它不是特别针对Web应用程序,但有助于防范常见的黑客攻击手法。不过,它也会阻止正当请求,所以在部署时一定要小心,还需要定制。
创建另一个目录,里面只保存带规则的ModSecurity文件,比如/etc/httpd/conf/crs/。要告诉Apache包含来自该目录的所有ModSecurity配置指令,只需在配置文件(/etc/httpd/conf/httpd.conf)的末尾添加下面这一行:
Include /etc/httpd/conf/crs/*.conf
将最新规则集下载到临时目录,比如~/mod_security_test/。为此,你可以使用名为rules-updater.pl的Perl脚本来完成这项任务;在默认情况下,你可以在/usr/local/modsecurity/bin/中找到这段脚本。它要求使用Perl模块Crypt::SSLeay,你可以这样来运行它:
/usr/local/modsecurity/bin/rules-updater.pl -rhttp://www.modsecurity.org/autoupdate/repository/ -prules -Smodsecurity-crs
上面这个命令下载带版本号的压缩文件——目前版本是modsecurity-crs_2.2.2.zip,以获得规则。在临时目录里面抽取该压缩文件(unzip modsecurity-crs_2.2.2.zip),然后拷贝ModSecurity的主配置文件,名为modsecurity_crs_10_config.conf.example,并拷贝base_rules中的基本规则:
cp ~/mod_security_test/modsecurity_crs_10_config.conf.example /etc/httpd/conf/crs/modsecurity_crs_10_config.conf
cp ~/mod_security_test/base_rules/* /etc/httpd/conf/crs/
除了基本规则外,核心规则集还提供了针对特定应用程序的规则,比如~/mod_security_test/slr_rules目录中的那些规则。后者专门是为了保护流行的Web应用程序,如Joomla和WordPress。不过,在运用任何特定或试验的规则时,要格外小心,因为它们可能会破坏客户机与Web服务器之间的正当通信。
要开始使用刚安装的规则,编辑文件/etc/httpd/conf/crs/modsecurity_crs_10_config.conf,寻找指令SecRuleEngine,该指令确定了是否执行ModSecurity规则、如何执行。它有三种模式:On(启用)、Off(禁用)和DetectionOnly,后者仅仅记录了规则何时被触发,而不实际执行规则。这第三个选项非常适合从ModSecurity入手,或者确保顺畅无阻地部署新的ModSecurity规则。除了指定这个设置外,还要指定SecDataDir,这是用于存储持续性数据IP地址和会话的目录。存储该数据的一个好地方是/tmp;就在SecRuleEngine设置之后指定SecDataDir /tmp。