作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
虽然默认安装的 Apache HTTP服务器已经是安全的使用,但其配置可以通过一些修改大幅改进. 您可以补充已经存在的安全机制,例如,通过设置围绕cookies和标题的保护,所以连接不能在用户的客户端水平上被篡改。 这样做可以大大降低多个攻击方法的可能性,如 跨站点脚本攻击(也被称为XSS)。
在本教程中,您将实施一些建议的步骤,以减少您服务器上暴露的信息量。您将检查目录列表并禁用索引来检查资源的访问权限。您还将更改时限
指令的默认值,以帮助减轻拒绝服务
类型的攻击。
大多数配置设置将应用于位于 `/usr/local/etc/apache24/httpd.conf 的 Apache HTTP 主配置文件。
<$>[注] **注:**截至2022年7月1日,DigitalOcean不再支持通过控制面板或API创建新的FreeBSD Droplets。
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个 FreeBSD 12 服务器是通过遵循本教程设置的 How To Get Started with FreeBSD。
- 一个防火墙是根据本文《新 FreeBSD 12.0 服务器的推荐步骤》(https://andsky.com/tech/tutorials/recommended-steps-for-new-freebsd-12-0-servers#how-to-configure-a-simple-ipfw-firewall)中的 配置防火墙() 设置的.
- 一个完整的 FAMP 堆积是通过以下教程安装的 How To Install a Apache, MySQL, and PHP (FAMP) Stack on FreeBSD 12.0 。
有了前提,你有一个 FreeBSD 系统,上面有一个堆栈,可以使用任何用 PHP 编写的 Web 内容,例如主要的 CMS 软件。
减少服务器信息
操作系统旗帜是计算机、服务器和各种设备用来在网络中展示自己的一种方法,恶意行为者可以使用这些信息来获取相关系统的利用。
为此,ServerTokens(LINK1)指令很重要;默认情况下,它会向连接到操作系统的客户端显示有关操作系统和编译的模块的所有细节。
您将使用网络扫描工具,在应用任何更改之前检查当前披露的信息。
1sudo pkg install nmap
要获取服务器的IP地址,您可以执行以下命令:
1ifconfig vtnet0 | awk '/inet / {print $2}'
您可以通过使用以下命令检查 Web 服务器的响应:
1nmap -sV -p 80 your-server-ip
您召唤nmap
来进行扫描(因此-s
旗),以显示该 IP 或域上的版本(-V
旗)在端口80
上(-p
旗)。
您将收到有关您的 Web 服务器的信息,类似于以下内容:
1[secondary_label Output]
2Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET
3Nmap scan report for 206.189.123.232
4Host is up (0.054s latency).
5
6PORT STATE SERVICE VERSION
780/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd
8
9Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
10Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
此输出显示,操作系统、Apache HTTP 版本和 OpenSSL 等信息是可见的,这可以帮助攻击者获取有关服务器的信息,并选择合适的工具来利用,例如,在服务器上运行的软件中的漏洞。
您将将ServerTokens
指令放置在主配置文件中,因为它没有默认配置。 由于缺乏此配置,Apache HTTP 会显示有关服务器的完整信息,如文档所述。
您将将此指令放置在配置文件中的ServerName
条目之后。
1grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf
您将找到行号码,然后可以用vi
搜索:
1[secondary_label Output]
2226 #ServerName www.example.com:80
运行以下命令:
1sudo vi +226 /usr/local/etc/apache24/httpd.conf
添加以下突出的一行:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3#ServerName www.example.com:80
4ServerTokens Prod
保存和退出文件,使用:wq
和ENTER
。
将ServerTokens
指令设置为Prod
,只会显示这是一个Apache Web 服务器。
要做到这一点,请重新启动 Apache HTTP 服务器:
1sudo apachectl restart
若要測試變更,請執行以下命令:
1nmap -sV -p 80 your-server-ip
您将看到类似的输出,在您的Apache Web 服务器上有更少的信息:
1[secondary_label Output]
2Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET
3Nmap scan report for WPressBSD (206.189.123.232)
4Host is up (0.056s latency).
5
6PORT STATE SERVICE VERSION
780/tcp open http Apache httpd
8
9Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
10Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds
您已经看到服务器在更改之前宣布了哪些信息,现在您已经将此信息降至最低限度。
管理目录列表
在此步骤中,您将确保目录列表正确配置,以便系统的正确部分按预期公开可用,而其余部分则受到保护。
<$>[注]
**注:**当一个参数被声明为活跃时,但+
可以视觉增强它实际上是启用的。
具有+
和/或-
的参数不能混合,它被认为是Apache HTTP中的坏语法,并且可以在启动时被拒绝
添加选项 - 索引
声明将设置数据路径内的内容/usr/local/www/apache24/data
以免自动索引(read listed)如果一个.html 文件不存在,并且不会显示是否有一个 URL 地图该目录。
您将设置 Options
指令与-Indexes
参数和+FollowSymLinks
指令,这将允许遵循符号链接。
运行以下命令,在配置文件中找到要编辑的行:
1grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf
您将看到类似于以下的输出:
1[secondary_label Output]
2263 : Options Indexes FollowSymLinks
运行此命令以直接访问编辑的行:
1sudo vi +263 /usr/local/etc/apache24/httpd.conf
现在根据配置编辑行:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3#
4Options -Indexes +FollowSymLinks
5
6#
7. . .
保存和退出文件,使用:wq
和ENTER
。
重新启动 Apache HTTP 以执行以下更改:
1sudo apachectl restart
在浏览器中的域中,你会看到一个被禁止访问的消息,也被称为403错误,这是因为你已经应用了这些更改。将 -Index
放入 Options
指令已禁用了 Apache HTTP 的自动索引功能,因此数据路径中没有 index.html
文件。
您可以通过将一个 index.html
文件放置在您在 Let's Encrypt 证书中启用的 VirtualHost
中(https://andsky.com/tech/tutorials/how-to-secure-apache-with-let-s-encrypt-on-freebsd-12-0#step-3-%E2%80%94-enabling-and-configuring-virtual-hosts)。
1[label /usr/local/etc/apache24/extra/httpd-vhosts.conf]
2<VirtualHost *:80>
3 ServerAdmin your_email@your_domain.com
4 DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
5 ServerName your_domain.com
6 ServerAlias www.your_domain.com
7 ErrorLog "/var/log/your_domain.com-error_log"
8 CustomLog "/var/log/your_domain.com-access_log" common
9</VirtualHost>
使用以下命令来执行此操作:
1sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html
现在,当您访问您的域时,您将看到一个 **It works!**消息。
在本节中,您已经对索引
指令设置了限制,以免自动列出和显示您打算以外的内容.现在如果数据路径中没有index.html
文件,Apache HTTP 将不会自动创建内容索引。
减少时限指令的价值
‘Timeout’指令设定了Apache HTTP在连接请求失败之前等待新输入/输出的时间限度。
在互联网服务缓慢的环境中,此默认值可能是有道理的,但如果服务器正在覆盖更快的互联网服务的目标用户,则一分钟可能相当长的时间。此外,服务器没有关闭连接的时间可以被滥用来执行服务拒绝攻击(DoS)。
若要更改值,您可以在 httpd-default.conf 文件中找到 Timeout
条目:
1grep -n 'Timeout' /usr/local/etc/apache24/extra/httpd-default.conf
你会看到类似的输出:
1[secondary_label Output]
2 8 # Timeout: The number of seconds before receives and sends time out.
310 Timeout 60
426 # KeepAliveTimeout: Number of seconds to wait for the next request from the
529 KeepAliveTimeout 5
689 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
在输出行 10
设置了 Timeout
指令值. 要直接访问此行,运行以下命令:
1sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf
例如,您将其更改为30
秒,如下:
1[label /usr/local/etc/apache24/extra/httpd-default.conf]
2#
3# Timeout: The number of seconds before receives and sends time out.
4#
5Timeout 30
保存和退出文件,使用:wq
和ENTER
。
该指令的价值必须平衡一个足够大的时间范围,以便这些事件发生合法和成功的连接,但足够短,以防止不必要的连接尝试。
<$>[注] **注:**服务拒绝攻击可以有效地消耗服务器的资源。一个补充和非常有能力的对策是使用有线MPM来获得Apache HTTP如何处理连接和流程的最佳性能。在本教程中(How To Configure Apache HTTP with MPM Event and PHP-FPM on FreeBSD 12.0)(https://andsky.com/tech/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-freebsd-12-0)有启用此功能的步骤。
要使此更改生效,请重新启动 Apache HTTP 服务器:
1sudo apachectl restart
您已更改时隔
指令的默认值,以部分缓解DoS攻击。
禁用 TRACE 方法
超文本传输协议是根据客户端服务器模型(https://en.wikipedia.org/wiki/Client%E2%80%93server_model)开发的,因此,该协议有请求方法来从服务器中获取或放置信息。
被认为是无害的TRACE方法被利用来执行跨网站追踪攻击。这些类型的攻击允许恶意行为者通过该方法窃取用户会话。该方法旨在为服务器返回客户端最初发送的相同请求进行调试。由于浏览器会话的cookie发送到服务器,它将再次发送回服务器。然而,这可能会被恶意行为者拦截,然后可以将浏览器的连接重定向到他们控制的网站而不是原始服务器。
由于可能滥用 TRACE 方法,建议仅用于调试,而不是在生产中使用它。
用以下命令编辑 httpd.conf
文件,然后按 G
到达文件的尽头:
1sudo vi /usr/local/etc/apache24/httpd.conf
在文件的末尾添加以下输入路径:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3TraceEnable off
一个很好的做法是只指定您将在 Apache HTTP Web 服务器中使用的 方法,这将有助于限制恶意行为者的潜在入口点。
LimitExcept
对于这个目的有用,因为它不会允许任何其他方法,除了那些在其中的声明。
1[label /usr/local/etc/apache24/httpd.conf]
2DocumentRoot "/usr/local/www/apache24/data"
3<Directory "/usr/local/www/apache24/data">
4 Options -Indexes +FollowSymLinks -Includes
5 AllowOverride none
6 <LimitExcept GET POST HEAD>
7 deny from all
8 </LimitExcept>
9 Require all granted
10</Directory>
正如LimitExcept
指令中声明的那样,配置中仅允许使用 GET、POST 和 HEAD 方法。
*GET
方法是HTTP协议的一部分,用于获取数据
*POST
方法也是HTTP协议的一部分,用于将数据发送到服务器
*HEAD
方法类似于GET
,但没有响应体
您将使用以下命令并将LimitExcept
块放置在文件内部:
1sudo vi +272 /usr/local/etc/apache24/httpd.conf
要设置此配置,您将将下列块放置在DocumentRoot
指令条目中,其中内容将被读取,更具体地说,在DocumentRoot
条目中:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3<LimitExcept GET POST HEAD>
4 deny from all
5</LimitExcept>
6. . .
若要应用更改,请重新启动 Apache HTTP:
1sudo apachectl restart
更新的指令 ‘AllowedMethods’提供类似的功能,尽管其状态仍然是实验性的。
您已经看到了什么是 HTTP 方法,它们的使用,以及它们提供的防止恶意活动利用 TRACE 方法的保护,以及如何宣布使用哪些方法。
安全标头和Cookie
在此步骤中,您将设置特定指令来保护客户端机器在访问您的 Apache HTTP Web 服务器时打开的会话,这样您的服务器将不会加载不必要的内容,加密不会降级,并且您将避免 内容扫描。
Headers是请求方法的组成部分,有用于调整身份验证、服务器与客户端之间的通信、缓存、内容谈判等。
Cookies 是服务器向浏览器发送的信息,这些信息允许服务器从一台计算机识别客户端浏览器到另一台计算机,它们还允许服务器识别用户会话,例如,它们可以跟踪登录用户的购物车、付款信息、历史等。 Cookies 被用来并保留在客户端的 Web 浏览器中,因为 HTTP 是一种无状态协议,即一旦连接关闭,服务器不会记住一个客户端或另一个客户端发送的请求。
保护标题和 Cookie 是很重要的,因为它们提供 Web 浏览器客户端和 Web 服务器之间的通信。
标题
模块默认启用. 要检查是否已加载,您将使用以下命令:
1sudo apachectl -M | grep 'headers'
您将看到以下输出:
1[secondary_label Output]
2headers_module (shared)
如果您看不到任何输出,请检查该模块是否已在Apache的httpd.conf
文件中激活:
1grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf
作为输出,你会看到一个没有评论的行,指向标题的特定模块:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3122 LoadModule headers_module libexec/apache24/mod_headers.so
4. . .
删除mod_headers.so
行开头的标签,如果存在的话,以激活指令。
通过使用以下Apache HTTP指令,您将保护标题和cookie免受恶意活动的影响,以减少客户端和服务器的风险。
现在您将设置标题的保护,将所有这些标题值放置在一个块中,您可以选择按您想要的方式应用这些值,但所有这些值都建议使用。
用以下命令编辑 httpd.conf
文件,然后按 G
到达文件的尽头:
1sudo vi /usr/local/etc/apache24/httpd.conf
将下列块放到文件的末尾:
1[label /usr/local/etc/apache24/httpd.conf]
2. . .
3<IfModule mod_headers.c>
4 # Add security and privacy related headers
5 Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
6 Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
7 Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
8 Header set X-Content-Type-Options "nosniff"
9 Header set X-XSS-Protection "1; mode=block"
10 Header set Referrer-Policy "strict-origin"
11 Header set X-Frame-Options: "deny"
12 SetEnv modHeadersAvailable true
13</IfModule>
头集严格运输-安全'
最大年龄=31536000;包括子域``: HTTP严格运输安全(HTSTS)是网络服务器和客户端(主要是浏览器)使用HTTPS建立通信的机制. 通过实施这一点,你避免了中层人的攻击,在中间的通信中,第三方有可能访问这些位点,但也有可能篡改这些位点.标题总是编辑 Set-Cookie (.*)' "1; Http Only; Secure" : 标题上 " Http Only " 和 " Secure " 旗帜有助于防止跨场脚本攻击,也称为 " XSS " 。 饼干可能被攻击者滥用来假扮合法访客,把自己扮成他人(_身份盗窃_),或者被篡改. (_) ( )*
指针集' 参考政策严格原产地
: [参考文献-政策] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy)页眉设置了标题域中作为裁判员信息包含的信息. () ( )*头集内容-安全政策'
默认-弧'自';升级-不安全请求;'
: [Content-security-Policy header] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) (CSP) 将完全防止参数中未指明的加载内容,这有助于防止跨站脚本(QQSS)攻击. 此标题有许多可能的 [参数] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) 配置 。 底线是配置它从同一站点装入内容并升级任何带有HTTP出自的内容. (_ ( )*头集 X- XSS- 保护' 1; 模式=块' : 这支持较旧的浏览器不处理 " Content-Security-Policy " 标题。 ['X-XSS-Protection' (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection])头条提供防范跨地脚本攻击的保护. 您不需要设置此标题, 除非您需要支持旧的浏览器版本, 这是罕见的 。 (_) ( )*
头集 X- Frame- 选项: 'dey' : 这可以防止[点击劫持 (https://owasp.org/www-community/Clickjacking)攻击. ['X-Frame-options' (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) 头条告诉浏览器,如果一个页面可以在 QQframe , QQiframe , QQembed 或 object 中渲染出. 这样,来自其他站点的内容就不能被嵌入到其他站点中去,防止点击劫持攻击. 在这里,你否认所有的帧渲染 所以网页不能被嵌入 其他地方,甚至连同一个网站。 您可以根据您的需要来修改, 例如, 您必须授权翻译一些网页, 因为这些网页是广告或与特定网站的合作 。 ( _ ( )*标题设置 X- Content- Type- 选项
nosniff` : ['X-Content-Type-options'] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options])头控制 [MIME类型] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types),所以不会被更改并被遵循. MIME类型_是文件格式标准;它们为文本,音频,视频,图像等工作. 此页眉将恶意角色从内容嗅取这些文件并试图更改文件类型中阻断 。 () (英语)
现在重新启动 Apache,以便更改生效:
1sudo apachectl restart
要检查配置设置的安全级别,请访问 安全标题网站。
<$>[注]
**注:**如果你通过访问https://securityheaders.com/来检查你的标题,并获得一个
F级别,这可能是因为你的网站的
DocumentRoot内部没有
index.html`,正如步骤2结束时指示的那样。
在此步骤中,您已使用多达七个设置来提高标题和cookie的安全性,这些设置将有助于防止跨站点脚本、clickjacking和其他类型的攻击。
结论
在本教程中,您已经解决了几个安全方面,从信息披露到保护会话,通过为重要功能设置替代配置设置。
有关硬化 Apache 的更多资源,这里有一些其他参考:
有关保护 Apache HTTP 的其他工具:
mod_evasive
是一个有用的工具来帮助减轻 DoS 攻击。您可以在 How To Protect Against DoS and DDoS with mod_evasive for Apache tutorial]中找到更多细节。fail2ban
是一个用于阻止未经授权的用户重复登录的入侵软件。您可以在 How To Protect a Apache Server with Fail2Ban tutorial中阅读更多信息。ModSecurity
是一个 Web Application Firewall (或 WAF),因此它提供了基于 SpyderLabs 和社区成员编写的预定义规则的广泛可能性。您可以在 [How To Set Up ModSecurity with Apache tutorial]([LINK