3 Web 服务器

概览

本节包含以安全方式设置Web服务器的最佳实践。

在URL的根目录上启用Zabbix

在基于RHEL的系统上,向Apache配置(/etc/httpd/conf/httpd.conf)中添加一个虚拟主机,并为文档根目录设置永久重定向到Zabbix SSL URL。 请注意,example.com应该替换为服务器的实际名称。

# 添加以下行:
       
       <VirtualHost *:*>
           ServerName example.com
           Redirect permanent / https://example.com
       </VirtualHost>

重启Apache服务以应用更改:

systemctl restart httpd.service

在Web服务器上启用HTTP严格传输安全(HSTS)

为了保护Zabbix前端免受协议降级攻击,我们建议在Web服务器上启用HSTS策略。

要在Apache配置中为您的Zabbix前端启用HSTS策略,请遵循以下步骤:

1. 定位您的虚拟主机配置文件:

  • /etc/httpd/conf/httpd.conf 在基于RHEL的系统上
  • /etc/apache2/sites-available/000-default.conf 在Debian/Ubuntu上

2. 在您的虚拟主机配置文件中添加以下指令:

<VirtualHost *:*>
           Header set Strict-Transport-Security "max-age=31536000"
       </VirtualHost>

3. 重启Apache服务以应用更改:

# 在基于RHEL的系统上:
       systemctl restart httpd.service
       
       # 在Debian/Ubuntu上
       systemctl restart apache2.service

在Zabbix中强制执行安全和SameSite会话Cookie

配置Zabbix时,强制执行会话Cookie的安全和SameSite属性对于增强安全性并防止跨站请求伪造(CSRF)攻击至关重要。然而,强制执行SameSite=Strict在某些情况下可能会导致问题,例如:

  • 仪表盘URL小部件在嵌入同域iframe时显示“用户未登录”。
  • 用户通过HTTP而非HTTPS访问仪表盘时可能遇到登录问题。
  • 无法共享指向特定Zabbix菜单部分或主机的URL。

为了缓解这些问题,用户应有办法调整SameSite策略。

1. 安全Cookie

设置secure标志确保Cookie仅通过HTTPS传输,防止在未加密连接上暴露。

要在Zabbix中启用安全Cookie,请在web服务器配置中添加或修改以下设置:

对于Apache:

Header always edit Set-Cookie ^(.*)$ $1;Secure

对于Nginx:

proxy_cookie_path / "/; Secure";

确保通过HTTPS访问Zabbix前端;否则,带有Secure标志的Cookie将不会被发送。

2. 配置SameSite属性

web服务器设置也可以强制执行SameSite属性:

对于Apache:

<IfModule mod_headers.c>
           Header onsuccess edit Set-Cookie (.*) "$1; SameSite=Strict"
       </IfModule>

对于Nginx(版本1.19.3+):

proxy_cookie_flags ~ samesite=Strict; # 将~替换为'zbx_session'以增加特定性

在Web服务器上启用内容安全策略(CSP)

为了保护Zabbix前端免受跨站脚本(XSS)、数据注入和类似攻击,我们建议在Web服务器上启用内容安全策略(CSP)。 为此,配置Web服务器以返回HTTP头

以下CSP头配置仅适用于默认Zabbix前端安装,以及所有内容均源自站点域(不包括子域)的情况。 如果您正在配置URL小部件以显示来自站点子域或外部域的内容,从OpenStreetMap切换到其他地图引擎,或添加外部CSS或小部件,可能需要不同的CSP头配置。 如果您使用Duo Universal Prompt多因素认证方法,请确保在虚拟主机配置文件中CSP指令中添加“duo.com”。

要在Apache配置中为您的Zabbix前端启用CSP,请遵循以下步骤:

1. 定位您的虚拟主机配置文件:

  • /etc/httpd/conf/httpd.conf 在基于RHEL的系统上
  • /etc/apache2/sites-available/000-default.conf 在Debian/Ubuntu上

2. 在您的虚拟主机配置文件中添加以下指令:

<VirtualHost *:*>
           Header set Content-Security-Policy: "default-src 'self' *.openstreetmap.org; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; img-src 'self' data: *.openstreetmap.org; style-src 'self' 'unsafe-inline'; base-uri 'self'; form-action 'self';"
       </VirtualHost>

3. 重启Apache服务以应用更改:

# 在基于RHEL的系统上:
       systemctl restart httpd.service
       
       # 在Debian/Ubuntu上
       systemctl restart apache2.service

禁用Web服务器信息暴露

为了增强安全性,建议禁用所有Web服务器标识。

默认情况下,Web服务器会暴露软件标识:

可以通过在Apache配置文件中添加以下参数来禁用标识:

ServerSignature Off
       ServerTokens Prod

可以禁用PHP标识(X-Powered-By HTTP头)通过更改php.ini配置文件(默认情况下,标识是禁用的):

expose_php = Off

为了使配置文件更改生效,需要重启Web服务器。

为了额外的安全性,您可以使用mod_security工具与Apache一起(包libapache2-mod-security2)。 此工具允许替换服务器标识,而不仅仅是从服务器标识中移除版本。 安装mod_security后,可以通过将"SecServerSignature"设置为任何所需的值来更改服务器标识。

请参阅您的Web服务器文档以获取有关如何移除/更改软件标识的帮助。

禁用Web服务器默认错误页面

为了避免信息泄露,建议禁用默认错误页面。

默认情况下,Web服务器使用内置错误页面:

这些默认错误页面应被替换或移除。 例如,可以使用“ErrorDocument”指令为Apache Web服务器定义自定义错误页面/文本。

请参考您的Web服务器文档,了解如何替换/移除默认错误页面的帮助。

删除 Web 服务器测试页面

为了防止信息泄露,建议删除 Web 服务器测试页面。

默认情况下,Apache Web 服务器的 Web 根目录包含 index.html 测试页面:

请参阅您 Web 服务器的文档,了解如何删除默认测试页面的帮助。

设置 X-Frame-Options HTTP 响应头

默认情况下,Zabbix 配置了 使用 X-Frame-Options HTTP 头 参数为 SAMEORIGIN。 这意味着内容只能在与页面本身具有相同来源的框架中加载。

Zabbix 前端元素从外部 URL 拉取内容(特别是 URL 仪表盘小部件)在启用了所有沙箱限制的沙箱中显示检索到的内容。

这些设置增强了 Zabbix 前端的安全性,并提供了针对 XSS 和点击劫持攻击的保护。 超级管理员 用户可以根据需要 修改 使用 iframe 沙箱使用 X-Frame-Options HTTP 头 参数。 在更改默认设置前,请仔细权衡风险和收益。 完全禁用 iframe 沙箱或 X-Frame-Options HTTP 头不被推荐。

隐藏包含常用密码列表的文件

为了增加密码暴力破解攻击的难度,建议限制对ui/data/top_passwords.txt文件的访问。 此文件包含最常见和特定于上下文的密码列表,防止用户设置此类密码(如果在密码策略中启用了避免易于猜测的密码参数)。

为了限制对top_passwords.txt文件的访问,请修改您的Web服务器配置。

在Apache上,可以使用.htaccess文件限制文件访问:

<Files "top_passwords.txt">
           Order Allow,Deny
           Deny from all
       </Files>

在NGINX上,可以使用location指令限制文件访问:

location = /data/top_passwords.txt {
           deny all;
           return 404;
       }