完全に暗号化されたデータベース機能を使用して、プライバシーデータを保護し、プライバシーデータの漏洩を防ぎます。 このトピックでは、完全暗号化データベース機能を使用したプライバシーデータ保護のベストプラクティスについて説明します。
シナリオ
保険会社は、個人という名前の保険契約者情報テーブルに格納されているプライバシーデータを保護したいと考えています。 次の表は一例です。
名前 (名前) | 電話番号 (電話) | IDカード番号 (ID) | 銀行カード番号 (debit_card) | アドレス (アドレス) |
Xiaobao TAO | 13900001111 | 111222190002309999 | 6225888888888888 | No. 888、ABCの道、杭州、浙江 |
Sanduo DING | 13900002222 | 111222190002308888 | 6225666666666666 | No. 666, DEF Road, 杭州, 浙江省 |
前の表のデータは参照用です。
保険契約者に関する機密情報は、情報が保険契約者のモバイルデバイスから送信された後、保護のためにデータ部門によって暗号化されます。 営業部門の担当者、関連するアプリケーションのユーザー、およびデータベースのユーザーは、暗号文データのみを表示できます。 これにより、プライバシーデータの漏洩が防止される。
保険契約者は、保険会社のモバイルアプリを使用してデータを暗号化し、個人情報を書き込みまたは更新できます。
保険会社の営業部門は、データベースに接続してデータを照会できます。 ただし、営業部門は暗号文データのみを表示でき、平文データは表示できません。
前提条件
完全暗号化データベース機能の使用方法を理解しています。 詳細については、「概要」をご参照ください。
完全暗号化データベース機能用に提供されているクライアントSDKまたはJava Database Connectivity (JDBC) がダウンロードされ、インストールされます。 詳細については、「Intel SGXベースのセキュリティ強化されたApsaraDB RDS For PostgreSQLインスタンスでの完全暗号化データベース機能の設定」をご参照ください。
EncDB拡張子がダウンロードされました。 この拡張機能は、マスター暗号化キー (MEK) のインポート、証明書または公開キーと秘密キーのペアの登録、および動作制御リスト (BCL) の発行と取り消しに使用されます。
EncDB拡張機能は、設定されたパラメーターに基づいてデータベースで実行できるSQL文を生成します。 EncDB拡張パッケージをダウンロードして解凍した後、
を実行できます。/genEncdbSQLCommand.sh -- ヘルプ
コマンドは、詳細を表示します。説明BCLの詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのマルチユーザーデータに対するアクセス許可の付与」をご参照ください。
準備
次の例では、CentOSオペレーティングシステムを使用してコマンドを実行します。
暗号スイートを設定します。
暗号スイートの変数を設定します。
cipher_suite=RSA_WITH_AES_128_CBC_SHA256
ファイルテンプレートを生成します。
説明この例では、次のコマンドを実行して、ファイルテンプレートに基づいてサンプルディレクトリに構成ファイルを生成できます。 生成された構成ファイル (キーファイルや認証ファイルなど) は、後で使用するために必要です。
. /generateSampleKeyAndBCLs.sh -c ${cipher_suite}
データベースを初期化します。
データベースを作成します。
CREATE DATABASEデモ;
説明この例では、
demo
という名前のデータベースが作成されます。 ビジネス要件に基づいてデータベースを作成できます。 後続のコマンドでは、実際のデータベース名を使用する必要があります。作成されたデータベースの完全暗号化データベース機能に必要な拡張機能を作成します。
拡張encdbを作成します。
データベースの公開鍵証明書を取得し、証明書の内容をローカルファイルに追加します。
SELECTエンコード (db_process_msg_api('{"request_type":0,"version":"1.2.8"}')) 、'escape')::json->'server_info'->'public_key'
説明この例では、ローカルファイルdefault_enclave_public_key.pemが使用されています。 ビジネス要件に基づいてファイル名を変更できます。 後続のコマンドでは、実際のファイル名を使用する必要があります。
公開鍵証明書の内容が二重引用符 (
"
) で始まり、終わる場合は、ローカルファイルに二重引用符を追加する必要はありません。
公開鍵証明書の形式を標準形式に変換します。
次のコマンドを実行して、
\\n
を改行\n
に置き換えます。sed -i 's/\\\\ n/\n/g' default_enclave_public_key.pem
次のコマンドを実行して、空の行をすべて削除します。
sed -i '/^[ ]*$/d' default_enclave_public_key.pem
プライバシー保護の例
保険会社のデータ部門
保険契約者に関する情報を準備します。
-------- ユーザーを作成します。 --------- -ユーザーデータを担当するデータ部門のユーザーを作成します。 CREATE USER ins_data; -- 営業部門のユーザーを作成します。 ユーザーを作成ins_sale; -------- テーブルを作成します。 --------- -- データ部門の保険契約者情報テーブルを作成します。 テーブルの作成者 ( 名前enc_text, 電話enc_text、 ID enc_text、 debit_card enc_text、 アドレスenc_text ); -- データ部門に保険契約者情報テーブルへのアクセスを許可します。 ins_dataにすべての人を許可します。
データ部門のユーザーを作成します。
説明EncDB拡張機能は、設定されたパラメーターに基づいてSQL文を自動的に生成します。 生成されたSQL文をデータベースで実行する必要があります。
. /genEncdbSQLCommand.sh -r MEK_PROVISION -- mek sample/default_mek_data.bin -e default_enclave_publickey.pem-c ${cipher_suite} # SELECT encdb_get_current_mek_id(); ステートメントを実行して、データ部門用に作成されたユーザーのMEK IDを取得します。 # MEK ID 178079820457738240を例として使用します。 mekid_data=178079820457738240 . /genEncdbSQLCommand.sh -r BCL_REGISTER -- mekid ${mekid_data} -- mek sample/default_mek_data.bin -- puk sample/usr_puk_data.pem -- pri sample/usr_pri_data.pem -c ${cipher_suite}
保険契約者情報テーブルの暗号化キーを作成します。
説明次のステートメントは、
ins_data
ユーザーを使用して実行する必要があります。次のSQL文では、
encdb.de k_xxx()
とencdb.keyname_xxx()
はデータ変換関数です。 詳細については、「データ変換関数」をご参照ください。
− データ暗号化キー (DEK) を作成し、groupidの値を記録する。 値の例: b6785611-0c49-4f13-87a9-13f151de9b4d。 SELECT encdb.de k_generate(encdb.keyname_generate('ins_data','demo','public','person ','name')); -これはほんの一例です。 すべての列は同じDEKを共有します。 SELECT encdb.de k_copy_keyname(encdb.keyname_generate('ins_data' 、'dem' 、'public' 、'person '、'phone')) 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person' 、'name')); SELECT encdb.de k_copy_keyname(encdb.keyname_generate('ins_data' 、'dem' 、'public' 、'person '、'ID')) 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person' 、'name')); SELECT encdb.de k_copy_keyname(encdb.keyname_generate('ins_data' 、'dem' 、'public' 、'person '、'debit_card')) 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person '、'name'));; SELECT encdb.de k_copy_keyname(encdb.keyname_generate('ins_data' 、'dem' 、'public' 、'person '、'address')) 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person' 、'name '));
ほとんどの場合、データベースユーザーはセキュリティ上の理由からSQL文を使用してデータを直接暗号化できません。 データベースユーザーは、SQL文を使用してデータを暗号化することを明示的に許可する必要があります。
BCLを編集して、必要なDEKの承認範囲 (groupidを含む) をBCLに更新します。
. /setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b 4d
説明b6785611-0c49-4f13-87a9-13f151de9b 4d
は参照だけのために使用されます。 実際の値を取得するには、次のステートメントを実行します。SELECT encdb.de k_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
BCLを発行します。
. /genEncdbSQLCommand.sh -r BCL_ISSUE -- subject_sign -- spriv sample/usr_pri_data.pem -- spuk sample/usr_puk_data.pem -- ipuk sample/usr_puk_data.pem -- bcl sample /bcl_fordata_insert.txt-c ${暗号スイート} . /genEncdbSQLCommand.sh -r BCL_ISSUE -- issuer_sign -- ipiv sample/usr_pri_data.pem -- spuk sample/usr_puk_data.pem -- ipuk sample/usr_puk_data.pem -- bcl sample /bcl_fordata_insert.txt-c ${暗号スイート}
データの書き込み。
説明ins_data
ユーザーとして次のステートメントを実行する必要があります。INSERT INTO person VALUES(encdb.enc_text_encrypt ('Xiaobao TAO' 、encdb.keyname_generate ('ines_data' 、'demo' 、'public' 、'person '、'name'))) 、 encdb.enc_text_encrypt('13900001111' 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person '、'phone')) 、 encdb.enc_text_encrypt('111222190002309999',encdb.keyname_generate('ins_data','demo','public','person','ID')), encdb.enc_text_encrypt ('62258888888888', encdb.keyname_generate('ins_data','demo','public','person ', 'debet_card)), encdb.enc_text_encrypt('No. 888, ABC Road, Hangzhou, Zhejiang',encdb.keyname_generate('ins_data','demo','public','person ','address'))); INSERT INTO person VALUES(encdb.enc_text_encrypt ('Sanduo DING ',encdb.keyname_generate('ins_data','demo','public','person','name'))) 、 encdb.enc_text_encrypt('13900002222' 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person '、'phone')) 、 encdb.enc_text_encrypt('111222190002308888',encdb.keyname_generate('ins_data','demo','public','person','ID')), encdb.enc_text_encrypt ('622566666666' 、encdb.keyname_generate('ins_data' 、'demo' 、'public' 、'person '、'debit_card)) 、 encdb.enc_text_encrypt ('No. 666, DEF Road, Hangzhou, Zhejiang',encdb.keyname_generate ('ines_data','demo','public','person ','address')));
クエリデータ。
保険契約者情報テーブルを照会します。 クエリ結果は暗号文です。
SELECT name,phone FROM person; 名前 | 電話 -------------------------------------------------------------------------- + -------------------------------------------------------------------------- \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890 (2行)
次のステートメントを
ins_data
ユーザーとして実行します。 クエリ結果はプレーンテキストです。SELECT encdb.de crypt(name) FROM person WHERE name LIKE encdb.enc_text_encrypt('TAO % ',encdb.keyname_generate('ins_data','demo','public','person','name')); decrypt --------- Xiaobao TAO (1行)
保険会社の営業部
営業部門のユーザーを作成します。
説明EncDB拡張機能は、設定されたパラメーターに基づいてSQL文を自動的に生成します。 生成されたSQL文をデータベースで実行する必要があります。
. /genEncdbSQLCommand.sh -r MEK_PROVISION -- mek sample/default_mek_sale.bin -e default_enclave_publickey.pem-c ${cipher_suite} # SELECT encdb_get_current_mek_id(); ステートメントを実行して、営業部門用に作成されたユーザーのMEK IDを取得します。 # MEK ID 2715553450389700608を例として使用します。 mekid_sale=2715553450389700608 . /genEncdbSQLCommand.sh -r BCL_REGISTER -- mekid ${mekid_sale} -- mek sample/default_mek_sale.bin -- puk sample/usr_puk_sale.pem -- pri sample/usr_pri_sale.pem -c ${cipher_suite}
クエリデータ。
営業部門は、データ部門によって保険契約者情報の表示を許可されていません。 これにより、プライバシーデータが保護されます。
保険契約者情報テーブルを照会します。 クエリ結果は暗号文です。
SELECT name,phone FROM person; 名前 | 電話 -------------------------------------------------------------------------- + -------------------------------------------------------------------------- \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890 (2行)
説明ERROR: permission denied for table person
エラーが発生した場合は、GRANT SELECT ON person TO ins_sale;
ステートメントを実行して、営業部門にテーブルへのアクセスを許可します。ins_sale
ユーザーを使用して、次のステートメントを実行します。 実行後、BCLが取得されなかったことを示すエラーが報告される。SELECT encdb.de crypt(name) 人から; 警告: -- encdb -- 信頼されていないログ -- 4 - src/core /Untrusted /src/encdb_untrusted_enclave.cpp、256、encdb_ecall: 失敗返された0xfa030000からBCL (subject_mekid: 2715553450389700608、issuer_mekid: 178079820457738240) を選択します エラー: encdb_ext_enc_text_decrypt: enc_text decrypt errno:fa030000