オブジェクト・ストレージからのインポート中のデータの復号化

オブジェクト・ストレージに格納されている暗号化されたファイルから、データを復号化およびロードできます。外部表で使用するオブジェクト・ストレージ上の暗号化されたデータを復号化することもできます。

このオプションは、ソース・ファイルのデータが暗号化されている場合、オンプレミス・データベースからAutonomous Databaseに移行する際に便利です。
ノート

このオプションは、4 GB未満のオブジェクト・ストレージ・ファイルでのみサポートされています。

このオプションは、次の手順に適用されます。

  • DBMS_CLOUD.COPY_DATA

  • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

  • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

  • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

    DBMS_CLOUD.CREATE_HYBRID_PART_TABLEの場合、このオプションはオブジェクト・ストレージ・ファイルにのみ適用されます。

  • DBMS_CLOUD.COPY_COLLECTION

トピック

DBMS_CRYPTOアルゴリズムを使用したデータの復号化とロード

オブジェクト・ストレージから暗号化されたファイルを復号化し、データをAutonomous Databaseの表にロードするステップを示します(復号化ステップではDBMS_CRYPTOアルゴリズムを使用します)。

前提条件として、暗号化されたファイルが存在し、そのファイルがオブジェクト・ストレージにアップロードされている必要があります。この例ではCSVファイルを使用し、ファイルはDBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5アルゴリズムを使用して暗号化され、クラウド・オブジェクト・ストレージにアップロードされていると想定しています。

ENCRYPTファンクションの詳細は、ENCRYPTファンクションを参照してください。

暗号化キーの生成の詳細は、DBMS_CRYPTOの操作上のノートを参照してください。

オブジェクト・ストレージからAutonomous Database上の既存の表にデータを復号化してロードするには:

  1. Autonomous Databaseインスタンスに接続します。

    詳細は、Autonomous Databaseへの接続を参照してください。

  2. DBMS_CLOUD.CREATE_CREDENTIALを使用してCloud Object Storage資格証明を格納します。

    たとえば、次のとおりです。

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OBJ_STORE_CRED',
        username        => 'user1@example.com',
        password        => 'password'
      );
    END;
    /

    usernameおよびpasswordに指定する値は、使用しているクラウド・オブジェクト・ストレージ・サービスによって異なります

    詳細は、CREATE_CREDENTIALプロシージャを参照してください。

    Creating a credential to access Oracle Cloud Infrastructure Object Store is not required if you enable resource principal credentials.詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスを参照してください。

  3. DBMS_CLOUD.CREATE_CREDENTIALを使用して、キーを格納する資格証明を作成します。例:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    別の方法として、ボールトにキーを格納する資格証明を作成できます。たとえば、次のとおりです。

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name  => 'ENC_CRED_NAME',
        params           => JSON_OBJECT ('username' value 'Any_username',
                                         'region'    value 'Region',
                                         'secret_id' value 'Secret_id_value'));
    END;
    /
    ノート

    キーを格納する資格証明で指定するusernameパラメータには、任意の文字列を指定できます。

    これにより、ボールト・シークレット資格証明であるENC_CRED_NAME資格証明が作成され、シークレット(復号化/暗号化キー)がシークレットとしてOracle Cloud Infrastructure Vaultに格納されます。

    詳細は、CREATE_CREDENTIALプロシージャを参照してください。

  4. DBMS_CLOUD.COPY_DATAを実行し、復号化方法としてDBMS_CRYPTO暗号化アルゴリズムを指定します。
    BEGIN
     DBMS_CLOUD.COPY_DATA (
       table_name       => 'CSV_COPY_DATA',
       credential_name  => 'OBJ_STORE_CRED',
       file_uri_list    => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
       format           => json_object( 'type' value 'csv', 'encryption' value json_object('type' value DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,'credential_name' value 'ENC_CRED_NAME'))
      );
    END;
    /

    これにより、オブジェクト・ストレージのENCRYPTED.CSVファイルが復号化されます。その後、CSV_COPY_DATA表にデータがロードされます。formatパラメータのencryptionオプション値は、データの復号化に使用するDBMS_CRYPTO暗号化アルゴリズムを指定します。

    暗号化アルゴリズムの詳細は、DBMS_CRYPTOアルゴリズムを参照してください。

    この例では、namespace-stringはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースの理解を参照してください。

    パラメータの詳細は、COPY_DATAプロシージャを参照してください。

    使用可能なformatパラメータの詳細は、DBMS_CLOUD.COPY_DATAとともに使用できます。DBMS_CLOUDパッケージ・フォーマット・オプションを参照してください。

