MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  暗号化接続を使用するための MySQL の構成

6.3.1 暗号化接続を使用するための MySQL の構成

暗号化された接続を使用するかどうかを示し、適切な証明書およびキーファイルを指定するために、いくつかの構成パラメータを使用できます。 このセクションでは、暗号化された接続のためのサーバーおよびクライアントの構成に関する一般的なガイダンスを示します:

暗号化された接続は次のコンテキストでも使用できます:

必要な証明書およびキーファイルを作成する手順は、セクション6.3.3「SSL および RSA 証明書とキーの作成」 で入手できます。

暗号化された接続のサーバー側の起動構成

サーバー側では、--ssl オプションは、サーバーが暗号化された接続を許可するが必要としないことを指定します。 このオプションはデフォルトで有効になっているため、明示的に指定する必要はありません。

クライアントが暗号化された接続を使用して接続することを要求するには、require_secure_transport システム変数を有効にします。 暗号化された接続の必須としての構成を参照してください。

サーバー側の次のシステム変数は、クライアントに暗号化された接続の確立を許可するときにサーバーが使用する証明書および鍵ファイルを指定します:

  • ssl_ca: 認証局 (CA) 証明書ファイルのパス名。(ssl_capath は類似していますが、CA 証明書ファイルのディレクトリのパス名を指定します。)

  • ssl_cert: サーバー公開キー証明書ファイルのパス名。 この証明書はクライアントに送信し、クライアントが持っている CA 証明書に対して認証できます。

  • ssl_key: サーバー秘密キーファイルのパス名。

たとえば、サーバーで暗号化された接続を有効にするには、my.cnf ファイルの次の行でサーバーを起動し、必要に応じてファイル名を変更します:

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

暗号化された接続を使用するためにクライアントが必要であることを指定するには、require_secure_transport システム変数を有効にします:

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON

各証明書およびキーシステム変数は、PEM 形式のファイルに名前を付けます。 必要な証明書およびキーファイルを作成する必要がある場合は、セクション6.3.3「SSL および RSA 証明書とキーの作成」 を参照してください。 OpenSSL を使用してコンパイルされた MySQL サーバーは、起動時に欠落している証明書およびキーファイルを自動的に生成できます。 セクション6.3.3.1「MySQL を使用した SSL および RSA 証明書とキーの作成」を参照してください。 または、MySQL ソース配布がある場合は、その mysql-test/std_data ディレクトリにあるデモンストレーション証明書およびキーファイルを使用して設定をテストできます。

サーバーは証明書と鍵ファイルの自動検出を実行します。 暗号化された接続を構成するために、--ssl 以外の明示的な encrypted-connection オプションが (ssl_cipher とともに) 指定されていない場合、サーバーは起動時に自動的に encrypted-connection サポートを有効にしようとします:

  • サーバーは、ca.pemserver-cert.pem および server-key.pem という名前の有効な証明書およびキーファイルをデータディレクトリで検出すると、クライアントによる暗号化された接続のサポートを有効にします。 (ファイルは自動的に生成されている必要はありません。これらの名前を持ち、有効であることが重要です。)

  • 有効な証明書およびキーファイルがデータディレクトリに見つからない場合、サーバーは実行を続行しますが、暗号化された接続はサポートしません。

サーバーが自動的に暗号化された接続サポートを有効にすると、エラーログにノートが書き込まれます。 CA 証明書が自己署名証明書であることがサーバーで検出されると、エラーログに警告が書き込まれます。 (サーバーによって自動的に作成された場合、または mysql_ssl_rsa_setup を使用して手動で作成された場合、証明書は自己署名されます。)

MySQL には、サーバー側の暗号化された接続制御用の次のシステム変数も用意されています:

  • ssl_cipher: 接続の暗号化に許可される暗号のリスト。

  • ssl_crl: 証明書失効リストを含むファイルのパス名。(ssl_crlpath は類似していますが、証明書失効リストファイルのディレクトリのパス名を指定します。)

  • tls_version, tls_ciphersuites: サーバーが暗号化された接続に対して許可する暗号化プロトコルおよび暗号スイート。セクション6.3.2「暗号化された接続 TLS プロトコルおよび暗号」 を参照してください。 たとえば、クライアントがセキュアでないプロトコルを使用できないように tls_version を設定できます。

