すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ベストプラクティス

最終更新日:Nov 09, 2025

RDS for MySQL の Confidential Database は、クエリ結果のデータを暗号化およびマスキングします。この保護により、権限のない担当者が保護されたデータのプレーンテキストを表示できなくなります。このトピックでは、EncJDBC クライアントドライバーを使用して RDS for MySQL の Confidential Database 機能を使用および検証する方法について説明します。

前提条件

お使いの RDS for MySQL インスタンスは、MySQL 5.7 または MySQL 8.0 を実行し、マイナーエンジンバージョンが 20240731 以降である必要があります。

説明

マイナーエンジンバージョンがこれより古い場合は、マイナーエンジンバージョンをアップグレードする必要があります。

使用上の注意

  • 設定したマスターキー (MEK) を安全な場所に保管してください。

  • Java 1.8 以降が必要です。

    説明

    このトピックでは、Maven 3.9.5IntelliJ IDEA Community Edition 2023.2.4 を例として使用します。

手順

ステップ 1: インスタンス、データベース、アカウントの作成

  1. 前提条件を満たす RDS for MySQL インスタンスを購入します。詳細については、「RDS for MySQL インスタンスの作成」、「標準プライマリ RDS for MySQL インスタンスのインスタンスタイプ (元の x86 アーキテクチャ)」、および「YiTian プライマリ RDS for MySQL インスタンスのインスタンスタイプ (元の ARM アーキテクチャ)」をご参照ください。

    説明

    前提条件を満たす既存のインスタンスがある場合は、新しいインスタンスを購入する必要はありません。

  2. データベースの特権アカウントを作成します。詳細については、「アカウントの作成」をご参照ください。

  3. データベースを作成します。詳細については、「データベースの管理」をご参照ください。

ステップ 2: Confidential Database 機能を有効にする

  1. RDS インスタンスページに移動します。上部のナビゲーションバーで、インスタンスが存在するリージョンを選択します。次に、インスタンスの ID をクリックします。

  2. Confidential Database 機能を有効にします。

    警告

    Confidential Database 機能を有効にすると、インスタンスが再起動します。この操作はオフピーク時に実行することをお勧めします。

    左側のナビゲーションウィンドウで、[パラメーター] をクリックします。[編集可能パラメーター] タブで `loose_encdb` を検索し、その値を [ON] に設定します。[パラメーターの送信] をクリックし、有効期間を選択してから [OK] をクリックします。

ステップ 3: データ保護ルールを設定する

説明

