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


MySQL 8.0 リファレンスマニュアル  /  ...  /  暗号化された接続 TLS プロトコルおよび暗号

6.3.2 暗号化された接続 TLS プロトコルおよび暗号

MySQL では、複数の TLS プロトコルおよび暗号がサポートされており、暗号化された接続を許可するプロトコルおよび暗号を構成できます。 現在のセッションで使用されているプロトコルおよび暗号を判別することもできます。

サポートされている接続 TLS プロトコル

MySQL では、TLSv1、TLSv1.1、TLSv1.2 および TLSv1.3 プロトコルを使用して暗号化された接続がサポートされており、安全性の低いものから安全性の高いものの順にリストされています。 接続に対して実際に許可されるプロトコルのセットは、複数の要因に従います:

  • MySQL configuration. 許可された TLS プロトコルは、サーバー側とクライアント側の両方で、サポートされている TLS プロトコルのサブセットのみを含むように構成できます。 両側の設定には、共通のプロトコルが少なくとも 1 つ含まれている必要があります。含まれていないと、接続を試行しても使用するプロトコルをネゴシエートできません。 詳細は、接続 TLS プロトコルネゴシエーションを参照してください。

  • システム全体のホスト構成。 ホストシステムでは特定の TLS プロトコルのみが許可される場合があります。つまり、MySQL 自体で許可されている場合でも、MySQL 接続では許可されていないプロトコルを使用できません:

    • MySQL 構成では TLSv1、TLSv1.1 および TLSv1.2 が許可されていますが、ホストシステム構成では TLSv1.2 以上を使用する接続のみが許可されているとします。 この場合、TLSv1 または TLSv1.1 を使用する MySQL 接続は、ホストシステムで許可されていないため、MySQL がそれらを許可するように構成されていても確立できません。

    • MySQL 構成で TLSv1、TLSv1.1 および TLSv1.2 が許可されているが、ホストシステム構成では TLSv1.3 以上を使用する接続のみが許可されている場合は、MySQL で許可されているプロトコルがホストシステムで許可されていないため、MySQL 接続を確立できません。

    この問題の回避策は次のとおりです:

    • システム全体のホスト構成を変更して、追加の TLS プロトコルを許可します。 手順については、オペレーティングシステムのドキュメントを参照してください。 たとえば、TLS プロトコルを TLSv1.2 以上に制限するために、システムに次の行を含む/etc/ssl/openssl.cnf ファイルがあるとします:

      [system_default_sect]
      MinProtocol = TLSv1.2

      値を低いプロトコルバージョンまたは None に変更すると、システムがより許可されます。 この回避策には、低い (安全性の低い) プロトコルを許可するというデメリットがあり、セキュリティに悪影響を与える可能性があります。

    • ホストシステムの TLS 構成を変更できない場合や変更したくない場合は、ホストシステムで許可されているより高い (よりセキュアな) TLS プロトコルを使用するように MySQL アプリケーションを変更します。 これは、より低いプロトコルバージョンのみをサポートする古いバージョンの MySQL では不可能な場合があります。 たとえば、TLSv1 は MySQL 5.6.46 より前にサポートされていた唯一のプロトコルであるため、5.6.46 より前のサーバーへの接続の試行は、クライアントがより高いプロトコルバージョンをサポートするより新しい MySQL バージョンからのものであっても失敗します。 このような場合は、追加の TLS バージョンをサポートする MySQL のバージョンへのアップグレードが必要になることがあります。

  • SSL ライブラリ。 SSL ライブラリが特定のプロトコルをサポートしていない場合、MySQL もサポートせず、そのプロトコルを指定する次の説明の一部も適用されません。

    注記

    TLSv1.3 プロトコルのサポートは、MySQL 8.0.16 (Group Replication コンポーネントの MySQL 8.0.18 時点) で使用できます。 また、TLSv1.3 を使用するには、MySQL サーバーとクライアントアプリケーションの両方を OpenSSL 1.1.1 以上を使用してコンパイルする必要があります。

接続 TLS プロトコル構成

