データベースへの安全な接続

概要

このセクションでは、以下の間で安全な TLS 接続を確立するための Zabbix のセットアップ手順と設定例を示します。

Database Zabbix components
MySQL Zabbix Webインターフェース, Zabbix サーバー, Zabbix プロキシ
PostgreSQL Zabbix Webインターフェース, Zabbix サーバー, Zabbix プロキシ

DBMS 内で接続の暗号化を設定する方法については、詳細を各ベンダーの公式ドキュメントで確認してください。

  • MySQL: ソースおよびレプリカのレプリケーションデータベースサーバー。
  • MySQL: グループレプリケーションなどのデータベースサーバー。
  • PostgreSQL 暗号化オプション。

すべての例は、CentOS 8 を使用し、公式リポジトリから入手できる MySQL CE (8.0) および PgSQL (13) の GA リリースを基にしています。

要件

暗号化を設定するには、以下が必要です。

  • 開発元がサポートするオペレーティングシステムで、OpenSSL >=1.1.X または 代替手段が利用できること。

特に新規インストールの場合は、OS がサポート終了状態であることは 避けることを推奨します。

  • 開発元が提供する公式リポジトリからインストールされ、保守されている データベースエンジン(RDBMS)。オペレーティングシステムには、暗号化 サポートが実装されていない古いデータベースソフトウェアのバージョンが 同梱されていることがよくあります。たとえば、RHEL 7 ベースのシステムや、 暗号化サポートのない PostgreSQL 9.2、MariaDB 5.5 などです。
用語

このオプションを設定すると、Zabbix サーバー/プロキシおよび Webインターフェース からデータベースへの接続に TLS 接続を使用することが強制されます。

  • required - アイデンティティ確認なしで、TLS を転送モードとして使用して接続します
  • verify_ca - TLS を使用して接続し、証明書を検証します
  • verify_full - TLS を使用して接続し、証明書を検証し、DBHost で指定されたデータベースのアイデンティティ (CN) がその証明書と一致することを検証します

Zabbix設定

Webインターフェースからデータベースへの接続

データベースへの安全な接続は、Webインターフェースのインストール時に設定できます。

  • DB接続の設定の手順で、Database TLS encryption チェックボックスを選択して、転送時の暗号化を有効にします。
  • TLS encryption フィールドを選択すると表示される Verify database certificate チェックボックスを選択して、証明書を使用した暗号化を有効にします。

MySQLの場合、Database host に localhost が設定されていると、Database TLS encryption チェックボックスは無効になります。これは、ソケットファイル(Unixの場合)または共有メモリ(Windowsの場合)を使用する接続を暗号化できないためです。
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 ホスト検証を有効にするには、このチェックボックスを選択します。
PHP MySQLライブラリでは、ピア証明書の検証手順をスキップできないため、MySQLでは無効です。
Database TLS cipher list 有効な暗号のカスタムリストを指定します。暗号リストの形式は、OpenSSL標準に準拠している必要があります。
MySQLでのみ使用できます。

TLSパラメータには、有効なファイルを指定する必要があります。存在しないファイルや無効なファイルを指定すると、認証エラーが発生します。
証明書ファイルが書き込み可能な場合、WebインターフェースはSystem informationレポートに「TLS certificate files must be read-only.」という警告を生成します(PHPユーザーが証明書の所有者である場合にのみ表示されます)。

パスワードで保護された証明書はサポートされていません。

使用例

ZabbixのWebインターフェースでは、GUIを使用して次のオプションを定義します: required、verify_ca、verify_full。
インストールウィザードのDB接続の設定ステップで、必要なオプションを指定します。
これらのオプションは、Webインターフェース設定ファイル(zabbix.conf.php)に次のようにマッピングされます。

GUI設定 設定ファイル 説明 結果
...
// TLS接続に使用。
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
1. データベースTLS暗号化をチェック
2. データベース証明書の検証をチェックしない
requiredモードを有効にします。
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
1. データベースTLS暗号化とデータベース証明書の検証をチェック
2. データベースTLS CAファイルへのパスを指定
verify_caモードを有効にします。
...
// 厳密に定義されたCipherリストを使用するTLS接続に使用。
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '<cipher_list>';
...

または:

...
// Cipherリストを定義せず、MySQLサーバーによって選択されるTLS接続に使用
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...
1. データベースTLS暗号化とデータベース証明書の検証をチェック
2. データベースTLSキーファイルへのパスを指定
3. データベースTLS CAファイルへのパスを指定
4. データベースTLS証明書ファイルへのパスを指定
5. データベースTLS Cipherリストを指定(任意)
MySQLのverify_fullモードを有効にします。
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '<key_file_path>';
$DB['CERT_FILE'] = '<key_file_path>';
$DB['CA_FILE'] = '<key_file_path>';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = ' ';
...
1. データベースTLS暗号化とデータベース証明書の検証をチェック
2. データベースTLSキーファイルへのパスを指定
3. データベースTLS CAファイルへのパスを指定
4. データベースTLS証明書ファイルへのパスを指定
5. データベースホストの検証をチェック
PostgreSQLのverify_fullモードを有効にします。

関連項目: MySQLの暗号化設定例、PostgreSQLの暗号化設定例。

Zabbix サーバー/プロキシの設定

データベースへの安全な接続は、Zabbix サーバーおよび/またはプロキシの設定ファイルで、それぞれのパラメータを使用して設定できます。

設定 結果
なし 暗号化なしでデータベースに接続します。
DBTLSConnect=required を設定 サーバー/プロキシはデータベースへの TLS 接続を確立します。暗号化されていない接続は許可されません。
1. DBTLSConnect=verify_ca を設定
2. DBTLSCAFile を設定 - TLS 認証局ファイルを指定
データベース証明書を検証した後、サーバー/プロキシはデータベースへの TLS 接続を確立します。
1. DBTLSConnect=verify_full を設定
2. DBTLSCAFile を設定 - TLS 認証局ファイルを指定
データベース証明書とデータベースのホスト ID を検証した後、サーバー/プロキシはデータベースへの TLS 接続を確立します。
1. DBTLSCAFile を設定 - TLS 認証局ファイルを指定
2. DBTLSCertFile を設定 - クライアント公開鍵証明書ファイルを指定
3. DBTLSKeyFile を設定 - クライアント秘密鍵ファイルを指定
サーバー/プロキシはデータベースへの接続時にクライアント証明書を提示します。
DBTLSCipher を設定 - TLS 1.2 までの TLS プロトコルを使用する接続でクライアントが許可する暗号化暗号のリスト

または DBTLSCipher13 - TLS 1.3 プロトコルを使用する接続でクライアントが許可する暗号化暗号のリスト
(MySQL) TLS 接続は、指定されたリスト内の暗号化暗号を使用して確立されます。
(PostgreSQL) このオプションを設定すると、エラーとして扱われます。