サーバーがサーバー側の暗号化された接続制御用のシステム変数から有効な TLS コンテキストを作成できない場合、サーバーは暗号化された接続をサポートしません。

サーバー側のランタイム構成および暗号化された接続の監視

MySQL 8.0.16 より前は、暗号化された接続サポートを構成する tls_xxx および ssl_xxx システム変数は、サーバーの起動時にのみ設定できます。 したがって、これらのシステム変数は、サーバーがすべての新しい接続に使用する TLS コンテキストを決定します。

MySQL 8.0.16 の時点では、tls_xxx および ssl_xxx システム変数は動的であり、起動時だけでなく実行時に設定できます。 SET GLOBAL を使用して変更した場合、新しい値はサーバーが再起動するまで適用されません。 SET PERSIST を使用して変更した場合、新しい値も後続のサーバーの再起動に引き継がれます。 セクション13.7.6.1「変数代入の SET 構文」を参照してください。 ただし、このセクションの後半で説明するように、これらの変数を実行時に変更しても、新しい接続の TLS コンテキストにすぐには影響しません。

TLS コンテキスト関連のシステム変数に対する実行時の変更を可能にする MySQL 8.0.16 の変更に加えて、サーバーは、新しい接続に使用される実際の TLS コンテキストに対する実行時の更新を可能にします。 この機能は、SSL 証明書が期限切れになるまで実行されている MySQL サーバーを再起動しないようにする場合などに役立ちます。

初期 TLS コンテキストを作成するために、サーバーは起動時にコンテキスト関連のシステム変数が持つ値を使用します。 コンテキスト値を公開するために、サーバーは対応するステータス変数のセットも初期化します。 次のテーブルに、TLS コンテキストを定義するシステム変数と、現在アクティブなコンテキスト値を公開する対応するステータス変数を示します。

表 6.11 サーバーメイン接続インタフェース TLS コンテキストのシステム変数およびステータス変数

システム変数名 対応するステータス変数名
ssl_ca Current_tls_ca
ssl_capath Current_tls_capath
ssl_cert Current_tls_cert
ssl_cipher Current_tls_cipher
ssl_crl Current_tls_crl
ssl_crlpath Current_tls_crlpath
ssl_key Current_tls_key
tls_ciphersuites Current_tls_ciphersuites
tls_version Current_tls_version

実行時に TLS コンテキストを再構成するには、次の手順を使用します:

  1. 変更する必要がある TLS コンテキスト関連のシステム変数については、それらを新しい値に設定します。

  2. ALTER INSTANCE RELOAD TLS を実行します。 このステートメントは、TLS コンテキスト関連のシステム変数の現在の値からアクティブな TLS コンテキストを再構成します。 また、新しいアクティブなコンテキスト値を反映するようにコンテキスト関連のステータス変数を設定します。 ステートメントには CONNECTION_ADMIN 権限が必要です。

  3. ALTER INSTANCE RELOAD TLS の実行後に確立された新しい接続は、新しい TLS コンテキストを使用します。 既存の接続は影響を受けません。 既存の接続を終了する場合は、KILL ステートメントを使用します。

システム変数とステータス変数の各ペアのメンバーは、再構成手順の動作によって一時的に異なる値を持つ場合があります:

  • ALTER INSTANCE RELOAD TLS より前のシステム変数を変更しても、TLS コンテキストは変更されません。 この時点では、これらの変更は新しい接続には影響せず、対応するコンテキスト関連のシステム変数とステータス変数の値が異なる場合があります。 これにより、個々のシステム変数に必要な変更を加え、すべてのシステム変数の変更が行われた後に、ALTER INSTANCE RELOAD TLS を使用してアクティブな TLS コンテキストを原子的に更新できます。

  • ALTER INSTANCE RELOAD TLS の後、対応するシステム変数とステータス変数の値は同じになります。 これは、次にシステム変数が変更されるまで当てはまります。

