ApsaraDB RDS for MySQL の Secure Sockets Layer (SSL) 暗号化機能は、転送中のデータを暗号化することで、データベース接続のセキュリティを強化し、コンプライアンス要件を満たします。デフォルトでは、ApsaraDB RDS for MySQL インスタンスで SSL 暗号化は無効になっています。本トピックでは、クラウド証明書を使用して SSL 暗号化を有効にする方法について説明します。
前提条件
SSL 暗号化 は、以下の MySQL バージョンでサポートされています:8.4、8.0、5.7、または 5.6。
強制 SSL 暗号化 は、以下の ApsaraDB RDS for MySQL インスタンスバージョンでサポートされています:
MySQL 8.4
マイナーエンジンバージョンが 20241130 以降の MySQL 8.0 または 5.7
この情報は、ご利用のインスタンスの 基本情報 ページで確認できます。
サーバーレスではない Basic Edition インスタンスをサーバーレスインスタンスに変換する場合、SSL 暗号化を再度有効にする必要があります。
上記の要件を満たしている一部のインスタンスで、SSL がサポートされていないことを示すエラーが返される場合があります。その場合は、マイナーエンジンバージョンをスペックアップしてから、再度お試しください。
概要
SSL 暗号化は、ApsaraDB RDS for MySQL インスタンスとクライアント間で転送中のデータを暗号化し、データがモニタリング・傍受・改ざんされることを防止します。
SSL 暗号化を有効にすると、ApsaraDB RDS for MySQL インスタンスへの接続に暗号化接続または非暗号化接続のいずれかを選択できます。強制 SSL 暗号化を有効にすると、クライアントまたはデータベースプロキシから ApsaraDB RDS for MySQL インスタンスへの接続は、SSL 暗号化接続のみ許可されます。
SSL 暗号化を有効にすると、ApsaraDB RDS for MySQL はサーバー証明書および公開鍵/秘密鍵ペアを生成します。
暗号化接続を確立する際、ApsaraDB RDS for MySQL インスタンスは公開鍵を含むサーバー証明書をクライアントに送信します。クライアントはこの公開鍵を使用して対称キーを暗号化します。この対称キーを復号できるのは、秘密鍵を持つ ApsaraDB RDS for MySQL インスタンスのみです。その後、両者はこの対称キーを使用してデータの暗号化および復号を行い、通信の機密性を確保します。中間者攻撃 (MITM) を防ぐため、クライアントは CA 証明書を使用してサーバー証明書を検証し、サーバーの真正性を確認することもできます。
次の表は、ApsaraDB RDS for MySQL インスタンスでサポートされている SSL 暗号化構成を比較したものです。
項目 | ||
方法 | インスタンスにクラウド証明書を設定します。 | 認証局 (CA) によって発行されたもの、または自己署名によるもの。 |
有効期間 | 365 日 | カスタム |
保護対象エンドポイント数 | 1 | 1 |
機能 | SSL 暗号化を有効にし、クライアントがサーバーの真正性を検証できるようにします。 | SSL 暗号化を有効にし、クライアントがサーバーの真正性を検証できるようにします。 |
影響
SSL 暗号化の有効化または無効化は、すべてのバージョンでインスタンスを再起動し、プライマリ/セカンダリ スイッチオーバーをトリガーします。この操作はオフピーク時間帯に実施し、アプリケーションに自動再接続メカニズムが備わっていることを推奨します。インスタンススイッチオーバーの影響の詳細については、「スイッチオーバーの影響」をご参照ください。
証明書を更新する際、MySQL 5.6、5.7、または 8.4 を実行しているインスタンスは再起動されます。MySQL 8.0 を実行しているインスタンスは再起動されません。
SSL 暗号化を有効にすると、暗号化接続の使用により CPU 使用率が大幅に増加します。パブリックエンドポイントに対してのみ暗号化が必要な場合に SSL 暗号化を有効にすることを推奨します。内部エンドポイントは比較的安全であり、通常は暗号化を必要としません。
強制 SSL 暗号化を有効にすると、クライアントまたはデータベースプロキシからの SSL 暗号化接続のみが許可されます。非暗号化接続は拒否されます。
TLS バージョン
Transport Layer Security (TLS) は、インターネット通信のプライバシーとデータ整合性を保証するために広く使用されているプロトコルです。TLS プロトコルには複数のバージョンがあります。次の表は、ApsaraDB RDS for MySQL の各メジャーバージョンでサポートされている TLS バージョンを示しています。
ApsaraDB RDS for MySQL バージョン | TLSv1.0 | TLSv1.1 | TLSv1.2 | TLSv1.3 |
8.4 | サポート対象外 | サポート対象外 | サポート対象 | サポート対象 |
8.0 | サポート対象 | サポート対象 | サポート対象 | サポート対象 (マイナーエンジンバージョン 20221231 以降) |
5.7 | サポート対象 | サポート対象 | サポート対象 | サポート対象外 |
5.6 | サポート対象 | サポート対象 | サポート対象 | サポート対象外 |
TLS 1.0 および TLS 1.1 は、2021 年にインターネット技術特別委員会 (IETF) によって廃止されました (RFC 8996)。セキュリティ上の理由から、安全な通信には TLS 1.2 以降を使用することを推奨します。
デフォルトの ssl_cipher 構成
ApsaraDB RDS for MySQL は、安全な TLS 通信を実現するために OpenSSL を使用しています。MySQL 5.7 のマイナーエンジンバージョン 20230831 および MySQL 8.0 のマイナーエンジンバージョン 20230930 で、ApsaraDB RDS for MySQL は OpenSSL 3.0 にスペックアップされました。デフォルトでは、OpenSSL 3.0 は TLS 1.0 または TLS 1.1 を使用した通信をサポートしていません。詳細については、OpenSSL 公式ドキュメントをご参照ください。
互換性を確保するため、ApsaraDB RDS for MySQL は ssl_cipher パラメーターのデフォルト値を "ALL:@SECLEVEL=0" に調整し、TLS 1.0 および TLS 1.1 のサポートを復元しています。
ワークロードが TLS 1.2 以降のみを使用する場合、より高いセキュリティレベルを実現するために、ApsaraDB RDS コンソールで ssl_cipher パラメーターを "" (空文字列) に設定することを推奨します。
手順 1:SSL 暗号化を有効にする
インスタンス ページに移動します。上部ナビゲーションバーで、RDS インスタンスが配置されているリージョンを選択します。次に、RDS インスタンスを見つけ、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
SSL タブで、無効 の横にあるスイッチをクリックします。
説明SSL タブが表示されない場合は、前提条件 セクションの要件を満たしているかご確認ください。
表示されるダイアログボックスで、SSL 暗号化を有効にするエンドポイントを選択します。
内部エンドポイントまたはパブリックエンドポイントのいずれかを暗号化できますが、選択できるのは 1 つのエンドポイントのみです。
(オプション) 強制 SSL 暗号化を有効にするには、強制暗号化を有効にするかどうか の横にあるスイッチをクリックします。
重要強制 SSL 暗号化を有効にするには、インスタンスが MySQL 8.4 を実行しているか、またはマイナーエンジンバージョンが 20241130 以降の MySQL 8.0 または 5.7 を実行している必要があります。
強制 SSL 暗号化を有効にすると、クライアントまたはデータベースプロキシからの SSL 暗号化接続のみが許可されます。非暗号化接続は拒否されます。
OK をクリックして、SSL 暗号化を有効にします。
処理には約 1 分かかります。手動でページをリフレッシュして、インスタンスステータスを確認できます。
手順 2:CA 証明書をダウンロードする
SSL 暗号化を有効にすると、ApsaraDB RDS for MySQL インスタンスの CA 証明書をダウンロードできます。クライアントはこの証明書を使用して、RDS インスタンスの真正性を検証します。
インスタンス ページに移動します。上部ナビゲーションバーで、RDS インスタンスが配置されているリージョンを選択します。次に、RDS インスタンスを見つけ、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。SSL タブで、CA 証明書のダウンロード をクリックします。
ダウンロードされるファイルは、次の 3 つの CA ファイルを含む圧縮パッケージです:
PEM ファイル:ほとんどのシナリオに適しています。
JKS ファイル:Java アプリケーションに適しています。パスワードは
apsaradbです。通常、PEM 形式の CA 証明書はトラストストアにインポートする必要があるため、Java で使用する前に JKS ファイルに変換する必要があります。p7b ファイル:PKCS #7 証明書ファイルを必要とする一部の Windows アプリケーションに適しています。
手順 3:クライアントから接続する
SSL 暗号化を有効にしても、クライアント接続が暗号化されるかどうかは、クライアントの種類および設定に依存します。たとえば、一部のクライアントはデフォルトで暗号化接続を使用する場合があります。クライアントの設定またはコードを変更して、暗号化接続が確立され、ApsaraDB RDS for MySQL インスタンスの ID が検証されることを保証できます。
強制 SSL 暗号化を有効にした場合、クライアントと ApsaraDB RDS for MySQL インスタンス間の接続は、SSL 暗号化接続のみ許可されます。
CLI
MySQL クライアントバージョン 5.7.11 以降では、接続コマンドに --ssl-mode オプションを追加して、SSL 暗号化を構成できます。
MariaDB クライアントおよび 5.7.11 より前の MySQL クライアントでは、--ssl や --ssl-verify-server-cert などのオプションを使用します。詳細については、MariaDB および MySQL の公式ドキュメントをご参照ください。
--ssl-mode=DISABLED:接続は暗号化されません。--ssl-mode=PREFERREDまたは--ssl-modeオプションを指定しない場合:暗号化接続の確立が試みられます。暗号化接続が確立できない場合は、非暗号化接続が使用されます。--ssl-mode=REQUIRED:暗号化接続が必須です。暗号化接続が確立できない場合は、接続が失敗します。--ssl-mode=VERIFY_CA:暗号化接続が必須であり、クライアントはローカルの CA 証明書を使用してサーバー証明書を検証します。--ssl-mode=VERIFY_IDENTITY:暗号化接続が必須です。クライアントはローカルの CA 証明書を使用してサーバー証明書を検証し、さらにサーバーのホスト名または IP アドレスが証明書に記載されているものと一致するかを検証します。
例 1:暗号化接続の確立を試みます。暗号化接続が確立できない場合は、非暗号化接続を使用します。
mysql -h {RDS_ENDPOINT} -u {RDS_ACCOUNT} -p --ssl-mode=PREFERRED例 2:暗号化接続を必須とし、サーバー証明書を検証します。
mysql -h {RDS_ENDPOINT} -u {RDS_ACCOUNT} -p --ssl-mode=VERIFY_CA --ssl-ca={CA_CERTIFICATE_PATH}/ApsaraDB-CA-Chain.pem上記の例では、{RDS_ENDPOINT}、{RDS_ACCOUNT}、および {CA_CERTIFICATE_PATH} を実際の値に置き換えてください。
--ssl-modeオプションの詳細については、MySQL 公式ドキュメントをご参照ください。
MySQL Workbench
MySQL Workbench を開き、データベース > Manage Connections を選択します。
RDS エンドポイント、ユーザー名、パスワードを入力します。
SSL タブで、Use SSL を設定し、SSL CA File にダウンロードした PEM 形式の CA 証明書を指定してから、Test Connection または ok をクリックします。
Use SSL パラメーターのオプションは、CLI セクションで説明されている --ssl-mode オプションに対応しています。
Data Management (DMS)
Data Management (DMS) で ApsaraDB RDS for MySQL インスタンスを登録する際に、Sslを開く スイッチをオンにできます。詳細については、「Alibaba Cloud データベースインスタンスの登録」をご参照ください。
既存の登録済みインスタンスを右クリックし、インスタンスの編集 を選択してから、Advanced Information タブで設定を構成することもできます。
アプリケーションコード
Java
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");
// ご利用のデータベースエンドポイント
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// ご利用のデータベースポート
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:
# ca: CA 証明書ファイルへのパス。mode: 使用する SSL モード。
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"}
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)その他の操作
クラウド証明書の更新
ApsaraDB RDS for MySQL インスタンスのクラウド証明書の有効期間は 1 年です。証明書の有効期限が切れた後に更新しない場合、暗号化接続を使用するクライアントアプリケーションはインスタンスに接続できなくなります。証明書の有効期限が切れる前に、Alibaba Cloud から メール、およびメッセージセンターのサイト内メッセージを通じて通知が送信されます。
イベントのスケジュール を使用して、ApsaraDB RDS for MySQL インスタンスのクラウド証明書の自動更新時刻をカスタマイズできます。詳細については、「スケジュールイベント」をご参照ください。証明書の有効期間を手動で更新することもできます。
クラウド証明書が自動更新された後、暗号化接続を使用するクライアントアプリケーションは、CA 証明書を再度ダウンロードおよび構成する必要はありません。
カスタム証明書を更新する方法については、「カスタム証明書の更新」をご参照ください。
MySQL 8.0 インスタンスの証明書を更新しても、インスタンスは再起動されません。MySQL 5.6、5.7、または 8.4 インスタンスの証明書を更新すると、インスタンスは再起動されます。
インスタンス ページに移動します。上部ナビゲーションバーで、RDS インスタンスが配置されているリージョンを選択します。次に、RDS インスタンスを見つけ、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
SSL タブをクリックしてから、有効期間の更新 をクリックします。
接続の暗号化状態の確認
現在のセッションで使用されている暗号スイートを確認します。値が返された場合、現在の接続は暗号化されています。
SHOW STATUS LIKE 'Ssl_cipher';現在のセッションで使用されている SSL/TLS バージョンを確認します。
SHOW STATUS LIKE 'Ssl_version';MySQL コマンドラインクライアントを使用している場合、
\sコマンドを実行して、現在の接続が暗号化されているかを確認することもできます。接続が暗号化されている場合、返される SSL 値は現在の暗号スイートを示します。
暗号化接続の強制
サーバーを設定して暗号化接続のみを許可する
この機能はサポートされています。詳細については、「手順 1:ApsaraDB RDS for MySQL インスタンスの 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 -textSSL 暗号化の無効化
SSL 暗号化を無効にすると、RDS インスタンスが再起動されます。影響を軽減するために、システムはプライマリ/セカンダリ スイッチオーバーをトリガーします。ただし、この操作はオフピーク時間帯に実施してください。
インスタンス ページに移動します。上部ナビゲーションバーで、RDS インスタンスが配置されているリージョンを選択します。次に、RDS インスタンスを見つけ、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、セキュリティコントロール をクリックします。
SSL タブをクリックします。
有効 の横にあるスイッチをオフにします。表示されるメッセージで、OK をクリックします。
よくある質問
機能
Q1:双方向認証を実装するにはどうすればよいですか?つまり、サーバーに加えてクライアントも認証する方法です。
A:ApsaraDB RDS for MySQL は、SSL ハンドシェイク中にクライアント認証をサポートしていません。アクセス制御には、許可リストおよびアカウント管理を使用してください。
Q2:読み書き分離エンドポイントを暗号化するにはどうすればよいですか?
A:詳細については、「プロキシ SSL 暗号化の設定」をご参照ください。
Q3:SSL を無効にするにはどうすればよいですか?
A:詳細については、「SSL 暗号化の無効化」をご参照ください。