サーバー側では、tls_version システム変数の値によって、MySQL サーバーが暗号化された接続に対して許可する TLS プロトコルが決まります。 tls_version の値は、クライアントからの接続、このサーバーインスタンスがソースである通常のソース/レプリカレプリケーション接続、グループレプリケーショングループ通信接続、およびこのサーバーインスタンスがドナーであるグループレプリケーション分散リカバリ接続に適用されます。 変数値は、このリストの 1 つ以上のカンマ区切りプロトコルバージョンのリストです (大/小文字は区別されません): TLSv1、TLSv1.1、TLSv1.2、および TLSV1.3 (使用可能な場合)。 デフォルトでは、この変数は、MySQL のコンパイルに使用される SSL ライブラリでサポートされているすべてのプロトコルをリストします。 実行時に tls_version の値を確認するには、次のステートメントを使用します:

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| tls_version   | TLSv1,TLSv1.1,TLSv1.2 |
+---------------+-----------------------+

tls_version の値を変更するには、サーバーの起動時に設定します。 たとえば、TLSv1.1 または TLSv1.2 プロトコルを使用するが、セキュアでない TLSv1 プロトコルを使用する接続を禁止するには、サーバー my.cnf ファイルで次の行を使用します:

[mysqld]
tls_version=TLSv1.1,TLSv1.2

さらに限定的にして TLSv1.2 接続のみを許可するには、次のように tls_version を設定します:

[mysqld]
tls_version=TLSv1.2

MySQL 8.0.16 では、tls_version を実行時に変更することもできます。 サーバー側のランタイム構成および暗号化された接続の監視を参照してください。

クライアント側では、--tls-version オプションは、クライアントプログラムがサーバーへの接続を許可する TLS プロトコルを指定します。 オプション値の形式は、前述の tls_version システム変数 (プロトコルバージョンのカンマ区切りリスト) と同じです。

このサーバーインスタンスがレプリカであるソース/レプリカレプリケーション接続の場合、CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23 より前) または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) の SOURCE_TLS_VERSION | MASTER_TLS_VERSION オプションで、レプリカがソースへの接続を許可する TLS プロトコルを指定します。 オプション値の形式は、前述の tls_version システム変数の場合と同じです。 セクション17.3.1「暗号化接続を使用するためのレプリケーションの設定」を参照してください。

SOURCE_TLS_VERSION | MASTER_TLS_VERSION に指定できるプロトコルは、SSL ライブラリによって異なります。 このオプションは、サーバーの tls_version 値に依存せず、影響を受けません。 たとえば、レプリカとして機能するサーバーは、tls_version を TLSv1.3 に設定して、TLSv1.3 を使用する受信接続のみを許可するように構成できますが、SOURCE_TLS_VERSION | MASTER_TLS_VERSION を TLSv1.2 に設定して、ソースへの送信レプリカ接続に TLSv1.2 のみを許可するように構成することもできます。

このサーバーインスタンスが分散リカバリを開始する結合メンバー (つまり、クライアント) である Group Replication 分散リカバリ接続の場合、group_replication_recovery_tls_version システム変数は、クライアントで許可されるプロトコルを指定します。 このオプションは、このサーバーインスタンスがドナーである場合に適用されるサーバー tls_version 値に依存せず、影響を受けません。 グループレプリケーションサーバーは、通常、そのグループメンバーシップの過程でドナーとしても参加メンバーとしても分散リカバリに参加するため、これら両方のシステム変数を設定する必要があります。 セクション18.5.2「Secure Socket Layer (SSL) を使用したグループ通信接続の保護」を参照してください。

TLS プロトコル構成は、接続 TLS プロトコルネゴシエーション で説明されているように、特定の接続が使用するプロトコルに影響します。

「穴」をリストに残さないなど、許可されたプロトコルを選択する必要があります。 たとえば、次のサーバー構成値には穴がありません:

tls_version=TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.2,TLSv1.3
tls_version=TLSv1.3

これらの値には穴があり、使用しないでください:

tls_version=TLSv1,TLSv1.2       (TLSv1.1 is missing)
tls_version=TLSv1.1,TLSv1.3     (TLSv1.2 is missing)