場合によっては、システム変数を変更せずに TLS コンテキストを再構成するには、ALTER INSTANCE RELOAD TLS 自体で十分です。 ssl_cert によって指定されたファイル内の証明書の有効期限が切れているとします。 既存のファイルの内容を期限切れでない証明書に置き換え、ALTER INSTANCE RELOAD TLS を実行して新しいファイルの内容を読み取り、新しい接続に使用するだけで十分です。

MySQL 8.0.21 の時点では、サーバーは管理接続インタフェースの独立した接続暗号化構成を実装します。 暗号化された接続に対する管理インタフェースのサポートを参照してください。 また、TLS コンテキストをリロードするチャネル (インタフェース) を指定できる FOR CHANNEL 句を使用して、ALTER INSTANCE RELOAD TLS が拡張されます。 セクション13.1.5「ALTER INSTANCE ステートメント」を参照してください。 管理インタフェース TLS コンテキストを公開するステータス変数はありませんが、パフォーマンススキーマ tls_channel_status テーブルはメインインタフェースと管理インタフェースの両方の TLS プロパティーを公開します。 セクション27.12.19.11「tls_channel_status テーブル」を参照してください。

メインインタフェース TLS コンテキストを更新すると、次の効果があります:

  • 更新により、メイン接続インタフェース上の新しい接続に使用される TLS コンテキストが変更されます。

  • この更新では、インタフェースにデフォルト以外の TLS パラメータ値が構成されていないかぎり、管理インタフェース上の新しい接続に使用される TLS コンテキストも変更されます。

  • この更新は、ほかの有効なサーバープラグインまたはグループレプリケーションや X プラグイン などのコンポーネントで使用される TLS コンテキストには影響しません:

    • サーバー TLS コンテキスト関連のシステム変数から設定を取得する Group Replication グループ通信接続にメインインタフェース再構成を適用するには、STOP GROUP_REPLICATION の後に START GROUP_REPLICATION を実行して Group Replication を停止および再起動する必要があります。

    • X プラグイン は、セクション20.5.3「X プラグイン での暗号化接続の使用」 で説明されているように、プラグインの初期化時に TLS コンテキストを初期化します。 その後、このコンテキストは変更されません。

デフォルトでは、RELOAD TLS アクションはエラーでロールバックされ、構成値で新しい TLS コンテキストの作成が許可されていない場合は影響しません。 以前のコンテキスト値は、引き続き新しい接続に使用されます。 オプションの NO ROLLBACK ON ERROR 句が指定され、新しいコンテキストを作成できない場合、ロールバックは発生しません。 代わりに、警告が生成され、ステートメントが適用されるインタフェース上の新しい接続の暗号化が無効になります。

接続インタフェースで暗号化された接続を有効または無効にするオプションは、起動時にのみ有効になります。 たとえば、--ssl および --admin-ssl オプションは、メインインタフェースと管理インタフェースが暗号化された接続をサポートしているかどうかにかかわらず、起動時にのみ影響します。 このようなオプションは無視され、実行時の ALTER INSTANCE RELOAD TLS の操作には影響しません。 たとえば、--ssl=OFF を使用して、メインインタフェースで暗号化された接続を無効にしてサーバーを起動し、TLS を再構成して ALTER INSTANCE RELOAD TLS を実行し、実行時に暗号化された接続を有効にできます。

暗号化された接続のクライアント側の構成

暗号化された接続の確立に関連するクライアントオプションの完全なリストは、暗号化接続のコマンドオプション を参照してください。

デフォルトでは、サーバーが暗号化された接続をサポートしている場合、MySQL クライアントプログラムは暗号化された接続を確立しようとし、--ssl-mode オプションを使用してさらに制御できます:

  • --ssl-mode オプションがない場合、クライアントは暗号化を使用して接続を試み、暗号化された接続を確立できない場合は暗号化されていない接続にフォールバックします。 これは、明示的な --ssl-mode=PREFFERED オプションでの動作でもあります。

  • --ssl-mode=REQUIRED では、クライアントは暗号化された接続を必要とし、確立できない場合は失敗します。

  • --ssl-mode=DISABLED では、クライアントは暗号化されていない接続を使用します。

  • --ssl-mode=VERIFY_CA または --ssl-mode=VERIFY_IDENTITY では、クライアントは暗号化された接続を必要とし、サーバー CA 証明書および (VERIFY_IDENTITY を使用して) 証明書内のサーバーホスト名に対しても検証を実行します。

