1 MySQL 加密配置

概述

本节提供了适用于 CentOS 8.2 和 MySQL 8.0.30 的若干加密配置示例,可作为加密数据库连接的快速入门指南。

如果 MySQL 主机设置为 localhost,则加密选项将不可用。在这种情况下,Zabbix 前端与数据库之间的连接使用套接字文件(在 Unix 上)或共享内存(在 Windows 上),因此无法加密。

加密组合列表并不局限于本页列出的内容。还有许多其他可用组合。

先决条件

official repository 安装 MySQL 数据库。

参见 MySQL documentation 有关如何使用 MySQL 仓库的详细信息。

MySQL 服务器已准备好使用自签名证书接受安全连接 证书。

要查看哪些用户正在使用加密连接,run 以下内容 query(应启用性能模式):

mysql> SELECT sbt.variable_value AS tls版本, t2.variable_value AS 密码, processlist_user AS 用户, processlist_host AS 主机
        从 `performance_schema.status_by_thread` 视图中查询数据。
        将 `performance_schema.threads` 表与 `t.thread_id = sbt.thread_id` 进行内连接。
        将 performance_schema.status_by_thread 表作为 t2 与 t.thread_id = t.thread_id 进行连接
        WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher'
        按 tls_version 排序;

仅传输加密

MySQL 配置

数据库的现代版本开箱即用,已准备好使用 required 加密模式。在初始设置和启动后,将创建服务器端证书。

为主要组件创建用户和角色:

对于 MySQL 8.4+ 版本,应使用 caching_sha2_password,而不是 mysql_native_password

mysql> CREATE USER
 'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
 'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
 REQUIRE SSL
 PASSWORD HISTORY 5; 

mysql> CREATE ROLE 'zbx_srv_role', 'zbx_web_role'; 

mysql> GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, INDEX, REFERENCES ON zabbix.* TO 'zbx_srv_role'; 
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON zabbix.* TO 'zbx_web_role'; 

mysql> GRANT 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> GRANT 'zbx_web_role' TO 'zbx_web'@'%'; 

mysql> SET DEFAULT ROLE 'zbx_srv_role' TO 'zbx_srv'@'%'; 
mysql> SET DEFAULT ROLE 'zbx_web_role' TO 'zbx_web'@'%';

请注意,X.509 协议并不用于检查身份,而是将用户配置为仅使用加密连接。有关配置用户的更多详细信息,请参见 MySQL 文档

运行以下命令以检查连接(socket 连接不能用于测试安全连接):

mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED 

检查当前状态和可用的密码套件:

mysql> status
--------------
mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id: 62
Current database:
Current user: [email protected]
SSL: Cipher in use is TLS_AES_256_GCM_SHA384

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
*************************** 1. row ***************************
Variable_name: Ssl_cipher_list
Value: TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA
1 row in set (0.00 sec)

ERROR:
No query specified

前端

要启用 Zabbix 前端与数据库之间连接的仅传输加密:

  • 勾选 数据库 TLS 加密
  • 不勾选 验证数据库证书

Server

要在服务器与数据库之间启用仅传输加密的连接,请配置 /etc/zabbix/zabbix_server.conf 文件:

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...

带CA验证的加密

将所需的 MySQL CA 复制到 Zabbix 前端服务器,并分配适当的权限以允许 Web 服务器读取此文件。

由于旧版本的 MySQL 库,此模式在 SLES 12 和 RHEL 7 上无法工作。

前端

要为 Zabbix 前端与数据库之间的连接启用带证书验证的加密:

  • 勾选 数据库 TLS 加密验证数据库证书
  • 指定数据库 TLS CA 的路径 file

或者,可以在 /etc/zabbix/web/zabbix.conf.php 中进行设置:

...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...

使用命令行工具排查用户问题,检查所需用户是否可以建立连接:

mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem

Server

为在 Zabbix server 与数据库之间的连接中启用带证书验证的加密,请配置 /etc/zabbix/zabbix_server.conf

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_ca
DBTLSCAFile=/etc/ssl/mysql/ca.pem
...

完全验证加密

MySQL 配置

将 MySQL CE 服务器配置选项 (/etc/my.cnf.d/server-tls.cnf)设置为:

[mysqld]
...
# 在此示例中,密钥位于 MySQL CE datadir 目录中
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

require_secure_transport=ON
tls_version=TLSv1.3
...

MySQL CE 服务器和客户端(Zabbix 前端)的密钥应根据 MySQL CE 文档手动创建:使用 MySQL 创建 SSL 和 RSA 证书及密钥使用 openssl 创建 SSL 证书及密钥

MySQL 服务器证书应包含 Common Name 字段,并将其设置为 FQDN 名称,因为 Zabbix 前端将使用 DNS 名称或数据库主机的 IP 地址与数据库通信。

创建 MySQL 用户:

对于 MySQL 8.4+ 版本,应使用 caching_sha2_password,而不是 mysql_native_password

mysql> CREATE USER
  'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
  'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
  REQUIRE X509
  PASSWORD HISTORY 5;

检查是否可以使用该用户登录:

mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem

前端

要启用 Zabbix 前端与数据库之间带有完全验证的加密连接:

  • 勾选 数据库 TLS 加密验证数据库证书
  • 指定 数据库 TLS 密钥文件 的路径
  • 指定 数据库 TLS CA 文件 的路径
  • 指定 数据库 TLS 证书文件 的路径

请注意,数据库 主机 验证 已被勾选且为灰色 - MySQL 不允许跳过此步骤。

如果 数据库 TLS 加密套件列表 字段留空,则将启用前端(客户端)和服务器都允许的通用加密套件。 或者,可以按照 cipher configuration requirements 明确设置加密套件。

或者,可以在 /etc/zabbix/web/zabbix.conf.php 中进行如下设置:

...
// 用于使用严格定义的加密套件列表建立 TLS 连接。
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GC';
...
// 或者
...
// 用于未定义加密套件列表的 TLS 连接 - 由 MySQL 服务器选择
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...

Server

要启用 Zabbix server 与数据库之间连接的完全验证加密,请配置 /etc/zabbix/zabbix_server.conf

...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_full
DBTLSCAFile=/etc/ssl/mysql/ca.pem
DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
...