常に機密性の高いデータベースクラスターでは、異なるユーザーの暗号文データが自動的に分離されます。 動作制御リスト (BCL) を発行して、マルチパーティデータ統合およびコンピューティングの暗号文データに対するアクセス許可を付与できます。
前提条件
常に機密データベース機能が有効になり、PolarDBインスタンスに対して設定されます。 詳細については、常に機密のデータベース機能を有効にする、機密データの定義、およびクライアントから常に機密のデータベース機能を使用するをご参照ください。
PolarDB for PostgreSQL クラスターのマイナーバージョンが20231030 (14.9.14.0) 以降であることを確認してください。
参加者の証明書の証明書と秘密鍵 (データ所有者と申請者) が取得されます。
背景情報
常時機密データベースでは、ユーザーデータはユーザーのデータ暗号化キー (DEK) を使用して暗号化されます。 異なるユーザーの暗号文データは自動的に分離されます。 共同クエリに複数のユーザーのデータを使用する場合は、BCLを使用して、共同クエリの参加者にアクセス許可を付与できます。 承認後、参加者は、安全な方法で他の参加者のデータを照会することができます。
シナリオ
データプラットフォームは、年齢ごとにユーザープロファイルデータを収集し、データプラットフォーム専用のDEKを使用してテーブル内の機密データ列を暗号化し、そのデータをPolarDBインスタンス上の常に機密のデータベースに格納します。 DEKは、データプラットフォーム専用です。 第三者が認可されていない場合、第三者は暗号文データのみを見ることができます。 第三者は、ユーザプロファイルデータを使用することができない。
第三者は、広告アプリケーションのための適切なユーザグループを識別するのを助けるためにユーザプロファイルデータを使用することを望みます。 このように、広告アプリケーションは、30歳未満のユーザなどの特定のユーザグループに広告をプッシュすることができます。 第三者は、認可アプリケーションインターフェースを呼び出し、データプラットフォームからのユーザプロファイルデータを使用する許可を申請するためにBCL認可アプリケーションを提出する必要がある。 サードパーティは、BCL承認アプリケーションで詳細を指定する必要があります。 データプラットフォームがアプリケーションを承認すると、BCL認証が発行されます。 必要な許可が付与された後、広告アプリケーションは、ユーザプロファイルデータを照会し、必要なユーザグループに関する情報を取得し、次いで、必要なユーザグループに広告をプッシュすることができます。
この例では、広告アプリケーションは、BCLによって指定された許可された範囲内でのみユーザプロファイルデータを使用することができ、最終結果のみを照会することができます。 中間データは、広告アプリケーションには利用できない。
手順
必要なコマンドを実行して、参加者のアプリケーションコードで証明書の公開鍵を初期化します。
// The private key of the participant certificate. String userPriPemString = "*****"; // The public key of the participant certificate. String userPukPemString = "*****"; // Key initialization. The keys need to be initialized only once. KeyManager km = sdk.getKeyManager(); km.registerCertificate(userPriPemString, userPukPemString);承認コンテンツを定義します。
String bclBodyJsonString = """{ "version": 1, "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8", "issuer_pukid": "dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=", "subject_pukid": "+Gg4vXehPt9BWlCPdR83wKDn6E1b/XddNhKQ5mVbKVQ=", "validity": { "not_after": "20220820111111+0800", "not_before": "20230820111111+0800" }, "policies": { "issuer_dek_group": [ { "min": 1, "max": 100000, "groupid": "b6785611-0c49-4f13-87a9-13f151de9b4d" } ], "result_dek": "SUBJECT", "subject_dek_group": [ { "min": 1, "max": 100000, "groupid": "5e19cfa7-c001-4e44-acab-2e5de4b97dcb" } ], "operation": [ "*" ], "postproc": "NULL", "preproc": "NULL" } }""";次の表に、上記の構文のパラメーターを示します。
パラメーター
例
説明
version
1
バージョン番号。 値を1に設定します。
serial_num
「a121bac0-5cb3-4463-a2b2-1155ff29f4c8」
UUID形式の一意のランダムなシリアル番号。
issuer_pukid
"dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo="
データ所有者の証明書の拇印。
証明書の拇印を取得するには、次の手順を実行します。
証明書の内容のハッシュ値を計算します。
説明デフォルトでは、
SHA 256の暗号化アルゴリズムが使用されます。 他の暗号化アルゴリズムを指定できます。次の例は、----- BEGIN certificate ----- および ----- END CERTIFICATE ----- を含む証明書の内容を示しています。
-----BEGIN CERTIFICATE----- dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo= -----END CERTIFICATE-----
Base64でハッシュ値をエンコードします。
このパラメーターをBase64-encoded文字列に設定します。
subject_pukid
"+ Gg4vXehPt9BWlCPdR83wKDn6E1b/XddNhKQ5mVbKVQ="
申請者の証明書の拇印。 このパラメーターは、issuer_pukidパラメーターの設定と同じ方法で設定できます。
妥当性
{"not_before": "20220820111111 + 0800", "not_after": "20230820111111 + 0800"}
承認の有効期間。 値はGeneralizedTime時間形式である必要があります。
"not_before": 有効期間の始まり。
"not_after": 有効期間の終了。
ポリシー
issuer_dek_group
[ { "min": 1, "max": 100000, "groupid": "b6785611-0c49-4f13-87a9-13f151de9b4d" }]
データ所有者によって許可されているDEKのグループ。
"groupid": DEKグループのID
"min": グループ内の最小のDEK ID
"max": グループ内で最大のDEK ID
説明groupidおよびdekidフィールドの値を取得するには、SELECT encdb_get_cc_entry_by_name(<keyname>); ステートメントを実行します。 申請者がアクセス権限を持つ列にkeynameパラメーターを設定する必要があります。
subject_dek_group
[ { "min": 1, "max": 100000, "groupid": "5e19cfa7-c001-4e44-acab-2e5de4b97dcb" }]
申請者によって許可されているDEKのグループ。
"groupid": DEKグループのID
"min": グループ内の最小のDEK ID
"max": グループ内で最大のDEK ID
説明groupidおよびdekidフィールドの値を取得するには、SELECT encdb_get_cc_entry_by_name(<keyname>); ステートメントを実行します。 申請者がアクセス権限を持つ列にkeynameパラメーターを設定する必要があります。
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 = false; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);データ所有者はアプリケーションを承認し、BCL認証を発行します。
boolean isIssuer = true; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPriPemString, isIssuer);(オプション) データ所有者が承認を取り消す必要がある場合は、次の操作を実行します。
取り消される権限を定義します。
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, userPriPemString);