1. 为什么在 Ubuntu 20.04 上部署 Zabbix 监控远程服务器必须“安全”二字打头阵
Zabbix 不是装上就能用的玩具,尤其当你把监控探针伸向生产环境里的数据库服务器、API 网关或核心业务容器集群时,“能连上”和“连得稳、看得清、防得住”之间隔着三道防火墙——两道是技术的,一道是认知的。我见过太多团队在测试机上跑通 Zabbix Web 界面后就急着上线,结果不到一周,Zabbix Server 日志里开始刷屏 zabbix_agentd [12345]: cannot connect to [[192.168.10.55]:10050]: connection refused ;再过三天,运维同事突然发现某台被监控的财务系统服务器 CPU 使用率曲线在图表里平直如尺——不是没负载,是 Agent 进程早被 SELinux 策略无声杀掉了;最惊险的一次,是某次批量更新 Zabbix Agent 配置时,因未校验 TLS 证书指纹,导致监控数据被中间节点劫持重放,告警阈值被恶意篡改,故障窗口被人为拉长了 47 分钟。
这些都不是理论风险。Ubuntu 20.04 作为长期支持(LTS)版本,其默认安全基线(AppArmor、systemd socket activation、严格的文件权限模型)与 Zabbix 经典部署方式存在天然张力。它不像 CentOS 7 那样默认关闭 SELinux 后留出宽松空间,也不像 Ubuntu 22.04 那样原生集成更现代的 TLS 1.3 协商机制。你面对的是一个“默认即防御”的操作系统,而 Zabbix 的官方文档却仍大量沿用 AllowRoot=1 、 ListenIP=0.0.0.0 这类在 2020 年已属高危的配置惯性。真正的难点从来不在“怎么装”,而在于: 如何让 Zabbix 的每一个通信环节——从 Agent 到 Proxy,从 Proxy 到 Server,从 Server 到 Web 前端——都经得起 tcpdump 抓包分析、nmap 端口扫描和 curl -v 的明文验证? 这篇文章不讲“一键安装”,只拆解你在 Ubuntu 20.04 上每一步操作背后的安全代价与补偿方案。关键词不是“Zabbix”或“Ubuntu”,而是“安全”——它必须贯穿于证书生成、用户隔离、端口绑定、日志审计、防火墙策略的每一行命令之中。
2. Zabbix 架构选型:为什么拒绝 All-in-One,坚持 Server-Proxy-Agent 三层分离
很多教程开篇就让你 apt install zabbix-server-pgsql zabbix-frontend-php zabbix-apache-conf ,看似省事,实则埋下三颗雷:第一,Web 前端与 Server 共享同一 Apache 实例,一旦 PHP 模块存在 RCE 漏洞(比如 CVE-2021-41773),攻击者可直接读取 /etc/zabbix/zabbix_server.conf 获取数据库密码;第二,Server 进程以 zabbix 用户运行,但 Apache 默认以 www-data 用户启动,二者若共用 /var/log/zabbix/ 目录,必然触发权限冲突,最终导致日志轮转失败、磁盘爆满;第三,也是最致命的——当你要监控分布在不同 DMZ 区域的远程服务器时,All-in-One 架构要求所有被监控端必须能直连 Zabbix Server 的 10051 端口,这等于主动撕开防火墙策略,将核心监控服务暴露在不可信网络边界。
我坚持采用 Server-Proxy-Agent 三层架构,不是为了炫技,而是为安全做物理隔离。具体到 Ubuntu 20.04 环境,我的部署拓扑是:
- Zabbix Server :部署在内网核心区(如 10.10.1.10),仅监听
127.0.0.1:10051,对外不开放任何端口; - Zabbix Proxy :部署在各网络区域边界(如 DMZ 区 172.16.1.5),监听
0.0.0.0:10051,但通过 iptables 严格限制仅允许来自本区域被监控服务器的连接; - Zabbix Agent :部署在每台远程服务器上,配置为仅连接本地 Proxy 的
172.16.1.5:10051,绝不直连 Server。
这个设计带来三个确定性收益:
- 攻击面收敛 :外部攻击者即使攻陷一台被监控服务器,也只能与 Proxy 通信,无法触达核心 Server;
- 网络策略可控 :防火墙只需在 Proxy 所在主机上放行
172.16.1.0/24 → 172.16.1.5:10051,无需为每台被监控机单独开规则; - 故障域隔离 :某 Proxy 失联,仅影响其下挂载的服务器组,Server 与其他 Proxy 仍正常工作。
提示:Ubuntu 20.04 的
zabbix-proxy-sqlite3包虽轻量,但 SQLite 在高并发写入场景下易出现database is locked错误。我实测在单 Proxy 管理 200+ 主机时,CPU 负载突增 40%,最终切换为zabbix-proxy-pgsql,并为 PostgreSQL 配置shared_buffers = 256MB和work_mem = 16MB,问题彻底消失。
3. TLS 加密链路:从证书签发到 Agent 配置的零信任实践
Zabbix 官方文档对 TLS 的描述常止步于“启用加密”,但 Ubuntu 20.04 的现实是:OpenSSL 1.1.1f 默认禁用 TLS 1.0/1.1,而旧版 Zabbix Agent(<5.0)若未正确配置,会因协议协商失败直接断连。更隐蔽的风险在于证书信任链——如果你用自签名 CA 签发证书,却未将 CA 根证书导入 Ubuntu 系统信任库,那么 zabbix_get 工具在调试时会静默失败,错误日志只显示 Cannot connect to [[172.16.1.5]:10051] ,根本不会提示“TLS handshake failed”。
我的零信任实践分四步走,每一步都经过 openssl s_client 和 zabbix_get -s 双重验证:
3.1 创建专用 CA 并签发全链证书
不复用公司现有 CA,避免权限过度集中。在 Zabbix Server 主机上执行:
# 创建 CA 私钥(4096 位,AES-256 加密)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -aes-256-cbc -out /etc/zabbix/ssl/ca.key
# 生成 CA 证书(有效期 10 年)
openssl req -x509 -new -nodes -key /etc/zabbix/ssl/ca.key -sha256 -days 3650 -out /etc/zabbix/ssl/ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=ZabbixCA/CN=Zabbix Root CA"
#


858

被折叠的 条评论
为什么被折叠?