サーバー側で require_secure_transport システム変数が有効になっていて、サーバーが暗号化された接続を要求する場合、暗号化されていない接続を確立しようとすると失敗します。 暗号化された接続の必須としての構成を参照してください。

クライアント側の次のオプションは、クライアントがサーバーへの暗号化された接続を確立するときに使用する証明書および鍵ファイルを識別します。 これらは、サーバー側で使用される ssl_cassl_cert および ssl_key システム変数に似ていますが、--ssl-cert および --ssl-key はクライアントの公開キーと秘密キーを識別します:

  • --ssl-ca: 認証局 (CA) 証明書ファイルのパス名。 このオプションを使用する場合は、サーバーで使用されるものと同じ証明書を指定する必要があります。(--ssl-capath は類似していますが、CA 証明書ファイルのディレクトリのパス名を指定します。)

  • --ssl-cert: クライアント公開キー証明書ファイルのパス名。

  • --ssl-key: クライアント秘密キーファイルのパス名。

デフォルトの暗号化で提供されるものと比較してセキュリティを強化するために、クライアントはサーバーで使用されるものと一致する CA 証明書を提供し、ホスト名のアイデンティティ検証を有効にできます。 このようにして、サーバーとクライアントは同じ CA 証明書に信頼を配置し、クライアントは接続先のホストが意図したものであることを確認します:

  • CA 証明書を指定するには、--ssl-ca (または --ssl-capath) を使用し、--ssl-mode=VERIFY_CA を指定します。

  • ホスト名アイデンティティ検証も有効にするには、--ssl-mode=VERIFY_CA ではなく --ssl-mode=VERIFY_IDENTITY を使用します。

注記

VERIFY_IDENTITY を使用したホスト名アイデンティティ検証は、サーバーによって自動的に作成された自己署名証明書、または mysql_ssl_rsa_setup を使用して手動で作成された自己署名証明書では機能しません (セクション6.3.3.1「MySQL を使用した SSL および RSA 証明書とキーの作成」 を参照)。 このような自己署名証明書には、共通名の値としてサーバー名は含まれません。

MySQL 8.0.12 より前では、ホスト名のアイデンティティ検証は、ワイルドカードを使用して共通名を指定する証明書でも機能しません。これは、その名前がサーバー名と比較されるためです。

MySQL には、クライアント側の SSL 制御用に次のオプションも用意されています:

  • --ssl-cipher: 接続の暗号化に許可される暗号のリスト。

  • --ssl-crl: 証明書失効リストを含むファイルのパス名。(--ssl-crlpath は類似していますが、証明書失効リストファイルのディレクトリのパス名を指定します。)

  • --tls-version, --tls-ciphersuites: 許可されている暗号化プロトコルおよび暗号スイート。セクション6.3.2「暗号化された接続 TLS プロトコルおよび暗号」 を参照してください。

クライアントで使用される MySQL アカウントの暗号化要件によっては、クライアントは、暗号化を使用して MySQL サーバーに接続するための特定のオプションを指定する必要がある場合があります。

特別な暗号化要件がないアカウント、または REQUIRE SSL 句を含む CREATE USER ステートメントを使用して作成されたアカウントを使用して接続するとします。 サーバーが暗号化された接続をサポートしていると仮定すると、クライアントは --ssl-mode オプションなしで暗号化を使用して、または明示的な --ssl-mode=PREFFERED オプションを使用して接続できます:

mysql

または:

mysql --ssl-mode=PREFERRED

REQUIRE SSL 句を使用して作成されたアカウントでは、暗号化された接続を確立できない場合、接続の試行は失敗します。 特別な暗号化要件のないアカウントの場合、暗号化された接続を確立できないと、暗号化されていない接続にフォールバックしようとします。 暗号化された接続を取得できない場合にフォールバックおよび失敗を防ぐには、次のように接続します:

mysql --ssl-mode=REQUIRED