穴の禁止は、クライアントやレプリカなどの他の構成コンテキストでも適用されます。

許可されたプロトコルのリストは空にできません。 TLS バージョンパラメータを空の文字列に設定すると、暗号化された接続を確立できません:

  • tls_version: サーバーは暗号化された着信接続を許可しません。

  • --tls-version: クライアントは、サーバーへの暗号化された送信接続を許可しません。

  • MASTER_TLS_VERSION: レプリカでは、ソースへの暗号化された送信接続は許可されません。

接続暗号構成

暗号のデフォルトセットは暗号化された接続に適用され、これは許可された暗号を明示的に構成することでオーバーライドできます。 接続の確立時には、接続の両側で共通の暗号が許可されている必要があります。許可されていない場合、接続は失敗します。 SSL ライブラリは、両側に共通の許可された暗号のうち、優先度が最も高い指定された証明書でサポートされている暗号を選択します。

TLSv1.2 までの TLS プロトコルを使用する暗号化された接続に適用可能な暗号を指定するには:

  • サーバー側で ssl_cipher システム変数を設定し、クライアントプログラムに --ssl-cipher オプションを使用します。

  • このサーバーインスタンスがソースである通常のソース/レプリカレプリケーション接続の場合は、ssl_cipher システム変数を設定します。 このサーバーインスタンスがレプリカである場合、CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23) または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) に SOURCE_SSL_CIPHER | MASTER_SSL_CIPHER オプションを使用します。 セクション17.3.1「暗号化接続を使用するためのレプリケーションの設定」を参照してください。

  • グループレプリケーショングループメンバーの場合、グループレプリケーショングループ通信接続、およびこのサーバーインスタンスがドナーであるグループレプリケーション分散リカバリ接続の場合は、ssl_cipher システム変数を設定します。 このサーバーインスタンスが参加メンバーであるグループレプリケーション分散リカバリ接続の場合は、group_replication_recovery_ssl_cipher システム変数を使用します。 セクション18.5.2「Secure Socket Layer (SSL) を使用したグループ通信接続の保護」を参照してください。

TLSv1.3 を使用する暗号化された接続の場合、OpenSSL 1.1.1 以上では次の暗号スイートがサポートされており、最初の 3 つはデフォルトで有効になっています:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_CCM_SHA256
TLS_AES_128_CCM_8_SHA256

許可された TLSv1.3 暗号スイートを明示的に構成するには、次のパラメータを設定します。 いずれの場合も、構成値はコロンで区切られたゼロ個以上の暗号スイート名のリストです。

  • サーバー側では、tls_ciphersuites システム変数を使用します。 この変数が設定されていない場合、デフォルト値は NULL です。つまり、サーバーは暗号スイートのデフォルトセットを許可します。 変数が空の文字列に設定されている場合、暗号スイートは有効にならず、暗号化された接続を確立できません。

  • クライアント側では、--tls-ciphersuites オプションを使用します。 このオプションが設定されていない場合、クライアントは暗号化方式群のデフォルトセットを許可します。 このオプションが空の文字列に設定されている場合、暗号スイートは有効にならず、暗号化された接続を確立できません。

  • このサーバーインスタンスがソースである通常のソース/レプリカレプリケーション接続には、tls_ciphersuites システム変数を使用します。 このサーバーインスタンスがレプリカである場合、CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23) または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) に SOURCE_TLS_CIPHERSUITES | MASTER_TLS_CIPHERSUITES オプションを使用します。 セクション17.3.1「暗号化接続を使用するためのレプリケーションの設定」を参照してください。

  • グループレプリケーショングループメンバーの場合、グループレプリケーショングループ通信接続、およびこのサーバーインスタンスがドナーであるグループレプリケーション分散リカバリ接続には、tls_ciphersuites システム変数を使用します。 このサーバーインスタンスが参加メンバーであるグループレプリケーション分散リカバリ接続の場合は、group_replication_recovery_tls_ciphersuites システム変数を使用します。 セクション18.5.2「Secure Socket Layer (SSL) を使用したグループ通信接続の保護」を参照してください。

注記

