すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:プライバシー保護

最終更新日:Feb 12, 2025

常に機密データベース機能は、プライバシーデータを保護し、プライバシーデータの漏洩を防ぐために使用できます。 このトピックでは、常に機密データベース機能を使用したプライバシーデータ保護のベストプラクティスについて説明します。

シナリオ

保険会社は、個人という名前の保険契約者情報テーブルに格納されているプライバシーデータを保護したいと考えています。 次の表は一例です。

名前 (名前)

電話番号 (電話)

IDカード番号 (ID)

銀行カード番号 (debit_card)

アドレス (アドレス)

Xiaobao TAO

13900001111

111222190002309999

6225888888888888

No. 888、ABCの道、杭州、浙江

Sanduo DING

13900002222

111222190002308888

6225666666666666

No. 666, DEF Road, 杭州, 浙江省

説明

前の表のデータは参照用です。

保険契約者に関する機密情報は、情報が保険契約者のモバイルデバイスから送信された後、保護のためにデータ部門によって暗号化されます。 営業部門の職員、関連するアプリケーションのユーザー、およびデータベースのユーザーは、暗号文データのみにアクセスできます。 これにより、プライバシーデータの漏洩が防止される。

  • 保険契約者は、保険会社のモバイルアプリを使用してデータを暗号化し、個人情報を書き込みまたは更新できます。

  • 保険会社の営業部門は、データベースに接続してデータを照会できます。 ただし、営業部門は暗号文データのみを表示でき、平文データは表示できません。

前提条件

準備

説明

次の例では、CentOSオペレーティングシステムを使用してコマンドを実行します。

  1. 暗号スイートを設定します。

    1. 暗号スイートの変数を設定します。

      cipher_suite=RSA_WITH_AES_128_CBC_SHA256
    2. ファイルテンプレートを生成します。

      説明

      この例では、次のコマンドを実行して、ファイルテンプレートに基づいてサンプルディレクトリに構成ファイルを生成できます。 生成された構成ファイル (キーファイルや認証ファイルなど) は、後で使用するために必要です。

      ./generateSampleKeyAndBCLs.sh -c ${cipher_suite}
  2. データベースを初期化します。

    1. データベースを作成します。

      CREATE DATABASE demo;
      説明

      この例では、demoという名前のデータベースが作成されます。 ビジネス要件に基づいてデータベースを作成できます。 後続のコマンドでは、実際のデータベース名を使用する必要があります。

    2. 作成したデータベースで、常に機密データベース機能に必要な拡張機能を作成します。

      CREATE EXTENSION encdb;
    3. データベースの公開鍵証明書を取得し、証明書の内容をローカルファイルに追加します。

      SELECT encode(db_process_msg_api('{"request_type":0,"version":"1.2.8"}'),'escape')::json->'server_info'->'public_key'
      説明
      • この例では、ローカルファイルdefault_enclave_public_key.pemが使用されています。 ビジネス要件に基づいてファイル名を変更できます。 後続のコマンドでは、実際のファイル名を使用する必要があります。

      • 公開鍵証明書の内容が二重引用符 (") で始まり、終わる場合は、ローカルファイルに二重引用符を追加する必要はありません。

    4. 公開鍵証明書の形式を標準形式に変換します。

      1. 次のコマンドを実行して、\\nを改行 \nに置き換えます。

        sed -i 's/\\\\n/\n/g' default_enclave_public_key.pem
      2. 次のコマンドを実行して、空の行をすべて削除します。

        sed -i '/^[ ]*$/d' default_enclave_public_key.pem

プライバシー保護の例

保険会社のデータ部門

  1. 保険契約者に関する情報を準備します。

    -------- Create a user. --------
    -- Create a user for the data department, which is responsible for user data.
    CREATE USER ins_data;
    -- Create a user for the sales department.
    CREATE USER ins_sale;
    
    -------- Create a table. --------
    -- Create a policyholder information table for the data department.
    CREATE TABLE person (
        name enc_text,
        phone enc_text,
        ID enc_text,
        debit_card enc_text,
        address enc_text
    );
    -- Authorize the data department to access the policyholder information table.
    GRANT ALL ON person TO ins_data;
  2. データ部門のユーザーを作成します。

    説明

    EncDB拡張機能は、設定されたパラメーターに基づいてSQL文を自動的に生成します。 生成されたSQL文をデータベースで実行する必要があります。

    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_data.bin -e default_enclave_public_key.pem -c ${cipher_suite}
    
    # Execute the SELECT encdb_get_current_mek_id(); statement to obtain the MEK ID of the user that is created for the data department.
    # The MEK ID 178079820457738240 is used as an example.
    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}
  3. 保険契約者情報テーブルの暗号化キーを作成します。

    説明
    • 次のステートメントは、ins_dataユーザーを使用して実行する必要があります。

    • 次のSQL文では、encdb.de k_xxx()encdb.keyname_xxx() はデータ変換関数です。 詳細については、「データ変換関数」をご参照ください。

    -- Create a data encryption key (DEK) and record the value of groupid. Example value: b6785611-0c49-4f13-87a9-13f151de9b4d.
    SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
    
    -- This is only an example. All columns share the same DEK.
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','phone'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','ID'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','debit_card'),encdb.keyname_generate('ins_data','demo','public','person','name'));
    SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','address'),encdb.keyname_generate('ins_data','demo','public','person','name'));

    ほとんどの場合、データベースユーザーはセキュリティ上の理由からSQL文を使用してデータを直接暗号化できません。 データベースユーザーは、SQL文を使用してデータを暗号化することを明示的に許可する必要があります。

    1. BCLを編集して、必要なDEKの承認範囲 (groupidを含む) をBCLに更新します。

      ./setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b4d
      説明

      b6785611-0c49-4f13-87a9-13f151de9b 4dは参照だけのために使用されます。 実際の値を取得するには、次のステートメントを実行します。

      SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
    2. 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_for_data_insert.txt -c ${cipher_suite}
      ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}
  4. データを書き込みます。

    説明

    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('6225888888888888',encdb.keyname_generate('ins_data','demo','public','person','debit_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('6225666666666666',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'))); 
  5. データの照会

    • 保険契約者情報テーブルを照会します。 クエリ結果は暗号文です。

      SELECT name,phone FROM person;
                                        name                                    |                                  phone                                   
      --------------------------------------------------------------------------+--------------------------------------------------------------------------
       \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c 
       \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890  
      (2 rows)
    • 次のステートメントをins_dataユーザーとして実行します。 クエリ結果はプレーンテキストです。

      SELECT encdb.decrypt(name) FROM person WHERE name LIKE encdb.enc_text_encrypt('TAO%',encdb.keyname_generate('ins_data','demo','public','person','name'));
       decrypt
      ---------
       Xiaobao TAO
      (1 row)

