5 安全的连接数据库

概述

本节提供了 Zabbix 的设置步骤和配置示例,用于在以下对象之间建立安全的 TLS 连接:

数据库 Zabbix 组件
MySQL Zabbix 前端、Zabbix 服务器、Zabbix proxy
PostgreSQL Zabbix 前端、Zabbix 服务器、Zabbix proxy

要在 DBMS 内配置连接加密,请参阅官方供应商文档了解详细信息:

  • MySQL: 源数据库服务器和副本复制数据库服务器。
  • MySQL: 组复制等数据库服务器。
  • PostgreSQL 加密选项。

所有示例均基于通过官方软件仓库提供的 MySQL CE (8.0) 和 PgSQL (13) 的 GA 版本,并使用 CentOS 8。

要求

设置加密需要满足以下条件:

  • 由开发者支持的操作系统,并安装 OpenSSL >=1.1.X 或其替代方案。

建议避免使用已进入生命周期终止(end-of-life)状态的操作系统, 尤其是在新安装的情况下。

  • 从开发者提供的官方仓库安装并维护的数据库引擎(RDBMS)。操作系统通常会附带版本过旧的数据库软件,而这些版本尚未实现加密支持,例如基于 RHEL 7 的系统和 PostgreSQL 9.2,以及不支持加密的 MariaDB 5.5。
术语

设置此选项会强制 Zabbix 服务器/proxy 和前端到数据库的连接使用 TLS:

  • required - 使用 TLS 作为传输模式进行连接,但不进行身份检查
  • verify_ca - 使用 TLS 进行连接并验证证书
  • verify_full - 使用 TLS 进行连接,验证证书,并验证由 DBHost 指定的数据库身份(CN)与其证书匹配

Zabbix 配置

前端到数据库

可以在前端安装期间配置与数据库的安全连接:

  • 在配置数据库连接步骤中勾选数据库 TLS 加密复选框,以启用传输加密。
  • 勾选选中TLS 加密字段后显示的验证数据库证书复选框,以启用基于证书的加密。

对于 MySQL,如果数据库主机设置为 localhost,则数据库 TLS 加密复选框处于禁用状态,因为使用套接字文件(在 Unix 上)或共享内存(在 Windows 上)的连接无法加密。
对于 PostgreSQL,如果数据库主机字段的值以斜杠开头或该字段为空,则TLS 加密复选框处于禁用状态。

在基于证书的 TLS 加密模式下(如果两个复选框均已勾选),以下参数可用:

参数 描述
数据库 TLS CA 文件 指定有效 TLS 证书颁发机构(CA)文件的完整路径。
数据库 TLS 密钥文件 指定有效 TLS 密钥文件的完整路径。
数据库 TLS 证书文件 指定有效 TLS 证书文件的完整路径。
数据库主机验证 勾选此复选框以启用主机验证。
MYSQL 不支持此选项,因为 PHP MySQL 库不允许跳过对等证书验证步骤。
数据库 TLS 加密套件列表 指定有效加密套件的自定义列表。加密套件列表的格式必须符合 OpenSSL 标准。
仅适用于 MySQL。

TLS 参数必须指向有效文件。如果指向不存在或无效的文件,将导致授权错误。
如果证书文件可写,前端会在系统信息报告中生成警告:“TLS 证书文件必须为只读。”(仅当 PHP 用户是证书所有者时显示)。

不支持受密码保护的证书。

使用场景

Zabbix 前端使用 GUI 界面来定义可用选项:required、 verify_ca、verify_full。请在安装向导的 Configure DB connections 步骤中指定所需选项。这些选项会按如下方式映射到配置文件 (zabbix.conf.php):

GUI 设置 配置文件 说明 结果
...
// 用于 TLS 连接。
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
勾选 Database TLS encryption
不要勾选 Verify database certificate
启用 required 模式。
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
1. 勾选 Database TLS encryption 和 Verify database certificate
2. 指定 Database TLS CA file 的路径
启用 verify_ca 模式。
...
// 用于具有严格定义 Cipher 列表的 TLS 连接。
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '<cipher_list>';
...

或者:

...
// 用于未定义 Cipher 列表的 TLS 连接 - 由 MySQL 服务器选择
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...
1. 勾选 Database TLS encryption 和 Verify database certificate
2. 指定 Database TLS key file 的路径
3. 指定 Database TLS CA file 的路径
4. 指定 Database TLS certificate file 的路径
5. 指定 Database TLS cipher list(可选)
为 MySQL 启用 verify_full 模式。
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = ' ';
...
1. 勾选 Database TLS encryption 和 Verify database certificate
2. 指定 Database TLS key file 的路径
3. 指定 Database TLS CA file 的路径
4. 指定 Database TLS certificate file 的路径
5. 勾选 Database host verification
为 PostgreSQL 启用 verify_full 模式。

另请参见: MySQL 的加密配置示例、PostgreSQL 的加密配置示例。

Zabbix 服务器/proxy 配置

可以在 Zabbix server 和/或 proxy 配置文件中使用相应参数来配置与数据库的安全连接。

Configuration Result
无 与数据库建立未加密连接。
1. 设置 DBTLSConnect=required 服务器/proxy 与数据库建立 TLS 连接。不允许未加密连接。
1. 设置 DBTLSConnect=verify_ca
2. 设置 DBTLSCAFile - 指定 TLS 证书颁发机构文件
服务器/proxy 在验证数据库证书后与数据库建立 TLS 连接。
1. 设置 DBTLSConnect=verify_full
2. 设置 DBTLSCAFile - 指定 TLS 证书颁发机构文件
服务器/proxy 在验证数据库证书和数据库主机身份后与数据库建立 TLS 连接。
1. 设置 DBTLSCAFile - 指定 TLS 证书颁发机构文件
2. 设置 DBTLSCertFile - 指定客户端公钥证书文件
3. 设置 DBTLSKeyFile - 指定客户端私钥文件
服务器/proxy 在连接数据库时提供客户端证书。
1. 设置 DBTLSCipher - 客户端允许用于使用 TLS 1.2 及以下 TLS 协议连接的加密密码套件列表

或 DBTLSCipher13 - 客户端允许用于使用 TLS 1.3 协议连接的加密密码套件列表
(MySQL) 使用提供列表中的某个密码套件建立 TLS 连接。
(PostgreSQL) 设置此选项将被视为错误。