Apache Web服务器加固和安全指南
一个保护和加固Apache HTTP服务器的实用指南。
Web服务器是基于Web的应用程序的关键部分。Apache Web服务器通常位于网络边缘,因此它成为最容易受到攻击的服务之一。
默认配置提供了很多敏感信息,这可能会帮助黑客为攻击应用程序做准备。大多数Web应用程序攻击是通过XSS攻击、信息泄漏、会话管理和SQL注入攻击进行的,这是由于弱编程代码和未对Web应用程序基础设施进行消毒处理。
感兴趣的研究指出,52%的扫描应用程序存在高漏洞。
在本文中,我将介绍一些在Linux平台上保护Apache HTTP服务器的最佳实践。
以下内容在Apache 2.4.x版本上进行了测试。
- 假设你已经在UNIX平台上安装了Apache。如果没有,你可以查看链接1。
- 我将在本指南中将Apache安装目录称为/opt/apache。
- 在进行任何修改之前,建议您备份现有的配置文件。
受众
本指南适用于中间件管理员、应用支持、系统分析师或任何工作或渴望学习加固和安全指南的人员。
必须具备Apache Web服务器和UNIX命令的基本知识。
注意
您需要一些工具来检查一些实施验证的HTTP Headers。有两种方法可以做到这一点。
- 使用浏览器内置的开发者工具检查HTTP头。通常在网络选项卡下面
- 使用在线工具HTTP response header checker tool
删除服务器版本标识
我认为这是考虑的第一件事,因为你不希望暴露你使用的Web服务器版本。暴露版本意味着你在帮助黑客加快侦察过程。
默认配置将显示Apache版本和操作系统类型,如下所示。
- 转到$Web_Server/conf目录
- 使用vi编辑器修改httpd.conf
- 添加以下指令并保存httpd.conf
ServerTokens Prod
ServerSignature Off
- 重启Apache
ServerSignature
将从Apache生成的页面中删除版本信息。
ServerTokens
将Header更改为仅生产,即Apache
如下所示,版本和操作系统信息已经消失。
禁用目录浏览列表
禁用浏览器中的目录列表,这样访问者就看不到您在根目录或子目录下拥有的所有文件和文件夹。
让我们测试一下默认设置的样子。
- 转到$Web_Server/htdocs目录
- 创建一个文件夹并在其中创建一些文件
# mkdir test
# touch hi
# touch hello
现在,让我们尝试通过http://localhost/test访问Apache
正如您可以看到的,它显示了您拥有的所有文件/文件夹,我相信您不希望暴露这些信息。
- 转到$Web_Server/conf目录
- 使用vi打开httpd.conf
- 搜索目录并将Options指令更改为None或-Indexes
Options -Indexes
(或者)
Options None
- 重启Apache
注意:如果您的环境中有多个目录指令,您应该考虑对所有目录进行相同的操作。
现在,让我们尝试通过http://localhost/test访问Apache
正如您可以看到的,它显示了一个禁止访问的错误,而不是显示test文件夹列表。
Etag
它允许远程攻击者通过Etag头获取敏感信息,如inode号码、多部分MIME边界和子进程。
为了防止这种漏洞,让我们按照以下步骤实施。这是为了修复PCI合规性而需要的。
- 进入$Web_Server/conf目录
- 添加以下指令并保存httpd.conf文件
FileETag None
- 重新启动apache
以非特权帐户运行Apache
默认安装使用nobody或daemon运行。为Apache使用一个单独的非特权用户是好的。
这里的想法是在出现任何安全漏洞时保护其他正在运行的服务。
- 创建一个名为apache的用户和组
# groupadd apache
# useradd –G apache apache
- 将apache安装目录的所有权更改为新创建的非特权用户
# chown –R apache:apache /opt/apache
- 进入$Web_Server/conf目录
- 使用vi修改httpd.conf文件
- 查找User和Group指令,并更改为非特权帐户apache
User apache
Group apache
- 保存httpd.conf文件
- 重新启动Apache
查找正在运行的http进程,并确保它正在使用apache用户运行
# ps –ef |grep http
你应该看到有一个进程正在使用root运行。这是因为Apache正在监听80端口,必须使用root启动。
保护二进制和配置目录的权限
默认情况下,二进制和配置目录的权限是755,这意味着服务器上的任何用户都可以查看配置。您可以禁止其他用户进入conf和bin文件夹。
- 进入$Web_Server目录
- 更改bin和conf文件夹的权限
# chmod –R 750 bin conf
系统设置保护
在默认安装中,用户可以使用.htaccess覆盖Apache配置。如果你想阻止用户更改你的Apache服务器设置,可以在根级别添加AllowOverride
为None
,如下所示。
这必须在根级别进行。
- 进入$Web_Server/conf目录
- 使用vi打开httpd.conf文件
- 查找根级别的Directory
Options -Indexes
AllowOverride None
- 保存httpd.conf文件
- 重新启动Apache
HTTP请求方法
HTTP 1.1协议支持许多请求方法,可能并不需要所有的方法,其中一些方法具有潜在的风险。
通常,在Web应用程序中,您可能需要GET、HEAD、POST请求方法,可以在相应的Directory指令中进行配置。
默认配置支持HTTP 1.1协议中的OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT方法。
- 进入$Web_Server/conf目录
- 使用vi打开httpd.conf文件
- 查找Directory并添加以下内容
deny from all
- 重新启动Apache
禁用Trace HTTP请求
默认情况下,Apache Web服务器启用了Trace方法。
启用此选项可能允许跨站点跟踪攻击,并有潜在的给黑客窃取cookie信息的选项。让我们看一下默认配置的情况。
- 使用telnet连接到Web服务器IP和监听端口
- 发送TRACE请求,如下所示
Header set X-XSS-Protection "1; mode=block"
- Restart Apache
This will enable the X-XSS-Protection header and block any potential XSS attacks.
Content Security Policy (CSP)
Content Security Policy (CSP) is an additional layer of security that helps detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks.
- Go to $Web_Server/conf directory
- Open httpd.conf using vi and add following Header directive
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'none';"
- Restart Apache
This will set the Content-Security-Policy header with a default policy that only allows resources to be loaded from the same origin, and allows inline scripts and styles from the same origin. It also restricts the loading of objects from any source.
To enhance the security of your web server, it is recommended to implement these security measures along with other best practices for secure web development.
Header set X-XSS-Protection "1; mode=block"
- 重启 Apache
您可以看到,XSS-Protection已注入到响应头中。
禁用HTTP 1.0协议
当我们谈论安全性时,我们应该尽可能地保护。那么为什么要使用较旧的HTTP协议版本,让我们也禁用它们呢?
HTTP 1.0存在与会话劫持相关的安全漏洞。我们可以使用mod_rewrite模块来禁用它。
- 确保在httpd.conf文件中加载mod_rewrite模块。
- 启用RewriteEngine指令,并添加Rewrite条件以仅允许HTTP 1.1。
RewriteEngine On
RewriteCond %{THE_REQUEST} !HTTP/1.1$
RewriteRule .* - [F]
超时值配置
默认情况下,Apache的超时值为300秒,这可能成为慢速Loris攻击和DoS攻击的受害者。为了缓解这个问题,您可以将超时值降低到60秒。
- 进入$Web_Server/conf目录。
- 使用vi打开httpd.conf文件。
- 在httpd.conf中添加以下内容。
Timeout 60
SSL
使用SSL是您为Web应用程序添加的额外安全层。然而,默认的SSL配置会导致某些漏洞,所以您应该考虑调整这些配置。
SSL密钥
破解SSL密钥很困难,但并非不可能。这只是与计算能力和时间有关。
正如您可能已经知道的,使用一台2009年的个人电脑,大约需要73天的时间就可以破解一个2048位的密钥。
因此,密钥长度越长,破解SSL密钥就越复杂。大多数大型Web公司使用2048位密钥,如下所示,那我们为什么不呢?
- Outlook.com
- Microsoft.com
- Live.com
- Skype.com
- Apple.com
- Yahoo.com
- Bing.com
- Hotmail.com
- Twitter.com
您可以使用OpenSSL生成2048位的CSR,如下所示。
openssl req -out yaoweibin.csr -newkey rsa:2048 -nodes -keyout yaoweibin.key
这将生成一个CSR文件,您需要将其发送给一个证书颁发机构进行签名。一旦您收到签名的证书文件,可以将其添加到httpd-ssl.conf文件中。
SSLCertificateFile #由机构签署的证书
SSLCertificateChainFile #由机构提供的证书签发者
SSLCertificateKeyFile #您上面生成的密钥文件
- 重启Apache Web服务器,并尝试使用https访问URL。
SSL加密算法
SSL加密算法是在Internet上两台计算机之间用作密钥的一种加密算法。数据加密是将明文转换为加密的密码文本的过程。
根据您的Web服务器SSL加密算法的配置,数据加密将发生。因此,配置更强大且不易受攻击的SSL加密算法非常重要。
- 进入$Web_Server/conf/extra文件夹。
- 在httpd-ssl.conf中修改SSLCipherSuite指令,以仅接受更高级的加密算法。
SSLCipherSuite HIGH:!MEDIUM:!aNULL:!MD5:!RC4
- 保存配置文件并重新启动Apache服务器。
注意:如果您在SSL审计报告中有许多弱密码,您可以通过在开头添加!来快速拒绝它们。
禁用SSL v2和v3
SSL v2和v3存在许多安全漏洞,如果您正在进行渗透测试或符合PCI合规性要求,则应关闭发现安全问题以禁用SSL v2/v3。
任何SSL v2/v3通信都可能容易受到中间人攻击,从而允许数据篡改或泄露。
让我们实现Apache Web服务器,只接受最新的TLS并拒绝SSL v2/v3连接请求。
- 转到$Web_Server/conf/extra文件夹
- 修改httpd-ssl.conf中的SSLProtocol指令,如下所示,仅接受TLS 1.2+
SSLProtocol –ALL +TLSv1.2
完成SSL配置后,建议使用online SSL/TLS Certificate tool测试您的Web应用程序,以查找任何配置错误。
Mod Security
Mod Security是一个开源的Web Application Firewall,您可以与Apache一起使用。
它作为一个模块提供,您需要编译和安装它。如果您负担不起商业web application firewall,这将是一个很好的选择。
为了提供通用的Web应用程序保护,核心规则使用以下技术:
- HTTP保护 – 检测违反HTTP协议和本地定义的使用策略
- 实时黑名单查找 – 利用第三方IP声誉
- 基于Web的恶意软件检测 – 通过与Google安全浏览API的检查来识别恶意的Web内容。
- HTTP拒绝服务保护 – 防御HTTP洪水和慢速HTTP DoS攻击。
- 常见的Web攻击保护 – 检测常见的Web应用程序安全攻击
- 自动化检测 – 检测机器人,爬虫,扫描仪和其他恶意表面活动
- 与文件上传的AV扫描集成 – 识别通过Web应用程序上传的恶意文件。
- 跟踪敏感数据 – 跟踪信用卡使用并阻止泄漏。
- 木马保护 – 检测对木马的访问。
- 应用程序缺陷的识别 – 提示应用程序配置错误。
- 错误检测和隐藏 – 伪装服务器发送的错误消息。
下载和安装
在希望在其中使用Mod Security与Apache的服务器上,必须安装以下先决条件。如果其中任何一个不存在,那么Mod Security编译将失败。您可以在Linux或Centos上使用yum install安装这些软件包。
- apache 2.x或更高版本
- libpcre软件包
- libxml2软件包
- liblua软件包
- libcurl软件包
- libapr和libapr-util软件包
- 与Apache Web服务器捆绑的mod_unique_id模块
现在,让我们从here下载Mod Security的最新稳定版本2.7.5
- 将下载的文件传输到/opt/apache
- 解压缩modsecurity-apache_2.7.5.tar.gz
# gunzip –c modsecurity-apache_2.7.5.tar.gz | tar xvf –
- 进入解压后的文件夹modsecurity-apache_2.7.5
# cd modsecurity-apache_2.7.5
- 运行configure脚本,包括现有Apache的apxs路径
# ./configure –with-apxs=/opt/apache/bin/apxs
- 使用make脚本编译和安装
# make
# make install
- 安装完成后,您会在/opt/apache的modules文件夹中看到mod_security2.so
现在,您已经在现有的Apache Web服务器中安装了Mod Security模块。
配置
要在Apache中使用Mod Security功能,我们必须在httpd.conf中加载mod security模块。mod_unique_id模块是Mod Security的先决条件。
该模块为每个请求提供一个唯一标识符的环境变量,该标识符由Mod Security跟踪和使用。
- 在httpd.conf中添加以下一行以加载Mod Security模块,并保存配置文件
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule security2_module modules/mod_security2.so
- 重新启动Apache Web服务器
Mod Security现在已安装!
下一件你需要做的事是安装Mod Security核心规则,以充分发挥其功能。
最新的核心规则可以从以下链接免费下载。 https://github.com/SpiderLabs/owasp-modsecurity-crs/zipball/master
- 将下载的核心规则压缩包复制到/opt/apache/conf文件夹中
- 解压缩核心规则文件
- 你可能希望将文件夹重命名为简短且容易记住的名称。在此示例中,我将重命名为crs。
- 进入crs文件夹并将modsecurity_crs10_setup.conf.example重命名为modsecurity_crs10_setup.conf
现在,让我们启用这些规则,使其与Apache Web服务器一起正常工作。
- 在httpd.conf中添加以下内容
Include conf/crs/modsecurity_crs_10_setup.confInclude conf/crs/base_rules/*.conf
在上述配置中,我们加载Mod Security主配置文件modsecurity_crs_10_setup.conf和由Mod Security Core Rules提供的base_rules/*.conf基本规则,以保护Web应用程序。
- 重新启动Apache Web服务器
您已成功配置Mod Security与Apache!
干得好。现在,Apache Web服务器受到Mod Security Web应用程序防火墙的保护。
入门
让我们从Mod Security的一些关键配置开始,以加强和保护Web应用程序。
在本节中,我们将在/opt/apache/conf/crs/modsecurity_crs_10_setup.conf中进行所有配置修改。
我们将在本节中将/opt/apache/conf/crs/modsecurity_crs_10_setup.conf简称为setup.conf,以举例说明。
重要的是要了解OWASP免费提供了哪些规则。OWASP提供了两种类型的规则。
基本规则 – 这些规则经过了严格测试,可能误报率较低。
实验性规则 – 这些规则是为了实验目的而提供的,可能会有较高的误报。在将其用于生产环境之前,重要的是在UAT中进行配置、测试和实施。
可选规则 – 这些可选规则可能不适用于整个环境。根据您的要求,您可以使用它们。
如果您正在寻找CSRF、用户跟踪、会话劫持等保护措施,那么您可以考虑使用可选规则。我们在从OWASP下载页面下载的crs zip文件解压缩后,会有基本规则、可选规则和实验规则。
这些规则配置文件可以在crs/base_rules、crs/optional_rules和crs/experimental_rules文件夹中找到。让我们熟悉一些基本规则。
- modsecurity_crs_20_protocol_violations.conf:规则用于保护免受协议漏洞的影响,例如响应拆分、请求走私、使用不允许的协议(HTTP 1.0)。
- modsecurity_crs_21_protocol_anomalies.conf:规则用于保护免受请求头中缺少Host、Accept、User-Agent等的请求的影响。
- modsecurity_crs_23_request_limits.conf:该规则依赖于应用程序特定的请求大小、上传大小、参数长度等。
- modsecurity_crs_30_http_policy.conf:用于配置和保护允许或禁止的方法,如CONNECT、TRACE、PUT、DELETE等。
- modsecurity_crs_35_bad_robots.conf:检测恶意机器人。
- modsecurity_crs_40_generic_attacks.conf:用于保护免受操作系统命令注入、远程文件包含等的影响。
- modsecurity_crs_41_sql_injection_attacks.conf:该规则用于保护免受SQL和盲SQL注入请求的影响。
- modsecurity_crs_41_xss_attacks.conf:保护免受跨站脚本请求的影响。
- modsecurity_crs_42_tight_security.conf:检测和保护目录遍历。
- modsecurity_crs_45_trojans.conf:该规则用于检测通用文件管理输出、HTTP后门页面上传、已知签名。
- modsecurity_crs_47_common_exceptions.conf:用作异常机制,以去除可能遇到的常见误报,例如Apache内部虚拟连接、SSL pinger等。
日志记录
日志记录是首要配置的一项,可以记录Mod Security的操作情况。有两种类型的日志记录可用:调试日志和审计日志。
调试日志:用于复制来自错误日志的Apache错误、警告和通知消息。
审计日志:用于编写由Mod Security规则标记的事务日志。Mod Security允许您灵活配置审计、调试或两者同时记录日志。
默认情况下,配置将同时记录两个日志。但是,您可以根据需要进行更改。日志由SecDefaultAction
指令控制。让我们看一下在setup.conf中的默认日志记录配置。
SecDefaultAction “phase:1,deny,log”
要记录调试日志和审计日志,请使用“log”;要仅记录审计日志,请使用“nolog, auditlog”;要仅记录调试日志,请使用“log, noauditlog”。您可以指定要存储的审计日志位置,该位置由SecAuditLog指令控制。
通过添加以下内容,将审计日志写入/opt/apache/logs/modsec_audit.log。
- 在setup.conf中添加SecAuditLog指令,并重新启动Apache Web服务器。
SecAuditLog /opt/apache/logs/modsec_audit.log
- 重新启动后,您应该看到modsec_audit.log文件生成。
启用规则引擎
默认情况下,规则引擎处于关闭状态,这意味着如果您不启用规则引擎,则无法利用Mod Security的所有优势。
规则引擎的启用或禁用由SecRuleEngine
指令控制。
- 在setup.conf中添加SecRuleEngine指令,并重新启动Apache Web服务器。
SecRuleEngine On
SecRuleEngine有三个取值:
- On – 启用规则引擎
- Off – 禁用规则引擎
- DetectionOnly – 启用规则引擎,但不执行任何操作,如阻止、拒绝、丢弃、允许、代理或重定向
一旦规则引擎开启,Mod Security就准备好保护免受一些常见的攻击类型的影响。
常见攻击类型保护
现在Web服务器已准备好保护免受常见的攻击类型(如XSS、SQL注入、协议违规等)的影响,因为我们已安装了核心规则并启用了规则引擎。让我们测试其中一些攻击。
XSS攻击
- 打开Firefox并访问您的应用程序,并在URL的末尾或末尾放置标签
- 监视apache/logs文件夹中的modsec_audit.log
您会注意到Mod Security阻止请求,因为它包含标签,这是XSS攻击的根源。
目录遍历攻击:目录遍历攻击可以通过利用这些漏洞并访问系统相关文件来造成很大的损害。例如:/etc/passwd,.htaccess等。
- 打开Firefox并访问您的应用程序,使用目录遍历
- 监视apache/logs文件夹中的modsec_audit.log
http://localhost/?../.../boot
- 您会注意到Mod Security阻止请求,因为它包含目录遍历。
更改服务器横幅
在本指南的前面,您学会了如何通过使用ServerTokens指令来删除Apache和操作系统类型、版本的帮助。
让我们再往前走一步,您想保留任何您希望的服务器名称吗?在Mod Security中使用SecServerSignature
指令是有可能的。你看,这很有趣。
注意:要使用Mod Security从标题中操作服务器横幅,您必须在Apache Web服务器的httpd.conf中将ServerTokesn设置为Full。
- 在setup.conf中添加带有所需服务器名称的SecServerSignature指令,并重新启动Apache Web服务器
SecServerSignature YourServerName
例如:
[/opt/apache/conf/crs] #grep SecServer modsecurity_crs_10_setup.conf
SecServerSignature yaoweibin.com
[/opt/apache/conf/crs] #
常规配置
让我们查看一些通用配置,作为最佳实践。
配置监听
当您在单个服务器上具有多个接口和IP时,建议使用绝对IP和端口号配置Listen指令。
当您将apache配置为以某个端口号监听所有IP时,它可能会在将HTTP请求转发到其他Web服务器时出现问题。这在共享环境中非常常见。
- 在httpd.conf中使用绝对IP和端口配置Listen指令,如下面示例所示
Listen 10.10.10.1:80
访问日志记录
在您的Web服务器中正确配置访问日志是至关重要的。在日志中捕获的一些重要参数是为请求提供服务所花费的时间和SESSION ID。
默认情况下,Apache未配置为捕获这些数据。您必须手动配置它们如下。
- 为了在访问日志中捕获为请求提供服务所花费的时间和SESSION ID
- 在LogFormat指令下的httpd.conf中添加%T和%sessionID
LogFormat "%h %l %u %t "%{sessionID}C" "%r" %>s %b %T" common
您可以参考http://httpd.apache.org/docs/2.2/mod/mod_log_config.html以获取Apache Web服务器中LogFormat指令支持的完整参数列表。
禁用加载不需要的模块
如果您已经编译并安装了所有模块,那么您很有可能在Apache中加载了许多不需要的模块。
最佳实践是在您的Web应用程序中仅配置所需的模块。以下模块存在安全问题,您可能希望在Apache Web服务器的httpd.conf中禁用它们。
WebDAV(基于Web的分布式创作和版本控制)此模块允许远程客户端操作服务器上的文件,并受到各种拒绝服务攻击的影响。要禁用,请在httpd.conf中注释以下内容
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#Include conf/extra/httpd-dav.conf
信息模块:一旦加载了mod_info模块,可以使用.htaccess泄漏敏感信息。要禁用,请在httpd.conf中取消以下注释:
#LoadModule info_module modules/mod_info.so
参考:没有以下链接的指导是不可能的:
- http://httpd.apache.org/docs/2.4/
- http://www.modsecurity.org/documentation/
- https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
这些是保护Apache Web服务器的最佳实践之一。
如果您想要implement custom error page in Apache,请查看此链接。
如果您是Apache HTTP的新用户,我建议您参加the Apache HTTP administration course。