18个Apache Web服务器安全性和加固技巧

Apache Web服务器是最受欢迎和广泛使用的Web服务器之一,用于托管文件和网站。它易于安装和配置,以满足您的托管需求。然而,默认设置并不安全,无法提供您网站所需的急需保护。

在本指南中,我们将介绍一些可实施的Apache服务器加固技巧,以加强您的Web服务器的安全性。

1. 如何隐藏Apache版本和操作系统信息

默认情况下,Apache Web服务器会在您浏览网站的错误URL时显示其版本。以下是一个示例,显示了无法在站点上找到页面的错误页面。最后一行指示Apache版本、主机操作系统、IP地址和它正在侦听的端口。

Show Apache Version Info

显示您的Web服务器信息通常不是一个好主意,因为这可能会成为黑客在其侦察任务中的重要信息。为了增加一层安全性并使黑客更难以获取信息,建议隐藏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服务器信息。

Check Apache Version Info

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,我们将能够查看目录列表。

Disable Apache Directory Listing

要禁用目录列表,请转到Apache的主配置文件,并搜索“Directory”属性。将“Options”参数设置为“-Indexes”,如所示。

<Directory /opt/apache/htdocs>
Options -Indexes
</Directory>

重新加载Apache,这次访问URL时,目录将不再显示。

Disable Directory Listing in Apache

3. 定期更新Apache

始终建议将所有应用程序保持更新,因为最新的应用程序带有修复错误和安全补丁,解决了旧软件版本中存在的潜在漏洞。

因此,建议定期升级您的应用程序到它们的最新版本。

$ sudo apt update && sudo apt upgrade [On Debian, Ubuntu and Mint]
$ sudo dnf upgrade                    [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
Update System Packages

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启用标题模块:

$ 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连接确保有效的带宽利用,即使传输多个数据流也是如此。

查看如何在Apache Web服务器上启用HTTP/2:

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以使更改生效。

禁用Apache中的ServerSignature指令

Apache配置文件中的ServerSignature指令会在由服务器生成的文档中添加页脚,其中包含有关您的Web服务器配置的信息,例如版本和正在运行的操作系统。向恶意行为者公开关于您的Web服务器的关键细节将显著增加攻击的可能性。

为防止暴露此类信息,您需要在Apache配置文件中禁用此指令:

ServerSignature Off

保存更改,并再次重启Apache以使更改生效。

$ sudo systemctl restart apache2

将‘ServerTokens’指令设置为‘Prod’

ServerTokens’指令控制服务器发送的信息,包括Apache版本(主要和次要版本)、操作系统和正在运行的Web服务器类型。

您希望向公众公开的信息越少,那么您只需要公开Web服务器是Apache即可。其他任何信息都只会暴露您的服务器给潜在攻击。因此,建议将Apache配置文件中的‘ServerTokens’指令设置为‘prod’。

ServerTokens Off

像往常一样保存更改,并确保重新启动Apache。

使用Fail2ban保护Apache

Fail2ban是一款开源入侵预防应用程序,可保护Linux系统免受外部威胁,包括DoS和暴力攻击。它通过不断监视系统日志以寻找恶意活动并禁止符合模仿攻击行为模式的主机来工作。

Fail2ban 可以配置以保护 Apache 免受 DoS 攻击,方法是不断监视 Apache 日志中的登录失败尝试,并临时禁止违规 IP 地址。

查看如何在 Linux 上安装 Fail2ban,使用:

11. 禁用不必要的模块

Apache 模块只是加载的程序,用于扩展 Web 服务器的功能,包括基本身份验证、内容缓存、加密、安全等。

始终建议禁用当前未使用的所有模块,以最小化成为攻击目标的可能性。

要查看所有已启用的模块,请运行以下命令

$ apache2ctl -M
View Apache Modules

要检查特定模块是否已启用,例如,rewrite 模块,请运行以下命令。

$ apache2ctl -M | grep rewrite
Check Apache Module

要禁用模块,请运行以下命令:

$ sudo a2dismod rewrite 
Disable Apache Module

12. 使用 mod_security 和 mod_evasive 模块保护 Apache

您可以启用 mod_securitymod_evasive 模块来保护 Apache 免受暴力攻击或 DDoS 攻击。

  • mod_security 模块类似于 Web 应用程序防火墙(WAF),可以阻止您站点的可疑和不受欢迎的流量。
  • mod_evasive 模块保护您的服务器免受暴力攻击和拒绝服务(DoS)攻击。

阅读有关如何使用 mod_security 和 mod_evasive 模块保护 Apache 的更多信息。

13. 限制 Apache 中不需要的服务

为了进一步保护 Apache,考虑禁用某些服务,例如符号链接和 CGI 执行,如果当前不需要的话。默认情况下,Apache 会遵循符号链接,我们可以关闭此功能以及 -Includes 功能和 CGI。

为此,将 '-ExecCGI -FollowSymLinks -Includes' 行添加到“Directory”部分的 ‘Options’ 指令中。

<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 = 4194304Bytes,请将以下指令添加到您的 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 – 此指令设置可以同时服务的连接数的限制。超过此限制的任何新连接都将排队等待。它在 PreforkWorker MPMs 中都可用。默认值为 256
  • KeepAliveTimeout – 此指令指定服务器在关闭连接之前等待后续请求的持续时间。默认值为 5 秒。
  • LimitRequestFields – 此指令设置客户端接受的HTTP请求头字段数量上限。默认值为100。如果由于过多的HTTP请求头而发生DDoS攻击,则建议降低此值。
  • LimitRequestFieldSize – 此指令设置HTTP请求头的大小限制。

18. 执行定期漏洞扫描

另一种保护您的Web服务器的方法是进行定期的漏洞扫描测试。这有助于识别可能被黑客利用以访问敏感文件或注入恶意软件的潜在安全漏洞。

漏洞扫描工具还有助于指出不安全的配置设置,并协助进行合规审计。流行的漏洞扫描工具包括AcutenixNessusNexposeSucuri等等。

结论

这些是一些Apache加固建议,您可以在您的Web服务器上实施,提供额外的保护层,并防止入侵。

Source:
https://www.tecmint.com/apache-security-tips/