暗号スイートのサポートは MySQL 8.0.16 で使用できますが、MySQL サーバーとクライアントアプリケーションの両方が OpenSSL 1.1.1 以上を使用してコンパイルされている必要があります。

MySQL 8.0.16 から 8.0.18 では、group_replication_recovery_tls_ciphersuites システム変数および CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23 から) の SOURCE_TLS_CIPHERSUITES | MASTER_TLS_CIPHERSUITES オプション、または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) は使用できません。 これらのリリースでは、TLSv1.3 がソース/レプリカレプリケーション接続に使用されている場合、または分散リカバリ (MySQL 8.0.18 からサポートされている) のグループレプリケーションで使用されている場合、レプリケーションソースまたはグループレプリケーションドナーのサーバーは、デフォルトで有効になっている TLSv1.3 暗号スイートの使用を許可する必要があります。 MySQL 8.0.19 から、オプションを使用して、必要に応じてデフォルト以外の暗号スイートのみを含む任意の暗号スイートのクライアントサポートを構成できます。

特定の暗号は、TLS プロトコルネゴシエーションプロセスに影響する特定の TLS プロトコルでのみ機能します。 接続 TLS プロトコルネゴシエーションを参照してください。

特定のサーバーがサポートする暗号を判別するには、Ssl_cipher_list ステータス変数のセッション値を確認します:

SHOW SESSION STATUS LIKE 'Ssl_cipher_list';

Ssl_cipher_list ステータス変数には、使用可能な SSL 暗号がリストされます (非 SSL 接続の場合は空)。 MySQL が TLSv1.3 をサポートしている場合、この値には使用可能な TLSv1.3 暗号スイートが含まれます。

TLS.v 1.3 を使用する暗号化された接続の場合、MySQL は SSL ライブラリのデフォルトの暗号化スイートリストを使用します。

TLSv1.2 を介して TLS プロトコルを使用する暗号化された接続の場合、MySQL は次のデフォルトの暗号リストを SSL ライブラリに渡します。

ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA256
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
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
DHE-DSS-AES128-SHA
DHE-RSA-AES128-SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-GCM-SHA256
DH-DSS-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
AES256-GCM-SHA384
DH-DSS-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
AES128-SHA256
DH-DSS-AES128-SHA256
ECDH-ECDSA-AES128-SHA256
AES256-SHA256
DH-DSS-AES256-SHA256
ECDH-ECDSA-AES256-SHA384
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DHE-RSA-AES256-GCM-SHA384
DH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-GCM-SHA256
DH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-GCM-SHA384
DH-RSA-AES128-SHA256
ECDH-RSA-AES128-SHA256
DH-RSA-AES256-SHA256
ECDH-RSA-AES256-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
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
DHE-RSA-AES256-SHA
AES128-SHA
DH-DSS-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES256-SHA
DH-DSS-AES256-SHA
ECDH-ECDSA-AES256-SHA
DH-RSA-AES128-SHA
ECDH-RSA-AES128-SHA
DH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA
DES-CBC3-SHA

次の暗号制限が適用されます:

  • 次の暗号は永続的に制限されています:

    !DHE-DSS-DES-CBC3-SHA
    !DHE-RSA-DES-CBC3-SHA
    !ECDH-RSA-DES-CBC3-SHA
    !ECDH-ECDSA-DES-CBC3-SHA
    !ECDHE-RSA-DES-CBC3-SHA
    !ECDHE-ECDSA-DES-CBC3-SHA
  • 次のカテゴリの暗号は永続的に制限されています:

    !aNULL
    !eNULL
    !EXPORT
    !LOW
    !MD5
    !DES
    !RC2
    !RC4
    !PSK
    !SSLv3

前述の制限付き暗号または暗号カテゴリのいずれかを使用する証明書に ssl_cert システム変数を設定してサーバーを起動すると、サーバーは暗号化された接続のサポートを無効にして起動します。

接続 TLS プロトコルネゴシエーション

