在FreeBSD12.0上强化ApacheHTTP的推荐步骤
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
尽管 Apache HTTP 服务器的默认安装已经可以安全使用,但只要进行一些修改,它的配置就可以得到显着改善。 您可以补充已经存在的安全机制,例如,通过围绕 cookie 和标头设置保护,因此连接不会在用户的客户端级别被篡改。 通过这样做,您可以显着降低多种攻击方法的可能性,例如 跨站点脚本攻击 (也称为 XSS)。 您还可以防止其他类型的攻击,例如 Cross-Site Request Forgery 或会话劫持,以及拒绝服务攻击。
在本教程中,您将实施一些推荐的步骤来减少服务器上暴露的信息量。 您将验证目录列表并禁用索引以检查对资源的访问。 您还将更改 timeout
指令的默认值,以帮助缓解拒绝服务类型的攻击。 此外,您将禁用 TRACE 方法,这样会话就不会被逆转和劫持。 最后,您将保护标头和 cookie。
大多数配置设置将应用于位于 /usr/local/etc/apache24/httpd.conf
的 Apache HTTP 主配置文件。
先决条件
在开始本指南之前,您需要以下内容:
- 按照 如何开始使用 FreeBSD 上的教程设置 FreeBSD 12 服务器。
- 按照 新 FreeBSD 12.0 服务器的推荐步骤 文章中的 配置防火墙部分 设置防火墙。
- 按照 How To Install an Apache, MySQL, and PHP (FAMP) Stack on FreeBSD 12.0 教程安装完整的 FAMP 堆栈。
- 按照教程 How To Secure Apache with Let's Encrypt on FreeBSD 安装 Let's Encrypt 证书。
具备先决条件后,您就拥有了一个顶部有堆栈的 FreeBSD 系统,能够使用任何用 PHP 编写的东西(例如主要的 CMS 软件)来提供 Web 内容。 此外,您还通过 Let's Encrypt 加密了安全连接。
减少服务器信息
操作系统横幅是计算机、服务器和各种设备用来将自己呈现到网络中的一种方法。 恶意行为者可以利用这些信息来利用相关系统。 在本节中,您将减少此横幅发布的信息量。
指令集 控制如何显示此信息。 为此,ServerTokens 指令很重要; 默认情况下,它会向连接到它的客户端显示有关操作系统和已编译模块的所有详细信息。
在应用任何更改之前,您将使用网络扫描工具检查当前显示的信息。 要安装 nmap
,请运行以下命令:
sudo pkg install nmap
要获取服务器的 IP 地址,可以运行以下命令:
ifconfig vtnet0 | awk '/inet / {print $2}'
您可以使用以下命令检查 Web 服务器响应:
nmap -sV -p 80 your-server-ip
您调用 nmap
进行扫描(因此使用 -s
标志),在端口 80
(-p
标志)在给定的 IP 或域上。
您将收到有关您的 Web 服务器的信息,类似于以下内容:
OutputStarting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET Nmap scan report for 206.189.123.232 Host is up (0.054s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
此输出显示操作系统、Apache HTTP 版本和 OpenSSL 等信息是可见的。 这对于攻击者获取有关服务器的信息并选择正确的工具来利用(例如,在服务器上运行的软件中的漏洞)很有用。
您将把 ServerTokens
指令放在主配置文件中,因为默认情况下它没有配置。 如文档所述,缺少此配置使 Apache HTTP 显示有关服务器的完整信息。 为了限制显示的有关您的服务器和配置的信息,您需要将 ServerTokens
指令放在主配置文件中。
您将在配置文件中的 ServerName
条目之后放置此指令。 运行以下命令以查找指令
grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf
您将找到可以使用 vi
搜索的行号:
Output226 #ServerName www.example.com:80
运行以下命令:
sudo vi +226 /usr/local/etc/apache24/httpd.conf
添加以下突出显示的行:
/usr/local/etc/apache24/httpd.conf
. . . #ServerName www.example.com:80 ServerTokens Prod
使用 :wq
和 ENTER
保存并退出文件。
将 ServerTokens
指令设置为 Prod
将使其仅显示这是一个 Apache Web 服务器。
为此,请重新启动 Apache HTTP 服务器:
sudo apachectl restart
要测试更改,请运行以下命令:
nmap -sV -p 80 your-server-ip
您将看到与以下类似的输出,其中包含更多关于您的 Apache Web 服务器的最少信息:
OutputStarting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET Nmap scan report for WPressBSD (206.189.123.232) Host is up (0.056s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
您已经看到服务器在更改之前宣布了哪些信息,并且您现在已将其减少到最低限度。 有了这个,您向外部参与者提供的关于您的服务器的线索更少。 在下一步中,您将管理 Web 服务器的目录列表。
管理目录列表
在此步骤中,您将确保正确配置目录列表,以便系统的正确部分按预期公开可用,而其余部分则受到保护。
注意:当一个参数被声明时它是激活的,但是+
可以从视觉上强化它实际上是启用的。 当放置减号 -
时,该参数被拒绝,例如 Options -Indexes
。
不能混合使用 +
和/或 -
的参数,它在 Apache HTTP 中被认为是错误的语法,并且可能在启动时被拒绝。
如果 .html
文件不存在,添加语句 Options -Indexes
将自动将数据路径 /usr/local/www/apache24/data
内的内容设置为不索引(readlisted) ,并且不显示 URL 是否映射此目录。 这也适用于使用虚拟主机配置,例如用于 Let's Encrypt 证书的 先决条件教程 的配置。
您将使用 -Indexes
参数和 +FollowSymLinks
指令设置 Options 指令,这将允许遵循符号链接。 您将使用 +
符号以符合 Apache 的 HTTP 约定。
运行以下命令,在配置文件中找到要编辑的行:
grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf
您将看到类似于以下内容的输出:
Output263 : Options Indexes FollowSymLinks
运行此命令可直接访问该行进行编辑:
sudo vi +263 /usr/local/etc/apache24/httpd.conf
现在根据配置编辑该行:
/usr/local/etc/apache24/httpd.conf
. . . # Options -Indexes +FollowSymLinks # . . .
使用 :wq
和 ENTER
保存并退出文件。
重新启动 Apache HTTP 以实现这些更改:
sudo apachectl restart
在浏览器的域中,您会看到一条禁止访问消息,也称为 403 错误。 这是由于您应用的更改。 将 -Indexes
放入 Options
指令已禁用 Apache HTTP 的自动索引功能,因此数据路径中没有 index.html
文件。
您可以通过在 先决条件教程 中为 Let's Encrypt 证书启用的 VirtualHost
中放置一个 index.html
文件来解决此问题。 您将使用 Apache HTTP 中的默认块并将其放置在与您在虚拟主机中声明的 DocumentRoot
相同的文件夹中。
/usr/local/etc/apache24/extra/httpd-vhosts.conf
<VirtualHost *:80> ServerAdmin your_email@your_domain.com DocumentRoot "/usr/local/www/apache24/data/your_domain.com" ServerName your_domain.com ServerAlias www.your_domain.com ErrorLog "/var/log/your_domain.com-error_log" CustomLog "/var/log/your_domain.com-access_log" common </VirtualHost>
使用以下命令执行此操作:
sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html
现在您将在访问您的域时看到 It works! 消息。
在本节中,您已对 Indexes
指令进行了限制,以使其不会自动登记和显示您想要的内容之外的内容。 现在,如果数据路径中没有 index.html
文件,Apache HTTP 将不会自动创建内容索引。 在下一步中,您将超越隐藏信息并自定义不同的指令。
减少超时指令值
Timeout 指令 设置 Apache HTTP 在连接请求失败之前等待新输入/输出的时间限制。 此故障可能由于不同的情况而发生,例如数据包未到达服务器或客户端未确认接收到的数据。
默认情况下,超时设置为 60
秒。 在互联网服务速度较慢的环境中,此默认值可能是明智的,但一分钟是相当长的时间,特别是如果服务器正在覆盖具有更快互联网服务的用户目标。 此外,服务器未关闭连接的时间可能会被滥用来执行拒绝服务攻击 (DoS)。 如果这些恶意连接泛滥,服务器将出现故障并可能变得饱和且无响应。
要更改值,您将在 httpd-default.conf
文件中找到 Timeout
条目:
grep -n 'Timeout' /usr/local/etc/apache24/extra/httpd-default.conf
您将看到与以下类似的输出:
Output 8 # Timeout: The number of seconds before receives and sends time out. 10 Timeout 60 26 # KeepAliveTimeout: Number of seconds to wait for the next request from the 29 KeepAliveTimeout 5 89 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
在输出行 10
设置 Timeout
指令值。 要直接访问此行,请运行以下命令:
sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf
您将其更改为 30
秒,例如,如下所示:
/usr/local/etc/apache24/extra/httpd-default.conf
# # Timeout: The number of seconds before receives and sends time out. # Timeout 30
使用 :wq
和 ENTER
保存并退出文件。
Timeout
指令的值必须平衡足够大的时间范围,以使这些事件能够发生合法和成功的连接,但又足够短以防止不希望的连接尝试。
注意: 拒绝服务攻击可以非常有效地耗尽服务器的资源。 一个互补且功能强大的对策是使用线程 MPM 从 Apache HTTP 处理连接和进程的方式中获得最佳性能。 在本教程 How To Configure Apache HTTP with MPM Event and PHP-FPM on FreeBSD 12.0 中,有启用此功能的步骤。
要使此更改生效,请重新启动 Apache HTTP 服务器:
sudo apachectl restart
您已更改 Timeout
指令的默认值,以部分缓解 DoS 攻击。
禁用 TRACE 方法
超文本传输协议是根据 客户端-服务器模型 开发的,因此,该协议具有从服务器检索或放置信息的请求方法。 服务器需要了解这些方法集以及它们之间的交互。 在此步骤中,您将配置最少的必要方法。
TRACE 方法被认为是无害的,被用来执行 跨站点跟踪攻击 。 这些类型的攻击允许恶意行为者通过该方法窃取用户会话。 该方法是为调试目的而设计的,服务器返回客户端最初发送的相同请求。 因为来自浏览器会话的 cookie 被发送到服务器,它将被再次发送回来。 但是,这可能会被恶意行为者拦截,然后他们可以将浏览器的连接重定向到他们控制的站点,而不是原始服务器。
由于可能会滥用 TRACE 方法,因此建议仅将其用于调试而不是在生产中使用。 在本节中,您将禁用此方法。
使用以下命令编辑 httpd.conf
文件,然后按 G
到达文件末尾:
sudo vi /usr/local/etc/apache24/httpd.conf
在文件末尾添加以下入口路径:
/usr/local/etc/apache24/httpd.conf
. . . TraceEnable off
一个好的做法是只指定您将在 Apache HTTP Web 服务器中使用的 methods。 这将有助于限制恶意行为者的潜在切入点。
LimitExcept 可用于此目的,因为它不允许除其中声明的方法之外的任何其他方法。 例如,可以像这样建立一个配置:
/usr/local/etc/apache24/httpd.conf
DocumentRoot "/usr/local/www/apache24/data" <Directory "/usr/local/www/apache24/data"> Options -Indexes +FollowSymLinks -Includes AllowOverride none <LimitExcept GET POST HEAD> deny from all </LimitExcept> Require all granted </Directory>
正如在 LimitExcept
指令中声明的那样,配置中只允许使用 GET、POST 和 HEAD 方法。
GET
方法是 HTTP 协议的一部分,用于检索数据。POST
方法也是 HTTP 协议的一部分,用于向服务器发送数据。HEAD
方法类似于GET
,但是没有响应体。
您将使用以下命令并将 LimitExcept
块放在文件中:
sudo vi +272 /usr/local/etc/apache24/httpd.conf
要设置此配置,您需要将以下块放入将从中读取内容的 DocumentRoot
指令条目中,更具体地说,在 Directory
条目中:
/usr/local/etc/apache24/httpd.conf
. . . <LimitExcept GET POST HEAD> deny from all </LimitExcept> . . .
要应用更改重新启动 Apache HTTP:
sudo apachectl restart
较新的指令 AllowedMethods 提供了类似的功能,尽管它的状态仍处于试验阶段。
您已经了解了什么是 HTTP 方法、它们的用途,以及它们利用 TRACE 方法提供的针对恶意活动的保护,以及如何声明要使用的方法。 接下来,您将使用专用于 HTTP 标头和 cookie 的进一步保护。
保护标头和 Cookie
在此步骤中,您将设置特定指令以保护客户端计算机在访问您的 Apache HTTP Web 服务器时将打开的会话。 这样您的服务器将不会加载不需要的内容,加密不会降级,并且您将避免 内容嗅探。
Headers 是请求方法的组件。 有头来调整身份验证、服务器和客户端之间的通信、缓存、内容协商等。
Cookie 是服务器向浏览器发送的信息位。 这些位允许服务器将客户端浏览器从一台计算机识别到另一台计算机。 它们还允许服务器识别用户会话。 例如,他们可以跟踪登录用户的购物车、支付信息、历史记录等。 由于 HTTP 是一种无状态协议,因此在客户端的 Web 浏览器中使用和保留 Cookie,这意味着一旦连接关闭,服务器就不会记住一个客户端或另一个客户端发送的请求。
保护标头和 cookie 很重要,因为它们提供了 Web 浏览器客户端和 Web 服务器之间的通信。
headers
模块默认激活。 要检查它是否已加载,您将使用以下命令:
sudo apachectl -M | grep 'headers'
您将看到以下输出:
Outputheaders_module (shared)
如果您没有看到任何输出,请检查该模块是否在 Apache 的 httpd.conf
文件中被激活:
grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf
作为输出,您将看到一个未注释的行,该行引用了标头的特定模块:
/usr/local/etc/apache24/httpd.conf
. . . 122 LoadModule headers_module libexec/apache24/mod_headers.so . . .
删除 mod_headers.so
行开头的主题标签(如果存在)以激活指令。
通过使用以下 Apache HTTP 指令,您将保护标头和 cookie 免受恶意活动的影响,从而降低客户端和服务器的风险。
现在您将设置标题的保护。 您将把所有这些标头值放在一个块中。 您可以根据需要选择应用这些值,但建议全部应用。
使用以下命令编辑 httpd.conf
文件,然后按 G
到达文件末尾:
sudo vi /usr/local/etc/apache24/httpd.conf
将以下块放在文件末尾:
/usr/local/etc/apache24/httpd.conf
. . . <IfModule mod_headers.c> # Add security and privacy related headers Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;" Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure" Header set X-Content-Type-Options "nosniff" Header set X-XSS-Protection "1; mode=block" Header set Referrer-Policy "strict-origin" Header set X-Frame-Options: "deny" SetEnv modHeadersAvailable true </IfModule>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
:HTTP 严格传输安全 (HTSTS) 是一种机制,用于 Web 服务器和客户端(主要是浏览器)仅使用 HTTPS 建立通信。 通过实现这一点,您可以避免中间人攻击,其中通信之间的第三方可能会访问这些位,但也可能会篡改它们。Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
:标头上的HttpOnly
和Secure
标志有助于防止跨站点脚本攻击,也称为 XSS。 Cookie 可能会被攻击者滥用以伪装成合法访问者,将自己伪装成其他人( 身份盗窃 ),或被篡改。Header set Referrer-Policy "strict-origin"
:Referrer-Policy 标头设置在标头字段中包含哪些信息作为引荐来源信息。Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
:Content-Security-Policy header(CSP)将完全阻止加载参数中未指定的内容,有助于防止跨站脚本(XSS[X191X ]) 攻击。 有许多可能的 参数来配置此标头的策略 。 底线是将其配置为从同一站点加载内容并升级具有 HTTP 源的任何内容。Header set X-XSS-Protection "1; mode=block"
:这支持不支持Content-Security-Policy
标头的旧版浏览器。 'X-XSS-Protection' 标头提供针对跨站点脚本攻击的保护。 除非您需要支持旧的浏览器版本,否则您不需要设置此标头,这种情况很少见。Header set X-Frame-Options: "deny"
:这可以防止 clickjacking 攻击。 'X-Frame-Options' 标头告诉浏览器页面是否可以在<frame>
、<iframe>
、<embed>
或<object>
。 这样,来自其他站点的内容就不能嵌入到其他站点中,从而防止点击劫持攻击。 在这里,您拒绝所有帧渲染,因此网页不能嵌入到其他任何地方,甚至不能嵌入到同一个网站中。 您可以根据自己的需要进行调整,例如,如果您必须授权呈现某些页面,因为它们是广告或与特定网站的合作。Header set X-Content-Type-Options "nosniff"
:'X-Content-Type-Options' 标头控制 MIME 类型,因此它们不会被更改和遵循。 MIME 类型 是文件格式标准; 它们适用于文本、音频、视频、图像等。 此标头阻止恶意行为者嗅探这些文件并尝试更改文件类型的内容。
现在重新启动 Apache 以使更改生效:
sudo apachectl restart
要检查配置设置的安全级别,请访问 安全标头网站 。 遵循本教程中的步骤后,您的域将获得 A 等级。
注意:如果你通过访问https://securityheaders.com/
进行标题检查并获得F
等级,这可能是因为DocumentRoot
。 如果检查您的标题,您得到的等级与 A
或 F
不同,请检查每个 Header set
行以查找可能导致降级的任何拼写错误。
在此步骤中,您使用了多达七种设置来提高标头和 cookie 的安全性。 这些将有助于防止跨站点脚本、点击劫持和其他类型的攻击。
结论
在本教程中,您已经解决了几个安全方面的问题,从信息泄露到保护会话,通过为重要功能设置替代配置设置。
有关强化 Apache 的更多资源,这里有一些其他参考资料:
- Apache的HTTP 安全提示
- Mozilla 的 安全指南
- 互联网安全中心 对 Apache HTTP 的审核建议
有关保护 Apache HTTP 的额外工具:
mod_evasive
是帮助缓解 DoS 攻击的有用工具。 您可以在 How To Protect against DoS and DDoS with mod_evasive for Apache 教程 中找到更多详细信息。fail2ban
是一种入侵防御软件,可用于阻止非授权用户的重复登录尝试。 您可以在 如何使用 Fail2Ban 教程 保护 Apache 服务器中阅读更多内容。ModSecurity
是一个 Web 应用程序防火墙(或 WAF),因此它基于 SpyderLabs 和社区成员编写的预定义规则提供了广泛的可能性。 您可以在 如何使用 Apache 设置 ModSecurity 教程 中了解更多信息。