Apache Web 服务器是最流行且使用最广泛的 Web 服务器之一,用于托管文件和网站。它易于安装和配置,可以满足您的托管需求。但是,默认设置并不安全,无法提供您网站所需的急需保护。
在本指南中,我们将介绍一些 Apache 服务器强化提示和技巧,您可以实施它们来增强 Web 服务器的安全性。
1.如何隐藏 Apache
默认情况下,Apache Web 服务器会显示其版本,以防您浏览错误的网站 URL。以下是错误页面的示例,指示在网站上找不到该页面。最后一行指示 Apache 版本、主机操作系统、IP 地址及其正在侦听的端口。
显示网络服务器的信息并不是一个好主意,因为这对于黑客的侦察任务来说是一个很好的礼物。为了增加一层安全性并使黑客更难攻击,建议隐藏 Web 服务器信息。
为此,请打开 基于 Debian 的发行版上的默认 Apache 配置文件。
$ sudo vim /etc/apache2/apache2.conf
对于基于RHEL的系统,例如 RHEL, Fedora、CentOS、Rocky和AlmaLinux。
$ sudo vim /etc/httpd/conf/httpd.conf
在文件末尾添加以下行。
ServerTokens Prod
ServerSignature Off
保存更改并重新启动 Apache Web 服务器。
$ sudo systemctl restart apache2 [On Debian, Ubuntu and Mint]
$ sudo systemctl restart httpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
现在重新加载站点,这一次,Web 服务器信息将不会显示。
2.禁用Apache中的目录列表
默认情况下,Apache允许列出目录,访问者可能会看到文档根目录中的任何文件或目录。
为了演示这一点,我们将创建一个名为test的目录。
$ sudo mkdir -p /var/www/html/test
接下来,我们将导航到该目录并创建一些文件。
$ cd /var/www/html/test
$ sudo touch app.py main.py
现在,如果我们访问该 URL,http://localhost/test 我们将能够查看目录列表。
要禁用目录列表,请转到Apache的主配置文件并搜索“Directory”属性。将“Options”参数设置为-Indexes
,如图所示。
<Directory /opt/apache/htdocs>
Options -Indexes
</Directory>
重新加载Apache,这一次,当您访问该 URL 时,将不再显示目录。
3.定期更新Apache
始终建议使所有应用程序保持最新状态,因为最新的应用程序附带错误修复和安全补丁,可以解决旧软件版本中存在的潜在漏洞。
因此,建议定期将您的应用程序升级到最新版本。
$ sudo apt update && sudo apt upgrade [On Debian, Ubuntu and Mint]
$ sudo dnf upgrade [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
4.在Apache上使用HTTPS加密
Apache 默认情况下使用HTTP协议,该协议是一种弱且不安全的协议,容易被窃听。为了提高网站的安全性,更重要的是提高您的Google SEO排名,请考虑使用SSL证书加密您的网站。
这样做会将默认HTTP协议切换为HTTPS,从而使任何人更难拦截和破译发回的通信并从服务器来回。
了解如何在 Linux 上使用Let’s Encrypt SSL来保护 Apache Web服务器的安全。
5.为Apache启用HTTP严格传输安全(HSTS)
除了使用TLS/SSL证书加密您的网站外,还可以考虑在HTTPS之上实现HSTS网络安全机制。
HTTP严格传输安全(HSTS)是一种保护网站免受中间人攻击和cookie劫持的策略机制。当攻击者将HTTPS协议降级为不安全的HTTP协议时,就会发生这种情况。
HSTS使web服务器能够严格声明web浏览器只能通过HTTPS与之交互,而不能通过HTTP协议。
若要启用HSTS,请确保您的网站运行HTTPS并具有有效的TLS/SSL证书。
接下来,为Apache启用headers模块:
$ sudo a2enmod headers
然后重新加载Apache以应用更改。
$ sudo systemctl restart apache2
接下来,访问域的虚拟主机配置文件。
$ sudo vim /etc/apache2/sites-available/mydomain.conf
接下来,在 <VirtualHost *:443>
块中添加此行:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
内容如下:
<VirtualHost *:443>
# .....
# ....
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
max-age参数指示web浏览器在接下来的一年内(31536000=1年)仅使用HTTPS访问您的网站。
最后,重新启动Apache以使HSTS策略生效。
$ sudo systemctl restart apache2
6.在 Apache上启用HTTP/2
2015年,HTTP/2发布,这是HTTP协议的一个新版本,旨在解决或解决HTTP/1.1创建者没有预见到的多个问题。
虽然HTTP/1.1仍在广泛使用,但它与使用多个TCP连接处理来自浏览器的多个请求相关的性能问题有关,这会导致客户端的高资源开销,导致网络性能下降。
随着应用程序的复杂性和功能性的增长,HTTP/2被创建来解决HTTP/1.1的缺点,这些缺点包括HTTP标头长、网页加载速度慢和总体性能下降。
HTTP/2比其前身提供了更多的保护和隐私。同样重要的是,通过使用多路复用的数据流来增强性能。使用HTTP/2,即使在传输多个数据流时,单个TCP连接也能确保有效的带宽利用率。
7.限制对Apache中敏感目录的访问
您可能采取的另一种安全措施是限制对可能包含敏感信息(如用户数据、日志和配置文件)的目录的访问。
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# Other virtual host settings
<Directory /var/www/html/sensitive_directory>
Require all denied
</Directory>
</VirtualHost>
在上述配置中,Require all denied
拒绝任何试图访问/sensitive_directory 中文件的人。
保存更改并退出文件。然后重新启动 Apache 以使更改生效。
8.在Apache中禁用ServerSignature指令
ServerSignature Off
保存更改并再次重新启动Apache以使更改生效。
$ sudo systemctl restart apache2
9.将“ServerTokens”指令设置为“Prod”
“ServerTokens”指令控制服务器发送的信息,包括Apache版本(主要和次要版本)、操作系统和运行的web服务器类型。
您最不想向公众公开的信息是web服务器是Apache。任何其他操作都只会使您的服务器受到潜在的攻击。因此,建议将Apache配置文件中的“ServerTokens”指令设置为“prod”。
ServerTokens Off
一如既往地保存更改并确保重新启动 Apache。
10.使用Fail2ban保护Apache
Fail2ban 是一款开源入侵防御应用程序,可保护 Linux 系统免受 DoS 和暴力攻击等外部威胁。它的工作原理是不断监视系统日志中的恶意活动,并禁止与模仿攻击行为的模式匹配的主机。
Fail2ban 可配置为持续监控 Apache 日志以查找失败的登录尝试并暂时禁止违规 IP,从而保护 Apache 免受 DoS 攻击。
11.禁用不需要的模块
Apache模块只是加载以扩展Web服务器功能的程序。模块扩展的功能包括基本身份验证、内容缓存、加密、安全等。
始终建议禁用当前未使用的所有模块,以最大程度地减少遭受攻击的可能性。
要查看所有启用的模块,请运行命令
$ apache2ctl -M
要检查特定模块(例如rewrite模块)是否启用,请运行该命令。
$ apache2ctl -M | grep rewrite
要禁用该模块,请运行以下命令:
$ sudo a2dismod rewrite
12.使用mod_security和mod_evasive模块来保护Apache
您可以启用mod_security和mod_evasive模块保护 Apache 免受暴力攻击或 DDoS 攻击。
-
mod_security 模块的作用类似于 Web 应用程序防火墙 (WAF) 并阻止可疑和不需要的流量进入您的网站。
-
mod_evasive 模块可保护您的服务器免受暴力破解和拒绝服务攻击 (DoS)。
13.限制Apache中不需要的服务
为了进一步保护 Apache,请考虑禁用某些服务,例如符号链接和 CGI执行(如果当前不需要)。默认情况下,Apache遵循符号链接,我们可以在一行中关闭此功能以及-Includes
功能和CGI。
要执行此操作,请在“Directory”部分为“Options”指令添加行“-ExcCGI-FlowSymLinks-Includes”。
<Directory /your/website/directory>
Options -ExecCGI -FollowSymLinks -Includes
</Directory>
这也可以在目录级别实现。例如,在这里,我们关闭 “/var/www/html/mydomain1” 目录的 Includes 和 Cgi 文件执行。
<Directory "/var/www/html/mydomain1">
Options -Includes -ExecCGI
</Directory>
保存更改并重新启动 Apache。
14.限制Apache中的文件上传大小
另一种保护web服务器的方法是限制从客户端发送到web服务器的HTTP请求体的总大小。您可以在服务器、每个目录、每个文件或每个位置的上下文中设置它。
例如,如果您希望允许将文件上载到特定目录,例如/var/www/domain.com/wp-uploads目录,并将上载文件的大小限制为4M=4194304字节,请将以下指令添加到Apache配置文件或.htaccess文件中。
<Directory "/var/www/domain.com/wp-uploads">
LimitRequestBody 4194304
</Directory>
保存更改并记得重新启动 Apache。
您可以在服务器、每个目录、每个文件或每个位置的上下文中设置它。该指令可防止异常客户端请求行为,这种行为有时可能是拒绝服务 (DoS) 攻击的一种形式。
15.在Apache中启用日志记录
日志记录提供有关客户端请求的所有详细信息以及与 Web 服务器性能相关的任何其他信息。如果出现问题,这可以提供有用的信息。启用 Apache 日志,尤其是在虚拟主机文件中,您可以在 Web 服务器出现问题时查明问题。
要启用日志记录,您需要包含mod_log_config 模块,该模块提供两个主要日志记录指令。
- ErrorLog – 指定错误日志文件的路径。
- CustomLog – 创建并格式化日志文件。
您可以在虚拟主机文件的虚拟主机部分中使用这些属性来启用日志记录。
<VirtualHost 172.16.25.125:443>
ServerName example.com
DocumentRoot /var/www/html/example/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Debian系统中的{APACHE_LOG_DIR}
指令定义为/var/log/apache2路径。
16.作为单独的用户和组运行Apache
以单独的用户和组身份运行 Apache 是一种常见的安全实践。通过这样做,您可以将 Web 服务器进程与其他系统进程隔离,并最大限度地减少 Web 服务器受到威胁时的潜在损害。
首先,您需要专门为 Apache 创建一个新用户和组。
$ sudo groupadd apachegroup
$ sudo useradd -g apachegroup apacheuser
接下来,您需要编辑 Apache 配置文件以指定新用户和组。
User apacheuser
Group apachegroup
由于您要更改 Apache 运行的用户和组,因此您可能需要更新 Web 目录和文件的所有权,以确保 Apache 仍然可以读取它们。
$ sudo chown -R apacheuser:apachegroup /var/www/html
进行这些更改后,重新启动 Apache 以应用它们:
$ sudo systemctl restart httpd # For RHEL/CentOS
$ sudo systemctl restart apache2 # For Debian/Ubuntu
17.防护DDOS攻击和加固
确实,您无法完全保护您的网站免受 DDoS 攻击。但是,这里有一些指南可以帮助您减轻和管理它们。
-
TimeOut – 该指令允许您指定服务器在返回错误之前等待某些事件完成的持续时间。默认值为 300 秒。对于容易受到 DDoS 攻击的站点,建议保持较低的值。但是,适当的设置很大程度上取决于您的网站收到的请求的性质。注意:超时时间过短可能会导致某些 CGI 脚本出现问题。
-
MaxClients – 该指令设置可同时提供服务的连接数限制。任何超出此限制的新连接都将排队。它在 Prefork 和 Worker MPM 中均可用。默认值为256。
-
KeepAliveTimeout – 该指令指定服务器在关闭连接之前等待后续请求的持续时间。默认值为 5 秒。
-
LimitRequestFields – 该指令设置客户端接受的 HTTP 请求标头字段的数量限制。默认值为100。如果由于HTTP请求头过多而导致DDoS攻击,建议减小该值。
-
LimitRequestFieldSize – 该指令设置 HTTP 请求标头的大小限制。
18.定期执行漏洞扫描
保护 Web 服务器的另一种方法是定期进行漏洞扫描测试。这有助于识别黑客可能利用的潜在安全漏洞来访问敏感文件或注入恶意软件。
漏洞扫描工具还可以帮助指出不安全的配置设置并帮助审核合规性。流行的漏洞扫描工具包括Acutenix、Nessus、Nexpose、Sucuri等等。
结论
这些是一些 Apache 强化技巧,您可以在 Web 服务器上实施这些技巧,以提供额外的保护层并防止入侵。