[comment]: # ({22b96536-5407a56a})
# 5 安全的连接数据库

[comment]: # ({/22b96536-5407a56a})

[comment]: # ({b38f1bac-7cadd09e})
#### 概述

本节提供了 Zabbix 的设置步骤和配置示例，用于在以下对象之间建立安全的 TLS 连接：

|数据库|Zabbix 组件|
|--------|-----------------|
|MySQL|Zabbix 前端、Zabbix 服务器、Zabbix proxy|
|PostgreSQL|Zabbix 前端、Zabbix 服务器、Zabbix proxy|

要在 DBMS 内配置连接加密，请参阅官方供应商文档了解详细信息：

-   [MySQL](https://dev.mysql.com/doc/refman/8.0/en/replication-encrypted-connections.html)：
    源数据库服务器和副本复制数据库服务器。
-   [MySQL](https://dev.mysql.com/doc/refman/8.0/en/group-replication-security.html)：
    组复制等数据库服务器。
-   [PostgreSQL](https://www.postgresql.org/docs/current/encryption-options.html)
    加密选项。

所有示例均基于通过官方软件仓库提供的 MySQL CE (8.0) 和 PgSQL
(13) 的 GA 版本，并使用 CentOS 8。

[comment]: # ({/b38f1bac-7cadd09e})

[comment]: # ({b7e9dcca-5af34b43})
##### 要求

设置加密需要满足以下条件：

-   由开发者支持的操作系统，并安装 OpenSSL >=1.1.X 或其替代方案。

::: noteclassic
 建议避免使用已进入生命周期终止（end-of-life）状态的操作系统，
尤其是在新安装的情况下。 
:::

-   从开发者提供的官方仓库安装并维护的数据库引擎（RDBMS）。操作系统通常会附带版本过旧的数据库软件，而这些版本尚未实现加密支持，例如基于 RHEL 7 的系统和 PostgreSQL 9.2，以及不支持加密的 MariaDB 5.5。

[comment]: # ({/b7e9dcca-5af34b43})

[comment]: # ({53676bc9-9801ac5b})
##### 术语

设置此选项会强制 Zabbix 服务器/proxy 和前端到数据库的连接使用 TLS：

-   `required` - 使用 TLS 作为传输模式进行连接，但不进行身份检查
-   `verify_ca` - 使用 TLS 进行连接并验证证书
-   `verify_full` - 使用 TLS 进行连接，验证证书，并验证由 DBHost 指定的数据库身份（CN）与其证书匹配

[comment]: # ({/53676bc9-9801ac5b})

[comment]: # ({84f30836-84f30836})
#### Zabbix 配置

[comment]: # ({/84f30836-84f30836})

[comment]: # ({9a1ac113-b1071a8a})
##### 前端到数据库

可在前端安装期间配置与数据库的安全连接：

-   在 [配置数据库连接](/manual/installation/frontend#configure-db-connection) 步骤中勾选 *Database TLS encryption* 复选框，以启用传输加密。
-   勾选在选中 *TLS encryption* 字段后出现的 *Verify database certificate* 复选框，以启用基于证书的加密。

::: noteclassic
 对于 MySQL，如果 *Database host* 设置为 localhost，则 *Database TLS encryption* 复选框会被禁用，因为使用套接字文件（在 Unix 上）或共享内存（在 Windows 上）的连接无法加密。<br>
对于 PostgreSQL，如果 *Database host* 字段的值以斜杠开头或该字段为空，则 *TLS encryption* 复选框会被禁用。

:::

在证书模式的 TLS 加密中，以下参数可用（如果两个复选框都已勾选）：

|Parameter|Description|
|--|--------|
|*Database TLS CA file*|指定有效 TLS 证书颁发机构（CA）文件的完整路径。|
|*Database TLS key file*|指定有效 TLS 密钥文件的完整路径。|
|*Database TLS certificate file*|指定有效 TLS 证书文件的完整路径。|
|*Database host verification*|勾选此复选框以启用主机验证。<br>对于 MYSQL，此选项被禁用，因为 PHP MySQL 库不允许跳过对端证书验证步骤。|
|*Database TLS cipher list*|指定有效密码套件的自定义列表。密码套件列表的格式必须符合 OpenSSL 标准。<br>仅适用于 MySQL。|

::: noteimportant
TLS 参数必须指向有效文件。如果它们指向不存在或无效的文件，将导致授权错误。<br>
如果证书文件可写，前端会在 [系统信息](/manual/web_interface/frontend_sections/reports/status_of_zabbix) 报告中生成一条警告：“TLS certificate files must be read-only.”（仅当 PHP 用户是证书所有者时显示）。

不支持受密码保护的证书。 
:::

[comment]: # ({/9a1ac113-b1071a8a})

[comment]: # ({18fae872-d4fd87a2})
##### 使用场景

Zabbix 前端使用 GUI 界面来定义可用选项：`required`、
`verify_ca`、`verify_full`。请在安装向导的 *Configure DB connections*
步骤中指定所需选项。这些选项会按如下方式映射到配置文件
(zabbix.conf.php)：

|GUI 设置|配置文件|说明|结果|
|----|----|----|----|
|![](../../../../assets/en/manual/appendix/install/encrypt_db_transport.png)|...<br>// 用于 TLS 连接。<br>$DB\['ENCRYPTION'\] = true;<br>$DB\['KEY\_FILE'\] = '';<br>$DB\['CERT\_FILE'\] = '';<br>$DB\['CA\_FILE'\] = '';<br>$DB\['VERIFY\_HOST'\] = false;<br>$DB\['CIPHER\_LIST'\] = '';<br>...|勾选 *Database TLS encryption*<br>不要勾选 *Verify database certificate*|启用 `required` 模式。|
|![](../../../../assets/en/manual/appendix/install/encrypt_db_verify_ca.png)|...<br>$DB\['ENCRYPTION'\] = true;<br>$DB\['KEY\_FILE'\] = '';<br>$DB\['CERT\_FILE'\] = '';<br>$DB\['CA\_FILE'\] = '/etc/ssl/mysql/ca.pem';<br>$DB\['VERIFY\_HOST'\] = false;<br>$DB\['CIPHER\_LIST'\] = '';<br>...|1\. 勾选 *Database TLS encryption* 和 *Verify database certificate*<br>2. 指定 *Database TLS CA file* 的路径|启用 `verify_ca` 模式。|
|![](../../../../assets/en/manual/appendix/install/encrypt_db_verify_full1.png)|...<br>// 用于具有严格定义 Cipher 列表的 TLS 连接。<br>$DB\['ENCRYPTION'\] = true;<br>$DB\['KEY\_FILE'\] = '<key\_file\_path>';<br>$DB\['CERT\_FILE'\] = '<key\_file\_path>';<br>$DB\['CA\_FILE'\] = '<key\_file\_path>';<br>$DB\['VERIFY\_HOST'\] = true;<br>$DB\['CIPHER\_LIST'\] = '<cipher\_list>';<br>...<br><br>或者：<br><br>...<br>// 用于未定义 Cipher 列表的 TLS 连接 - 由 MySQL 服务器选择<br>$DB\['ENCRYPTION'\] = true;<br>$DB\['KEY\_FILE'\] = '<key\_file\_path>';<br>$DB\['CERT\_FILE'\] = '<key\_file\_path>';<br>$DB\['CA\_FILE'\] = '<key\_file\_path>';<br>$DB\['VERIFY\_HOST'\] = true;<br>$DB\['CIPHER\_LIST'\] = '';<br>...|1\. 勾选 *Database TLS encryption* 和 *Verify database certificate*<br>2. 指定 *Database TLS key file* 的路径<br>3. 指定 *Database TLS CA file* 的路径<br>4. 指定 *Database TLS certificate file* 的路径<br>5. 指定 *Database TLS cipher list*（可选）|为 MySQL 启用 `verify_full` 模式。|
|![](../../../../assets/en/manual/appendix/install/encrypt_db_verify_full2.png)|...<br>$DB\['ENCRYPTION'\] = true;<br>$DB\['KEY\_FILE'\] = '<key\_file\_path>';<br>$DB\['CERT\_FILE'\] = '<key\_file\_path>';<br>$DB\['CA\_FILE'\] = '<key\_file\_path>';<br>$DB\['VERIFY\_HOST'\] = true;<br>$DB\['CIPHER\_LIST'\] = ' ';<br>...<br>|1\. 勾选 *Database TLS encryption* 和 *Verify database certificate*<br>2. 指定 *Database TLS key file* 的路径<br>3. 指定 *Database TLS CA file* 的路径<br>4. 指定 *Database TLS certificate file* 的路径<br>5. 勾选 *Database host verification*|为 PostgreSQL 启用 `verify_full` 模式。|

**另请参见：** [MySQL 的加密配置示例](/manual/appendix/install/db_encrypt/mysql)、[PostgreSQL 的加密配置示例](/manual/appendix/install/db_encrypt/postgres)。

[comment]: # ({/18fae872-d4fd87a2})

[comment]: # ({b504a368-9cfb91d1})
#### Zabbix 服务器/proxy 配置

可以在 Zabbix [server](/manual/appendix/config/zabbix_server) 和/或 [proxy](/manual/appendix/config/zabbix_proxy) 配置文件中使用相应参数来配置与数据库的安全连接。

|Configuration|Result|
|--|--|
|无|与数据库建立未加密连接。|
|1\. 设置 `DBTLSConnect=required`|服务器/proxy 与数据库建立 TLS 连接。不允许未加密连接。|
|1\. 设置 `DBTLSConnect=verify_ca`<br>2. 设置 `DBTLSCAFile` - 指定 TLS 证书颁发机构文件|服务器/proxy 在验证数据库证书后与数据库建立 TLS 连接。|
|1\. 设置 `DBTLSConnect=verify_full`<br>2. 设置 `DBTLSCAFile` - 指定 TLS 证书颁发机构文件|服务器/proxy 在验证数据库证书和数据库主机身份后与数据库建立 TLS 连接。|
|1\. 设置 `DBTLSCAFile` - 指定 TLS 证书颁发机构文件<br>2. 设置 `DBTLSCertFile` - 指定客户端公钥证书文件<br>3. 设置 `DBTLSKeyFile` - 指定客户端私钥文件|服务器/proxy 在连接数据库时提供客户端证书。|
|1\. 设置 `DBTLSCipher` - 客户端允许用于使用 TLS 1.2 及以下 TLS 协议连接的加密密码套件列表<br><br>或 `DBTLSCipher13` - 客户端允许用于使用 TLS 1.3 协议连接的加密密码套件列表|(MySQL) 使用提供列表中的某个密码套件建立 TLS 连接。<br>(PostgreSQL) 设置此选项将被视为错误。|

[comment]: # ({/b504a368-9cfb91d1})
