MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MySQL - SSL TLS接続のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MySQL - SSL TLS接続
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == MySQLでは、サーバとクライアント間の通信を暗号化するためにSSL/TLS (Transport Layer Security) プロトコルを使用できる。<br> TLSはSSL (Secure Sockets Layer) の後継プロトコルであり、MySQLでは一般的に「SSL接続」と呼ばれるが、実際にはTLSプロトコルが使用されている。<br> <br> SSL/TLS接続により、ネットワーク通信の盗聴・改ざんを防止し、データの機密性と完全性を保護できる。<br> クライアント証明書を使用することで、接続元の認証も可能である。<br> <br> MySQL 8.0では、サーバ起動時に自動的にSSL証明書が生成され (<code>auto_generate_certs=ON</code>)、デフォルトでSSL/TLS接続がサポートされる。<br> クライアントの <code>ssl-mode</code> オプションにより、暗号化接続の要求レベルを制御できる。<br> <br> MySQL 8.0.28以降では、TLS 1.0/1.1のサポートが削除され、TLS 1.2以上が必須となった。<br> TLS 1.3は、MySQL 8.0.16以降でOpenSSL 1.1.1以上を使用する場合にサポートされる。<br> <br> 認証プラグイン <code>caching_sha2_password</code> との関連については、[[MySQL - 認証プラグイン]] を参照すること。<br> レプリケーション全般については、[[MySQL - レプリケーション]] を参照すること。<br> <br><br> == SSL/TLS の基本 == ==== TLS プロトコルの概要 ==== TLS (Transport Layer Security) は、ネットワーク通信を暗号化するプロトコルであり、SSL (Secure Sockets Layer) の後継である。<br> MySQLでは、サーバとクライアント間のTCP/IP接続を暗号化し、以下に示す機能を提供する。<br> <br> * データの暗号化 *: 通信内容の盗聴を防止 * データの完全性保護 *: 通信内容の改ざんを検出 * サーバ認証 *: サーバ証明書によるサーバの身元確認 * クライアント認証 *: クライアント証明書による接続元の認証 <br> TLS接続では、接続確立時にTLSハンドシェイクが実行され、暗号化パラメータの交換と認証が行われる。<br> <br> ==== MySQLにおけるTLSバージョンのサポート ==== MySQLのTLSバージョンサポートは、バージョンにより異なる。<br> <br> <center> {| class="wikitable" |+ MySQLバージョン別TLSサポート ! MySQLバージョン !! サポートTLSバージョン !! 備考 |- | 8.0.0 - 8.0.15 || TLSv1 (非推奨), TLSv1.1 (非推奨), TLSv1.2 || TLS 1.0/1.1は非推奨 |- | 8.0.16 - 8.0.27 || TLSv1 (非推奨), TLSv1.1 (非推奨), TLSv1.2, TLSv1.3 || TLS 1.3サポート追加 (OpenSSL 1.1.1以上) |- | 8.0.28以降 || TLSv1.2, TLSv1.3 || TLS 1.0/1.1削除 |- | 8.4以降 || TLSv1.2, TLSv1.3 || TLS 1.2が最低バージョン |} </center> <br> <u>TLS 1.3を使用するには、OpenSSL 1.1.1以上が必要である。</u><br> <u>TLS 1.3は、ハンドシェイク時間の短縮 (1-RTT) により、接続確立のパフォーマンスが向上する。</u><br> <br> ==== デフォルトの暗号化動作 ==== MySQL 8.0では、<code>auto_generate_certs=ON</code> (デフォルト) により、サーバ起動時に自動的にSSL証明書が生成される。<br> <br> 下表に、自動生成されるファイルを示す。<br> <br> <center> {| class="wikitable" |+ 証明書・鍵ファイル一覧 |- ! ファイル名 !! 説明 |- | ca.pem || CA証明書 (自己署名、有効期限10年) |- | ca-key.pem || CA秘密鍵 |- | server-cert.pem || サーバ公開鍵証明書 |- | server-key.pem || サーバ秘密鍵 |- | client-cert.pem || クライアント公開鍵証明書 |- | client-key.pem || クライアント秘密鍵 |} </center> <br> <u>生成される証明書の鍵サイズは2048ビットであり、CA証明書は自己署名である。</u><br> <br> クライアントの <code>ssl-mode</code> デフォルト値は <u>PREFERRED</u> であり、サーバがSSL/TLSをサポートしている場合は暗号化接続、サポートしていない場合は非暗号化接続が確立される。<br> <br><br> == サーバ側の設定 == ==== SSL/TLS関連のシステム変数 ==== MySQLサーバのSSL/TLS設定は、システム変数により制御される。<br> <br> 下表に、主要なシステム変数を示す。<br> <br> <center> {| class="wikitable" |+ SSL/TLS関連のシステム変数 ! 変数名 !! 説明 |- | ssl_ca || CA証明書ファイルのパス |- | ssl_capath || CA証明書ディレクトリのパス |- | ssl_cert || サーバ公開鍵証明書のパス (必須) |- | ssl_key || サーバ秘密鍵のパス (必須) |- | ssl_cipher || TLS 1.2以下用の暗号スイート (コロン区切り) |- | ssl_crl || 証明書失効リスト (CRL) ファイルのパス |- | ssl_crlpath || 証明書失効リスト (CRL) ディレクトリのパス |- | tls_version || サポートするTLSバージョン (カンマ区切り、デフォルト: TLSv1.2,TLSv1.3) |- | tls_ciphersuites || TLS 1.3用暗号スイート (コロン区切り) |- | auto_generate_certs || サーバ起動時の自動証明書生成 (デフォルト: ON) |} </center> <br> 管理インターフェース用の独立したSSL/TLS設定も可能である。<br> <br> * <u>admin_ssl_ca</u>, <u>admin_ssl_cert</u>, <u>admin_ssl_key</u> *: 管理インターフェース用の証明書設定 * <u>admin_tls_version</u>, <u>admin_tls_ciphersuites</u> *: 管理インターフェース用のTLSバージョンと暗号スイート <br> ==== require_secure_transport ==== <code>require_secure_transport</code> システム変数をONに設定すると、暗号化接続またはUNIXソケット接続のみが許可される。<br> 非暗号化のTCP/IP接続は拒否される。<br> <br> 設定例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SET PERSIST require_secure_transport=ON; </syntaxhighlight> <br> この設定により、全ての接続で暗号化が強制される。<br> <br> ==== TLSバージョンの制限 ==== <code>tls_version</code> システム変数により、サポートするTLSバージョンを制限できる。<br> <br> my.cnfの <code>[mysqld]</code> セクション、または <code>SET GLOBAL</code> / <code>SET PERSIST</code> 文で設定する。<br> <br> <syntaxhighlight lang="ini"> [mysqld] tls_version=TLSv1.2,TLSv1.3 </syntaxhighlight> tls_version=TLSv1.2,TLSv1.3 <br> TLS 1.0/1.1はMySQL 8.0.28で削除されたため、指定できない。<br> <br> TLS 1.3のみを許可する例を以下に示す。<br> <br> <syntaxhighlight lang="ini"> [mysqld] tls_version=TLSv1.3 </syntaxhighlight> <br> ==== 暗号スイートの設定 ==== 暗号スイートは、TLS接続で使用される暗号化アルゴリズムの組み合わせである。<br> <br> TLS 1.2以下用の暗号スイートは <code>ssl_cipher</code> で設定する。<br> TLS 1.3用の暗号スイートは <code>tls_ciphersuites</code> で設定する。<br> <br> これらもmy.cnfの <code>[mysqld]</code> セクション、または <code>SET GLOBAL</code> / <code>SET PERSIST</code> 文で設定する。<br> <br> <syntaxhighlight lang="ini"> [mysqld] ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 tls_ciphersuites=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 </syntaxhighlight> <br> TLS 1.3のデフォルト暗号スイートを以下に示す。<br> <br> * TLS_AES_128_GCM_SHA256 * TLS_AES_256_GCM_SHA384 * TLS_CHACHA20_POLY1305_SHA256 <br> 暗号スイートは、セキュリティと互換性のバランスを考慮して選択する必要がある。<br> <br> ==== 設定ファイルの例 ==== <u>my.cnfファイル</u> (または、<u>my.iniファイル</u>) での設定例を以下に示す。<br> <br> <syntaxhighlight lang="ini"> [mysqld] ssl_ca=/path/to/ca.pem ssl_cert=/path/to/server-cert.pem ssl_key=/path/to/server-key.pem ssl_cipher=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384 tls_version=TLSv1.2,TLSv1.3 tls_ciphersuites=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 require_secure_transport=OFF </syntaxhighlight> <br> 証明書ファイルのパスは、絶対パスを推奨する。<br> <br><br> == 証明書の作成と管理 == ==== mysql_ssl_rsa_setup ツール ==== <u><code>mysql_ssl_rsa_setup</code> ツールは、MySQL 8.0.34で非推奨となり、MySQL 8.4 / 9.0で削除された。</u><br> <br> 非推奨となった理由を以下に示す。<br> <br> * MySQL Community EditionがyaSSLからOpenSSLに移行 * 自動証明書生成機能 (<code>auto_generate_certs=ON</code>) で代替可能 <br> 代替手段を以下に示す。<br> <br> * <code>auto_generate_certs=ON</code> (デフォルト) *: サーバ起動時に自動的にSSL証明書を生成 * OpenSSLを使用した手動生成 *: 本格的な証明書管理が必要な場合 <br> 新規環境では、OpenSSLを使用した証明書生成を推奨する。<br> <br> ==== OpenSSL を使用した証明書の作成 ==== OpenSSLコマンドにより、CA証明書、サーバ証明書、クライアント証明書を作成することができる。<br> <br> ===== CA証明書の作成 ===== CA (認証局) 証明書と秘密鍵を作成する。<br> <br> openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem <br> <code>openssl req</code> コマンドでは、下表に示す情報を入力する。<br> <br> <center> {| class="wikitable" |+ 証明書に必要な識別情報項目 ! 項目名 (英語名称) !! 例 / 説明 |- | Country Name (国コード) || JP |- | State or Province Name (都道府県) || Tokyo |- | Locality Name (市区町村) || Chiyoda-ku |- | Organization Name (組織名) || Example Company |- | Organizational Unit Name (部署名) || IT Department |- | Common Name (CN) || CA証明書のCN (サーバ・クライアント証明書とは異なる値を指定) |} </center> <br> CA証明書の有効期限は3600日 (約10年) である。<br> <br> ===== サーバ証明書の作成 ===== サーバ証明書と秘密鍵を作成し、CA証明書で署名する。<br> <br> openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem <br> サーバ証明書のCommon Name (CN) は、サーバのホスト名またはFQDNを指定する。<br> <br> <u>※注意</u><br> * <u>CA証明書のCNとサーバ証明書のCNは異なる値を指定</u> * <u>クライアント証明書のCNも異なる値を指定</u> <br> ===== クライアント証明書の作成 ===== クライアント証明書と秘密鍵を作成し、CA証明書で署名する。<br> <br> クライアント証明書のCommon Name (CN) は、クライアントを識別する任意の名前を指定する。<br> <code>-set_serial</code> オプションは、サーバ証明書とクライアント証明書で異なる値を指定する必要がある。<br> <br> openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem <br> ==== 証明書の検証 ==== 作成した証明書の検証を以下のコマンドで実行する。<br> <br> <syntaxhighlight lang="bash"> openssl verify -CAfile ca.pem server-cert.pem client-cert.pem </syntaxhighlight> <br> 正常な場合は、以下のようなメッセージが出力される。<br> <br> server-cert.pem: OK client-cert.pem: OK <br> 証明書の内容を確認するコマンドを以下に示す。<br> 有効期限、発行者、サブジェクト、公開鍵等の情報を確認することができる。<br> <br> openssl x509 -text -in server-cert.pem openssl x509 -text -in client-cert.pem <br> ==== 証明書のローテーション ==== MySQL 8.0.16以降では、<code>ALTER INSTANCE RELOAD TLS</code> 文により、サーバ再起動不要で証明書を更新できる。<br> <br> 基本構文を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> ALTER INSTANCE RELOAD TLS; </syntaxhighlight> <br> インターフェース別のリロード (MySQL 8.4以降) を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> ALTER INSTANCE RELOAD TLS FOR CHANNEL mysql_main; </syntaxhighlight> <br> エラー時にロールバックしないオプションを以下に示す。<br> <br> <syntaxhighlight lang="mysql"> ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR; </syntaxhighlight> <br> 実行には <code>CONNECTION_ADMIN</code> 権限が必要である。<br> <br> 証明書リロード後の確認方法を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SHOW STATUS LIKE 'Current_tls_%'; </syntaxhighlight> <br> <u>※注意</u><br> * <u>現在の接続には影響なし。(新規接続から適用)</u> * <u>グループレプリケーションのTLSコンテキストは更新されない。</u> <br><br> == クライアント側の設定 == ==== ssl-mode オプション ==== クライアントの <code>ssl-mode</code> オプションにより、暗号化接続の要求レベルを制御する。<br> <br> <center> {| class="wikitable" |+ ssl-mode オプションの値 ! ssl-mode !! 説明 !! 証明書検証 !! ホスト名検証 |- | DISABLED || SSL/TLS接続を無効化 || なし || なし |- | PREFERRED || サーバがサポートしていれば暗号化、なければ非暗号化 (デフォルト) || なし || なし |- | REQUIRED || 暗号化接続を要求 (証明書検証なし、MITM攻撃に脆弱) || なし || なし |- | VERIFY_CA || 暗号化接続を要求 + CA証明書を検証 (ホスト名検証なし) || あり || なし |- | VERIFY_IDENTITY || 暗号化接続を要求 + CA証明書検証+ホスト名検証 (最も安全) || あり || あり |} </center> <br> セキュリティを重視する場合は、<code>VERIFY_IDENTITY</code> を推奨する。<br> <br> ==== mysql コマンドラインクライアント ==== mysqlコマンドラインクライアントでのSSL/TLS接続例を以下に示す。<br> <br> 基本的な接続 (<code>VERIFY_CA</code>) を以下に示す。<br> <br> mysql --ssl-mode=VERIFY_CA --ssl-ca=/path/to/ca.pem -h localhost -u user -p <br> ホスト名検証付き接続 (<code>VERIFY_IDENTITY</code>) を以下に示す。<br> <br> mysql --ssl-mode=VERIFY_IDENTITY --ssl-ca=/path/to/ca.pem \ --ssl-cert=/path/to/client-cert.pem \ --ssl-key=/path/to/client-key.pem \ -h server.example.com -u user -p <br> クライアント証明書を使用する場合は、<code>--ssl-cert</code> と <code>--ssl-key</code> オプションを指定する。<br> <br> SSL接続の確認方法を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SHOW SESSION STATUS LIKE 'Ssl_cipher'; SHOW SESSION STATUS LIKE 'Ssl_version'; </syntaxhighlight> <br> または、<code>\s</code> コマンドで接続情報を確認する。<br> <br> <syntaxhighlight lang="mysql"> \s </syntaxhighlight> <br> SSL接続が確立されている場合、<u>SSL: Cipher in use is ...</u> のような情報が表示される。<br> <br> ==== プログラミング言語からの接続 ==== ===== MySQL Connector/Python ===== Python (MySQL Connector/Python) からのSSL/TLS接続例を以下に示す。<br> <br> <syntaxhighlight lang="python"> import mysql.connector conn = mysql.connector.connect( host='server.example.com', user='user', password='password', database='mydb', ssl_ca='/path/to/ca.pem', ssl_cert='/path/to/client-cert.pem', ssl_key='/path/to/client-key.pem', ssl_verify_cert=True, ssl_verify_identity=True ) </syntaxhighlight> <br> <code>ssl_verify_cert=True</code> により、証明書検証が有効化される。<br> <code>ssl_verify_identity=True</code> により、ホスト名検証が有効化される。<br> <br> ===== MySQL Connector/Java (JDBC) ===== Java (JDBC) からのSSL/TLS接続例を以下に示す。<br> <br> <syntaxhighlight lang="java"> jdbc:mysql://server.example.com:3306/mydb?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:/path/to/truststore.jks&clientCertificateKeyStoreUrl=file:/path/to/keystore.jks </syntaxhighlight> <br> JDBCでは、JavaのKeyStore形式 (JKS) の証明書ファイルを使用する。<br> <br> ===== PHP (PDO / mysqli) ===== PHP (PDO) からのSSL/TLS接続例を以下に示す。<br> <br> <syntaxhighlight lang="php"> <?php $pdo = new PDO( 'mysql:host=server.example.com;dbname=mydb', 'user', 'password', [ PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem', PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem', PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem', PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true, ] ); </syntaxhighlight> <br> PHP (mysqli) からのSSL/TLS接続例を以下に示す。<br> <br> <syntaxhighlight lang="php"> <?php $mysqli = new mysqli(); $mysqli->ssl_set( '/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca.pem', NULL, NULL ); $mysqli->real_connect( 'server.example.com', 'user', 'password', 'mydb', 3306, NULL, MYSQLI_CLIENT_SSL ); </syntaxhighlight> <br> ==== SSL接続の確認方法 ==== 接続後にSSL/TLS接続が確立されているかを確認する方法を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SHOW SESSION STATUS LIKE 'Ssl_cipher'; </syntaxhighlight> <br> <code>Ssl_cipher</code> が空でない場合、SSL/TLS接続が確立されている。<br> <br> TLSバージョンの確認を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SHOW SESSION STATUS LIKE 'Ssl_version'; </syntaxhighlight> <br> <code>Ssl_version</code> の値 (例: TLSv1.3) により、使用中のTLSバージョンを確認できる。<br> <br><br> == ユーザごとのSSL/TLS要件 == MySQLでは、ユーザ作成時に <code>REQUIRE</code> 句を使用して、ユーザごとにSSL/TLS接続要件を設定できる。<br> <br> ==== REQUIRE SSL ==== 暗号化接続を必須とするが、証明書検証は行わない。<br> <br> <syntaxhighlight lang="mysql"> CREATE USER 'user1'@'%' REQUIRE SSL; </syntaxhighlight> <br> ==== REQUIRE X509 ==== 有効なクライアント証明書を必須とする。(証明書の発行者・サブジェクトは問わない)<br> <br> <syntaxhighlight lang="mysql"> CREATE USER 'user2'@'%' REQUIRE X509; </syntaxhighlight> <br> ==== REQUIRE ISSUER / SUBJECT ==== 特定の発行者 (ISSUER) またはサブジェクト (SUBJECT) のクライアント証明書を必須とする。<br> <br> <code>REQUIRE ISSUER</code> の例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE USER 'user3'@'%' REQUIRE ISSUER '/C=US/ST=State/O=Organization/CN=CA'; </syntaxhighlight> <br> <code>REQUIRE SUBJECT</code> の例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE USER 'user4'@'%' REQUIRE SUBJECT '/C=US/CN=client'; </syntaxhighlight> <br> <code>REQUIRE ISSUER</code> および <code>REQUIRE SUBJECT</code> は、<u>REQUIRE X509</u> を暗示する。<br> <br> ==== ユーザの作成例と変更例 ==== 複数条件の組み合わせ例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE USER 'user5'@'%' REQUIRE SUBJECT '/C=US/CN=client' AND ISSUER '/C=US/CN=CA' AND CIPHER 'ECDHE-RSA-AES256-GCM-SHA384'; </syntaxhighlight> <br> * 既存ユーザの変更例 *: <syntaxhighlight lang="mysql"> ALTER USER 'user1'@'%' REQUIRE X509; </syntaxhighlight> *: <br> * SSL/TLS要件の削除例 *: <syntaxhighlight lang="mysql"> ALTER USER 'user1'@'%' REQUIRE NONE; </syntaxhighlight> *: <br> * <code>REQUIRE CIPHER</code> により、特定の暗号スイートを要求できる。 *: <syntaxhighlight lang="mysql"> CREATE USER 'user6'@'%' REQUIRE CIPHER 'ECDHE-RSA-AES128-GCM-SHA256'; </syntaxhighlight> <br><br> == レプリケーションのSSL/TLS設定 == ==== ソース-レプリカ間の暗号化 ==== レプリケーション接続を暗号化するには、<code>CHANGE REPLICATION SOURCE TO</code> 文でSSL/TLSオプションを設定する。<br> <br> 基本的な設定例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CHANGE REPLICATION SOURCE TO SOURCE_HOST='source.example.com', SOURCE_USER='replication', SOURCE_PASSWORD='password', SOURCE_SSL=1, SOURCE_SSL_CA='/path/to/ca.pem', SOURCE_SSL_CERT='/path/to/client-cert.pem', SOURCE_SSL_KEY='/path/to/client-key.pem', SOURCE_TLS_VERSION='TLSv1.2,TLSv1.3', SOURCE_SSL_VERIFY_SERVER_CERT=1; START REPLICA; </syntaxhighlight> <br> ==== レプリケーション用証明書の設定 ==== 下表に、<code>CHANGE REPLICATION SOURCE TO</code> のSSL/TLSオプションを示す。<br> <br> <center> {| class="wikitable" |+ レプリケーション用SSL/TLSオプション ! オプション !! 説明 |- | SOURCE_SSL || SSL/TLS接続の有効化 (1: 有効、0: 無効) |- | SOURCE_SSL_CA || CA証明書ファイルのパス |- | SOURCE_SSL_CAPATH || CA証明書ディレクトリのパス |- | SOURCE_SSL_CERT || クライアント証明書ファイルのパス |- | SOURCE_SSL_KEY || クライアント秘密鍵ファイルのパス |- | SOURCE_SSL_CRL || 証明書失効リストファイルのパス |- | SOURCE_SSL_CRLPATH || 証明書失効リストディレクトリのパス |- | SOURCE_SSL_CIPHER || TLS 1.2以下用の暗号スイート |- | SOURCE_SSL_VERIFY_SERVER_CERT || サーバ証明書検証 (1: 有効、0: 無効) |- | SOURCE_TLS_VERSION || サポートするTLSバージョン (カンマ区切り) |- | SOURCE_TLS_CIPHERSUITES || TLS 1.3用暗号スイート |} </center> <br> <code>SOURCE_SSL_VERIFY_SERVER_CERT=1</code> により、ソースサーバ証明書の検証を有効化する。<br> <br> ==== グループレプリケーションのSSL設定 ==== グループレプリケーションでのSSL/TLS設定は、専用のシステム変数を使用する。<br> <br> 下表に、主要な設定変数を示す。<br> <br> <center> {| class="wikitable" |+ Group Replicationセキュリティ設定項目 ! パラメータ名 !! 説明 / 設定値 |- | group_replication_ssl_mode || DISABLED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY |- | group_replication_recovery_use_ssl || リカバリ用の暗号化接続有効化 |- | group_replication_recovery_ssl_ca || リカバリ用CA証明書 |- | group_replication_recovery_ssl_cert || リカバリ用クライアント証明書 |- | group_replication_recovery_ssl_key || リカバリ用クライアント秘密鍵 |} </center> <br> 設定例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SET GLOBAL group_replication_ssl_mode='VERIFY_IDENTITY'; SET GLOBAL group_replication_recovery_use_ssl=ON; SET GLOBAL group_replication_recovery_ssl_ca='/path/to/ca.pem'; SET GLOBAL group_replication_recovery_ssl_cert='/path/to/client-cert.pem'; SET GLOBAL group_replication_recovery_ssl_key='/path/to/client-key.pem'; </syntaxhighlight> <br> <u>※注意</u><br> * <u><code>ALTER INSTANCE RELOAD TLS</code> では、グループレプリケーションのTLSコンテキストは更新されない。</u> * <u>グループレプリケーションのTLS設定を変更する場合は、グループの再起動が必要となる。</u> <br><br> == SSL/TLS接続のパフォーマンス == ==== 暗号化のオーバーヘッド ==== SSL/TLS接続により、以下のパフォーマンスオーバーヘッドが発生する。<br> <br> <center> {| class="wikitable" |+ SSL/TLSパフォーマンスへの影響 ! 項目 !! 説明 |- | CPU使用率の増加 || 一般的に2〜5[%]増加 (適切な設定で1%以下も可能) |- | TLSハンドシェイクのオーバーヘッド || 接続確立時にハンドシェイク処理が実行される |- | データ転送の暗号化/復号化コスト || データ送受信時に暗号化処理が実行される |} </center> <br> TLS 1.3では、ハンドシェイク時間が短縮 (1-RTT) され、接続確立のパフォーマンスが向上する。<br> <br> ==== パフォーマンス最適化 ==== SSL/TLS接続のパフォーマンスを最適化する手法を以下に示す。<br> <br> <center> {| class="wikitable" |+ SSL/TLSパフォーマンス最適化対策 ! 対策項目 !! 説明 |- | 接続プーリングの活用 || ハンドシェイク回数を削減し、接続確立コストを低減 |- | TLS 1.3の使用 || ハンドシェイク時間の短縮 (1-RTT) |- | 適切な暗号スイートの選択 || ECDHE (楕円曲線Diffie-Hellman鍵交換) を推奨<br>DHE (Diffie-Hellman鍵交換) は避ける (計算コストが高い) |- | セッション再利用/キャッシュ || TLSセッションの再利用により、ハンドシェイクを省略 |} </center> <br> 暗号スイートの選択例を以下に示す。<br> <br> <syntaxhighlight lang="ini"> [mysqld] tls_ciphersuites=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 </syntaxhighlight> <br> 接続プーリングの推奨を以下に示す。<br> <br> * アプリケーション側で接続プールを実装 * 接続の再利用により、ハンドシェイク回数を削減 <br><br> == トラブルシューティング == ==== SSL接続エラーの診断 ==== SSL/TLS接続エラーの診断には、以下に示すステータス変数を確認する。<br> <br> <syntaxhighlight lang="mysql"> SHOW STATUS LIKE 'Ssl%'; </syntaxhighlight> <br> 主要なステータス変数を以下に示す。<br> <br> <center> {| class="wikitable" |+ SSL/TLSステータス変数 ! 変数名 !! 説明 |- | Ssl_accepts || SSL接続受入回数 |- | Ssl_accepts_failed || SSL接続失敗回数 |- | Ssl_cipher || 現在の接続の暗号スイート |- | Ssl_version || 現在の接続のTLSバージョン |} </center> <br> <code>Ssl_accepts_failed</code> が増加している場合、SSL/TLS接続エラーが発生している。<br> <br> エラーログの確認を以下に示す。<br> <br> MySQLエラーログに、SSL/TLS関連のエラーメッセージが出力される。<br> <br> tail -f /var/log/mysql/error.log <br> ==== 証明書関連のエラー ==== ===== 証明書期限切れ ===== 証明書の有効期限を確認する。<br> <br> openssl x509 -text -in server-cert.pem | grep -A2 Validity <br> 期限切れの場合は、新しい証明書を作成する。<br> <br> ===== CA証明書不一致 ===== 証明書がCA証明書で署名されているかを確認する。<br> <br> openssl verify -CAfile ca.pem server-cert.pem <br> エラーが表示される場合、証明書とCA証明書が一致していない。<br> <br> ===== 秘密鍵と証明書の不一致 ===== 秘密鍵と証明書の対応を確認する。<br> <br> openssl x509 -noout -modulus -in server-cert.pem | openssl md5 # または openssl rsa -noout -modulus -in server-key.pem | openssl md5 <br> MD5ハッシュ値が一致しない場合、秘密鍵と証明書が対応していない。<br> <br> ===== Common Name (CN) 重複 ===== CA証明書、サーバ証明書、クライアント証明書のCNは、それぞれ異なる値が必要である。<br> <br> 証明書のCNを確認する。<br> <br> openssl x509 -noout -subject -in ca.pem # または openssl x509 -noout -subject -in server-cert.pem # または openssl x509 -noout -subject -in client-cert.pem <br> CNが重複している場合は、証明書を再作成する。<br> <br> ==== クライアント互換性の問題 ==== MySQL 8.0.28以降では、TLS 1.0/1.1のサポートが削除されている。<br> <br> 古いクライアントがTLS 1.2以上に対応していない場合は、以下の対処が必要である。<br> <br> * クライアントライブラリの更新 *: TLS 1.2以上に対応したバージョンに更新 * サーバ側でのTLSバージョン調整 (MySQL 8.0.27以前) *: <code>tls_version</code> に古いバージョンを含める (非推奨) <br> TLS 1.2対応の確認を以下に示す。<br> <br> mysql --version # または openssl version <br> OpenSSL 1.0.1以上が必要である。<br> <br><br> == バージョン別の変更点 == ==== MySQL 8.0の変更 ==== MySQL 8.0での主要な変更を以下に示す。<br> <br> * サーバ起動時の自動証明書生成 (<code>auto_generate_certs=ON</code>) * クライアントのデフォルト <code>ssl-mode</code> が <code>PREFERRED</code> * TLS 1.2サポート (デフォルト) <br> MySQL 8.0.16での変更を以下に示す。<br> <br> * TLS 1.3サポート (OpenSSL 1.1.1以上) * <code>ALTER INSTANCE RELOAD TLS</code> 文の追加 <br> ==== MySQL 8.0.28の変更 ==== MySQL 8.0.28での主要な変更を以下に示す。<br> <br> * TLS 1.0 / 1.1サポート削除 * TLS 1.2が最低バージョン <br> 影響を以下に示す。<br> <br> * TLS 1.2以上に対応していないクライアントは接続不可 * <code>tls_version</code> に TLSv1 または TLSv1.1を指定するとエラー <br> ==== MySQL 8.0.34の変更 ==== MySQL 8.0.34での主要な変更を以下に示す。<br> <br> * <code>mysql_ssl_rsa_setup</code> ツールの非推奨化 <br> 代替手段を以下に示す。<br> <br> * <code>auto_generate_certs=ON</code> による自動生成 * OpenSSLによる手動生成 <br> MySQL 8.4/9.0では、<code>mysql_ssl_rsa_setup</code> は削除される。<br> <br> MySQL 8.4での追加機能を以下に示す。<br> <br> * <code>tls-certificates-enforced-validation</code> *: 証明書検証を強制し、無効な証明書でサーバ起動が失敗する * <code>ALTER INSTANCE RELOAD TLS FOR CHANNEL</code> 句 *: インターフェース別の証明書リロード <br><br> == 参考リンク == * [https://dev.mysql.com/doc/refman/8.0/en/encrypted-connections.html MySQL 8.0 Reference Manual - Encrypted Connections] * [https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html MySQL 8.0 Reference Manual - Using Encrypted Connections] * [https://dev.mysql.com/doc/refman/8.0/en/alter-instance.html MySQL 8.0 Reference Manual - ALTER INSTANCE Statement] * [https://dev.mysql.com/doc/refman/8.0/en/replication-encrypted-connections.html MySQL 8.0 Reference Manual - Replication with Encrypted Connections] <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MySQL,Database,SQL,SSL,TLS,Encrypted Connection,Certificate,Security,SSL/TLS,暗号化接続,証明書,セキュリティ,データベース,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - MySQLのSSL/TLS接続設定と証明書管理に関する包括的なガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:MySQL]]
MySQL - SSL TLS接続
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse