1 MySQL 加密配置

概述

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

如果 MySQL 主机 设置为 localhost,则加密选项将不可用。在这种情况下,Zabbix 前端与数据库之间的连接使用套接字 file(在 Unix 上)或共享 memory(在 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 documentation

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

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: 正在使用的加密方式为 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 文档手动创建: Creating SSL and RSA certificates and keys using MySQLCreating SSL certificates and keys using openssl

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
       ...