[comment]: # ({f745f323-f745f323})
# 1 MySQL加密配置

[comment]: # ({/f745f323-f745f323})

[comment]: # ({355d8b52-f87c5964})
### 概述

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

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

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

[comment]: # ({/355d8b52-f87c5964})

[comment]: # ({8cb2ef57-30b5ee7b})
### 先决条件

从[官方仓库](https://dev.mysql.com/downloads/repo/yum/)安装 MySQL 数据库。

有关如何使用 MySQL 仓库的详细信息，请参见 [MySQL 文档](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)。

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

要查看哪些用户正在使用加密连接，请运行以下查询（应启用 Performance Schema）：

```sqlmysql
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;
```

[comment]: # ({/8cb2ef57-30b5ee7b})

[comment]: # ({7b44fd81-fda36821})
### 仅传输加密

[comment]: # ({/7b44fd81-fda36821})

[comment]: # ({1727050e-9ebeae19})
#### MySQL 配置

现代版本的数据库开箱即已为 `required` [加密模式](/manual/appendix/install/db_encrypt#terminology)做好准备。
完成初始设置并启动后，将创建服务器端证书。

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

```sqlmysql
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 文档](https://dev.mysql.com/doc/refman/8.4/en/create-user.html#create-user-tls)。

运行以下命令检查连接（不能使用套接字连接来测试安全连接）：

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

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

```sqlmysql
mysql> status
--------------
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id: 62
Current database:
Current user: zbx_srv@bfdb.local
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
```

[comment]: # ({/1727050e-9ebeae19})

[comment]: # ({f58390e3-68afdcc8})
#### 前端

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

-   选中 *Database TLS encryption*
-   不选中 *Verify database certificate*

![](../../../../../assets/en/manual/appendix/install/encrypt_db_transport.png){width="600"}

[comment]: # ({/f58390e3-68afdcc8})

[comment]: # ({28b4b1c0-99c0e65b})
#### 服务器

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

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

[comment]: # ({/28b4b1c0-99c0e65b})

[comment]: # ({627a05e9-fa9ec203})
### 使用证书颁发机构验证的加密

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

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

[comment]: # ({/627a05e9-fa9ec203})

[comment]: # ({4cb2ce06-9776435f})
#### 前端

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

-   勾选 *Database TLS encryption* 和 *Verify database certificate*
-   指定 Database TLS CA 文件的路径

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_ca.png){width="600"}

或者，也可以在 */etc/zabbix/web/zabbix.conf.php* 中进行设置：

```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'] = '';
...
```

故障排查时，用户可以使用命令行工具检查所需用户是否能够建立连接：

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

[comment]: # ({/4cb2ce06-9776435f})

[comment]: # ({cfd9329e-a7a54f92})
#### 服务器

要为 Zabbix 服务器与数据库之间的连接启用带证书验证的加密，请配置 */etc/zabbix/zabbix\_server.conf*：

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

[comment]: # ({/cfd9329e-a7a54f92})

[comment]: # ({edf12bed-fa5d4760})
### 完全验证加密

[comment]: # ({/edf12bed-fa5d4760})

[comment]: # ({86a84990-22fb0ddd})
#### MySQL 配置

将 MySQL CE 服务器配置选项（*/etc/my.cnf.d/server-tls.cnf*）设置为：

```ini
[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 文档手动创建 MySQL CE 服务器和客户端（Zabbix 前端）的密钥：[Creating SSL and RSA certificates and keys using MySQL](https://dev.mysql.com/doc/refman/8.4/en/creating-ssl-rsa-files-using-mysql.html) 或 [Creating SSL certificates and keys using openssl](https://dev.mysql.com/doc/refman/8.4/en/creating-ssl-files-using-openssl.html)

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

创建 MySQL 用户：

```sqlmysql
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;
```

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

```bash
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
```

[comment]: # ({/86a84990-22fb0ddd})

[comment]: # ({165e89bf-2f3a5c57})
#### 前端

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

-   勾选 *Database TLS encryption* 和 *Verify database certificate*
-   指定 *Database TLS key file* 的路径
-   指定 *Database TLS CA file* 的路径
-   指定 *Database TLS certificate file* 的路径

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

::: notewarning
如果 *Database TLS cipher list* 字段留空，则会启用前端（客户端）和服务器双方都允许的通用密码套件。
或者，也可以显式设置密码套件，以符合[密码套件配置要求](https://dev.mysql.com/doc/refman/8.4/en/encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration)。
:::

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_full1.png){width=600}

或者，也可以在 */etc/zabbix/web/zabbix.conf.php* 中进行设置：

```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'] = '';
...
```

[comment]: # ({/165e89bf-2f3a5c57})

[comment]: # ({e32ce094-c0090000})
#### 服务器

要为 Zabbix 服务器与数据库之间的连接启用带完全验证的加密，请配置 */etc/zabbix/zabbix\_server.conf*：

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

[comment]: # ({/e32ce094-c0090000})
