1 MySQL加密配置

概述

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

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

加密组合并不限于本页列出的这些。 还有更多可用的组合。

先决条件

官方仓库安装 MySQL 数据库。

有关如何使用 MySQL 仓库的详细信息,请参见 MySQL 文档

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

要查看哪些用户正在使用加密连接,请运行以下查询(应启用 Performance Schema):

SELECT sbt.variable_value AS tls_version, t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host 
FROM performance_schema.status_by_thread  AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher'
ORDER BY tls_version;

仅传输加密

MySQL 配置

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

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

mysql> CREATE USER   
 'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',   
 'zbx_web'@'%' IDENTIFIED WITH caching_sha2_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 文档

运行以下命令以检查连接(不能使用套接字连接来测试安全连接):

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

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

mysql> status
--------------
mysql Ver 8.4.0 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 前端与数据库之间的连接启用仅传输加密:

  • 选中 Database TLS encryption
  • 不选中 Verify database certificate

服务器

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

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

使用证书颁发机构验证的加密

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

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

前端

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

  • 勾选 Database TLS encryptionVerify database certificate
  • 指定 Database TLS CA 文件的路径

或者,也可以在 /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

服务器

要为 Zabbix 服务器与数据库之间的连接启用带证书验证的加密,请配置 /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 文档手动创建:Creating SSL and RSA certificates and keys using MySQLCreating SSL certificates and keys using openssl

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

创建 MySQL 用户:

mysql> CREATE USER
  'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
  'zbx_web'@'%' IDENTIFIED WITH caching_sha2_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 前端与数据库之间的连接启用带完整验证的加密:

  • 勾选 Database TLS encryptionVerify database certificate
  • 指定 Database TLS key file 的路径
  • 指定 Database TLS CA file 的路径
  • 指定 Database TLS certificate file 的路径

请注意,Database host verification 已被勾选且显示为灰色 - 对于 MySQL,此步骤不能跳过。

如果 Database TLS cipher list 字段留空,则会启用前端(客户端)和服务器双方都允许的通用密码套件。 或者,也可以显式设置密码套件,以符合密码套件配置要求

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

...
// 用于 TLS 连接,并严格定义 Cipher 列表。
$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 连接,不定义 Cipher 列表 - 由 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'] = '';
...

服务器

要为 Zabbix 服务器与数据库之间的连接启用带完全验证的加密,请配置 /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
...