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 Enterprise EditionのMySQL 8.0、MySQL 5.7、またはMySQL 5.6
RDSインスタンスの [基本情報] ページに移動して、前述の情報を表示できます。
この機能は、Elastic Compute Service (ECS) またはdockerOnECSに基づいてデプロイされ、RDS Basic Editionを実行する既存のRDSインスタンスではサポートされていません。 この機能は、RDS High-availability Editionを実行するプライマリRDSインスタンスのRDS Basic Editionの読み取り専用RDSインスタンスではサポートされていません。 RDSインスタンスのRDSエディションを変更する場合は、「インスタンス仕様の変更」の手順に従います。
RDS Basic Editionを実行するサーバーレス以外のRDSインスタンスの課金方法をサーバーレスに変更する場合は、SSL暗号化機能を再度有効にする必要があります。
説明
SSL暗号化機能を使用して、ApsaraDB RDS for MySQLインスタンスとクライアント間で送信されるデータを暗号化できます。 これにより、データが第三者によって監視、傍受、または改ざんされるのを防ぎます。
SSL暗号化機能を有効にすると、SSL暗号化または非SSL暗号化接続を介してクライアントをRDSインスタンスに接続できます。
RDSインスタンスのSSL暗号化機能を有効にすると、サーバー証明書、公開鍵、および秘密鍵が生成されます。
暗号化された接続が確立されると、システムは、公開鍵を含むサーバ証明書をクライアントに送信する。 クライアントは、受信した公開鍵を用いて、生成した対称鍵を暗号化する。 次に、システムは、秘密鍵を使用して対称鍵を復号化する。 このように、RDSインスタンスとクライアントは対称キーを使用してデータを暗号化および復号化します。 これにより、通信の機密性が確保される。 クライアントは、認証局 (CA) 証明書を使用して、受信したサーバー証明書を検証し、RDSインスタンスのIDを確認し、中間者攻撃を防ぐこともできます。
影響
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 | 対応 | 対応 | 対応 | 対応 (20221231のマイナーエンジン版から) |
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証明書のダウンロード
CA証明書を使用しない場合は、SSL暗号化機能を使用してRDSインスタンスへの接続を暗号化できます。 CA証明書をダウンロードして使用することを推奨します。 CA証明書を使用して、SSLハンドシェイク中に受信したサーバー証明書を確認できます。 これにより、RDSインスタンスのIDを確認し、man-in-the-middle攻撃を防ぐことができます。
- [インスタンス] ページに移動します。 上部のナビゲーションバーで、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を確認できます。
コマンドラインツール
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ワークベンチ
MySQL Workbenchを起動し、
を選択します。RDSインスタンスへの接続に使用するアカウントのユーザー名とパスワード、およびエンドポイントを入力します。
[SSL] タブで、[SSLの使用] パラメーターを設定し、[SSL CAファイル] パラメーターをダウンロードしたPEM形式のCA証明書に設定し、[接続のテスト] または [OK] をクリックします。
SSLを使用するパラメーターのオプションの詳細については、このトピックの「コマンドラインツール」セクションの -- 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モードを指定する方法の例を次に示します。 sslModeプロパティは、mysql-connector-java 8.0.13からサポートされています。 以前のバージョンを使用する場合は、useSSL、requireSSL、およびverifyServerCertificateプロパティを使用する必要があります。 詳細については、「MySQLドキュメント」をご参照ください。
サンプルコード:
パッケージcom.aliyun.sample;
com.mysql.cj.jdbc.MysqlDataSourceをインポートします。java.sql.Connectionをインポートします。java.sql.SQLExceptionをインポートします。public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS=新しいMysqlDataSource();
// ビジネス要件に基づいてsslModeプロパティを指定できます。 このプロパティのオプションの詳細については、このトピックの「コマンドラインツール」セクションの説明を参照してください。
mysqlDS.setSslMode("VERIFY_IDENTITY");
// トラストストアは、CA証明書を格納するために使用されます。 この例では、トラストストアタイプはJKSに設定されています。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// ファイル: /の次のコンテンツをApsaraDB-CA-Chain.jksファイルへの実際のパスに置き換える必要があります。
mysqlDS.setTrustCertificateKeyStoreUrl("ファイル:/D :\\ ApsaraDB-CA-チェーン \\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 (例外e){
e.printStackTrace();
} 最後に{
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# pip install pymysqlコマンドを実行してPyMySQLをインストールします。
pymysqlのインポート
トライ:
conn = pymysql.connect(host='****** .mysql.rds.aliyuncs.com' 、user='******' 、passwd='******' 、db='*****' 、ssl=True、
ssl_ca='/path/to/path/ApsaraDB-CA-Chain.pem')
cursor = conn.cursor()
cursor.exeかわいい ('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
eとしてpymysql.Errorを除いて:
プリント (e)
次に何をすべきか
サーバー証明書の更新
RDSインスタンスのサーバー証明書は1年間有効です。 証明書の有効期限が切れた後にサーバー証明書を更新しない場合、暗号化された接続を使用するクライアントはRDSインスタンスに接続できません。 サーバー証明書の有効期限が近づいている場合、Alibaba Cloudは 電子メールまたは内部メッセージを送信し、特定の期間内に証明書を自動的に更新します。 [イベントセンター] ページで内部メッセージを表示できます。 [スケジュールイベント] ダイアログボックスで、サーバー証明書の更新時間を指定できます。 詳細については、「スケジュールされたイベントの管理」をご参照ください。 次の操作を実行して、サーバー証明書を手動で更新することもできます。
サーバー証明書が自動的に更新されると、暗号化された接続を使用するクライアントは、CA証明書を再度ダウンロードまたは構成する必要なくデータベースに接続できます。。
MySQL 8.0を実行するRDSインスタンスの証明書を更新しても、インスタンスは再起動しません。 MySQL 5.6またはMySQL 5.7を実行するRDSインスタンスの証明書を更新すると、インスタンスが再起動します。
- [インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されるページで、[SSL] タブをクリックします。 次に、[有効性の更新] をクリックします。
接続暗号化の詳細を表示
現在のセッションで使用されている暗号スイートを表示します。 戻り値が空でない場合、現在の接続は暗号化されます。
「Ssl_暗号」のようなステータスを表示します。
現在のセッションで使用されているSSLまたはTLSのバージョンを表示します。
「Ssl_バージョン」のようなステータスを表示します。
MySQLコマンドラインツールを使用する場合は、
\s
コマンドを実行して、現在の接続が暗号化されているかどうかを確認できます。 現在の接続が暗号化されている場合、コマンド出力のSSL値は、現在の接続で使用されている暗号スイートを示します。
暗号化された接続を強制的に使用
暗号化された接続のみを使用するようにサーバーを構成する
この操作はサポートされていません。
暗号化された接続のみを使用するようにクライアントを構成する
この例では、コマンドラインツールが使用されています。 接続コマンドで、暗号化された接続のみを使用するには、SSLモードをREQUIRED、VERIFY_CA、またはVERIFY_IDENTITYに設定します。 接続を暗号化できない場合、接続は確立されません。
暗号化された接続のみを使用するように特定のユーザーを構成する
この例では、testuserユーザーは暗号化された接続のみを使用するように設定されています。
ALTER USER 'testuser' @ '%' REQUIRE SSL;
CA証明書のコンテンツの表示
次のコマンドを実行して、CA証明書の内容を表示します。
openssl x509 -in {CA証明書へのパス}/ApsaraDB-CA-Chain.pemテキスト
SSL暗号化機能の無効化
SSL暗号化機能を無効にすると、RDSインスタンスが再起動します。 この場合、システムはプライマリ /セカンダリの切り替えをトリガーして、ワークロードへの影響を軽減します。 オフピーク時にはSSL暗号化機能を無効にすることを推奨します。
- [インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
表示されるページで、[SSL] タブをクリックします。
SSL暗号化をオフにします。 表示されるメッセージで、[OK] をクリックします。
よくある質問
機能
サーバーとクライアントのIDを検証する相互認証を実装するにはどうすればよいですか?
ApsaraDB RDS for MySQLでは、SSLハンドシェイク中にクライアントIDを検証できません。 ホワイトリストとアカウント管理を使用して、アクセス制御を実装できます。
読み書き分離エンドポイントのSSL暗号化を設定するにはどうすればよいですか。
詳細については、「データベースプロキシエンドポイントのSSL暗号化の設定」をご参照ください。