[comment]: # translation:outdated

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

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

[comment]: # ({7ec7fbd7-cbecfd3f})
### 总览

本节提供了一些关于CentOS 8.2和MySQL
8.0.21的加密配置示例，并且可以用作数据库加密连接的快速入门指南。加密组合列表不限于此页面上列出的组合。有很多可用的组合。

::: noteimportant
 从Zabbix 5.0.5版本开始，如果Mysql主机设置成
localhost,则加密选型将不可用。在这种情况下，Zabbix
前端（frontend）与数据库之间的连接使用套接字文件（在Unix上）或共享内存（在Windows上），并且无法加密。
:::

::: noteclassic
 在 Zabbix 5.0.5
以前版本，TLS加密参数名称以来，已略有更改：为了更清楚起见，添加了"Database"
前缀。在5.0.0-5.0.4版本中，参数称为 *TLS加密(TLS encryption)*,
*TLS证书文件(TLS certificate file)* 等。 
:::

[comment]: # ({/7ec7fbd7-cbecfd3f})

[comment]: # ({18bc694c-30b5ee7b})
### 前提条件

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

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

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

若要查看哪些用户正在使用加密的连接，请运行以下查询（性能模式(Performance
Schema)应打开）：

    mysql> 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]: # ({/18bc694c-30b5ee7b})

[comment]: # ({fe9ba7d9-fda36821})
### 必须模式

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

[comment]: # ({49d81b3d-9ebeae19})
#### MySQL 配置

数据库的当前版本可直接使用 '必须(required)'
[加密模式](/manual/appendix/install/db_encrypt#terminology)。初始设置和启动后，将创建服务器端证书。

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


    mysql> CREATE USER   
     'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<健壮的复杂密码>',   
     'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<健壮的复杂密码>'
     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.0/en/create-user.html#create-user-tls)。

远程连接验证(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: 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]: # ({/49d81b3d-9ebeae19})

[comment]: # ({d4a6a830-b7c3e0c8})
#### 前端

要为Zabbix frontend和数据库之间的连接启用仅传输加密：

-   检查 *数据库TLS加密(Database TLS encryption)*
-   不选中 *验证数据库证书(Verify database certificate)*

[comment]: # ({/d4a6a830-b7c3e0c8})

[comment]: # ({c3928624-99c0e65b})
#### Server

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

    ...
    DBHost=10.211.55.9
    DBName=zabbix
    DBUser=zbx_srv
    DBPassword=<健壮的复杂密码>
    DBTLSConnect=required
    ...

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

[comment]: # ({b288aed0-fa9ec203})
### 验证 CA 模式

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

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

[comment]: # ({e78ba22b-337ad5f4})
#### 前端 (Frontend)

为Zabbix 前端(frontend) 和数据库之间的连接启用带有证书验证的加密：

-   检查 *数据库TLS加密(Database TLS encryption)* 和 *验证数据库证书
    (Verify database certificate)*
-   指定数据库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

[comment]: # ({/e78ba22b-337ad5f4})

[comment]: # ({1a2e31a1-a7a54f92})
#### Zabbix 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
    ...

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

[comment]: # ({8b049fc5-fa5d4760})
### 验证完全模式(Full mode)

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

[comment]: # ({50cb4c56-22fb0ddd})
#### 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文档手动创建MySQL CE服务器和客户端的密钥(Zabbix
前端)[使用MySQL创建SSL和RSA证书和密钥文档](https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-rsa-files-using-mysql.html) or
[使用openssl创建SSL证书和密钥文档](https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html)

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

创建MySQL用户：

    mysql> CREATE USER
      'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<健壮的复杂密码>',
      'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<健壮的复杂密码>'
      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

[comment]: # ({/50cb4c56-22fb0ddd})

[comment]: # ({e0ea02ed-93876c7c})
#### 前端

要对 Zabbix前端 和数据库之间的连接进行完整验证的加密，请执行以下操作：

-   检查 数据库TLS加密并验证数据库证书
-   指定 数据库TLS密钥文件的路径
-   指定 数据库TLS CA文件的路径
-   指定 数据库TLS证书文件的路径

请注意，*数据库主机验证(Database host verification)*
已选中并显示为灰色-MySQL不能跳过此步骤。

::: notewarning
 密码列表应该为空，以便 前端和服务器
可以从两端支持的服务器中协商所需的一个。
:::

或者，可以在/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';
    ...
    // or
    ...
    // 用于未定义密码列表的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'] = '';
    ...

[comment]: # ({/e0ea02ed-93876c7c})

[comment]: # ({decce3e4-c0090000})
#### Zabbix 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
    ...

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