Confidential Database 機能を有効にし、データ保護ルールを設定するために使用するアカウントは、特権アカウントである必要があります。アプリケーションデータベースロールには、管理者権限のない標準アカウントを作成します。アプリケーションデータベースロールに高レベルの権限を付与しないでください。

  1. 保護するフィールドの決定

    保護するデータを決定します。この例では、アドレス帳の部門名 (department.name)、従業員名 (users.name)、および ID (users.id) が保護データとして指定されています。テーブルスキーマは次のとおりです。

    説明

    テーブルを作成する前に、CREATE DATABASE contact; コマンドを実行して contact データベースを作成します。

    -- 部門テーブル
    CREATE TABLE department (id INTEGER PRIMARY KEY AUTO_INCREMENT, dept_id BIGINT, name TEXT, parentId BIGINT, createDeptGroup BOOL, autoAddUser BOOL, UNIQUE(dept_id));
    -- ユーザーテーブル
    CREATE TABLE users (id varchar(255) PRIMARY KEY, dept_id BIGINT, name TEXT, avatar TEXT);
    
    -- テストデータの挿入
    INSERT INTO department(dept_id, name, parentId, createDeptGroup, autoAddUser) VALUES
     (202301,'dept1',202301,true,true), (202302,'dept2',202301,true,true), (202303,'dept3',202301,true,false);
    INSERT INTO users VALUES
     ('110110181103233433', 202301, 'user1', 'director'),
     ('350110180103038669', 202302, 'user2', 'dept2_user'), ('220110182203032387', 202302, 'user3', 'dept2_user'),
     ('410110182209237752', 202303, 'user4', 'dept3_user'), ('310140181210228325', 202303, 'user5', 'dept3_user');
  2. ルールの設定

    選択したデータに基づいて、データ保護ルールフォーマットに従ってルール内容を編集します。次に、SQL ユーザー定義関数 (UDF) を使用してルールを適用します。詳細については、「データ保護ルールの概要」をご参照ください。

    SELECT encdb_rule_op('add', '[{
                                   "name": "rule-for-contact-name",
                                   "enabled": true,
                                   "meta": {
                                     "databases": ["contact"],
                                     "tables": ["department","users"],
                                     "columns": ["name"]
                                   }
                                  }, {
                                   "name": "rule-for-contact-id",
                                   "enabled": true,
                                   "meta": {
                                     "databases": ["contact"],
                                     "tables": ["users"],
                                     "columns": ["id"]
                                   }
                                  }]');

    この例では、rule-for-contact-name は部門名 (department.name) と従業員名 (users.name) の両方をマークします。rule-for-contact-id ルールは従業員 ID (users.id) をマークします。

  3. ユーザーアクセスの許可

    データベースユーザーがアプリケーションクライアントから復号化されたプレーンテキストデータにアクセスする必要がある場合は、そのユーザーに restrictedAccess 権限を付与します。詳細については、「SQL 文を使用した列暗号化ルールの設定」をご参照ください。

    次のコマンドを実行して、アプリケーションデータベースロールに restrictedAccess 権限を付与します。

    SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser"]}'); 
    説明

    appuser はアプリケーションデータベースロールを指定します。

ステップ 4: クライアント接続を設定する

Confidential Database は、ビジネスコードを変更することなくアプリケーションクライアントからデータベースにアクセスできる接続ドライバーを提供します。次の 2 つの設定ステップを実行するだけで済みます。このセクションでは、EncJDBC を例として使用します。

  1. データベース接続ドライバーを EncJDBC に置き換えます。

  2. データベース接続 URL を更新して、マスターキー (MEK) と暗号化アルゴリズム (ENC_ALGO) を指定します。

Java アプリケーションの場合、次の 2 つの変更を行うだけで済みます。

// ドメイン名 (ホスト名)、ポート、データベース名 (dbname)、ユーザー名、パスワードなどの接続情報を準備します。
// ...
String mek="00112233445566778899aabbccddeeff";
String encAlgo="SM4_128_CTR";

// 1. データベース接続ドライバーを EncJDBC に置き換えます。
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// 2. データベース接続 URL を更新します。マスターキー (MEK) と暗号化アルゴリズム (ENC_ALGO) を指定します。
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s&ENC_ALGO=%s", hostname, port, dbname, mek, encAlgo);

java.sql.Connection connection = java.sql.DriverManager.getConnection(dbUrl, username, password);
// ... クエリを開始 ...

EncJDBC を使用したクライアントの設定方法の詳細については、「EncJDBC」をご参照ください。

ステップ 5: 機能の検証

コマンドラインインターフェイス (CLI) または DMS コンソールで SQL コマンドを実行して、データが暗号化されていることを確認します。

  • 次のコマンドを実行して、アドレス帳の特定の部門に関する情報をクエリします。

    SELECT * FROM contact.department WHERE dept_id = 202302;

    次の結果が返されます。

    image.png

  • 次のコマンドを実行して、特定の部門の従業員に関する情報をクエリします。

    SELECT * FROM contact.users WHERE dept_id = 202302;

    次の結果が返されます。

    image.png

  • 次のコマンドを実行して、従業員情報のあいまい検索を実行します。

    SELECT * FROM contact.users WHERE name LIKE '%1';

    次の結果が返されます。

    image.png

Confidential Database からのクエリ結果は、すべての保護されたデータが暗号化されていることを示しています。

参考資料