アカウントのセキュリティ要件が厳しい場合は、暗号化された接続を確立するために他のオプションを指定する必要があります:

  • REQUIRE X509 句を使用して作成されたアカウントの場合、クライアントは少なくとも --ssl-cert および --ssl-key を指定する必要があります。 また、サーバーによって提供される公開証明書を検証できるように、--ssl-ca (または --ssl-capath) をお薦めします。 次に例を示します (単一行にコマンドを入力します):

    mysql --ssl-ca=ca.pem
          --ssl-cert=client-cert.pem
          --ssl-key=client-key.pem
  • REQUIRE ISSUER または REQUIRE SUBJECT 句を使用して作成されたアカウントの場合、暗号化要件は REQUIRE X509 の場合と同じですが、証明書はそれぞれアカウント定義で指定された問題またはサブジェクトと一致する必要があります。

REQUIRE 句の詳細は、セクション13.7.1.3「CREATE USER ステートメント」 を参照してください。

暗号化の使用を防止し、他の --ssl-xxx オプションをオーバーライドするには、--ssl-mode=DISABLED を使用してクライアントプログラムを起動します:

mysql --ssl-mode=DISABLED

サーバーとの現在の接続で暗号化が使用されているかどうかを確認するには、Ssl_cipher ステータス変数のセッション値を確認します。 値が空の場合、接続は暗号化されません。 それ以外の場合、接続は暗号化され、値は暗号化暗号を示します。 例:

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+

mysql クライアントの場合は、代わりに STATUS または \s コマンドを使用して、SSL 行をチェックすることもできます。

mysql> \s
...
SSL: Not in use
...

または:

mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...

暗号化された接続の必須としての構成

一部の MySQL デプロイメントでは、暗号化された接続を使用することが望ましいだけでなく、(規制要件を満たすためなどに) 必須である場合があります。 このセクションでは、これを可能にする構成設定について説明します。 次のレベルの制御を使用できます:

  • クライアントが暗号化された接続を使用して接続することを要求するようにサーバーを構成できます。

  • 個々のクライアントプログラムを起動して、サーバーで許可されているが暗号化が必要ない場合でも、暗号化された接続を要求できます。

  • 暗号化された接続でのみ使用できるように個々の MySQL アカウントを構成できます。

クライアントが暗号化された接続を使用して接続することを要求するには、require_secure_transport システム変数を有効にします。 たとえば、サーバー my.cnf ファイルに次の行を挿入します:

[mysqld]
require_secure_transport=ON

または、実行時に値を設定して永続化するには、次のステートメントを使用します:

SET PERSIST require_secure_transport=ON;

SET PERSIST は、実行中の MySQL インスタンスの値を設定します。 また、値が保存され、それ以降のサーバーの再起動にも使用されます。 セクション13.7.6.1「変数代入の SET 構文」を参照してください。

require_secure_transport を有効にすると、なんらかの形式のセキュアなトランスポートを使用するためにサーバーへのクライアント接続が必要になり、SSL を使用する TCP/IP 接続、またはソケットファイル (Unix の場合) または共有メモリー (Windows の場合) を使用する接続のみがサーバーで許可されます。 サーバーはセキュアでない接続試行を拒否し、ER_SECURE_TRANSPORT_REQUIRED エラーで失敗します。

サーバーで暗号化が必要かどうかにかかわらず暗号化された接続を必要とするようにクライアントプログラムを起動するには、REQUIREDVERIFY_CA または VERIFY_IDENTITY--ssl-mode オプション値を使用します。 例:

mysql --ssl-mode=REQUIRED
mysqldump --ssl-mode=VERIFY_CA
mysqladmin --ssl-mode=VERIFY_IDENTITY

暗号化された接続でのみ使用できるように MySQL アカウントを構成するには、アカウントを作成する CREATE USER ステートメントに REQUIRE 句を含め、その句に必要な暗号化特性を指定します。 たとえば、暗号化された接続と有効な X.509 証明書の使用を要求するには、REQUIRE X509 を使用します:

CREATE USER 'jeffrey'@'localhost' REQUIRE X509;

REQUIRE 句の詳細は、セクション13.7.1.3「CREATE USER ステートメント」 を参照してください。

暗号化要件のない既存のアカウントを変更するには、ALTER USER ステートメントを使用します。


関連キーワード:  接続, 暗号, サーバー, 変数, コンテキスト, 構成, キー, 作成, アカウント, 変更