MySQL での接続試行では、プロトコル互換暗号が両側で使用可能な両側で使用可能な最上位 TLS プロトコルバージョンの使用がネゴシエーションされます。 ネゴシエーションプロセスは、サーバーとクライアントのコンパイルに使用される SSL ライブラリ、TLS プロトコルと暗号化暗号構成、使用されるキーサイズなどの要因によって異なります:

  • 接続を正常に試行するには、サーバーとクライアントの TLS プロトコル構成で一部のプロトコルを共通に許可する必要があります。

  • 同様に、サーバーとクライアントの暗号化の構成では、一部の暗号を共通に許可する必要があります。 特定の暗号は特定の TLS プロトコルでのみ機能するため、互換性のある暗号がないかぎり、ネゴシエーションプロセスで使用可能なプロトコルは選択されません。

  • TLSv1.3 が使用可能な場合は、可能であれば使用されます。 (つまり、サーバーとクライアントの両方の構成で TLSv1.3 が許可されている必要があり、両方で一部の TLSv1.3 互換暗号も許可されている必要があります。) それ以外の場合、MySQL は、可能であれば TLSv1.2 などを使用して、使用可能なプロトコルのリストを続行します。 ネゴシエーションは、よりセキュアなプロトコルからよりセキュアでないプロトコルに進みます。 ネゴシエーション順序は、プロトコルが構成されている順序とは無関係です。 たとえば、ネゴシエーション順序は、tls_version の値が TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 であるか TLSv1.3,TLSv1.2,TLSv1.1,TLSv1 であるかに関係なく同じです。

  • TLSv1.2 は、512 ビット以下のキーサイズのすべての暗号で機能するわけではありません。 このようなキーでこのプロトコルを使用するには、サーバー側で ssl_cipher システム変数を設定するか、--ssl-cipher クライアントオプションを使用して暗号名を明示的に指定します:

    AES128-SHA
    AES128-SHA256
    AES256-SHA
    AES256-SHA256
    CAMELLIA128-SHA
    CAMELLIA256-SHA
    DES-CBC3-SHA
    DHE-RSA-AES256-SHA
    RC4-MD5
    RC4-SHA
    SEED-SHA
  • セキュリティを向上させるには、RSA キーサイズが 2048 ビット以上の証明書を使用します。

サーバーとクライアントに共通の許可されたプロトコルがなく、共通のプロトコル互換暗号がある場合、サーバーは接続リクエストを終了します。 例:

  • サーバーが tls_version=TLSv1.1,TLSv1.2 で構成されている場合:

    • --tls-version=TLSv1 を使用して起動されたクライアント、および TLSv1 のみをサポートする古いクライアントの接続試行は失敗します。

    • 同様に、MASTER_TLS_VERSION = 'TLSv1'を使用して構成されたレプリカ、および TLSv1 のみをサポートする古いレプリカの接続試行も失敗します。

  • サーバーが tls_version=TLSv1 で構成されているか、TLSv1 のみをサポートする古いサーバーである場合:

    • --tls-version=TLSv1.1,TLSv1.2 で起動されたクライアントの接続試行が失敗します。

    • 同様に、MASTER_TLS_VERSION = 'TLSv1.1,TLSv1.2'で構成されたレプリカの接続試行も失敗します。

MySQL では、サポートするプロトコルのリストを指定できます。 このリストは、基礎となる SSL ライブラリに直接渡され、最終的には、提供されたリストから実際に有効にするプロトコルがそのライブラリになります。 SSL ライブラリによる処理方法の詳細は、MySQL ソースコードおよび OpenSSL SSL_CTX_new() のドキュメントを参照してください。

現在のクライアントセッション TLS プロトコルおよび暗号のモニタリング

現在のクライアントセッションが使用する暗号化 TLS プロトコルと暗号を判別するには、Ssl_version および Ssl_cipher ステータス変数のセッション値を確認します:

mysql> SELECT * FROM performance_schema.session_status
       WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
+---------------+---------------------------+
| VARIABLE_NAME | VARIABLE_VALUE            |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
| Ssl_version   | TLSv1.2                   |
+---------------+---------------------------+

接続が暗号化されていない場合、両方の変数の値は空になります。


関連キーワード:  SHA, TLSv, 接続, プロトコル, 暗号, サーバー, 許可, 構成, version, 変数