ApsaraDB RDS for MySQLの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
RDSインスタンスの [基本情報] ページに移動して、前述の情報を表示できます。
RDS Basic Editionを実行するサーバーレス以外のRDSインスタンスの課金方法をサーバーレスに変更する場合は、SSL暗号化機能を再度有効にする必要があります。
RDSインスタンスが上記の要件を満たしていても、SSL暗号化機能がサポートされていないことを示すエラーメッセージが表示されている場合は、RDSインスタンスのマイナーエンジンバージョンを更新できます。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
説明
SSL暗号化機能を使用して、ApsaraDB RDS for MySQLインスタンスとクライアント間で送信されるデータを暗号化できます。 これにより、データが第三者によって監視、傍受、または改ざんされるのを防ぎます。
SSL暗号化機能を有効にすると、SSL暗号化または非SSL暗号化接続を介してクライアントをRDSインスタンスに接続できます。
RDSインスタンスのSSL暗号化機能を有効にすると、サーバー証明書、公開鍵、および秘密鍵が生成されます。
暗号化された接続が確立されると、システムは、公開鍵を含むサーバ証明書をクライアントに送信する。 クライアントは、受信した公開鍵を用いて、生成した対称鍵を暗号化する。 次に、システムは、秘密鍵を使用して対称鍵を復号化する。 このように、RDSインスタンスとクライアントは対称キーを使用してデータを暗号化および復号化します。 これにより、通信の機密性が確保される。 クライアントは、認証局 (CA) 証明書を使用して、受信したサーバー証明書を検証し、RDSインスタンスのIDを確認し、中間者攻撃を防ぐこともできます。
次の表は、さまざまな証明書間のSSL暗号化設定と利点の比較を示しています。
項目 | ||
取得する方法 | Alibaba Cloudによって発行されました。 | 認証局 (CA) または自己署名証明書から発行されます。 |
有効期間 | 365日。 | カスタマイズ。 |
保護されたエンドポイントの数 | 1 | 1 |
目的 | SSL暗号化を有効にするために使用され、クライアントがサーバーを認証するために使用されます。 | SSL暗号化を有効にするために使用され、クライアントがサーバーを認証するために使用されます。 |
影響
SSL暗号化機能を有効にするか、SSL暗号化機能を無効にするか、SSL証明書を更新すると、RDSインスタンスが再起動され、プライマリ /セカンダリの切り替えがトリガーされます。 オフピーク時に操作を実行することを推奨します。 RDSインスタンスに自動的に再接続するようにアプリケーションが設定されていることを確認します。 アプリケーションのコードを変更して、自動再接続を有効にすることができます。 MySQL 5.6またはMySQL 5.7を実行するRDSインスタンスのSSL証明書を更新すると、RDSインスタンスが再起動します。 MySQL 8.0を実行するRDSインスタンスのSSL証明書を更新しても、RDSインスタンスは再起動されません。 インスタンスの切り替えの影響の詳細については、「インスタンスの切り替えの影響」をご参照ください。
SSL暗号化機能を有効にすると、暗号化された接続によりCPU使用率が大幅に増加します。 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 | 対応 | 対応 | 対応 | 非対応 |
TLSv1.0とTLSv1.1は、2021のインターネットエンジニアリングタスクフォース (IETF) によって廃止されました。 データのセキュリティを確保するため、TLSv1.2以降の使用を推奨します。 詳細については、「RFC 8996」をご参照ください。
ssl_cipherの設定
ApsaraDB RDS for MySQLはOpenSSL for TLSを使用して安全な通信を提供します。 MySQL 5.7とMySQLのマイナーエンジンバージョンを実行するRDSインスタンス、MySQLのマイナーエンジンバージョンを実行するRDSインスタンス、および20230831のマイナーエンジンバージョンを実行するRDSインスタンスに対して、OpenSSL 3.0にアップグレードされ20230930。 デフォルトでは、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暗号化機能を有効にするプロセスが完了するまで約1分待ちます。 ページを更新して、機能のステータスを表示できます。
ステップ2: CA証明書のダウンロード
クラウド証明書を設定すると、RDSインスタンスからサーバーCA証明書がダウンロードされます。 クライアントからRDSインスタンスに接続する場合、サーバーCA証明書を使用してRDSインスタンスを認証できます。
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
表示されるページの左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。 SSLタブで、[CA証明書のダウンロード] をクリックします。
ダウンロードしたファイルは、次のファイルを含むパッケージです。
PEMファイル: ほとんどのシナリオに適しています。
JKSファイル: Javaアプリケーションに適しています。 ほとんどの場合、PEM形式のCA証明書ファイルは、JKSファイルに変換するためにトラストストアにインポートする必要があります。 JKSファイルはJavaアプリケーションで使用できます。 ファイルのパスワードはapsaradbです。
P7Bファイル: PKCS#7形式の証明書ファイルを必要とする少数のWindowsアプリケーションに適しています。
ステップ3: データベースクライアントからRDSインスタンスに接続する
SSL暗号化機能を有効にすると、クライアントのタイプと設定によって、クライアントとRDSインスタンス間の接続を暗号化するかどうかが決まります。 例えば、クライアントからRDSインスタンスへの接続は、デフォルトで暗号化することができる。 クライアントの設定またはコードを変更して、接続の暗号化を有効にし、RDSインスタンスのIDを確認できます。
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 {Endpoint of the RDS instance} -u {Account of the RDS instance} -p --ssl-mode=PREFERRED
例2: 暗号化された接続が必要であり、サーバー証明書の有効性を検証する必要があります。
mysql -h {Endpoint of the RDS instance} -u {Account of the RDS instance} -p --ssl-mode=VERIFY_CA --ssl-ca={Path to the CA certificate}/ApsaraDB-CA-Chain.pem
ビジネス要件に基づいて、RDSインスタンスのエンドポイント、RDSインスタンスのアカウント、およびCA証明書のパスのパラメーターを設定する必要があります。
-- ssl-modeオプションの詳細については、MySQLのドキュメントを参照してください。
MySQLワークベンチ
MySQL Workbenchを起動し、
を選択します。RDSインスタンスへの接続に使用するアカウントのユーザー名とパスワード、およびエンドポイントを入力します。
[SSL] タブで、[SSLの使用] パラメーターを設定し、[SSL CAファイル] パラメーターをダウンロードしたPEM形式のCA証明書に設定し、[接続のテスト] または [OK] をクリックします。
Use SSLパラメーターのオプションの詳細については、このトピックの「CLI」セクションの -- ssl-modeオプションの説明を参照してください。
DMS
RDSインスタンスをデータ管理 (DMS) に登録するときに、[SSLを有効にする] パラメーターを設定できます。 詳細については、「Alibaba Cloudデータベースインスタンスの登録」をご参照ください。
インスタンスを右クリックして [編集] を選択し、[詳細情報] セクションで [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();
//You can specify the sslMode property based on your business requirements. For more information about the options for this property, see the description in the "CLI" section of this topic.
mysqlDS.setSslMode("VERIFY_IDENTITY");
//The truststore is used to store the CA certificate. In this example, the truststore type is set to JKS.
mysqlDS.setTrustCertificateKeyStoreType("JKS");
//You must replace the content following file:/ with the actual path to your ApsaraDB-CA-Chain.jks file.
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
//The password of the downloaded JKS file is fixed as apsaradb.
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
//The endpoint of your RDS instance.
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
//The port number of your RDS instance.
mysqlDS.setPort(3306);
//The username of the account that is used to connect to your RDS instance.
mysqlDS.setUser("xxxxxx");
//The password of the account that is used to connect to your RDS instance.
mysqlDS.setPassword("xxxxxx");
//The name of the database that you want to connect on your RDS instance.
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# Run the pip install pymysql command to install PyMySQL.
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # You must set ca to the path to the certificate and mode to the SSL mode that you use.
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値は、現在の接続で使用されている暗号スイートを示します。
暗号化された接続を強制的に使用
暗号化された接続のみを使用するようにサーバーを構成する
この操作はサポートされていません。
暗号化された接続のみを使用するようにクライアントを構成する
この例では、コマンドラインツールが使用されています。 接続コマンドで、暗号化された接続のみを使用するには、SSLモードをREQUIRED、VERIFY_CA、またはVERIFY_IDENTITYに設定します。 接続を暗号化できない場合、接続は確立されません。
暗号化された接続のみを使用するように特定のユーザーを構成する
この例では、testuserユーザーは暗号化された接続のみを使用するように設定されています。
ALTER USER 'testuser' @ '%' REQUIRE SSL;
CA証明書のコンテンツの表示
次のコマンドを実行して、CA証明書の内容を表示します。
openssl x509 -in {Path to the CA certificate}/ApsaraDB-CA-Chain.pem -text
SSL暗号化機能の無効化
SSL暗号化機能を無効にすると、RDSインスタンスが再起動します。 この場合、システムはプライマリ /セカンダリの切り替えをトリガーして、ワークロードへの影響を軽減します。 オフピーク時にはSSL暗号化機能を無効にすることを推奨します。
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されるページで、[SSL] タブをクリックします。
SSL暗号化をオフにします。 表示されたメッセージボックスで [OK] をクリックします。
よくある質問
機能
サーバーとクライアントのIDを検証する相互認証を実装するにはどうすればよいですか?
ApsaraDB RDS for MySQLでは、SSLハンドシェイク中にクライアントIDを検証できません。 ホワイトリストとアカウント管理を使用して、アクセス制御を実装できます。
読み書き分離エンドポイントのSSL暗号化を設定するにはどうすればよいですか。
詳細については、「データベースプロキシエンドポイントのSSL暗号化の設定」をご参照ください。