3 Web 服务器

概述

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

强制将根 URL 重定向到 Zabbix SSL

在基于 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. 找到您的虚拟主机配置文件:

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

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 时,必须强制会话 cookie 使用 secure 和 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 服务器上启用内容安全策略。 为此,请将 Web 服务器配置为返回 HTTP 标头

以下 CSP 标头配置仅适用于默认的 Zabbix 前端安装,以及所有内容都来自站点域名(不包括子域名)的情况。 如果您例如配置 URL 小部件以显示来自站点子域名或外部域名的内容,或者从 OpenStreetMap 切换到其他地图引擎,或添加外部 CSS 或小部件,则可能需要不同的 CSP 标头配置。 如果您使用 Duo Universal Prompt 多因素认证 方法,请确保在虚拟主机的配置文件中将 "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 服务以应用更改:

# 在 RHEL 系统上:
systemctl restart httpd.service

# 在 Debian/Ubuntu 上
systemctl restart apache2.service

禁用 Web 服务器信息暴露

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

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

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

ServerSignature Off
ServerTokens Prod

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

expose_php = Off

需要重启 Web 服务器,配置文件更改才会生效。

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

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

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

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

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

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

请参阅你的 web 服务器文档,了解如何替换/移除默认错误页面。

删除 web 服务器测试页面

为避免信息泄露,建议删除 web 服务器测试页面。

默认情况下,Apache web 服务器的 webroot 中包含 index.html 测试页面:

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

设置 X-Frame-Options HTTP 响应头

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

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

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

隐藏常见密码列表文件

为了提高密码暴力破解攻击的复杂度,建议限制对 ui/data/top_passwords.txt 文件的访问。
该文件包含最常见以及与上下文相关的密码列表,并可防止用户设置此类密码(如果在 password policy 中启用了 Avoid easy-to-guess passwords 参数)。

要限制对 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;
}