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.5とIntelliJ IDEA Community Edition 2023.2.4を例として使用します。
手順
ステップ 1: インスタンス、データベース、アカウントの作成
前提条件を満たす RDS for MySQL インスタンスを購入します。詳細については、「RDS for MySQL インスタンスの作成」、「標準プライマリ RDS for MySQL インスタンスのインスタンスタイプ (元の x86 アーキテクチャ)」、および「YiTian プライマリ RDS for MySQL インスタンスのインスタンスタイプ (元の ARM アーキテクチャ)」をご参照ください。
説明前提条件を満たす既存のインスタンスがある場合は、新しいインスタンスを購入する必要はありません。
データベースの特権アカウントを作成します。詳細については、「アカウントの作成」をご参照ください。
データベースを作成します。詳細については、「データベースの管理」をご参照ください。
ステップ 2: Confidential Database 機能を有効にする
RDS インスタンスページに移動します。上部のナビゲーションバーで、インスタンスが存在するリージョンを選択します。次に、インスタンスの ID をクリックします。
Confidential Database 機能を有効にします。
警告Confidential Database 機能を有効にすると、インスタンスが再起動します。この操作はオフピーク時に実行することをお勧めします。
左側のナビゲーションウィンドウで、[パラメーター] をクリックします。[編集可能パラメーター] タブで `loose_encdb` を検索し、その値を [ON] に設定します。[パラメーターの送信] をクリックし、有効期間を選択してから [OK] をクリックします。
ステップ 3: データ保護ルールを設定する
Confidential Database 機能を有効にし、データ保護ルールを設定するために使用するアカウントは、特権アカウントである必要があります。アプリケーションデータベースロールには、管理者権限のない標準アカウントを作成します。アプリケーションデータベースロールに高レベルの権限を付与しないでください。
保護するフィールドの決定
保護するデータを決定します。この例では、アドレス帳の部門名 (
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');ルールの設定
選択したデータに基づいて、データ保護ルールフォーマットに従ってルール内容を編集します。次に、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) をマークします。ユーザーアクセスの許可
データベースユーザーがアプリケーションクライアントから復号化されたプレーンテキストデータにアクセスする必要がある場合は、そのユーザーに
restrictedAccess権限を付与します。詳細については、「SQL 文を使用した列暗号化ルールの設定」をご参照ください。次のコマンドを実行して、アプリケーションデータベースロールに restrictedAccess 権限を付与します。
SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser"]}');説明appuserはアプリケーションデータベースロールを指定します。
ステップ 4: クライアント接続を設定する
Confidential Database は、ビジネスコードを変更することなくアプリケーションクライアントからデータベースにアクセスできる接続ドライバーを提供します。次の 2 つの設定ステップを実行するだけで済みます。このセクションでは、EncJDBC を例として使用します。
データベース接続ドライバーを
EncJDBCに置き換えます。データベース接続 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;次の結果が返されます。

次のコマンドを実行して、特定の部門の従業員に関する情報をクエリします。
SELECT * FROM contact.users WHERE dept_id = 202302;次の結果が返されます。

次のコマンドを実行して、従業員情報のあいまい検索を実行します。
SELECT * FROM contact.users WHERE name LIKE '%1';次の結果が返されます。

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