ユーザー定義関数を使用したデータの復号化とロード

オブジェクト・ストレージのファイルを復号化し、ユーザー定義の復号化関数を使用してデータを表にロードするステップを示します。

これらのステップの前提条件として、ファイルを暗号化し、ファイルをオブジェクト・ストレージにアップロードする必要があります。この例ではCSVファイルを使用し、ファイルはDBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5アルゴリズムを使用して暗号化され、クラウド・オブジェクト・ストレージにアップロードされていると想定しています。

ENCRYPTファンクションの詳細は、ENCRYPTファンクションを参照してください。

暗号化キーの生成の詳細は、DBMS_CRYPTOの操作上のノートを参照してください。

オブジェクト・ストレージからAutonomous Database上の既存の表にデータを復号化してロードするには:

  1. Autonomous Databaseインスタンスに接続します。

    詳細は、Autonomous Databaseへの接続を参照してください。

  2. DBMS_CLOUD.CREATE_CREDENTIALを使用してCloud Object Storage資格証明を格納します。

    次に例を示します。

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OBJ_STORE_CRED',
        username        => 'user1@example.com',
        password        => 'password'
      );
    END;
    /

    usernameおよびpasswordに指定する値は、使用しているクラウド・オブジェクト・ストレージ・サービスによって異なります

    詳細は、CREATE_CREDENTIALプロシージャを参照してください。

    Creating a credential to access Oracle Cloud Infrastructure Object Store is not required if you enable resource principal credentials.詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスを参照してください。

  3. ユーザー定義関数の復号化コールバック関数を作成します。

    次に例を示します。

    CREATE OR REPLACE FUNCTION decryption_func (data IN BLOB)
    RETURN BLOB
    IS
      l_decrypted_data     BLOB;
      response             DBMS_CLOUD_TYPES.resp;
      l_response_json      JSON_ARRAY_T;
      l_response_json_obj  JSON_OBJECT_T;
      l_secret_id          VARCHAR2(4000) := '<secret_ocid>';
      l_key                VARCHAR2(4000);
    BEGIN
       response := DBMS_CLOUD.send_request (
                    credential_name => 'OCI$RESOURCE_PRINCIPAL',
                    uri             => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/' || l_secret_id,
                    method          => 'GET');
      l_response_json_obj := JSON_OBJECT_T.parse (DBMS_CLOUD.get_response_text(response));
      l_key := UTL_RAW.cast_to_varchar2 (UTL_ENCODE.base64_decode(UTL_RAW.cast_to_raw (l_response_json_obj.get_object('secretBundleContent').get_string('content'))));
     
      DBMS_LOB.createtemporary (l_decrypted_data, TRUE, DBMS_LOB.CALL);
      DBMS_CRYPTO.decrypt (
          dst => l_decrypted_data,
          src => data,
          typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
          key => l_key
        );
      RETURN l_decrypted_data;
    END decryption_func;
    /

    これにより、DECRYPTION_FUNC復号化関数が作成されます。このファンクションは、ユーザーが指定するキーを使用して、ストリーム暗号またはブロック暗号を使用してデータを復号化します。この例でユーザーが指定したキーはOracle Cloud Infrastructure Vaultに格納され、Oracle Cloud Infrastructure VaultサービスへのRESTコールによって動的に取得されます。

  4. DBMS_CLOUD.COPY_DATAを実行し、formatオプションencryptionを指定して、データを復号化するために作成したユーザー定義関数を指定します。
    BEGIN
     DBMS_CLOUD.COPY_DATA (
        table_name      => 'CSV_COPY_DATA',
        credential_name => 'OBJ_STORE_CRED',
        file_uri_list   => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
        format          => json_object(
                             'type' value 'csv',
                             'encryption' value json_object('user_defined_function' value 'admin.decryption_func'))
      );
    end;
    /

    これにより、オブジェクト・ストレージのENCRYPTED.CSVファイルが復号化されます。その後、CSV_COPY_DATA表にデータがロードされます。formatパラメータのencryptionオプション値は、データの復号化に使用するユーザー定義関数名を指定します。

    ノート

    ユーザー定義関数に対するEXECUTE権限が必要です。

    この例では、namespace-stringはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースの理解を参照してください。

    パラメータの詳細は、COPY_DATAプロシージャを参照してください。

    使用可能なformatパラメータの詳細は、DBMS_CLOUD.COPY_DATAとともに使用できます。DBMS_CLOUDパッケージ・フォーマット・オプションを参照してください。