[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がONになっている必要があります）。

```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]: # ({195216c8-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]: # ({/195216c8-9ebeae19})

[comment]: # ({f58390e3-68afdcc8})
#### フロントエンド

Zabbixフロントエンドとデータベース間の接続でトランスポートのみの暗号化を有効にするには:

-   *データベースTLS暗号化*をチェックします
-   *データベース証明書の検証*はチェックしません

![](../../../../../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]: # ({1919f8f1-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サーバーおよびクライアント（Zabbixフロントエンド）用のキーは、MySQL CEのドキュメントに従って手動で作成する必要があります：[MySQLを使用したSSLおよびRSA証明書とキーの作成](https://dev.mysql.com/doc/refman/8.4/en/creating-ssl-rsa-files-using-mysql.html) または [opensslを使用したSSL証明書とキーの作成](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]: # ({/1919f8f1-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接続を使用する場合
$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'] = '';
...
```

[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})
