SSL 暗号化は、ApsaraDB RDS for MySQL インスタンスとクライアント間で転送中のデータを保護し、監視、傍受、改ざんを防ぎます。デフォルトでは、SSL 暗号化は無効になっています。
このトピックでは、以下の方法について説明します。
SSL 暗号化の有効化 (およびオプションですべての接続に SSL の使用を強制)
CA 証明書のダウンロード
クライアント (CLI、MySQL Workbench、DMS、Java、Python) の SSL 経由での接続設定
前提条件
開始する前に、以下を確認してください。
お使いの RDS インスタンスで [SSL 暗号化] を使用するには、次のいずれかの MySQL バージョンおよびエディションを実行している必要があります:
MySQL バージョン
High-availability Edition
Cluster Edition
Basic Edition
8.0
サポート済み
サポート済み
サポート済み
5.7
サポート済み
サポート済み
サポート済み
5.6
サポート済み
—
—
お使いの RDS インスタンスで[強制 SSL 暗号化] を使用するには、次の両方の要件を満たす必要があります:
Basic Edition、High-availability Edition、または Cluster Edition で MySQL 8.4、8.0、または 5.7 を実行している
マイナーエンジンバージョンが 20241130 以降である
お使いの RDS インスタンスの [基本情報] ページでこれらの詳細を確認してください。 インスタンスが要件を満たしているにもかかわらず [SSL] タブが表示されない場合は、マイナーエンジンバージョンを更新してください。 詳細については、「マイナーエンジンバージョンをアップグレードする」をご参照ください。 非サーバーレスのベーシック版 RDS インスタンスの課金方法をサーバーレスに変更した場合、SSL 暗号化を再度有効にする必要があります。
潜在的リスク
再起動と切り替えの動作:
操作 | MySQL 5.6 または 5.7 | MySQL 8.0 |
SSL の有効化 | 再起動とプライマリ/セカンダリ切り替えが発生します | 再起動とプライマリ/セカンダリ切り替えが発生します |
SSL の無効化 | 再起動とプライマリ/セカンダリ切り替えが発生します | 再起動とプライマリ/セカンダリ切り替えが発生します |
証明書の更新 | 再起動します | 再起動しません |
これらの操作はオフピーク時間帯に実行し、再起動後にアプリケーションが自動的に再接続するように設定してください。
CPU オーバーヘッド: SSL 暗号化された接続は、CPU 使用率を大幅に増加させます。暗号化が必要なエンドポイント (通常はパブリックエンドポイント) に対してのみ SSL を有効にしてください。
強制 SSL 暗号化: 強制 SSL 暗号化を有効にすると、クライアントおよびデータベースプロキシからの非 SSL 接続は拒否されます。
仕組み
SSL 暗号化を有効にすると、RDS インスタンスはサーバー証明書、公開鍵、秘密鍵を生成します。
SSL ハンドシェイク中:
RDS インスタンスはサーバー証明書 (公開鍵を含む) をクライアントに送信します。
クライアントは、受信した公開鍵を使用して対称キーを暗号化します。
RDS インスタンスは、その秘密鍵を使用して対称キーを復号します。
双方は、対称キーを使用してデータを暗号化および復号します。
オプションで、クライアントは認証局 (CA) の証明書でサーバー証明書を検証し、サーバーのアイデンティティを確認して中間者攻撃を防ぐことができます。
TLS バージョンのサポート
MySQL バージョン | TLSv1.0 | TLSv1.1 | TLSv1.2 | TLSv1.3 |
8.0 | サポート済み | サポート済み | サポート済み | サポート済み (マイナーバージョン 20221231 以降) |
5.7 | サポート済み | サポート済み | サポート済み | サポート対象外 |
5.6 | サポート済み | サポート済み | サポート済み | サポート対象外 |
TLS 1.0 および TLS 1.1 は、2021 年に Internet Engineering Task Force (IETF) によって非推奨とされました。TLSv1.2 以降を使用してください。詳細については、「RFC 8996」をご参照ください。
ssl_cipher の設定
ApsaraDB RDS for MySQL は、TLS に OpenSSL を使用します。OpenSSL は、以下のインスタンスで OpenSSL 3.0 にアップグレードされました。
マイナーエンジンバージョン 20230831 を実行する MySQL 5.7 インスタンス
マイナーエンジンバージョン 20230930 を実行する MySQL 8.0 インスタンス
OpenSSL 3.0 は、デフォルトでは TLSv1.0 と TLSv1.1 をサポートしていません。互換性を維持するため、ssl_cipher パラメーターはデフォルトで "ALL:@SECLEVEL=0" に設定されており、これにより TLSv1.0 と TLSv1.1 が再度有効になります。
ワークロードが TLSv1.2 以降のみを使用する場合は、セキュリティを強化するために、ApsaraDB RDS コンソールで ssl_cipher を空の文字列 ("") に設定してください。
証明書の種類
どちらの証明書タイプも 1 つのエンドポイントを保護し、同じ目的を果たします。すなわち、SSL 暗号化を有効にし、クライアントがサーバーを認証できるようにすることです。
クラウド証明書 | カスタム証明書 | |
発行元 | Alibaba Cloud | CA または自己署名 |
有効期間 | 365 日 | カスタマイズ |
保護されるエンドポイント | 1 | 1 |
このトピックでは、クラウド証明書について説明します。カスタム証明書を使用するには、「カスタム証明書の設定」をご参照ください。
ステップ 1: SSL 暗号化の有効化
インスタンス ページに移動します。上部メニューで、RDS インスタンスが存在するリージョンを選択します。インスタンスを見つけて、その ID をクリックします。
左側のナビゲーションペインで、セキュリティコントロール をクリックします。
[SSL] タブで、[無効] の横にあるスイッチをオンにします。
[SSL] タブが表示されない場合は、インスタンスが前提条件に記載されているすべての要件を満たしていることを確認してください。
表示されるダイアログボックスで、保護するエンドポイント (内部エンドポイントまたは公開エンドポイント) を選択し、[OK] をクリックします。一度に保護できるエンドポイントは 1 つだけです。
(オプション) [強制的な暗号化] をオンにします。
重要強制 SSL 暗号化には、MySQL 8.4、8.0、または 5.7 と、マイナーエンジンバージョン 20241130 以降が必要です。強制 SSL 暗号化を有効にすると、SSL 暗号化された接続のみが受け入れられます。クライアントおよびデータベースプロキシからの非 SSL 接続は拒否されます。
プロセスが完了するまで約 1 分間待ちます。ページを更新して、機能が有効になっていることを確認してください。
説明読み取り専用インスタンスの SSL 暗号化は、プライマリインスタンスとは独立しています。プライマリインスタンスで SSL 暗号化を有効にしても、関連付けられた読み取り専用インスタンスでは自動的に有効になりません。読み取り専用インスタンスで SSL 暗号化を有効にするには、読み取り専用インスタンスの詳細ページに移動し、[データセキュリティ] > [SSL] をクリックして、SSL 暗号化を手動でオンにします。
ステップ 2: CA 証明書のダウンロード
インスタンス ページに移動し、インスタンスを見つけて、その ID をクリックします。
左側のナビゲーションペインで、セキュリティコントロール をクリックします。[SSL] タブで、[CA 証明書のダウンロード] をクリックします。
ダウンロードしたパッケージには、次の 3 つのファイルが含まれています。
ファイル | フォーマット | 使用場面 |
| PEM | ほとんどのシナリオ |
| JKS (Java KeyStore) | Java アプリケーション。パスワードは |
| P7B (PKCS#7) | PKCS#7 形式を必要とする Windows アプリケーション |
ステップ 3: SSL を使用した接続
SSL 暗号化を有効にした後、暗号化された接続を介して接続するようにクライアントを設定します。利用可能な SSL モードは次のとおりです。
モード | 動作 |
| 接続は暗号化されません |
| 暗号化された接続を試みます。SSL が利用できない場合は、暗号化されていない接続にフォールバックします |
| 暗号化された接続が必要です。暗号化が利用できない場合は失敗します |
| 暗号化が必要で、CA 証明書でサーバー証明書を検証します |
| 暗号化が必要で、サーバー証明書を検証し、証明書のホスト名が実際の接続と一致することを確認します |
強制 SSL 暗号化が有効になっている場合、REQUIRED、VERIFY_CA、または VERIFY_IDENTITY モードのみが接続を許可します。
CLI
MySQL クライアント 5.7.11 以降では、--ssl-mode オプションを使用します。
サーバー証明書を検証せずに接続:
mysql -h <endpoint> -u <username> -p --ssl-mode=PREFERREDサーバー証明書を検証して接続:
mysql -h <endpoint> -u <username> -p \
--ssl-mode=VERIFY_CA \
--ssl-ca=<path-to-certificate>/ApsaraDB-CA-Chain.pem<endpoint>、<username>、および <path-to-certificate> を実際の値に置き換えてください。
5.7.11 より前の MySQL クライアントおよび MariaDB クライアントでは、代わりに--sslと--ssl-verify-server-certを使用してください。詳細については、MySQL と MariaDB の公式ドキュメントをご参照ください。
MySQL Workbench
MySQL Workbench を開き、[データベース] > [接続の管理] を選択します。
接続エンドポイント、ユーザー名、パスワードを入力します。
[SSL] タブで、[SSL の使用] を希望のモードに設定し、[SSL CA ファイル] にダウンロードした PEM ファイルのパスを設定してから、[接続テスト] または [OK] をクリックします。
DMS
Data Management (DMS) に RDS インスタンスを登録する際に、[SSL の有効化] パラメーターを設定します。詳細については、「Alibaba Cloud データベースインスタンスを登録する」をご参照ください。
既存の登録の設定を更新するには、インスタンスを右クリックし、[編集] を選択し、[詳細情報] の [SSL を有効にする] を設定します。
アプリケーションコード
Java
MySQL Connector/J (mysql-connector-java) は MySQL の公式 JDBC ドライバーです。この例ではバージョン 8.0.19 を使用します。
次の依存関係を追加します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>sslMode プロパティは、mysql-connector-java 8.0.13 からサポートされています。以前のバージョンでは、代わりに useSSL、requireSSL、および verifyServerCertificate プロパティを使用してください。詳細については、「MySQL Connector/J ドキュメント」をご参照ください。
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS = null;
try {
mysqlDS = new MysqlDataSource();
// SSL モードを設定します。オプション: DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY。
mysqlDS.setSslMode("VERIFY_IDENTITY");
// トラストストアにはCA証明書を格納します。この例では JKS 形式を使用します。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// システム上の ApsaraDB-CA-Chain.jks への実際のパスに置き換えてください。
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
// JKS ファイルのパスワードは常に apsaradb です。
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// 以下の値を実際の RDS インスタンスの詳細に置き換えてください。
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com"); // RDS エンドポイント
mysqlDS.setPort(3306);
mysqlDS.setUser("xxxxxx"); // データベースアカウントのユーザー名
mysqlDS.setPassword("xxxxxx"); // データベースアカウントのパスワード
mysqlDS.setDatabaseName("xxxxxx"); // データベース名
conn = mysqlDS.getConnection();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}Python
# PyMySQL のインストール: pip install pymysql
import pymysql
try:
ssl_config = {
"ca": "/path/to/ApsaraDB-CA-Chain.pem", # CA 証明書へのパス
"mode": "VERIFY_CA" # SSL モード
}
conn = pymysql.connect(
host="******.mysql.rds.aliyuncs.com",
user="*****",
passwd="******",
db="*****",
ssl=ssl_config
)
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()
print("Database version:", data[0])
cursor.close()
except pymysql.Error as e:
print(e)追加の操作
クラウド証明書の更新
クラウド証明書は 1 年間有効です。更新前に証明書が期限切れになると、暗号化された接続を使用するクライアントは接続できなくなります。Alibaba Cloud は、有効期限の通知を E メールまたは内部メッセージで送信します。
自動更新をスケジュールするには、[イベントのスケジュール] ダイアログボックスを使用します。詳細については、「スケジュールされたイベントの管理」をご参照ください。
自動更新後、クライアントは CA 証明書を再ダウンロードまたは再設定する必要はありません。
証明書を手動で更新するには:
証明書を更新すると、MySQL 5.6 または 5.7 を実行しているインスタンスが再起動します。MySQL 8.0 を実行しているインスタンスは再起動しません。
インスタンス ページに移動し、インスタンスを見つけて、その ID をクリックします。
左側のナビゲーションペインで、セキュリティコントロール をクリックします。
[SSL] タブで、[有効期限の更新] をクリックします。
暗号化された接続の検証
次の SQL 文を実行して、現在の接続を確認します。
-- 現在のセッションで使用されている暗号スイートを確認します。
-- 空でない結果は、接続が暗号化されていることを示します。
SHOW STATUS LIKE 'Ssl_cipher';
-- 現在のセッションで使用されている TLS バージョンを確認します。
SHOW STATUS LIKE 'Ssl_version';MySQL CLI で \s を実行して接続の詳細を表示します。接続が暗号化されている場合、SSL フィールドに使用中の暗号スイートが表示されます。
特定のユーザーに SSL を要求
ALTER USER 'testuser'@'%' REQUIRE SSL;CA 証明書の内容の表示
openssl x509 -in <path-to-certificate>/ApsaraDB-CA-Chain.pem -textSSL 暗号化の無効化
SSL を無効にすると、RDS インスタンスが再起動し、プライマリ/セカンダリ切り替えが発生します。この操作はオフピーク時間帯に実行してください。
インスタンス ページに移動し、インスタンスを見つけて、その ID をクリックします。
左側のナビゲーションペインで、セキュリティコントロール をクリックします。
[SSL] タブで、[SSL 暗号化]をオフにします。確認ダイアログで [OK] をクリックします。
よくある質問
サーバーとクライアントの両方のアイデンティティを検証する相互認証を設定できますか?
ApsaraDB RDS for MySQL は、SSL ハンドシェイク中のクライアントアイデンティティ検証をサポートしていません。ホワイトリストとアカウント管理を使用してアクセスを制御してください。
読み書き分離エンドポイントの SSL 暗号化を設定するにはどうすればよいですか?
「データベースプロキシエンドポイントの SSL 暗号化の設定」をご参照ください。
Java アプリケーション:「javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints」
このエラーは、デフォルトの JDK 7 または JDK 8 のセキュリティ設定で発生します。アプリケーションホストの jre/lib/security/java.security ファイルで、次のように設定します。
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024Java アプリケーション:「javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)」
MySQL Connector/J 8.0.18 以前では、MySQL 5.6 または 5.7 インスタンスに接続する際に TLSv1.2 が無効になります。次のいずれかの方法でこの問題を修正できます。
MySQL Connector/J を 8.0.19 以降にアップグレードします
RDS インスタンスを MySQL 8.0 にアップグレードします
接続設定で
enabledTLSProtocolsまたはtlsVersionsをTLSv1.2に設定して、TLS バージョンを明示的に指定します