ApsaraDB RDS for PostgreSQLインスタンスの常時機密データベース機能を有効にすると、RDSインスタンス上のさまざまなユーザーの暗号文データが自動的に分離されます。 このトピックでは、マルチユーザーデータの統合コンピューティングを実装するためのアクセス許可を管理する方法と、データベース管理者 (DBA) にリスクの高いデータ操作を実行する権限を付与する方法について説明します。
説明
常時機密データベースでは、ユーザーデータはユーザーのデータ暗号化キー (DEK) を使用して暗号化されます。 異なるユーザーの暗号文データは自動的に分離されます。 共同クエリに複数のユーザーからのデータが含まれる場合、データ所有者は、データ所有者の暗号文データにアクセスするために、データをクエリするサブジェクトに権限を付与する必要があります。 このプロセスは、マルチユーザ認証管理と呼ばれる。
常時機密データベースでは、動作制御リスト (BCL) を使用して、マルチユーザーデータに対するアクセス許可を付与できます。 BCLが発行された後、サブジェクトは、データを所有する発行者のデータコンテンツを理解する必要なく、共同クエリを実行できます。 発行者は、データ漏洩について心配する必要はなく、BCLを発行または無効にして、サブジェクトの行動を制限することができる。 これにより、データが予期せず使用されることを迅速かつ効果的に防ぎます。
カスタムキーを作成したり、平文と暗号文の間でデータを変換したりするなど、常に機密性の高いデータベースに対してリスクの高い操作をDBAに許可する場合は、BCLを発行できます。 このように、DBAはアカウントを使用して関連する操作を実行できます。 この場合、サブジェクトと発行者は同じアカウントを使用します。
前提条件
常に機密のデータベース機能が有効になります。 詳細については、「常に機密のデータベース機能の有効化」をご参照ください。
説明RDSインスタンスのマイナーエンジンバージョンが20230830以降です。 RDSインスタンスのマイナーエンジンバージョンを更新する方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
アカウントは、サブジェクトと発行者に対して別々に作成されます。 詳細については、「アカウントの作成」をご参照ください。
機密データが定義される。 詳細については、「機密データの定義」をご参照ください。
EncDB SDKは、サブジェクトと発行者が必要なデータベースに別々にログオンし、データベースにテストデータを構築するために使用します。 詳細については、「クライアントから常に機密のデータベース機能を使用する」をご参照ください。
ステップ1: 公開鍵と秘密鍵の初期化
OpenSSLをインストールします。
このトピックでは、オープンソースの暗号化ツールキットであるOpenSSLを使用して、公開鍵と秘密鍵を取得します。 LinuxオペレーティングシステムにはOpenSSLが提供されます。 Linuxオペレーティングシステムを使用している場合は、OpenSSLをインストールする必要はありません。 Windowsオペレーティングシステムを使用する場合は、OpenSSLソフトウェアパッケージをダウンロードしてOpenSSLをインストールする必要があります。 詳細については、「Win32/Win64 OpenSSL」をご参照ください。
説明常時機密データベース (基本版) 機能が有効になっているRDSインスタンスを使用する場合は、SM2アルゴリズムを使用して公開鍵と秘密鍵を生成する必要があります。
openssl ecparam -list_curves
コマンドを実行して、SM2アルゴリズムが現在のOpenSSLバージョンでサポートされているかどうかを確認できます。 常時機密データベース (基本版) 機能が有効になっているRDSインスタンスは、非Intel SGXベースのセキュリティ強化インスタンスタイプを使用するRDSインスタンスです。 SM2がコマンド出力に含まれている場合、SM2アルゴリズムがサポートされます。 SM2がコマンド出力に含まれていない場合は、OpenSSLをSM2アルゴリズムをサポートするバージョンにアップグレードする必要があります。 OpenSSLをV1.1.1以降にアップグレードできます。常時機密データベース機能が有効になっているRDSインスタンスのインスタンスタイプに基づいて、サブジェクトと発行者の公開鍵と秘密鍵を取得します。
2つのキーファイルが生成される。
pub_key.pem
ファイルは公開鍵ファイルです。pri_key_pkcs8.pem
ファイルは秘密鍵ファイルです。常に機密性の高いデータベース機能のハードウェア拡張版 (Intel SGXベース)
常時機密データベース (ハードウェア拡張エディション) 機能が有効になっているRDSインスタンスは、Intel SGXベースのセキュリティ拡張インスタンスタイプを使用するRDSインスタンスです。 詳細については、「プライマリApsaraDB RDS For PostgreSQLインスタンスのインスタンスタイプ」をご参照ください。
次の操作を実行して、公開鍵と秘密鍵を取得できます。
OpenSSLを使用して、RSA (Rivest-Shamir-Adleman) 秘密鍵を生成します。
openssl genpkey -algorithm RSA -out pri_key_pkcs8.pem -pkeyopt rsa_keygen_bits:3072
説明3072: キーの長さ。 キーの長さは、ビジネス要件に基づいてセキュリティ標準に準拠した別の値に変更できます。
OpenSSLを使用してRSA公開鍵を生成します。
openssl rsa -in pri_key_pkcs8.pem -pubout -out pub_key.pem
常に機密性の高いデータベース機能の基本版
常時機密データベース (基本版) 機能が有効になっているRDSインスタンスは、非Intel SGXベースのセキュリティ強化インスタンスタイプを使用するRDSインスタンスです。 詳細については、「プライマリApsaraDB RDS For PostgreSQLインスタンスのインスタンスタイプ」をご参照ください。
次の操作を実行して、公開鍵と秘密鍵を取得できます。
OpenSSLを使用してSM2プライベートキーを生成します。
# Generate a private key in the Public-Key Cryptography Standards (PKCS)#1 format. openssl ecparam -out ec_param.pem -name SM2 -param_enc explicit -genkey # Convert the private key into the PKCS#8 format. openssl pkcs8 -topk8 -inform PEM -in ec_param.pem -outform pem -nocrypt -out pri_key_pkcs8.pem
OpenSSLを使用してSM2公開キーを生成します。
openssl ec -in ec_param.pem -pubout -out pub_key.pem
サブジェクトと発行者の公開鍵と秘密鍵を別々に初期化します。
ビジネスコードでサブジェクトと発行者の公開鍵と秘密鍵を初期化します。
説明OpenSSLを使用して生成されたPEMファイルに新ラインが自動的に追加されます。 特定のエディタでは、改行の表示を最適化することができる。 その結果、PEMファイルのコンテンツを手動でコピーすると、改行が省略されます。 データの正確性を確保するために、プログラムコードを使用してPEMファイルの内容を読み取ることを推奨します。
//The private keys of the subject and the issuer. String userPrkPemString = readPemFile("path/to/pri_key_pkcs8.pem"); //The public keys of the subject and the issuer. String userPukPemString = readPemFile("path/to/pub_key.pem"); //Key initialization. The keys need to be initialized only once. KeyManager km = sdk.getKeyManager(); km.registerCertificate(userPrkPemString, userPukPemString);
手順2: マルチユーザーデータに対するアクセス許可の付与
承認コンテンツを定義します。
String bclBodyJsonString = """{ "version": 1, "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8", "issuer_pukid": "p81x+WqYb7BR0yP0LK0qiEaxgLDqwuIjfJhgC0mMJcE=", "subject_pukid": "qIPPfgTJEEG/9WkjP0E5LLAijZ14h/Qgb2EfmBZCWSo=", "validity": { "not_after": "20250820111111+0800", "not_before": "20240820111111+0800" }, "policies": { "issuer_dek_group": [ { "min": 1, "max": 100000, "groupid": "5bc60759-5b05-45ec-afc1-ffca1229e554" } ], "result_dek": "SUBJECT", "subject_dek_group": [ { "min": 1, "max": 100000, "groupid": "53413af9-f90a-48a9-93b6-49847861b823" } ], "operation": [ "*" ], "postproc": "NULL", "preproc": "NULL" } } """;
パラメーターの説明
パラメーター
値の例
説明
version
1
バージョン番号。 値を1に設定します。
serial_num
「a121bac0-5cb3-4463-a2b2-1155ff29f4c8」
UUID形式の一意のランダムなシリアル番号。
説明UUID生成ツールを使用してシリアル番号を生成できます。
issuer_pukid
"p81x + WqYb7BR0yP0LK0qiEaxgLDqwuIjfJhgC0mMJcE="
発行者の公開鍵ダイジェスト。 次のコードを実行すると、常時機密データベース機能のエディションと生成された公開鍵ファイルpub_key.pemに基づいて公開鍵ダイジェストを取得できます。
ハードウェア拡張エディション (インテルSGXベース)
openssl sha256-バイナリpub_key.pem | openssl base64
ベーシックエディション
openssl sm3-バイナリpub_key.pem | openssl base64
subject_pukid
"qIPPfgTJEEG/9WkjP0E5LLAijZ1 4h/Qgb2EfmBZCWSo="
サブジェクトの公開鍵ダイジェスト。 このパラメーターは、issuer_pukidパラメーターの設定と同じ方法で設定できます。
妥当性
{"not_before": "20240820111111 + 0800", "not_after": "20250820111111 + 0800"}
承認の有効期間。 値はGeneralizedTime時間形式である必要があります。
"not_before": 有効期間の始まり。
"not_after": 有効期間の終了。
ポリシー
issuer_dek_group
[ { "min": 1, "max": 100000, "groupid": "5bc60759-5b05-45ec-afc1-ffca1229e554" }]
発行者によって許可されているDECsのグループ。
"groupid": DEKグループのID
"min": DEKグループ内の最小のDEK ID
"max": DEKグループで最大のDEK ID
説明DEKグループでは、DEK IDの値は単調に増加しなければならない。
groupidパラメーターの値を取得するには、次のコードを実行します。
SELECT encdb_get_cc_entry_by_name(encdb.keyname_generate('<user_name>' 、'<database_name>' 、'<schema_name>' 、'<table_name>' 、'<column_name>'));
説明<user_name>
: 発行者のユーザー名<table_name>
: 発行者がサブジェクトにアクセスを許可するテーブルの名前<column_name>
: 発行者がサブジェクトにアクセスを許可する列の名前
subject_dek_group
[ { "min": 1, "max": 100000, "groupid": "53413af9-f90a-48a9-93b6-49847861b823" }]
サブジェクトがアクセスを許可されているDEKグループ。
"groupid": DEKグループのID
"min": DEKグループ内の最小のDEK ID
"max": DEKグループで最大のDEK ID
説明DEKグループでは、DEK IDの値は単調に増加しなければならない。
groupidパラメーターの値を取得するには、次のコードを実行します。
SELECT encdb_get_cc_entry_by_name(encdb.keyname_generate('<user_name>' 、'<database_name>' 、'<schema_name>' 、'<table_name>' 、'<column_name>'));
説明<user_name>
: サブジェクトのユーザー名<table_name>
: サブジェクトがアクセスを許可されているテーブルの名前。<column_name>
: サブジェクトがアクセスを許可されている列の名前。
result_dek
"件名"
計算結果の暗号化に使用されるDEK。
"SUBJECT": 現在の計算でサブジェクトのDEKを使用します。
"ISSUER": 現在の計算で発行者のDEKを使用します。
DEK ID: 指定されたDEK IDを持つDEKを使用します。
重要特定のDEKを使用する場合は、このパラメーターを
DEKのID
に設定します。 DEK IDを二重引用符 ("") で囲む必要なく、DEK IDを直接指定できます。
operation
[ "*"]
許可された計算操作。
"encrypt": 暗号化
"decrypt": 解読
"cmp": 比較
"*": すべての操作
postproc
"NULL"
計算の前の前処理操作。 値をNULLに設定します。これは、前処理操作が必要ないことを指定します。
preproc
"NULL"
計算後の後処理操作。 値をNULLに設定します。これは、後処理操作が不要であることを指定します。
マルチユーザーデータに対するアクセス権限の付与
発行者は、その公開鍵および秘密鍵を使用してBCLを発行し、許可された列のデータにアクセスすることを主体に許可する。
boolean isIssuer = true; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPrkPemString, isIssuer);
サブジェクトは、公開鍵と秘密鍵を使用してBCLを発行し、許可されたデータにアクセスします。
boolean isIssuer = false; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPrkPemString, isIssuer);
(オプション) 手順3: 承認の取り消し
発行者が承認を取り消す場合は、次の操作を実行します。
取り消される権限を定義します。
String brlBodyJsonString = """{ "version": 1, "pukid": "dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=", "this_update": "20220819111128+0800", "next_update": "20220919111128+0800", "revoked": [ { "revocation_date": "20220819111128+0800", "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8" } ] } """;
パラメーターの説明
パラメーター
値の例
説明
version
1
バージョン番号。 値を1に設定します。
pukid
"dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo="
発行者の公開鍵ダイジェスト。 BCL認可アプリケーションの発行者の公開鍵ダイジェストに値を設定します。 このパラメーターは、「権限付与コンテンツの定義」で説明したパラメーターと同じ方法で設定できます。
this_update
"20220819111128 + 0800"
失効リストが更新される時点。 値はGeneralizedTime時間形式である必要があります。
next_update
"20220919111128 + 0800"
失効リストの次の更新時刻。 値はGeneralizedTime時間形式である必要があります。
取り消された
revocation_date
"20220819111128 + 0800"
承認が取り消された時点。 値はGeneralizedTime時間形式である必要があります。
serial_num
「a121bac0-5cb3-4463-a2b2-1155ff29f4c8」
UUID形式のシリアル番号。 このパラメーターは、BCL認証アプリケーションで指定されたシリアル番号に設定する必要があります。
発行者は失効を承認し発行する。
brlBodyJsonString = km.revokeBCL(brlBodyJsonString, userPukPemString, userPrkPemString);
シナリオ
シナリオ1: リスクの高い操作: 平文と暗号文の間のデータ変換
データを移行せずに既存の平文データベースに対して常に機密性のデータベース機能を有効にする場合は、データベース上の平文データを暗号文データに直接変換できます。 詳細については、「平文と暗号文の間のデータ変換」をご参照ください。 デフォルトでは、DBAを含むユーザーは、常に機密のデータベースで平文と暗号文の間のデータ変換を実行できません。これは、この操作がリスクの高い操作と見なされるためです。
データのセキュリティリスクを理解して認識した場合は、BCLを発行して、必要なユーザーに、常に機密性の高いデータベースの平文と暗号文の間でデータを直接変換することを許可できます。 この場合、サブジェクトと発行者は同じアカウントを使用します。
BCLのコンテンツを定義する場合、
issuer_pukid
パラメーターをsubject_pukid
パラメーターと同じ値に設定し、issuer_dek_group
パラメーターをsubject_dek_group
パラメーターと同じ値に設定する必要があります。 詳細については、「権限付与コンテンツの定義」をご参照ください。公開鍵と秘密鍵を初期化すると、サブジェクトと発行者は同じ公開鍵と秘密鍵を使用します。 公開鍵は
userPukPemString
パラメーターで指定され、秘密鍵はuserPrkPemString
パラメーターで指定されます。 発行者のuserPukPemStringおよびuserPrkPemStringパラメーターの値は、サブジェクトの値と同じです。 詳細については、「公開鍵と秘密鍵の初期化」をご参照ください。
BCLを発行した後、許可されたアカウントを使用して必要な操作を実行できます。 サンプルコード:
シナリオ2: マルチユーザーデータの共同クエリ
たとえば、データプラットフォーム会社は、データプラットフォームを使用してユーザーデータを収集し、ユーザープロファイルを生成するために必要な許可を取得します。 次いで、データプラットフォーム会社は、保険会社などの第三者が、マルチパーティデータ統合およびコンピューティングのためにデータを使用することを許可する。 これは共同マーケティングの実装に役立ちます。 詳細については、「マルチパーティデータ統合とコンピューティング」をご参照ください。
次のコードは、共同クエリの実行方法の例を示しています。