保険会社の営業部

  1. 営業部門のユーザーを作成します。

    説明

    EncDB拡張機能は、設定されたパラメーターに基づいてSQL文を自動的に生成します。 生成されたSQL文をデータベースで実行する必要があります。

    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_sale.bin -e default_enclave_public_key.pem -c ${cipher_suite}
    
    # Execute the SELECT encdb_get_current_mek_id(); statement to obtain the MEK ID of the user that is created for the sales department.
    # The MEK ID 2715553450389700608 is used as an example.
    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}
  2. データの照会

    営業部門は、データ部門によって保険契約者情報の表示を許可されていません。 これにより、プライバシーデータが保護されます。

    • 保険契約者情報テーブルを照会します。 クエリ結果は暗号文です。

      SELECT name,phone FROM person;
                                        name                                    |                                  phone                                   
      --------------------------------------------------------------------------+--------------------------------------------------------------------------
       \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c 
       \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890  
      (2 rows)
      説明

      ERROR: permission denied for table personエラーが発生した場合は、GRANT SELECT ON person TO ins_sale; ステートメントを実行して、営業部門にテーブルへのアクセスを許可します。

    • ins_saleユーザーを使用して、次のステートメントを実行します。 実行後、BCLが取得されなかったことを示すエラーが報告される。

      SELECT encdb.decrypt(name) FROM person;
       WARNING:  -- encdb -- -- Untrusted log -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 178079820457738240) from table fail - returned 0xfa030000
       ERROR:  encdb_ext_enc_text_decrypt: enc_text decrypt errno:fa030000