3 Web服务器

概述

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

在URL根目录启用Zabbix

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

# Add lines:
       
       <VirtualHost *:*>
           ServerName example.com
           Redirect permanent / https://example.com
       </VirtualHost>

重启 Apache 服务以应用更改:

systemctl restart httpd.service

启用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 服务以应用更改:

# On RHEL-based systems:
       systemctl restart httpd.service
       
       # On Debian/Ubuntu
       systemctl restart apache2.service

强制安全与SameSite会话Cookie

配置 Zabbix 时,为了增强安全性并防止跨站请求伪造 (CSRF) 攻击,必须为会话 Cookie 强制启用 Secure 和 SameSite 属性。然而,在某些场景下强制启用 SameSite=Strict 可能会导致出现 问题,例如:

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

为缓解这些 问题,用户应能够调整 SameSite 策略。

1. 安全 Cookie

设置 secure flag 属性可确保 Cookie 仅通过 HTTPS 传输,防止在未加密连接中泄露。

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

对于 Apache:

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

对于 nginx:

proxy_cookie_path / "/; Secure";

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

2. 配置 SameSite 属性

Web 服务器设置还可以强制启用 SameSite 属性:

对于 Apache:

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

对于 nginx(version 1.19.3+):

proxy_cookie_flags ~ samesite=Strict; # 将 ~ 替换为 'zbx_session' 以提高针对性

启用内容安全策略(CSP)

为防止Zabbix前端遭受跨站脚本(XSS)、数据注入及类似攻击,我们建议在Web服务器上启用内容安全策略(Content Security Policy)。 为此,请配置Web服务器返回HTTP header

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

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

1. 找到您的虚拟主机配置文件:

  • RHEL系统上为:/etc/httpd/conf/httpd.conf
  • Debian/Ubuntu系统上为:/etc/apache2/sites-available/000-default.conf

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服务以应用更改:

# On RHEL-based systems:
       systemctl restart httpd.service
       
       # On Debian/Ubuntu
       systemctl restart apache2.service

禁用Web服务器信息暴露

为提高安全性,建议禁用所有 Web 服务器签名。

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

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

ServerSignature Off
       ServerTokens Prod

PHP 签名(X-Powered-By HTTP 头)可以通过更改 php.ini 配置 file 来禁用(默认情况下,签名已被禁用):

expose_php = Off

需要重启 Web 服务器以使配置 file 的更改生效。

为了进一步增强安全性,您可以将 Apache 与 mod_security 工具一起使用(软件包 libapache2-mod-security2)。 该工具允许完全移除服务器签名,而不仅仅是移除服务器签名中的 version。 安装 mod_security 后,通过将 "SecServerSignature" 设置为任意期望的值,可以将服务器签名更改为任何值。

有关如何移除/更改软件签名的帮助,请参阅您的 Web 服务器的文档。

禁用Web服务器默认错误页

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

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

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

有关如何替换或移除默认错误页面的更多信息,请参考您的 Web 服务器文档。

移除Web服务器测试页

为了避免信息泄露,建议移除 Web 服务器的测试页面。

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

有关如何移除默认测试页面的帮助,请参考您的 Web 服务器文档。

设置X-Frame-Options响应头

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

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

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

隐藏常用密码列表文件

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

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

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

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

在 nginx 上,可以使用 location 指令限制对 file 的访问:

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