ApsaraDB RDS for PostgreSQL は、クエリ結果セットの機密カラムを暗号化するための rds_encdb 拡張機能を提供します。データベースアカウントの権限を設定することで、機密カラムをクエリする際に、アカウントが暗号文でのみクエリ結果を表示するように制限できます。
前提条件
RDS インスタンスで PostgreSQL 16 が実行されている。
RDS インスタンスでマイナーエンジンバージョン 20250228 以降が実行されている。
20250228 より前のマイナーエンジンバージョンを実行している RDS インスタンスで rds_encdb 拡張機能を使用するには、インスタンスのマイナーエンジンバージョンを更新します。
シナリオ
rds_encdb 拡張機能は、金融、医療、e コマースなど、機密データを含むクエリ結果を動的に暗号化する必要があるシナリオに適しています。一般的なシナリオは次のとおりです。
動的データ暗号化
コンプライアンス監査
サードパーティ データ共有
この拡張機能により、アプリケーションコードを変更することなく、結果セットによるデータ暗号化が可能になり、クエリの効率とデータプライバシーのバランスが保たれます。
制限事項
rds_encdb 拡張機能は、次のクエリまたは結果セットをサポートしていません。
関数によって返されるクエリ結果セット。
カーソル操作やプリペアドステートメントなどの非 SELECT クエリ。
共通テーブル式 (CTE) または UNION 句を含むクエリ。
rds_encdb 拡張機能をインストールする拡張機能
ホワイトリストに追加されたユーザーのみが、SQL 文を実行して rds_encdb 拡張機能をインストールできます。次の手順を実行して拡張機能をインストールする前に、テクニカルサポートに連絡して、アカウントをホワイトリストに追加してください。
コンソールで、RDS インスタンスの [パラメーター] ページに移動します。 rds_encdb.enable_encryption パラメーターの [実行値] を [オン] に設定します。詳細については、「ApsaraDB RDS for PostgreSQL インスタンスのパラメーターを変更する」をご参照ください。
特権アカウント を使用してデータベースに接続し、次の SQL 文を実行して rds_encdb 拡張機能をインストールします。
CREATE EXTENSION rds_encdb;説明SELECT * FROM pg_extension;を実行して、インストールされている拡張機能を表示できます。
カラム暗号化ルールを設定する
rds_encdb 拡張機能は、暗号化されたカラムをメタデータテーブル rds_encdb.encryption_rule に記録します。カラムを暗号化するには、メタデータテーブルにデータの行を挿入することで、カラムの暗号化ルールを設定できます。これにより、暗号化されたカラムのクエリ結果は暗号文で返されます。暗号化ルールは、設定後、現在のセッションと後続のセッションで有効になります。
次の表は、メタデータテーブル rds_encdb.encryption_rule のスキーマを示しています。暗号化ルールを設定するためにテーブルにデータを挿入する場合は、データがスキーマに準拠していることを確認してください。
カラム名 | タイプ | 説明 |
id | int | テーブルのプライマリキーとして使用される自動インクリメント ID。 |
rule_name | name | カラム暗号化ルール名。 |
attrelid | regclass | 暗号化ルールを設定するカラムを含むテーブル。このパラメーターの値は、rule_name、attrelid、および attnum カラムの一意制約を満たしている必要があります。 |
attnum | smallint | attrelid で指定されたテーブル内の暗号化ルールを設定するカラムの序数。 |
暗号化アルゴリズム
暗号化ルールが設定されたカラムのデータは、AES_256_GCM アルゴリズムを使用して暗号化されます。
例
テストテーブルを作成し、サンプルデータをテーブルに挿入します。
CREATE TABLE test(a text,b text,c text); INSERT INTO test VALUES ('foo','bar','hello world');test テーブルのデータをクエリします。
SELECT * FROM test;プレーンテキストで次の結果が返されます。
a | b | c -----+-----+------------- foo | bar | hello world (1 row)メタデータテーブル rds_encdb.encryption_rule に 2 つの行を挿入して、カラム暗号化ルールを設定します。この例では、設定されたルールは、test テーブルの 1 番目と 2 番目のカラムが暗号化されることを指定しています。
INSERT INTO rds_encdb.encryption_rule VALUES (9, 'rule1', 'test', '1'), (10, 'rule1', 'test', '2');test テーブルのデータをクエリします。
SELECT * FROM test;次の結果が返されます。 test テーブルの 1 番目と 2 番目のカラムの値は暗号文で返されます。
a | b | c ------------------------------------------------------------------+------------------------------------------------------------------+------------- 1yAZAAAACVyTxvBACK5JFw0w/ZU62Yt9btkv9bSN8TcJWOfXCiWVnCqnakSZCwI= | DSAZAAAACaSrnhi0usv3MiJsgRQKXA5xEArdALSdnFVjqD0nrd1s6ilShhw00EM= | hello world (1 row)(オプション) メタデータテーブル rds_encdb.encryption_rule をクエリすることで、設定されたカラム暗号化ルールを表示できます。
SELECT * FROM rds_encdb.encryption_rule;前の手順で設定されたルールを示す次の結果が返されます。
id | rule_name | attrelid | attnum ----+-----------+----------+-------- 9 | rule1 | test | 1 10 | rule1 | test | 2 (2 rows)
rds_encdb 拡張機能は、ルール名とテーブル名に基づいて暗号化ルールを集約形式で表示する rds_encdb.rules というビューを提供します。このビューを使用して、次の文を実行して設定済みの暗号化ルールをクエリできます。
SELECT * FROM rds_encdb.rules;次の結果が返されます。
rule_name | attrelid | attname_list
-----------+----------+--------------
rule1 | test | b,a
(1 row)暗号化されたカラムを表示する権限を設定する
アカウントに フルアクセス 権限または 制限付きアクセス 権限を付与できます。デフォルトでは、アカウントには 制限付きアクセス 権限が付与されます。
権限 | 説明 |
フルアクセス | アカウントが暗号化されたカラムのクエリ結果を プレーンテキストで 表示することを許可します。プレーンテキスト |
制限付きアクセス | 暗号化されたカラムにアクセスするために JDBC ドリブンカラム暗号化ドライバーを使用する 場合を除き、アカウントが暗号化されたカラムのクエリ結果を 暗号文でのみ 表示することを許可します。 |
アカウントに暗号化されたカラムを表示する権限を付与する
SELECT rds_encdb.setup_encryption_role('アカウント名', '権限', '有効期限');アカウントから暗号化されたカラムを表示する権限を取り消す
SELECT rds_encdb.remove_encryption_role('アカウント名');暗号化されたカラムを表示する権限が付与されたアカウントは、メタデータテーブル rds_encdb.setup_encryption_role に記録されます。次の表は、メタデータテーブルのスキーマを示しています。
カラム名 | タイプ | 説明 |
role | regrole | テーブルのプライマリキー。権限が付与されているアカウントの名前です。 |
role_type | char | アカウントに付与される権限。
|
salt | text | アカウント用にランダムに生成されたキー。 EncJDBC を使用して暗号化されたカラムにアクセスする場合、接続が確立された後にクライアントによってキーが自動的に作成されます。 |
expire_time | timestamptz | アカウントに付与された権限の有効期限。元の権限の有効期限が切れると、権限は自動的に 制限付きアクセス に設定されます。 有効期限の形式は |
例
test_user という名前のアカウントにフルアクセス権限を付与します。
SELECT rds_encdb.setup_encryption_role('test_user','FULL ACCESS',now());暗号化されたカラムを表示する権限が付与されているアカウントを表示します。
SELECT * FROM rds_encdb.encryption_role_auth;次の結果が返されます。
role | role_type | salt | expire_time -----------+-----------+------+------------------------------- rds_test | f | | 2025-02-21 06:01:02.509447+00 (1 row)