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 Strict Transport Security (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 服务以应用更改:
# On RHEL-based systems:
systemctl restart httpd.service
# On Debian/Ubuntu
systemctl restart apache2.service
在 Zabbix 中强制使用 Secure 和 SameSite 会话 cookie
在配置 Zabbix 时,必须为会话 cookie 强制启用 Secure 和 SameSite 属性,以增强安全性并防止跨站请求伪造(CSRF)攻击。但是,强制使用 SameSite=Strict 在某些场景下可能会导致问题,例如:
- 在嵌入同域 iframe 时,仪表板 URL 部件显示“用户未登录”。
- 用户通过 HTTP 而不是 HTTPS 访问仪表板时,可能会遇到登录问题。
- 无法共享指向特定 Zabbix 菜单部分或主机的 URL。
为缓解这些问题,用户应能够调整 SameSite 策略。
1. Secure cookie
设置 secure 标志可确保 cookie 仅通过 HTTPS 传输,从而防止其在未加密连接中暴露。
要在 Zabbix 中启用 Secure 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 服务器上启用内容安全策略(Content Security Policy)。 为此,请将 web 服务器配置为返回 HTTP 标头。
以下 CSP 标头配置仅适用于默认的 Zabbix 前端安装,以及所有内容均来自站点域名(不包括子域名)的情况。 如果您例如将 URL 部件配置为显示来自站点子域名或外部域名的内容、将 OpenStreetMap 切换为其他地图引擎,或添加外部 CSS 或部件,则可能需要不同的 CSP 标头配置。 如果您使用 Duo Universal Prompt 多因素认证 方法,请确保在虚拟主机配置文件的 CSP 指令中添加 "duo.com"。
要在 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 签名(X-Powered-By HTTP 标头)可通过修改 php.ini 配置文件来禁用(默认情况下,该签名已禁用):
expose_php = Off
要使配置文件更改生效,需要重启 Web 服务器。
为了进一步提高安全性,您可以在 Apache 中使用 mod_security 工具(软件包 libapache2-mod-security2)。 该工具允许完全移除服务器签名,而不仅仅是从服务器签名中移除版本信息。 安装 mod_security 后,可将 "SecServerSignature" 设置为任意所需值,从而将服务器签名更改为任意值。
有关如何移除/更改软件签名的帮助,请参阅您的 Web 服务器文档。
禁用 Web 服务器默认错误页面
为避免信息泄露,建议禁用默认错误页面。
默认情况下,Web 服务器会使用内置错误页面:

这些默认错误页面应被替换/移除。
例如,对于 Apache Web 服务器,可以使用 "ErrorDocument" 指令来定义自定义错误页面/文本。
请参阅您的 Web 服务器文档,了解如何替换/移除默认错误页面。
删除 Web 服务器测试页面
为避免信息泄露,建议删除 Web 服务器测试页面。
默认情况下,Apache Web 服务器的 webroot 包含 index.html 测试页面:

请参阅您的 Web 服务器文档,了解如何删除默认测试页面。
设置 X-Frame-Options HTTP 响应头
默认情况下,Zabbix 配置为将 Use X-Frame-Options HTTP header 参数设置为 SAMEORIGIN。
这意味着内容只能加载到与页面本身具有相同源的框架中。
从外部 URL 拉取内容的 Zabbix 前端元素(即 URL 仪表板小组件)会在启用了所有沙箱限制的沙箱中显示获取到的内容。
这些设置增强了 Zabbix 前端的安全性,并可防御 XSS 和点击劫持攻击。 Super admin 用户可根据需要修改 Use iframe sandboxing 和 Use X-Frame-Options HTTP header 参数。 在更改默认设置之前,请仔细权衡风险与收益。 不建议完全关闭 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;
}