ApsaraDB RDS for MySQL の SSL 暗号化機能は、転送中のデータを暗号化するために使用されます。この機能は、接続のセキュリティとコンプライアンスが要求されるシナリオに適しています。デフォルトでは、ApsaraDB RDS for MySQL インスタンスの SSL 暗号化機能は無効になっています。このトピックでは、クラウド証明書を使用して SSL 暗号化機能を有効にする方法について説明します。
前提条件
SSL 暗号化機能を使用するには、ご利用の RDS インスタンスが次のいずれかの MySQL バージョンと RDS エディションを実行している必要があります。
RDS High-availability Edition の MySQL 8.0、MySQL 5.7、または MySQL 5.6
RDS Cluster Edition の MySQL 8.0 または MySQL 5.7
RDS Basic Edition の MySQL 8.0 または MySQL 5.7
SSL 強制暗号化機能を使用するには、ご利用の RDS インスタンスが次の要件を満たしている必要があります。
RDS インスタンスが RDS Basic Edition、RDS High-availability Edition、または RDS Cluster Edition の MySQL 5.7 または MySQL 8.0 を実行している。
RDS インスタンスが 20241130 以降のマイナーエンジンバージョンを実行している。
RDS インスタンスの [基本情報] ページで、上記情報を確認できます。
RDS Basic Edition を実行している非サーバーレス RDS インスタンスの課金方法をサーバーレスに変更した場合、SSL 暗号化機能を再度有効にする必要があります。
ご利用の RDS インスタンスが上記の要件を満たしているにもかかわらず、「SSL 暗号化機能はサポートされていません」というエラーメッセージが表示される場合は、RDS インスタンスのマイナーエンジンバージョンを更新できます。詳細については、「マイナーエンジンバージョンのアップグレード」をご参照ください。
機能の説明
SSL 暗号化機能は、ApsaraDB RDS for MySQL インスタンスとクライアント間で送信されるデータを暗号化するために使用できます。これにより、データが第三者によって監視、傍受、または改ざんされるのを防ぎます。
SSL 暗号化機能を有効にすると、クライアントは SSL 暗号化接続または非 SSL 暗号化接続を介して RDS インスタンスに接続できます。SSL 強制暗号化機能を有効にすると、クライアントまたはプロキシは SSL 暗号化接続を介してのみ RDS インスタンスに接続できます。
RDS インスタンスで SSL 暗号化機能を有効にすると、サーバー証明書、公開鍵、および秘密鍵が生成されます。
暗号化接続が確立されると、システムは公開鍵を含むサーバー証明書をクライアントに送信します。クライアントは、受信した公開鍵を使用して生成された共通鍵を暗号化します。その後、システムは秘密鍵を使用して共通鍵を復号します。これにより、RDS インスタンスとクライアントは共通鍵を使用してデータを暗号化および復号し、通信の機密性を確保します。クライアントは、認証局 (CA) 証明書を使用して受信したサーバー証明書を検証し、RDS インスタンスの ID を確認して中間者攻撃を防ぐこともできます。
次の表は、さまざまな証明書における SSL 暗号化の構成と利点を比較したものです。
項目 | ||
取得方法 | Alibaba Cloud によって発行されます。 | 認証局 (CA) によって発行されるか、自己署名証明書から取得します。 |
有効期間 | 365 日。 | カスタマイズ。 |
保護されるエンドポイントの数 | 1 | 1 |
目的 | SSL 暗号化を有効にし、クライアントがサーバーを認証するために使用されます。 | SSL 暗号化を有効にし、クライアントがサーバーを認証するために使用されます。 |
影響
SSL 暗号化機能を有効にする、無効にする、または SSL 証明書を更新すると、RDS インスタンスが再起動し、プライマリ/セカンダリの切り替えがトリガーされます。オフピーク時間に操作を実行することを推奨します。アプリケーションが RDS インスタンスに自動的に再接続するように設定されていることを確認してください。アプリケーションのコードを変更して、自動再接続を有効にできます。MySQL 5.6 または MySQL 5.7 を実行している RDS インスタンスの SSL 証明書を更新すると、RDS インスタンスが再起動します。MySQL 8.0 を実行している RDS インスタンスの SSL 証明書を更新しても、RDS インスタンスは再起動しません。インスタンスの切り替えによる影響の詳細については、「インスタンスの切り替えによる影響」をご参照ください。
RDS インスタンスで SSL 暗号化機能を有効にすると、暗号化接続によって CPU 使用率が大幅に増加します。RDS インスタンスのパブリックエンドポイントへの接続を暗号化する必要がある場合にのみ、SSL 暗号化機能を有効にすることを推奨します。
RDS インスタンスで SSL 強制暗号化機能を有効にすると、クライアントまたはデータベースプロキシは SSL 暗号化接続を介してのみ RDS インスタンスに接続できます。非 SSL 暗号化接続は拒否されます。
TLS バージョン
Transport Layer Security (TLS) は、インターネット通信のデータプライバシーとセキュリティを確保する、広く使用されているトランスポート層セキュリティプロトコルです。複数の TLS バージョンが利用可能です。ApsaraDB RDS for MySQL インスタンスでサポートされている TLS バージョンは、RDS インスタンスのメジャーエンジンバージョンによって異なります。
メジャーエンジンバージョン | 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 を使用して安全な通信を提供します。MySQL 5.7 およびマイナーエンジンバージョン 20230831 を実行する RDS インスタンス、および MySQL 8.0 およびマイナーエンジンバージョン 20230930 を実行する RDS インスタンスでは、OpenSSL が OpenSSL 3.0 にアップグレードされます。デフォルトでは、OpenSSL 3.0 は TLSv1.0 および TLSv1.1 を介した通信をサポートしなくなりました。詳細については、OpenSSL ドキュメントをご参照ください。
ApsaraDB RDS for MySQL のデータ互換性を確保するため、`ssl_cipher` パラメーターの値は "ALL:@SECLEVEL=0" に変更され、TLSv1.0 と TLSv1.1 をサポートします。
ワークロードが TLSv1.2 以降のみを使用する場合は、より高いセキュリティを確保するために、ApsaraDB RDS コンソールで `ssl_cipher` パラメーターを空の文字列 ("") に設定することを推奨します。
ステップ 1:RDS インスタンスの SSL 暗号化機能を有効にする
[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、対象の RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されたページの [SSL] タブで、[無効] の左側にあるスイッチをオンにします。
説明[SSL] タブが表示されない場合は、RDS インスタンスが [前提条件] のすべての要件を満たしているかどうかを確認する必要があります。
表示されたダイアログボックスで、保護するエンドポイントを選択し、[OK] をクリックします。
ビジネス要件に基づいて、内部エンドポイントまたはパブリックエンドポイントへの接続を暗号化できます。接続を暗号化できるのは 1 つのエンドポイントのみです。
オプション。 [強制暗号化] をオンにして、SSL 強制暗号化機能を有効にします。
重要SSL 強制暗号化機能は、RDS インスタンスが MySQL 5.7 または MySQL 8.0 で、マイナーエンジンバージョンが 20241130 以降の場合にのみ有効にできます。
RDS インスタンスで SSL 強制暗号化機能を有効にすると、クライアントまたはデータベースプロキシは SSL 暗号化接続を介してのみ RDS インスタンスに接続できます。非 SSL 暗号化接続は拒否されます。
SSL 暗号化機能を有効にするプロセスが完了するまで、約 1 分待ちます。ページをリフレッシュして、機能のステータスを表示できます。
ステップ 2:CA 証明書をダウンロードする
クラウド証明書を設定した後、RDS インスタンスはダウンロード用のサーバー CA 証明書を提供します。クライアントから RDS インスタンスに接続するときに、サーバー CA 証明書を使用して RDS インスタンスを認証できます。
[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、対象の RDS インスタンスを見つけて、インスタンス ID をクリックします。
表示されたページの左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。[SSL] タブで、[CA 証明書のダウンロード] をクリックします。
ダウンロードしたファイルは、次のファイルを含むパッケージです。
PEM ファイル:ほとんどのシナリオに適しています。
JKS ファイル:Java アプリケーションに適しています。ファイルのパスワードは apsaradb です。ほとんどの場合、PEM 形式の CA 証明書ファイルをトラストストアにインポートして JKS ファイルに変換する必要があります。Java アプリケーションで JKS ファイルを使用できます。ファイルのパスワードは apsaradb です。
P7B ファイル:PKCS#7 形式の証明書ファイルを必要とする一部の Windows アプリケーションに適しています。
ステップ 3:データベースクライアントから RDS インスタンスに接続する
SSL 暗号化機能を有効にした後、クライアントと RDS インスタンス間の接続を暗号化するかどうかは、クライアントの種類と設定によって決まります。たとえば、クライアントから RDS インスタンスへの接続は、デフォルトで暗号化される場合があります。クライアントの設定またはコードを変更して、接続の暗号化を有効にし、RDS インスタンスの ID を検証できます。
RDS インスタンスで SSL 強制暗号化機能を有効にすると、クライアントまたはデータベースプロキシは SSL 暗号化接続を介してのみ RDS インスタンスに接続できます。
CLI
MySQL 5.7.11 以降を実行しているクライアントの場合、接続コマンドに --ssl-mode オプションを追加して SSL 暗号化機能を設定できます。
MySQL 5.7.11 より前の MySQL バージョンを実行しているクライアントおよび MariaDB クライアントの場合、--ssl や --ssl-verify-server-cert などのオプションを使用して SSL 暗号化機能を設定できます。詳細については、MariaDB および MySQL の公式ドキュメントをご参照ください。
--ssl-mode オプションが DISABLED に設定されている場合、接続は暗号化されません。
--ssl-mode オプションが PREFERRED に設定されている場合、またはオプションが使用されていない場合、システムは暗号化された接続を確立しようとします。試行が失敗した場合、暗号化されていない接続が確立されます。
--ssl-mode オプションが REQUIRED に設定されている場合、暗号化された接続のみが許可されます。接続を暗号化できない場合、接続の確立は失敗します。
--ssl-mode オプションが VERIFY_CA に設定されている場合、暗号化された接続のみが許可され、オンプレミスデバイスの CA 証明書を使用してサーバー証明書が有効かどうかを確認する必要があります。
--ssl-mode オプションが VERIFY_IDENTITY に設定されている場合、暗号化された接続のみが許可され、オンプレミスデバイスの CA 証明書を使用してサーバー証明書が有効かどうか、およびサーバー証明書のホスト名または IP アドレスが実際の接続のホスト名または IP アドレスと一致するかどうかを確認する必要があります。
例 1:システムは暗号化された接続を確立しようとします。試行が失敗した場合、暗号化されていない接続が確立されます。
mysql -h {RDS インスタンスのエンドポイント} -u {RDS インスタンスのアカウント} -p --ssl-mode=PREFERRED例 2:暗号化された接続が必要であり、サーバー証明書の有効性を検証する必要があります。
mysql -h {RDS インスタンスのエンドポイント} -u {RDS インスタンスのアカウント} -p --ssl-mode=VERIFY_CA --ssl-ca={CA 証明書へのパス}/ApsaraDB-CA-Chain.pemビジネス要件に基づいて、RDS インスタンスのエンドポイント、RDS インスタンスのアカウント、および CA 証明書へのパスのパラメーターを設定する必要があります。
--ssl-mode オプションの詳細については、MySQL のドキュメントをご参照ください。
MySQL Workbench
MySQL Workbench を起動し、 を選択します。
RDS インスタンスへの接続に使用するアカウントのユーザー名とパスワード、およびエンドポイントを入力します。
[SSL] タブで、[Use SSL] パラメーターを設定し、[SSL CA File] パラメーターをダウンロードした PEM 形式の CA 証明書に設定してから、[Test Connection] または [OK] をクリックします。
[Use SSL] パラメーターのオプションの詳細については、このトピックの「CLI」セクションの --ssl-mode オプションの説明をご参照ください。
DMS
Data Management (DMS) に RDS インスタンスを登録する際に、[Enable SSL] パラメーターを設定できます。詳細については、「Alibaba Cloud データベースインスタンスの登録」をご参照ください。
インスタンスを右クリックして [編集] を選択し、[詳細情報] セクションで [Enable SSL] パラメーターを設定することもできます。
アプリケーションコード
Java
MySQL Connector/J (mysql-connector-java) は、MySQL の公式 JDBC ドライバーです。この例では、mysql-connector-java 8.0.19 を依存関係として使用します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>次のコードは、sslMode プロパティを使用して SSL モードを指定する方法の例を示しています。このプロパティは、mysql-connector-java 8.0.13 からサポートされています。以前のバージョンを使用する場合は、useSSL、requireSSL、および verifyServerCertificate プロパティを使用する必要があります。詳細については、MySQL ドキュメントをご参照ください。
サンプルコード:
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();
//ビジネス要件に基づいて sslMode プロパティを指定できます。このプロパティのオプションの詳細については、このトピックの「CLI」セクションの説明をご参照ください。
mysqlDS.setSslMode("VERIFY_IDENTITY");
//トラストストアは CA 証明書を保存するために使用されます。この例では、トラストストアのタイプは JKS に設定されています。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
//file:/ の後のコンテンツを、実際の 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);
//ご利用の RDS インスタンスへの接続に使用するアカウントのユーザー名。
mysqlDS.setUser("xxxxxx");
//ご利用の RDS インスタンスへの接続に使用するアカウントのパスワード。
mysqlDS.setPassword("xxxxxx");
//ご利用の RDS インスタンスで接続するデータベースの名前。
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}Python
# pip install pymysql コマンドを実行して PyMySQL をインストールします。
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # ca を証明書のパスに、mode を使用する 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)次のステップ
クラウド証明書の更新
RDS インスタンスのクラウド証明書は 1 年間有効です。証明書の有効期限が切れた後にクラウド証明書を更新しないと、暗号化接続を使用するクライアントは RDS インスタンスに接続できなくなります。クラウド証明書の有効期限が近づくと、Alibaba Cloud はメール、または内部メッセージで通知します。
[イベントのスケジュール] ダイアログボックスでクラウド証明書を更新する時間を指定できます。証明書は指定された期間内に自動的に更新されます。詳細については、「スケジュールされたイベントの管理」をご参照ください。証明書を手動で更新するには、次の操作を実行することもできます。
クラウド証明書が自動的に更新された後、暗号化接続を使用するクライアントは、CA 証明書を再度ダウンロードまたは設定しなくてもデータベースに接続できます。
カスタム証明書の更新方法の詳細については、「作成したカスタム証明書の更新」をご参照ください。
MySQL 8.0 を実行している RDS インスタンスの証明書を更新しても、インスタンスは再起動しません。MySQL 5.6 または MySQL 5.7 を実行している RDS インスタンスの証明書を更新すると、インスタンスは再起動します。
[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、対象の RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されたページの [SSL] タブをクリックします。次に、[有効期限の更新] をクリックします。
接続暗号化の詳細の表示
現在のセッションで使用されている暗号スイートを表示します。戻り値が空でない場合、現在の接続は暗号化されています。
SHOW STATUS LIKE 'Ssl_cipher';現在のセッションで使用されている SSL または TLS のバージョンを表示します。
SHOW STATUS LIKE 'Ssl_version';MySQL コマンドラインツールを使用している場合は、
\sコマンドを実行して現在の接続が暗号化されているかどうかを確認できます。現在の接続が暗号化されている場合、コマンド出力の SSL 値は現在の接続で使用されている暗号スイートを示します。
暗号化接続の強制使用
サーバーが暗号化接続のみを使用するように設定する
詳細については、「ステップ 1:RDS インスタンスの SSL 暗号化機能を有効にする」をご参照ください。
クライアントが暗号化接続のみを使用するように設定する
この例では、コマンドラインツールを使用します。接続コマンドで、SSL モードを REQUIRED、VERIFY_CA、または VERIFY_IDENTITY に設定して、暗号化接続のみを使用します。接続を暗号化できない場合、接続の確立は失敗します。
特定のユーザーが暗号化接続のみを使用するように設定する
この例では、testuser ユーザーが暗号化接続のみを使用するように設定されています。
ALTER USER 'testuser'@'%' REQUIRE SSL;CA 証明書の内容の表示
次のコマンドを実行して、CA 証明書の内容を表示します。
openssl x509 -in {CA 証明書へのパス}/ApsaraDB-CA-Chain.pem -textSSL 暗号化機能の無効化
SSL 暗号化機能を無効にすると、RDS インスタンスが再起動します。この場合、システムはプライマリ/セカンダリの切り替えをトリガーして、ワークロードへの影響を軽減します。オフピーク時間に SSL 暗号化機能を無効にすることを推奨します。
[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、対象の RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されたページの [SSL] タブをクリックします。
[SSL 暗号化] をオフにします。表示されるメッセージで、[OK] をクリックします。
よくある質問
機能
サーバーとクライアントの ID を検証する相互認証を実装するにはどうすればよいですか?
ApsaraDB RDS for MySQL では、SSL ハンドシェイク中にクライアント ID を検証することはできません。ホワイトリストとアカウント管理を使用して、アクセスの制御を実装できます。
読み書き分離エンドポイントの SSL 暗号化を設定するにはどうすればよいですか?
詳細については、「データベースプロキシエンドポイントの SSL 暗号化の設定」をご参照ください。