6  他の Oracle機能で透過的データ暗号化を使用

Oracle Data Encryptionは、Oracle Data GuardやOracle Real Application ClustersなどのOracle機能とともに使用できます。

6.1 透過的データ暗号化とエクスポートおよびインポート操作との連携

Oracle Data Pumpによって、暗号化列を含む表をエクスポートおよびインポートしたり、ダンプ・セット全体を暗号化することができます。

6.1.1 暗号化データされたデータのエクスポートおよびインポートについて

暗号化列を持つ表のエクスポートとインポートには、Oracle Data Pumpを使用できます。

ソフトウェア・キーストアと外部キーストアのどちらについても、暗号化された列を含む表をエクスポートする必要がある場合には次の点が重要となります。

  • 転送中も機密データが解読されないように保つ必要があります。

  • 権限のあるユーザーは、宛先にインポートされたデータを復号化できる必要があります。

Oracle Data Pumpを使用して暗号化列を含む表をエクスポートおよびインポートする場合、ENCRYPTIONパラメータを使用してダンプ・ファイル・セットのデータを暗号化できるようにします。ENCRYPTIONパラメータには、次の値を指定できます。

  • ENCRYPTED_COLUMNS_ONLY: 暗号化列が暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • DATA_ONLY: すべてのデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • METADATA_ONLY: すべてのメタデータがダンプ・ファイル・セットに暗号化された形式で書き込まれます。

  • ALL: すべてのデータとメタデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • NONE: ダンプ・ファイル・セットに対して暗号化は使用されません。

6.1.2 暗号化された列のある表のエクスポートおよびインポート

ENCRYPTION=ENCRYPTED_COLUMNS_ONLY設定を使用して、暗号化された列のある表をエクスポートおよびインポートできます。

  1. 暗号化列を含む表のエクスポートを試行する前に、キーストアが開いていることを確認します。

    マルチテナント環境では、プラガブル・データベース(PDB)内のデータをエクスポートする場合、ウォレットがPDB内でオープン状態であることを確認します。rootにエクスポートする場合、ウォレットがroot内でオープン状態であることを確認します。

    キーストアが開いているかどうかを確認するには、V$ENCRYPTION_WALLETビューのSTATUS列を問い合せます。キーストアを開く必要がある場合は、次のSQL文を実行します。

    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN 
    IDENTIFIED BY software_keystore_password 
    [CONTAINER = ALL | CURRENT];
    

    software_keystore_password設定は、キーストアのパスワードです。キーストアが開いている必要があるのは、暗号化列の復号化にはTDE表キーを使用する必要があり、そのためにはTDEマスター暗号化キーへのアクセスが必要なためです。列は、エクスポートされる前にパスワードを使用して再暗号化されます。

  2. エクスポート・ダンプ・ファイル・セットの列データを暗号化する際に使用するパスワードを、ENCRYPTION_PASSWORDパラメータを使用して指定し、EXPDPコマンドを実行します。

    次に、employee_data表をエクスポートする例を示します。ENCRYPTION_PWD_PROMPT = YES設定によって、対話式でパスワードを求めるプロンプトの表示が可能となり、これは推奨されるセキュリティ上の措置となっています。

    expdp hr TABLES=employee_data DIRECTORY=dpump_dir
    DUMPFILE=dpcd2be1.dmp ENCRYPTION=ENCRYPTED_COLUMNS_ONLY
    ENCRYPTION_PWD_PROMPT = YES
    
    Password: password_for_hr
    
  3. エクスポートされたデータをターゲット・データベースにインポートするには、ENCRYPTION_PASSWORDパラメータによって設定されエクスポート操作に使用したものと同じパスワードを確実に指定してください。

    このパスワードは、データの復号化に使用されます。データは、ターゲット・データベースに生成された新しいTDE表キーを使用して再暗号化されます。ターゲット・データベースがTDEマスター暗号化キーにアクセスするためには、キーストアが開いている必要があります。次に、employee_data表をインポートする例を示します。

    impdp hr TABLES=employee_data DIRECTORY=dpump_dir 
    DUMPFILE=dpcd2be1.dmp 
    ENCRYPTION_PWD_PROMPT = YES
    
    Password: password_for_hr

6.1.3 Oracle Data Pumpを使用してダンプ・セット全体を暗号化

Oracle Data Pumpによって、透過的データ暗号化列のみではなく、ダンプ・セット全体を暗号化できます。

インポートでは、パスワードまたはキーストアTDEマスター暗号化キーのいずれかを使用してデータを復号化できます。パスワードを指定しなかった場合、データの復号化にはキーストアのTDEマスター暗号化キーが使用されます。ターゲット・データベースにおいて、キーストアが存在して開いている必要があります。この開いているキーストアは、ターゲット・データベースで列暗号化データを再暗号化する際にも必要です。

ENCRYPTION_MODE=TRANSPARENT設定を使用すると、キーストアに格納されているTDEマスター暗号化キーを使用してダンプ・ファイル・セットを透過的に暗号化できます。この場合、パスワードは不要です。キーストアは、ターゲット・データベースに存在して開かれている必要があり、インポート操作中に列暗号化メタデータを正常に復号化するためにソース・データベースのTDEマスター暗号化キーを含んでいる必要があります。

この開いているキーストアは、ターゲット・データベースで列暗号化メタデータを再暗号化する際にも必要です。キーストアがすでにターゲット・データベースに存在している場合には、ソース・データベースのキーストアから現在のTDEマスター暗号化キーをエクスポートし、ターゲット・データベースのキーストアインポートできます。

  • ENCRYPTION_MODEパラメータを使用して、暗号化モードを指定します。ENCRYPTION_MODE=DUALによって、キーストアに格納されているTDEマスター暗号化キーと指定したパスワードを使用してダンプ・セットが暗号化されます。

たとえば、二重暗号化モードを使用して、暗号化されたデータをエクスポートする場合、次のようにします。

expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr_enc.dmp
ENCRYPTION=all ENCRYPTION_PASSWORD=encryption_password
ENCRYPTION_ALGORITHM=AES256 ENCRYPTION_MODE=dual

Password: password_for_hr

関連項目:

6.2 透過的データ暗号化とOracle Data Guardとの連携

Oracle Data Guardプライマリ・データベースおよびセカンダリ・データベースは、ソフトウェア・キーストアと外部キーストアの両方を共有できます。

6.2.1 Oracle Data Guardでの透過的データ暗号化の使用について

Oracle Data Guardでは、ソフトウェア・キーストアと外部キーストアのどちらについても、透過的データ暗号化(TDE)がサポートされています。

プライマリ・データベースでTDEを使用する場合、Data Guard構成の各スタンバイ・データベースには、プライマリ・データベースからの暗号化キーストアのコピーが必要です。プライマリ・データベースでTDEマスター暗号化キーを再設定した場合は、そのTDEマスター暗号化キーが格納されているプライマリ・データベースから各スタンバイ・データベースにキーストアをコピーする必要があります。

次の点に注意してください。

  • ウォレットベースのTDEによるキー更新操作では、新しいTDEマスター暗号化キーがまだ使用可能でないため、スタンバイ・データベースでの管理リカバリ・プロセス(MRP)が失敗します。この問題を回避するには、プライマリ・データベースでADMINISTER KEY MANAGEMENT CREATE KEY文を使用して、新しいTDEマスター暗号化キーをウォレットに挿入します。ウォレットをスタンバイ・データベースにコピーしてから、プライマリでADMINISTER KEY MANAGEMENT USE KEY文を実行します。

  • データをスタンバイ・データベースに転送する場合、ログ・ファイル内の暗号化データは暗号化されたままです。暗号化データは転送中も暗号化されたままです。

6.2.2 Oracle Data Guard環境でのTDEおよびOracle Key Vaultの構成

TDEおよびOracle Key Vaultと連携できるように、マルチテナント環境でOracle Data Guardを構成できます。

次のシナリオでは、フィジカル・スタンバイ・データベースが1つでシングル・インスタンスのマルチテナントOracle Data Guard環境でのOracle Key Vaultを使用した構成を示します。プライマリ・データベースとスタンバイ・データベースのバージョンは、2020年1月リリース更新以降が適用されたリリース12.2.01である必要があります。この手順を完了するには、各ステップを示されている順序で実行する必要があります。手順を完了すると、Oracle Data Guardでは、TDEキー管理にOracle Key Vaultのみが使用され、データベース・サーバー上にTDEウォレットはありません。プライマリ・データベースとスタンバイ・データベースの両方のアラート・ログをモニターすることをお薦めします。
  1. プライマリ・データベースとスタンバイ・データベースの両方で、opatch lspatchesコマンドを実行してパッチ・リリースを確認します。
    $ORACLE_HOME/OPatch/opatch lspatches

    次のような出力が表示されます。

    31312468;Database Jul 2020 Release Update : 12.2.0.1.200714 (31312468)
  2. データベース管理者がOracleデータベースをOracle Key Vaultに自動的に登録できるように、Oracle Key Vault管理者が準備したOracle Key Vaultデプロイメント・スクリプトをダウンロードします。
    Oracleデータベースをエンドポイントとして自動的に登録するスクリプトの作成方法の例は、Oracle Key Vault RESTfulサービス管理者ガイドを参照してください。デプロイメント・スクリプトは、データベース管理者がダウンロードできる共有ファイル・システムにあります。これらのデプロイメント・スクリプトには2つの異なるバージョンがあります。primary.zipファイルはプライマリ・データベース用で、secondary.zipファイルはすべてのスタンバイ・データベース用です。これらのスクリプトは、Oracle Data GuardまたはOracle RAC環境に使用できます。
    Oracle Key Vault管理者が準備してデプロイメント・スクリプトに追加する別のコンポーネントは、Oracle Key Vaultに接続するデプロイメント・スクリプトのすべての詳細を含む構成ファイルです。
  3. データベース管理者が共有の場所からダウンロードするためにOracle Key Vault管理者が作成した2つのデプロイメント・スクリプト(primary.zipおよびsecondary.zip)をコピーします。
    1. primary.zipファイルをプライマリ・データベースにコピーします。
      $ scp user@ip_address:/path/to/file/primary.zip .
    2. secondary.zipファイルをスタンバイ・データベースにコピーします。
      $ scp user@ip_address:/path/to/file/secondary.zip .
  4. それぞれのサーバーで、zipファイルを解凍します。
    $ unzip primary.zip
    
    $ unzip secondary.zip
  5. primary-run-me.shおよびsecondary-run-me.shスクリプトを実行します。これらのスクリプトには、Oracle Key VaultでRESTful APIが実行するコマンドが含まれています。
    Oracle Key Vault RESTfulサービスがこれらのコマンドを実行し、一意のウォレットおよびエンドポイント名でこのデータベースをOracle Key Vaultに登録します。
    1. プライマリ・データベース: たとえば:
      $ more primary-run-me.sh
      
      #!/bin/bash
      export EP_NAME=${ORACLE_SID^^}_on_${HOSTNAME/.*}
      export WALLET_NAME=${ORACLE_SID^^}
      curl -Ok --tlsv1.2 https://Oracle_Key_Vault_IP_address:5695/okvrestclipackage.zip
      unzip -oj okvrestclipackage.zip lib/okvrestcli.jar -d ./lib
      cat > /home/oracle/deploy-primary.sh  << EOF
      #!/bin/bash
      mkdir -pv ${ORACLE_BASE}/product/okv
      okv manage-access wallet create --wallet ${WALLET_NAME} --unique FALSE
      okv admin endpoint create --endpoint ${EP_NAME} --description "$HOSTNAME, $(hostname -i)" 
          --type ORACLE_DB --platform LINUX64 --subgroup "USE CREATOR SUBGROUP" --unique FALSE --strict-ip-check TRUE
      okv manage-access wallet set-default --wallet ${WALLET_NAME} --endpoint ${EP_NAME}
      expect << _EOF
          set timeout 120
          spawn okv admin endpoint provision --endpoint ${EP_NAME} --location ${ORACLE_BASE}/product/okv --auto-login FALSE
          expect "Enter Oracle Key Vault endpoint password: "
          send "change-on-install\r"
          expect eof
      _EOF
      EOF
    2. スタンバイ・データベース: たとえば:
      $ more secondary-run-me.sh
      
      $ more run-me.sh
      #!/bin/bash
      export EP_NAME=${ORACLE_SID^^}_on_$(hostname -s)
      export WALLET_NAME=${ORACLE_SID^^}
      curl -Ok --tlsv1.2 https://Oracle_Key_Vault_IP_address:5695/okvrestclipackage.zip 
      unzip -oj okvrestclipackage.zip lib/okvrestcli.jar -d ./lib
      cat > /home/oracle/deploy-standby.sh << EOF
      #!/bin/bash
      okv admin endpoint create --endpoint ${EP_NAME} --description "$(hostname -f) $(hostname -i)" --subgroup "USE CREATOR SUBGROUP" --unique FALSE
      okv admin endpoint update --endpoint ${EP_NAME} --strict-ip-check TRUE
      okv manage-access wallet set-default --wallet ${WALLET_NAME} --endpoint ${EP_NAME}
      expect << _EOF
          set timeout 120
          spawn okv admin endpoint provision --endpoint ${EP_NAME} --location /etc/ORACLE/KEYSTORES/${ORACLE_UNQNAME^^}/okv --auto-login FALSE
          expect "Enter Oracle Key Vault endpoint password: "
          send "change-on-install\r"
          expect eof
      _EOF
      EOF
  6. プライマリ・データベースおよびスタンバイ・データベースで、次のディレクトリを作成します。
    たとえば:
    $ mkdir -pv /u01/opt/oracle/product/okv 
    $ mkdir -pv /u01/opt/oracle/product/tde 
    $ mkdir -pv /u01/opt/oracle/product/tde_seps

    ここでは次のように指定します。

    • /u01/opt/oracle/product/okvは、Oracle Key Vaultクライアント・ソフトウェアのインストール・ディレクトリです。
    • /u01/opt/oracle/product/tdeには、将来のOracle Key Vaultパスワードのみを含む自動ログイン・ウォレットが格納され、自動ログインのOracle Key Vault構成が有効になります。
    • /u01/opt/oracle/product/tde_sepsには、将来のOracle Key Vaultパスワードのみを含む自動ログイン・ウォレットが格納されます。これにより、SQL*PlusコマンドラインからOracle Key Vaultパスワードが非表示になり、場合によっては、Oracleデータベース管理者とOracle Key Vault管理者との間で義務の分離を強化するためにデータベース管理者にも非表示になる可能性があります。
  7. まず、プライマリ・データベースでRESTful APIを実行します。これは、スタンバイ・データベースのデプロイメント・スクリプトが、プライマリ・データベースのスクリプトによって作成されるOracle Key Vaultの共有仮想ウォレットの存在に依存するためです。
    • プライマリ上:
      $ ./deploy-primary.sh

      次のようなメッセージが表示されます。

      $ ./primary-run-me.sh
      mkdir: created directory ‘/u01/opt/oracle/product/okv’
      {
        "result" : "Success",
        "value" : {
          "status" : "PENDING",
          "locatorID" : "CC7B4E69-79D5-4F8F-BE63-CB515B6DA4AB"
        }
      }
      {
        "result" : "Success",
        "value" : {
          "status" : "PENDING",
          "locatorID" : "EC5B78D6-F60D-4E81-883D-4B48D773A7AC"
        }
      }
      {
        "result" : "Success"
      }
      spawn okv admin endpoint provision --endpoint DAVID122_on_david --location /u01/opt/oracle/product/okv --auto-login FALSE
      Enter Oracle Key Vault endpoint password:
      {
        "result" : "Success",
        "value" : {
          "javaHome" : "/u01/opt/oracle/product/12.2/db_1/jdk/jre"
        }
      }
    • すべてのスタンバイ上:
      $ ./deploy-standby.sh

      次のようなメッセージが表示されます。

      ./standby-run-me.sh
      
      mkdir: created directory ‘/u01/opt/oracle/product/okv’
      {
        "result" : "Success",
        "value" : {
          "status" : "PENDING",
          "locatorID" : "803E93C8-8775-4C71-975B-7BAE2413E0DB"
        }
      }
      {
        "result" : "Success"
      }
      spawn okv admin endpoint provision --endpoint DAVID122_on_goliath --location /u01/opt/oracle/product/okv --auto-login FALSE
      Enter Oracle Key Vault endpoint password:
      {
        "result" : "Success",
        "value" : {
          "javaHome" : "/u01/opt/oracle/product/12.2/db_1/jdk/jre"
        }
      }
  8. プライマリ・データベースおよびスタンバイ・データベースで、root.shスクリプトを実行してPKCS#11ライブラリをデプロイします。
    # /u01/opt/oracle/product/okv/bin/root.sh

    次の出力が表示されます。

    Creating directory: /opt/oracle/extapi/64/hsm/oracle/1.0.0/
    Copying PKCS library to /opt/oracle/extapi/64/hsm/oracle/1.0.0/
    Setting PKCS library file permissions
  9. プライマリ・データベースから、次にスタンバイの順で、okvutil changepwdコマンドを実行してインストールしたウォレットのパスワードを変更します。
    すべてのデータベース管理者が同じデプロイメント・スクリプトをダウンロードしたため、すべてのデータベースのパスワードがOracle Key Vaultで同じになります。このステップにより、各データベースが一意のパスワードを持つようになります。
    $ /u01/opt/oracle/product/okv/bin/okvutil changepwd -t wallet -l /u01/opt/oracle/product/okv/ssl/
    
    Enter wallet password: default_password
    Enter new wallet password: Oracle_Key_Vault_password
    Confirm new wallet password: Oracle_Key_Vault_password
    Wallet password changed successfully
  10. プライマリ・データベースおよびスタンバイ・データベースで、次の文を実行します。
    1. 次のエントリをsqlnet.oraファイルに追加します。
      ENCRYPTION_WALLET_LOCATION =
       (SOURCE = (METHOD = OKV)
        (METHOD_DATA =
         (DIRECTORY = /u01/opt/oracle/product/tde)))
    2. 次の文を実行して、Oracle Key Vaultパスワードをシークレットとして自動オープン・ウォレットに追加し、SQL*PlusコマンドラインのOracle Key VaultパスワードをEXTERNAL STOREに置き換えます。
      ADMINISTER KEY MANAGEMENT ADD SECRET 'Oracle_Key_Vault_password' 
      FOR CLIENT 'OKV_PASSWORD' 
      TO LOCAL AUTO_LOGIN KEYSTORE '/u01/opt/oracle/product/tde_seps';
      
      ALTER SYSTEM SET EXTERNAL_KEYSTORE_CREDENTIAL_LOCATION = '/u01/opt/oracle/product/tde_seps' SCOPE = SPFILE;
      
    3. 次の文を実行して、Oracle Key Vaultパスワードをシークレットとして追加し、Oracle Key Vaultへの自動ログイン接続を可能にします。
      ADMINISTER KEY MANAGEMENT ADD SECRET 'Oracle_Key_Vault_password' 
      FOR CLIENT 'HSM_PASSWORD' 
      TO LOCAL AUTO_LOGIN KEYSTORE '/u01/opt/oracle/product/tde';
      
    4. 必要に応じて、パッチ30398099がインストールされている場合は、データベースのデフォルト・アルゴリズムをAES128からAES192またはAES256に変更します。
      次のパラメータの前にアンダースコアがあることに注意してください。
      ALTER SYSTEM SET "_tablespace_encryption_default_algorithm" = 'AES256' SCOPE = BOTH;
      
    5. 常に新しい表領域を暗号化するようにプライマリ・データベースおよびスタンバイ・データベースを構成します。
      ALTER SYSTEM SET ENCRYPT_NEW_TABLESPACES = ALWAYS SCOPE = BOTH;
    6. 前述のALTER SYSTEM SET WALLET_ROOT文が有効になるように、プライマリ・データベースおよびスタンバイ・データベースを再起動します。
  11. プライマリ・データベースで、最初のTDEマスター暗号化キーをOracle Key Vaultに作成します。
    スタンバイ・データベースのalert.logを確認します。スタンバイ・データベースはOracle Key Vaultの共有仮想ウォレットで正しいマスター・キーを検出するため、管理リカバリ・プロセス(MRP)は停止しないでください。
    1. プライマリ・ルート・コンテナ: 最初のマスター暗号化キーを設定します。

      TDE構成を変更しないすべてのADMINISTER KEY MANAGEMENT文では、パスワードはEXTERNAL STOREに置き換えられます。これにより、Oracle Key Vault管理者はOracle Key Vaultパスワードをデータベース管理者と共有する必要がなくなるため、データベース管理者とOracle Key Vault管理者の業務を分離できます。

      sqlplus sys as syskm
      Enter password: password
      
      ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY EXTERNAL STORE 
      CONTAINER = CURRENT;
    2. すべてのプライマリPDB: オープンしているPDBごとに最初のタグ付きマスター・キーを設定します。PDBキーにタグを付ける利点は、後で特定のPDBに属するものと簡単に識別できることです。
      SELECT ' ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG '''||UPPER(SYS_CONTEXT('USERENV', 'CON_NAME'))||' '||TO_CHAR (SYS_EXTRACT_UTC (SYSTIMESTAMP), 
      'YYYY-MM-DD HH24:MI:SS"Z"')||''' FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE;' 
      AS "SET KEY COMMAND" FROM DUAL;
    3. このSELECT文の生成済出力を実行します。
      たとえば:
      ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG 'pdb_name date time' 
      IDENTIFIED BY EXTERNAL STORE;
  12. ルート・コンテナで次のステップを実行します。
    1. 必要に応じて、ルート・コンテナのUSERS表領域を暗号化します。
      たとえば:
      ALTER TABLESPACE USERS ENCRYPTION ONLINE USING 'AES256' ENCRYPT;
    2. スタンバイ・データベースのalert.logをよく見て、そこにあるUSERS表領域も暗号化されていることを確認します。
  13. 必要に応じて、PDBのUSERS表領域を暗号化します。
    SYSTEMSYSAUXTEMPおよびUNDOの各表領域の暗号化は、Oracle Databaseリリース19c以降でのみ実装されているため、お薦めしません。
    たとえば:
    ALTER TABLESPACE USERS ENCRYPTION ONLINE USING 'AES256' ENCRYPT;
  14. プライマリ・データベースPDBで表領域および表を作成します。
    プライマリ・データベースで表領域を作成すると、その文に暗号化キーワードがなくても、デフォルトで暗号化されます。スタンバイ・データベースのalert.logをよく見て、暗号化された表領域がそこにも作成されていることを確認します。
    CREATE TABLESPACE protected DATAFILE SIZE 50M;
    
    CREATE TABLE SYSTEM.TEST TABLESPACE protected 
    AS SELECT * FROM DBA_OBJECTS;
  15. 暗号化された表領域に格納されている表から選択できることを確認します。
    SELECT COUNT(*), OWNER FROM SYSTEM.TEST 
    GROUP BY OWNER 
    ORDER BY 1 DESC;
  16. スタンバイ・データベースで、次の問合せを実行して、ルート・コンテナの暗号化された表領域、すべてのPDBおよび暗号化アルゴリズムをリストします。
    SELECT C.NAME AS PDB_NAME, T.NAME AS TBS_NAME, E.ENCRYPTIONALG AS ALG 
    FROM V$TABLESPACE T, V$ENCRYPTED_TABLESPACES E, V$CONTAINERS C 
    WHERE E.TS# = T.TS# AND E.CON_ID = T.CON_ID AND E.CON_ID = C.CON_ID ORDER BY E.CON_ID, T.NAME;
    
    PDB_NAME        TBS_NAME             ALG     
    --------------- -------------------- ------- 
    CDB$ROOT        USERS                AES256  
    FINPDB          PROTECTED            AES256 
    FINPDB          USERS                AES256  
    
  17. オプションで、構成を検証します。
    1. プライマリ・データベースとスタンバイ・データベース間でOracle Data Guardスイッチオーバーを実行します。
      Oracle Data Guard概要および管理を参照してください。
      新しいプライマリ・データベースで次のステップを実行します。
    2. PDBの暗号化された表から選択します。
      Oracle Key Vaultへの自動オープン接続があるため、次の問合せではOracle Key Vaultパスワードを入力する必要がありません。
      SELECT COUNT(*), OWNER FROM SYSTEM.TEST 
      GROUP BY OWNER 
      ORDER BY 1 DESC;
      
      24 rows selected.
    3. PDBのキーを更新します。
      SELECT ' ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG '''||UPPER(SYS_CONTEXT('USERENV', 'CON_NAME'))||' '||TO_CHAR (SYS_EXTRACT_UTC (SYSTIMESTAMP), 
      'YYYY-MM-DD HH24:MI:SS"Z"')||''' 
      FORCE KEYSTORE 
      IDENTIFIED BY EXTERNAL STORE;' 
      AS "RE-KEY COMMAND" FROM DUAL;
    4. このSELECT文の生成済出力を実行します。
      たとえば:
      ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG 'pdb_name date time' 
      IDENTIFIED BY EXTERNAL STORE;
    5. Oracle Data Guardスイッチオーバーをさらに実行します。
      Oracle Data Guard概要および管理を参照してください。
    6. PDBの暗号化された表から選択します。
      Oracle Key Vaultへの自動オープン接続があるため、次の問合せではOracle Key Vaultパスワードを入力する必要がありません。
      SELECT COUNT(*), OWNER FROM SYSTEM.TEST 
      GROUP BY OWNER 
      ORDER BY 1 DESC;
      
      24 rows selected.
    7. PDBのキーを更新します。
      SELECT ' ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG '''||UPPER(SYS_CONTEXT('USERENV', 'CON_NAME'))||' '||TO_CHAR (SYS_EXTRACT_UTC (SYSTIMESTAMP), 
      'YYYY-MM-DD HH24:MI:SS"Z"')||''' 
      FORCE KEYSTORE 
      IDENTIFIED BY EXTERNAL STORE;' 
      AS "RE-KEY COMMAND" FROM DUAL;
    8. このSELECT文の生成済出力を実行します。
      たとえば:
      ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG 'pdb_name date time' 
      IDENTIFIED BY EXTERNAL STORE;

6.3 透過的データ暗号化とOracle Real Application Clustersとの連携

Oracle Real Application Clusters (Oracle RAC)ノードでは、ソフトウェア・キーストアと外部キーストアの両方を共有できます。

6.3.1 Oracle Real Application Clustersでの透過的データ暗号化の使用について

Oracleは、Oracle Real Application Clusters (Oracle RAC)の共有ソフトウェア・キーストア、つまり、クラスタ・インスタンス間で共有されるOracle Key Vault内の共通の仮想ウォレットを必要とします。

Oracle Key Vaultを使用するTDE構成では、データベースの各インスタンスから外部キー・マネージャへのネットワーク接続が使用されます。Oracle Key Vaultでは、Oracle RAC対応データベースのインスタンスごとに1つのエンドポイントを作成し、Oracle RAC対応データベースごとに1つの仮想ウォレットを作成する必要があります。次に、その仮想ウォレットを、そのデータベースに属するすべてのエンドポイントのデフォルト・ウォレットにします。Oracle RAC対応のData Guard構成では、すべてのインスタンス(プライマリおよびすべてのスタンバイ・データベース)で1つの仮想ウォレットが共有されます。この構成では、関連するすべてのインスタンスが自動的に同期されるため、キー設定操作とキー更新操作は完全に透過的に行われます。これにより、クラスタ内のその他の各ノードにソフトウェア・キーストアを手動でコピーする必要がなくなります。

Oracleでは、Oracle RACノードごとの個別のTDEウォレットの使用はサポートされていません。かわりに、Oracle RAC環境でTDE用の共有ウォレットを使用してください。これによってすべてのインスタンスが、同じ共有ソフトウェア・キーストアにアクセスできます。対象の環境でOracle Automatic Storage Management Cluster File System (Oracle ACFS)を使用している場合は、これが共有ウォレットの推奨される場所です。Oracle ACFSを使用できない場合は、Oracle Automatic Storage Management (Oracle ASM)でウォレットを直接共有する(+DATA/$ORACLE_UNQNAME/WALLETSなど)という方法もあります。

キーストア操作(キーストアの開閉、TDEマスター暗号化キーのキー更新など)は、任意の1つのOracle RACインスタンスで実行可能です。内部的には、Oracleデータベースにより、各Oracle RACノードでキーストアのコンテキストが同期されます。こうすることで、キーストア操作の結果が、クラスタ内の他のすべてのOracle RACインスタンスに表示されます。同様に、TDEマスター暗号化キーのキー更新操作が実行されると、新しいキーが各Oracle RACインスタンスで使用可能になります。TDEマスター暗号化キーのエクスポート、キーストアのパスワードのローテーション、キーストアのマージ、キーストアのバックアップを含む他のキーストア操作なども、1つのインスタンスのみから実行できます。

共有ファイル・システムを使用する場合は、すべてのOracle RACインスタンスのsqlnet.oraファイルにおけるENCRYPTION_WALLET_LOCATIONパラメータ設定が、必ず同じ共有ソフトウェア・キーストアの場所を指すようにします。また、適切なディレクトリ権限を割り当てることによって、共有ソフトウェア・キーストアのセキュリティを確保する必要もあります。

ノート:

Oracle Real Application Clusters (Oracle RAC)インスタンスごとの個別のウォレットでのTDEマスター暗号化キーの格納はサポートされていません。かわりに、オンプレミスまたはクラウドベースのデータベース・デプロイメント、Oracle Automatic Storage Management (Oracle ASM)またはOracle ASM Cluster File System (Oracle ACFS)間の集中キー管理用のOracle Key Vaultを使用してローカル共有ウォレットを提供します。

6.3.2 Oracle Real Application ClustersにおけるOracle Key Vault用のTDEの構成

Oracle Exadata Cloud at Customer (ExaCC)およびその他のサーバーのOracle Real Application Clusters (Oracle RAC)でTDEを、Oracle Key Vaultによって実現される一元管理されたキー管理のために構成できます。

次のシナリオでは、マルチテナント2ノードOracle RAC構成があると想定しています。この手順では、示されている順序で次のステップを実行する必要があります。この手順を完了すると、Oracle RAC環境では、透過的データ暗号化のキー管理のためにOracle Key Vaultのみが使用されます。この手順では、Oracle Databaseリリース12.2.0.1の2020年1月以降のアップグレードがインストール済であることを前提としています。
開始する前に、実行中のOracle RACデータベースのアラート・ログを監視します。デフォルトのOracle Databaseリリース12.2.0.1インストールに含まれているJavaバージョンを使用すると、RESTfulサービスを備えたOracle Key Vaultクライアントをインストールできます。RESTful APIのprovisionコマンドには、OracleデータベースのJavaホームを指す/usr/bin/java内のシンボリック・リンクが必要です。たとえば:
# ln -sv $ORACLE_HOME/jdk/jre/java /usr/bin/java
  1. データベース管理者がOracleデータベースをOracle Key Vaultに自動的に登録できるように、Oracle Key Vault管理者が準備したOracle Key Vaultデプロイメント・スクリプトをダウンロードします。
    Oracleデータベースをエンドポイントとして自動的に登録するスクリプトの作成方法の例は、Oracle Key Vault RESTfulサービス管理者ガイドを参照してください。デプロイメント・スクリプトは、データベース管理者がダウンロードできる共有ファイル・システムにあります。これらのデプロイメント・スクリプトには2つの異なるバージョンがあります。1つのスクリプトは最初のノード(このプロシージャではリード・ノードと呼ばれます)のみを対象とし、もう1つのスクリプトはその他のすべてのノード(このプロシージャではセカンダリ・ノードと呼ばれます)を対象としています。これらのスクリプトは、Oracle RACまたはOracle Data Guard環境に使用できます。
    Oracle Key Vault管理者が準備してデプロイメント・スクリプトに追加する別のコンポーネントは、Oracle Key Vaultに接続するデプロイメント・スクリプトのすべての詳細を含む構成ファイルです。
  2. データベース管理者が共有の場所からダウンロードするためにOracle Key Vault管理者が作成した2つのデプロイメント・スクリプト(primary.zipおよびsecondary.zip)をコピーします。
    1. primary.zipファイルをリード・ノードにコピーします。
      $ scp user@ip_address:/path/to/file/primary.zip .
    2. secondary.zipファイルを各セカンダリ・ノードにコピーします。
      $ scp user@ip_address:/path/to/file/secondary.zip .
  3. zipファイルを解凍します。
    1. リード・ノード: primary.zipファイルを解凍します。
      $ unzip primary.zip
    2. セカンダリ・ノード: secondary.zipファイルを解凍します。
      $ unzip secondary.zip
  4. すべてのノードで次のディレクトリを作成します。
    たとえば:
    $ mkdir -pv /u01/opt/oracle/product/okv 
    $ mkdir -pv /u01/opt/oracle/product/tde 
    $ mkdir -pv /u01/opt/oracle/product/tde_seps

    ここでは次のように指定します。

    • /u01/opt/oracle/product/okvOracle_Key_Vault_installation_directoryです。.
    • /u01/opt/oracle/product/tdeには、将来のOracle Key Vaultパスワードのみを含む自動ログイン・ウォレットが格納され、自動ログインのOracle Key Vault構成が有効になります。
    • /u01/opt/oracle/product/tde_sepsには自動ログイン・ウォレットが格納され、このウォレットには将来のOracle Key Vaultパスワードのみが含まれるので、Oracle Key Vaultパスワードをデータベース管理者に対して非表示にすることが可能になります。静的パラメータEXTERNAL_KEYSTORE_CREDENTIAL_LOCATION/u01/opt/oracle/product/tde_sepsディレクトリに設定します。
  5. primary-run-me.shおよびsecondary-run-me.shスクリプトを実行します。これらのスクリプトには、Oracle Key VaultでRESTful APIが実行するコマンドが含まれています。
    Oracle Key Vault RESTfulサービスがこれらのコマンドを実行し、一意のウォレットおよびエンドポイント名でこのデータベースをOracle Key Vaultに登録します。
    1. リード・ノード: このスクリプトは、Oracle Key Vaultで共有ウォレット(リードとすべてのセカンダリ・ノード用)およびエンドポイントを作成し、リード・ノード用のこのエンドポイントを共有ウォレットに関連付け、Oracle Key Vaultクライアントをダウンロードして既存のインストール・ディレクトリにインストールします。
      $ more primary-run-me.sh
      #!/bin/bash
      export EP_NAME=${ORACLE_SID^^}_on_$(hostname -s)
      export WALLET_NAME=${ORACLE_UNQNAME^^}${HOSTNAME//[!0-9]/}
      curl -Ok https://192.168.1.181:5695/okvrestclipackage.zip --tlsv1.2
      unzip -Voj okvrestclipackage.zip lib/okvrestcli.jar -d ./lib
      cat > /home/oracle/deploy-OKV.sh << EOF
      #!/bin/bash
      okv manage-access wallet create --wallet ${WALLET_NAME} --unique FALSE
      okv admin endpoint create --endpoint ${EP_NAME} --description "$(hostname -f) $(hostname -i)" --subgroup "USE CREATOR SUBGROUP" --unique FALSE
      okv admin endpoint update --endpoint ${EP_NAME} --strict-ip-check TRUE
      okv manage-access wallet set-default --wallet ${WALLET_NAME} --endpoint ${EP_NAME}
      expect << _EOF
          set timeout 120
          spawn okv admin endpoint provision --endpoint ${EP_NAME} --location /etc/ORACLE/KEYSTORES/${ORACLE_UNQNAME^^}/okv --auto-login FALSE
          expect "Enter Oracle Key Vault endpoint password: "
          send "change-on-install\r"
          expect eof
      _EOF
      EOF
    2. セカンダリ・ノード: このスクリプトは、セカンダリ・ノードのエンドポイントのみを作成し、セカンダリ・ノードのエンドポイントを共有ウォレットに関連付けて、Oracle Key Vaultクライアントをダウンロードして各セカンダリ・ノードの既存のインストール・ディレクトリにインストールします。
      $ more run-me.sh
      #!/bin/bash
      export EP_NAME=${ORACLE_SID^^}_on_$(hostname -s)
      export WALLET_NAME=${ORACLE_UNQNAME^^}${HOSTNAME//[!0-9]/}
      curl -Ok --tlsv1.2 https://<OKV-IP-addr>:5695/okvrestclipackage.zip
      unzip -Voj okvrestclipackage.zip lib/okvrestcli.jar -d ./lib
      cat > /home/oracle/deploy-OKV.sh << EOF
      #!/bin/bash
      okv admin endpoint create --endpoint ${EP_NAME} --description "$(hostname -f) $(hostname -i)" --subgroup "USE CREATOR SUBGROUP" --unique FALSE
      okv admin endpoint update --endpoint ${EP_NAME} --strict-ip-check TRUE
      okv manage-access wallet set-default --wallet ${WALLET_NAME} --endpoint ${EP_NAME}
      expect << _EOF
          set timeout 120
          spawn okv admin endpoint provision --endpoint ${EP_NAME} --location /etc/ORACLE/KEYSTORES/${ORACLE_UNQNAME^^}/okv --auto-login FALSE
          expect "Enter Oracle Key Vault endpoint password: "
          send "change-on-install\r"
          expect eof
      _EOF
      EOF
  6. すべてのセカンダリ・ノードが、リード・ノードによって作成されるOracle Key Vault内の共有ウォレットの存在に依存するため、最初にリード・ノードでRESTful APIを実行します。
    $ java -jar okvrestservices.jar -c config.ini

    次のような出力が表示されます。

    [Line 1 OK] [CREATE WALLET] [3E48990A-82A0-48BC-ACEC-FF80CB380D38]
    [Line 2 OK] [CREATE ENDPOINT] [6FA40F80-558C-456A-84E3-25AE73B245DD]
    [Line 3 OK] [SET DEFAULT WALLET] [FINRAC1_on_rac122a:FINRAC]
    [Line 4 OK] [GET ENROLLMENT TOKEN] [FINRAC1_on_rac122a]
    The endpoint software for Oracle Key Vault installed successfully.
    [Line 4 OK] [PROVISION] 
    [Line 4 OK] [CLEANUP] 

    ウォレットのUUIDを書き留めます(これは、行1に表示され、boldで表示されます)。

    このコマンドをリード・ノードで実行した後、すべてのセカンダリ・ノードで実行します。

  7. Oracle Key Vaultクライアントが正常にインストールされた後、root.shスクリプトを実行して、すべてのノードにPKCSライブラリをインストールします。
    # Oracle_Key_Vault_installation_directory/bin/root.sh

    次の出力が表示されます。

    Creating directory: /opt/oracle/extapi/64/hsm/oracle/1.0.0/
    Copying PKCS library to /opt/oracle/extapi/64/hsm/oracle/1.0.0/
    Setting PKCS library file permissions
  8. すべてのノードでOracle Key Vault okvutil changepwdコマンドを実行して、インストールしたOracle Key Vaultクライアントのパスワードを変更します。
    すべてのデータベース管理者が同じデプロイメント・スクリプトをダウンロードしたため、すべてのデータベースのパスワードがOracle Key Vaultで同じになります。このステップにより、各データベースが一意のパスワードを持つようになります。
    $ Oracle_Key_Vault_installation_directory/bin/okvutil changepwd -t wallet -l Oracle_Key_Vault_installation_directory/ssl/
    
    Enter wallet password: default_password
    Enter new wallet password: Oracle_Key_Vault_password
    Confirm new wallet password: Oracle_Key_Vault_password
    Wallet password changed successfully
  9. すべてのノードで、ローカル自動ログイン・ウォレットにOracle Key Vaultパスワードを追加して、Oracle Key Vaultパスワードをデータベース管理者に対して非表示にします。
    ADMINISTER KEY MANAGEMENT ADD SECRET 'Oracle_Key_Vault_password' 
    FOR CLIENT 'OKV_PASSWORD' 
    TO LOCAL AUTO_LOGIN KEYSTORE '/u01/opt/oracle/product/tde_seps';
    

    任意のノードで次の文を1回実行します。

    ALTER SYSTEM SET EXTERNAL_KEYSTORE_CREDENTIAL_LOCATION='/u01/opt/oracle/product/tde_seps' 
    SCOPE = SPFILE SID = '*';
  10. すべてのインスタンスのsqlnet.oraファイルに、暗号化ウォレットの場所を追加します。
    ENCRYPTION_WALLET_LOCATION =
        (SOURCE = (METHOD = OKV))
  11. ORACLE_BASEおよびORACLE_UNQNAMEの環境変数をsrvctlに追加します。
    任意のノードでこのコマンドを実行します。
    $ srvctl setenv database -db database_name -t "ORACLE_UNQNAME=database_name, ORACLE_BASE=/u01/opt/oracle"
  12. データベースを再起動します。
    任意のノードでこのコマンドを実行します。
    $ srvctl stop database -db database_name -o immediate 
    $ srvctl start database -db database_name
  13. オプションで、Oracleパッチ30398099を適用した後で、データベースのデフォルトの暗号化アルゴリズムを定義します。
    デフォルトでは、Oracle Databaseは、暗号化アルゴリズムを指定しない暗号化句にAES128アルゴリズムを適用します。パッチ30398099では、AES128AES192およびAES256の各暗号化アルゴリズムから選択できます。このパッチを適用した場合は、次のコマンドを実行して暗号化句を設定できます。
    ALTER SYSTEM SET "_TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM" = 'encryption_algorithm' 
    SCOPE = BOTH SID = '*';
  14. ルート・コンテナでキーストアを開くと、ルート・コンテナおよびすべてのオープンPDBを対象としたOracle Key Vaultへの接続が開きます。
    データベースでは、ステップ8ですべてのノードに作成したローカル自動ログイン・ウォレットからOracle Key Vaultパスワードが自動的に取得されるため、Oracle Key Vaultのパスワードは、その後のすべてのADMINISTER KEY MANAGEMENTコマンドでEXTERNAL STOREに置換されていることに注意してください。
    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN
    IDENTIFIED BY EXTERNAL STORE 
    CONTAINER = ALL;
  15. ルート・コンテナで、マスター暗号化キーを設定します。
    ADMINISTER KEY MANAGEMENT SET KEY 
    IDENTIFIED BY EXTERNAL STORE 
    CONTAINER = CURRENT;

    EXTERNAL STORE句は、SQL*PlusコマンドラインのOracle Key Vaultパスワードを置き換えてデータベース管理者に対して非表示にし、データベース管理者とOracle Key Vault管理者の業務分離を可能にします。

  16. このコンテナ内のすべてのPDBでタグ付きマスター暗号化キーを作成し、アクティブ化します。
    タグ付きマスター暗号化キーをPDBに追加する利点は、特定のPDBに属するキーを簡単に識別できることです。
    1. 各PDBに接続し、次のSELECT文を実行して、PDBのマスター暗号化キーのタグとしてPDB名とタイムスタンプを含むADMINISTER KEY MANAGEMENTコマンドを作成します。
      CONNECT C##SEC_ADMIN@pdb_name AS SYSKM
      Enter password: password
      
      SELECT ' ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG '''||SYS_CONTEXT('USERENV', 'CON_NAME')||' '|| 
      TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI:SS')||''' 
      IDENTIFIED BY EXTERNAL STORE;' "SET KEY COMMAND" FROM DUAL;
    2. このSELECT文の生成済出力を実行します。
      たとえば:
      ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG 'pdb_name date time' 
      IDENTIFIED BY EXTERNAL STORE;
  17. すべてのノードで、自動ログイン・ウォレットにOracle Key Vaultパスワードを追加し、Oracle Key Vaultへの自動ログイン接続を有効にします。
    Oracle RACでは、このステップは必須です。自動ログイン接続をOracle Key Vaultに含めることは、Oracle RACノードが自動的に再起動される場合(たとえば、opatchautoパッチ・ツールを使用して四半期ごとのリリース・アップグレードを適用する場合)に特に重要です。
    ADMINISTER KEY MANAGEMENT ADD SECRET 'Oracle_Key_Vault_password' 
    FOR CLIENT 'HSM_PASSWORD' 
    TO LOCAL AUTO_LOGIN KEYSTORE '/u01/opt/oracle/product/tde';
    
  18. CREATE TABLESPACEコマンドに暗号化句が含まれていない場合でも、AES128アルゴリズム(またはステップ13で指定したアルゴリズム)を使用して新しい表領域を常に暗号化するように、データベースのデフォルトの動作を変更します。
    任意のノードでこの文を1回実行します。
    ALTER SYSTEM SET ENCRYPT_NEW_TABLESPACES = ALWAYS SCOPE = BOTH SID = '*';
  19. 両方のインスタンスで、次の例のようにsqlnet.oraを変更します。
    ENCRYPTION_WALLET_LOCATION =
       (SOURCE = (METHOD = OKV)
         (METHOD_DATA =
          (DIRECTORY = /u01/opt/oracle/product/tde)))
  20. PDBにログインし、表領域を作成します。たとえば、protectedという名前の表領域を作成するには、次のようにします。
    CREATE TABLESPACE protected DATAFILE SIZE 50M;
  21. 暗号化句が省略されていても、表領域が暗号化されていることを確認します。
    SELECT C.NAME AS pdb_name, T.NAME AS tablespace_name, E.ENCRYPTIONALG AS ALG 
    FROM V$TABLESPACE T, V$ENCRYPTED_TABLESPACES E, V$CONTAINERS C 
    WHERE E.TS# = T.TS# AND E.CON_ID = T.CON_ID AND E.CON_ID = C.CON_ID 
    ORDER BY E.CON_ID, T.NAME;
    
  22. 作成した暗号化済の表領域に、表を作成します。
    たとえば:
    CREATE TABLE SYSTEM.test TABLESPACE protected 
    AS SELECT * FROM DBA_OBJECTS;
  23. この表から選択して、暗号化データを読み取れることを確認します。
    SELECT COUNT(*), OWNER FROM SYSTEM.test 
    GROUP BY OWNER 
    ORDER BY 1 DESC;
  24. PDBで、既存のアプリケーション表領域を暗号化します。
    暗号化アルゴリズムを省略すると、デフォルトのアルゴリズム(AES128またはステップ13で指定したアルゴリズム)が適用されます。
    ALTER TABLESPACE tablespace_name ENCRYPTION ONLINE ENCRYPT;
  25. オプションで、構成を検証します。
    1. Oracle Key Vaultへの自動ログインが機能していることを確認します。
      これは、データベースを再起動し、PDBにログインし、暗号化された表から選択することでテストできます。データベースを再起動するには:
      $ srvctl stop database -db database_name -o immediate
      $ srvctl start database -db database_name

      PDBにログインした後、SYSTEM.test表から選択します。

      SELECT COUNT(*), OWNER FROM SYSTEM.test 
      GROUP BY OWNER 
      ORDER BY 1 DESC;
    2. オープンしているすべてのPDBでマスター暗号化キーの再キー操作が成功していることを確認します。
      最初に、SYSKM管理権限を持つユーザーとして次のSELECT文を実行し、PDB名とタイムスタンプを含むADMINISTER KEY MANAGEMENTコマンドを作成します。
      SELECT ' ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG '''||SYS_CONTEXT('USERENV', 'CON_NAME')||' '|| 
      TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI:SS')||''' 
      FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE;' "RE-KEY COMMAND" FROM DUAL;

      次に、このSELECT文の生成済出力を実行します。

      ADMINISTER KEY MANAGEMENT SET KEY 
      USING TAG 'pdb_name date time' 
      FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE;
    3. protected表領域とその表testを削除します。
      DROP TABLESPACE protected
      INCLUDING CONTENTS AND DATAFILES;

6.4 透過的データ暗号化とSecureFilesとの連携

LOBが格納されるSecureFilesには、圧縮、重複除外および暗号化の3つの機能があります。

6.4.1 透過的データ暗号化およびSecureFilesについて

SecureFilesの暗号化では、LOBの暗号化機能を提供するためにTDEを使用します。

表を作成または変更する際に、SecureFiles記憶域を使用する必要があるSecureFiles暗号化やLOB列を指定できます。現在の透過的データ暗号化(TDE)構文を使用するか、またはLOB列に関するLOBパラメータの一部としてENCRYPT句を使用することによって、LOB列の暗号化を有効化できます。現在の構文またはLOBパラメータにおけるDECRYPTオプションによって、暗号化を無効化できます。

6.4.2 例: 特定の暗号化アルゴリズムを使用したSecureFiles LOBの作成

CREATE TABLE文によって、暗号化を指定してSecureFiles LOBを作成できます。

例6-1では、CREATE TABLE文でSecureFiles LOBを作成する方法を示しています。

例6-1 特定の暗号化アルゴリズムを使用したSecureFiles LOBの作成

CREATE TABLE table1 ( a BLOB ENCRYPT USING 'AES256')
    LOB(a) STORE AS SECUREFILE (
    CACHE
    );

6.4.3 例: 列パスワードを指定したSecureFiles LOBの作成

CREATE TABLE文によって、列パスワードを指定してSecureFiles LOBを作成できます。

例6-2では、暗号化された列に対してパスワード保護を使用するSecureFiles LOBの作成例を示しています。

LOB列のすべてのLOBが、同じ暗号化の指定で暗号化されます。

例6-2 列パスワードを指定したSecureFiles LOBの作成

CREATE TABLE table1 (a VARCHAR2(20), b BLOB)
    LOB(b) STORE AS SECUREFILE (
        CACHE
        ENCRYPT USING 'AES192' IDENTIFIED BY password
    );

6.5 透過的データ暗号化のマルチテナント環境での使用

マルチテナント環境では、実行できるTDE操作はrootにいるかPDBにいるかによって変わります。

6.5.1 マルチテナント環境における透過的データ暗号化の使用について

マルチテナント環境では、列と表領域の両方にTDEを使用できます。

次の点に注意してください。

  • 作成するキーストアは、特定のPDB内ではなくホストのマルチテナント環境に存在します。複数のPDBはこのホスト上で動作中に、単一のキーストアにアクセス可能です。暗号化を使用する各PDBには、このキーストアに格納されている透過的データ暗号化のTDEマスター暗号化キーがあります。

  • 各PDBには個別のTDEマスター暗号化キーがあります。PDB固有のキー管理のADMINISTER KEY MANAGEMENT文を使用して、PDB内でのみ各PDB用のTDEマスター暗号化キーを管理する必要があります。rootまたはPDBから、CDBにおけるPDBのTDEマスター暗号化キーについての情報を確認するために適切なビューを問合せできます。たとえば、V$ENCYRYPTION_KEYSビューのPDBID列は、TDEマスター暗号化キーが属するPDBを示しています。

  • 各PDBのキーストア内で、透過的データ暗号化のTDEマスター暗号化キーを個別に管理できます。各PDB向けのTDEマスター暗号化キーを、個別にローテーションできます。詳細は、TDEマスター暗号化キーのエクスポートおよびインポートを参照してください。

  • rootからキーストア操作の大部分を実行します。キーストア・パスワードのローテーションやキーストアのマージなどのキーストア操作は、rootで実行する必要があります。キーを開く、閉じる、リセットする、作成するなど、PDB内で実行できるキー管理の操作がいくつかあります。rootからすべてのPDBに操作を実行することもできます。適用可能な場合には、ADMINISTER KEY MANAGEMENT文にCONTAINER句があります。CONTAINER=ALLと設定すると、すべてのPDBにアクションが実行されます。

  • 自動ログイン・キーストアが(たとえば、ルートで)開いているか、キーストアが閉じている場合。このシナリオでは、次の操作の場合にADMINISTER KEY MANAGEMENT文にFORCE KEYSTORE句を含めます。キーストア・パスワードのローテーション。暗号化キーの作成、使用、キー更新、タグ付け、インポート、エクスポート、移行または逆移行。キーストアのオープンまたはバックアップ。シークレット・キーストアの追加、更新または削除。

  • マルチテナント環境では、パスワード用に外部ストアを使用できます。パスワードベースのソフトウェア・キーストアが外部ストアを使用するように構成している場合、次の操作の場合にADMINISTER KEY MANAGEMENT文にIDENTIFIED BY EXTERNAL STORE句を含めます。キーストアのバックアップ、オープンまたはクローズ。シークレット・キーストアの追加、更新または削除。暗号化キーの作成、使用、キー更新、タグ付け、インポートまたはエクスポート。

  • 透過的データ暗号化を使用するPDBを、新しいホスト・コンピュータに移動する予定の場合、TDEマスター暗号化キーも移動する必要があります。あるホスト・コンピュータから別のコンピュータにTDEマスター暗号化キーを移動するには、TDEマスター暗号化キーのエクスポートおよびインポートに記載されている手順を使用します。

6.5.2 rootで実行される必要がある操作

特定のADMINISTER KEY MANAGEMENTキーストア操作は、rootでのみ実行される必要があります。

操作は次のとおりです。

  • ADMINISTER KEY MANAGEMENT CREATE KEYSTORE文を使用したパスワードベースのソフトウェア・キーストアの作成

  • ADMINISTER KEY MANAGEMENT CREATE [LOCAL] AUTO_LOGIN KEYSTORE FROM KEYSTORE文を使用した自動ログインのソフトウェア・キーストアの作成

  • ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD文を使用したソフトウェア・キーストアのパスワードの変更

  • ADMINISTER KEY MANAGEMENT MERGE KEYSTORE文を使用したソフトウェア・キーストアのマージ

  • ADMINISTER KEY MANAGEMENT BACKUP KEYSTOREキーストアを使用したソフトウェア・キーストアのバックアップ

  • ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY ... MIGRATE USING文を使用したソフトウェア・キーストアから外部キーストアへの移行

  • ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY... REVERSE MIGRATE文の使用による外部キーストアからソフトウェア・キーストアへの逆移行

  • ADMINISTER KEY MANAGEMENT ADD|UPDATE|DELETE SECRET文を使用したシークレットの追加、更新および削除

  • 問合せまたは識別子リストに基づいた、キーの選択的なエクスポートおよびインポート

キーおよびキーストア操作に関するCONTAINER=ALL設定の動作状況

この項に記載されているキーおよびキーストア操作に関して、CONTAINER=ALL設定を指定できます。CONTAINER=ALL設定を指定することによって、CDB内のすべてのPDBで同じ操作が実行されます。rootでのみCONTAINER=ALL設定を使用できることに留意してください。CONTAINER句はオプションです。CONTAINER句を省略すると、デフォルトはCONTAINER = CURRENTになります。

許可されているCONTAINER=ALL操作は次のとおりです。

  • キーストアを開く。CONTAINER=ALL設定を使用してキーストアを開くと、関連するすべてのPDBのキーストアが開きます。

  • キーストアを閉じる。CONTAINER=ALL設定を使用してキーストアを閉じると、関連するすべてのPDBのキーストアが閉じます。

  • TDEマスター暗号化キーを作成する。CONTAINER=ALL設定を使用してTDEマスター暗号化キーを作成すると、開いているすべてのPDBにキーが作成されます。最近作成されたキーを確認するには、V$ENCRYPTION_KEYSビューのCREATION_TIME列を問い合せます。CONTAINER=ALL操作でタグの指定もできますが、この操作によってすべてのPDBのキーが同じタグで作成されることに注意してください。各TDEマスター暗号化キーに個別のタグを作成する必要があり、これは、エラー発生時にキー作成操作が成功したPDBがこのタグによって識別可能であるためです。ADMINISTER KEY MANAGEMENT SET TAG文を使用して、後でタグを変更できます。

  • キー更新操作を実行する。CONTAINER=ALL設定でキー更新操作を実行することによって、開いているすべてのPDBでキーが作成され、有効化されます。最近作成されたキーを確認するには、V$ENCRYPTION_KEYSビューのCREATION_TIME列を問い合せます。最近アクティブ化されたキーを確認するには、V$ENCRYPTION_KEYSビューのACTIVATION_TIME列を問い合せます。CONTAINER=ALL操作でタグの指定もできますが、この操作によってすべてのPDBのキーが同じタグで作成されることに注意してください。このタグは、エラー時にキー作成操作が成功したPDBの識別にも役立ちます。ADMINISTER KEY MANAGEMENT SET TAG文を使用して、後でタグを変更できます。

6.5.3 rootまたはPDBで実行可能な操作

rootまたはPDBのいずれかで、次の一部のキーストア操作を実行できます。

操作は次のとおりです。

  • ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN文を使用して、キーストアを開く

  • ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE文を使用して、キーストアを閉じる

rootまたはPDBのいずれかで、次のキー管理操作を実行できます。

  • ADMINISTER KEY MANAGEMENT SET TAG文を使用した、TDEマスター暗号化キーのタグの作成

  • ADMINISTER KEY MANAGEMENT CREATE KEY文を使用した、TDEマスター暗号化キーの作成

  • ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY文を使用した、TDEマスター暗号化キーの再設定またはローテーション

  • ADMINISTER KEY MANAGEMENT USE KEY文を使用した、TDEマスター暗号化キーのアクティブ化

  • ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS文を使用した、TDEマスター暗号化キーのエクスポート

  • ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS文を使用した、TDEマスター暗号化キーのインポート

6.5.4 あるCDBから別のCDBへのPDBの移動

暗号化されたPDBを同じコンテナ・データベース内またはコンテナ・データベース間でクローニングまたは再配置できます。

SYSTEMSYSAUXUNDOまたはTEMP表領域が暗号化されている非CDBまたはPDBを移動し、キーの手動エクスポートまたはインポートを使用する場合は、まずPDBを作成する前に、ターゲット・データベースのCDB$ROOTにある非CDBまたはPDBのキーをインポートする必要があります。キーをPDBに関連付けるには、PDB内でキーのインポートが再度必要です。

  • 次の構文を使用して非CDBまたはPDBをクローニングまたは再配置します:
    CREATE|RELOCATE PLUGGABLE DATABASE database_name KEYSTORE 
    IDENTIFIED BY EXTERNAL STORE|target_keystore_password NO REKEY;<

6.5.5 PDB向けのTDEマスター暗号化キーのエクスポートおよびインポート

ADMINISTER KEY MANAGEMENT EXPORTEXPORTおよびIMPORT句によって、PDB向けのTDEマスター暗号化キーをエクスポートまたはインポートできます。

6.5.5.1 PDB向けのTDEマスター暗号化キーのエクスポートおよびインポートについて

CDB以外のデータベースでこのキーをエクスポートおよびインポートする場合と同じ方法で、rootからTDEマスター暗号化キーをエクスポートおよびインポートできます。

PDB内からTDEマスター暗号化キーをエクスポートおよびインポートすることで、PDBに属するすべてのTDEマスター暗号化キーをエクスポートおよびインポートできます。PDBのTDEマスター暗号化キーのエクスポートおよびインポートでは、PDBのアンプラグとプラグ操作がサポートされます。PDBのアンプラグとプラグでは、PDBに属するすべてのTDEマスター暗号化キー、およびメタデータが対象になります。したがって、PDB内からキーをエクスポートする場合、ADMINISTER KEY MANAGEMENT EXPORT文のWITH IDENTIFIER句は許可されません。WITH IDENTIFIER句は、rootでのみ許可されます。

ルートに自動ログイン・キーストアがある場合、またはキーストアが閉じている場合は、FORCE KEYSTORE句を含める必要があります。キーストアがパスワードに外部ストアを使用するように構成されている場合、IDENTIFIED BY EXTERNAL STORE句を使用します。たとえば、このシナリオにおいてエクスポート操作を実行するには、次のようにします。

ADMINISTER KEY MANAGEMENT EXPORT KEYS WITH SECRET "my_secret"
TO '/etc/TDE/export.exp'
FORCE KEYSTORE IDENTIFIED BY EXTERNAL STORE;

このADMINISTER KEY MANAGEMENT EXPORT操作では、キーがエクスポートされるだけでなく、PDB環境(およびクローニング操作)に必要なメタデータも作成されます。

PDBの内部では、TDEマスター暗号化キーのエクスポート操作によって、キーがエクスポートされるPDBと同じGUIDを持つPDBにより作成またはアクティブ化されたキーがエクスポートされます。基本的に、エクスポートが実行されるPDBに属しているすべてのキーがエクスポートされます。

PDB内のエクスポート・ファイルからTDEマスター暗号化キーがインポートされるのは、そのTDEマスター暗号化キーが同じGUIDを持つ別のPDBからエクスポートされている場合のみです。CDBへのPDBのプラグインをサポートするため、インポートでは、WITH IDENTIFIER句なしでエクスポートされたCDB以外のTDEマスター暗号化キーを含むエクスポート・ファイルからもTDEマスター暗号化キーがインポートされます。PDB名やデータベースIDなどのPDB固有の詳細は、CDBごとに変化する可能性があるため、PDB固有の情報は、更新されたPDB情報を反映するようにインポート時に変更されます。

ノート:

PDB内では、PDB全体のキーのみエクスポートできます。問合せまたは識別子に基づいた選択的なエクスポート機能はrootに制限されています。

6.5.5.2 PDB向けのTDEマスター暗号化キーのエクスポートまたはインポート

ADMINISTER KEY MANAGEMENT文によって、PDB向けのTDEマスター暗号化キーをエクスポートまたはインポートできます。

  1. ADMINISTER KEY MANAGEMENTまたはSYSKM権限を付与されたユーザーとしてPDBにログインします。

    たとえば:

    sqlplus sec_admin@hr_pdb as syskm
    Enter password: password
    Connected.
    

    利用可能なPDBを検索するには、DBA_PDBSデータ・ディクショナリ・ビューを問い合せます。現在のPDBを確認するには、show con_nameコマンドを実行します。

  2. キーストアが開いていることを確認します。

    V$ENCRYPTION_WALLETビューのSTATUS列を問い合せると、キーストアが開いているかどうかを確認できます。ソフトウェア・キーストアを開く必要がある場合は、エクスポートまたはインポート操作を実行する際に、オプションでADMINISTER KEY MANAGEMENT文にFORCE KEYSTORE句を含めることができます。この句を使用すると、自動ログイン・キーストアまたはパスワードベースのキーストアを個別に開く必要なく、操作中にソフトウェア・キーストアを開くことができます。

    たとえば:

    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN FORCE KEYSTORE IDENTIFIED BY keystore_password;
  3. エクスポートまたはインポート操作を実行します。

6.5.5.3 例: PDBからTDEマスター暗号化キーをエクスポート

ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS文によって、PDBのTDEマスター暗号化キーをエクスポートできます。

例6-3では、PDB hr_pdb1からTDEマスター暗号化キーをエクスポートする方法を示しています。この例では、自動ログイン・キーストアが使用されているか、キーストアが閉じている場合に、FORCE KEYSTORE句が含められます。

例6-3 PDBからTDEマスター暗号化キーをエクスポート

sqlplus sec_admin@hr_pdb1 as syskm
Enter password: password
Connected.

ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET "my_secret" TO '/export.p12' FORCE KEYSTORE IDENTIFIED BY password_cdb1;
6.5.5.4 例: PDBにTDEマスター暗号化キーをインポート

ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS文によって、PDBにTDEマスター暗号化キーをインポートできます。

例6-4では、PDB hr_pdb2へTDEマスター暗号化キーをインポートする方法を示しています。

例6-4 PDBにTDEマスター暗号化キーをインポート

sqlplus sec_admin@hr_pdb2 as syskm
Enter password: password
Connected.

ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS WITH SECRET "my_secret" FROM '/tmp/export.p12' FORCE KEYSTORE IDENTIFIED BY password_cdb2 WITH BACKUP;

6.5.6 暗号化データのあるPDBをCDBでプラグおよびアンプラグ

暗号化されたデータのあるPDBを、CDBに追加またはCDBから削除できます。

6.5.6.1 暗号化データを含むPDBのアンプラグ

1つのCDBからPDBをアンプラグして、別のCDBにプラグインできます。

アンプラグされるデータベースには、データ・ファイルおよび他の関連ファイルが含まれています。各PDBには独自の一意のキーストアがあるため、アンプラグするPDBのTDEマスター暗号化キーをエクスポートする必要はありません。
6.5.6.2 暗号化データを含むPDBのCDBへのプラグイン

暗号化データを含むPDBをCDBにプラグインするには、まずPDBにプラグインしてから、その暗号化キーを構成します。

アンプラグされたPDBを別のCDBにプラグインする際、この操作は以前のキーの履歴を無効にするため、キー・バージョンは0に設定されます。キー・バージョンは、V$ENCRYPTED_TABLESPACES動的ビューのKEY_VERSIONを問い合せて確認できます。同様に、制御ファイルが失われ再作成された場合、以前のキーの履歴は0にリセットされます。
  1. Oracle Database管理者ガイドの説明に従って、アンプラグされたPDBをCDBにプラグインすることによって、PDBを作成します。

    プラグ操作後のPDBのオープン操作中に、Oracle DatabaseによってPDBに暗号化データが含まれるかどうかが判別されます。その場合、PDBはRESTRICTEDモードでオープンされます。PDBのオープン・モードの詳細は、Oracle Database管理者ガイドを参照してください。

    別のPDBをクローニングしてPDBを作成するか、非CDBからPDBを作成するときに、ソース・データベースに暗号化されたデータまたはキーストア・セットがある場合、CREATE PLUGGABLE DATABASE ... FROM SQL文のkeystore_password句によって識別されるキーストアを含めることによって、キーストアのパスワードを提供する必要があります。このパスワードは、ソース・データベースが自動ログイン・ソフトウェア・キーストアを使用している場合であっても指定する必要があります。ソース・データベースに暗号化されたデータまたはキーストアがあるかどうかについては、DBA_ENCRYPTED_COLUMNSデータ・ディクショナリ・ビューを問い合せて確認できます。

  2. TDEマスター暗号化キーをPDBにインポートします。

    PDB向けのTDEマスター暗号化キーのエクスポートおよびインポートを参照してください。

  3. Oracle Database管理者ガイドの説明に従って、PDBをクローズしてからPDBを再オープンします。

  4. キーストアを開きます。

    次の項を参照してください。

  5. PDBにTDEマスター暗号化キーを設定します。

    次のトピックを参照してください。

6.5.6.3 マスター・キーが外部キーストアに格納されているPDBのアンプラグ

外部キーストアを使用するように構成されたCDBからPDBをアンプラグした後、それを同様に外部キーストアを使用するように構成された別のCDBにプラグインできます。

  1. PDBをアンプラグします。
  2. ソースCDBで使用されていた外部キーストア内のアンプラグされたPDBのマスター・キーを、宛先CDBで使用中の外部キーストアに移動します。

関連項目:

PDBのアンプラグの詳細は、Oracle Database管理者ガイドを参照してください
6.5.6.4 マスター・キーが外部キーストアに格納されているPDBのプラグイン

ADMINISTER KEY MANAGEMENT文を使用すると、外部キーストアのマスター・キーを、別のCDBに移されたPDBにインポートできます。

  1. アンプラグされたPDBを、外部キーストアを使用するように構成された宛先CDBにプラグインします。
    プラグイン操作の後、プラグインされたPDBは制限モードになります。
  2. ソースCDBを使用するように構成されたHSMのマスター・キーが、宛先CDBの外部キーストアで使用可能であることを確認します。
  3. プラグされたPDBに、ADMINISTER KEY MANAGEMENTまたはSYSKM権限を付与されたユーザーとしてログインします。

    たとえば:

    sqlplus sec_admin@hr_pdb as syskm
    Enter password: password
    Connected.
    

    利用可能なPDBを検索するには、DBA_PDBSデータ・ディクショナリ・ビューを問い合せます。現在のPDBを確認するには、show con_nameコマンドを実行します。

  4. プラグされたPDBのマスター暗号化キーを開きます。

    たとえば、PDB1というPDBの場合は、次のようになります。

    ALTER SESSION SET CONTAINER = PDB1;
    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "keystore_passsword";
  5. 外部キーストアのマスター・キーをPDBにインポートします。
    ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS WITH SECRET "HSM" FROM 'HSM' IDENTIFIED BY "keystore_password"; 
  6. PDBを再起動します。
    ALTER PLUGGABLE DATABASE PDB1 CLOSE;
    ALTER PLUGGABLE DATABASE PDB1 OPEN;

関連項目:

PDBのプラグの詳細は、Oracle Database管理者ガイドを参照してください

6.5.7 暗号化データを含むクローニングされたPDBの管理

CDBで暗号化されたデータのあるPDBをクローニングできます。

6.5.7.1 暗号化データを含むクローニングされたPDBの管理について

PDBをクローニングする際、ソースPDBのマスター・キーをクローニングされたPDBが使用できるようにしておく必要があります。

これにより、クローニングされたPDBが暗号化データに対して操作を行うことができます。クローニングされたPDBがリモートのCDBにある場合であっても、Oracle Databaseがキーを転送するため、クローニングを実行するためにキーをエクスポートまたはインポートする必要はありません。ただし、クローンを作成するCDBのキーストア・パスワードは指定する必要があります。

6.5.7.2 CDBでの暗号化データを含むPDBのクローニング

KEYSTORE IDENTIFIED BY句を含むCREATE PLUGGABLE DATABASE文によって、暗号化データを含むPDBをクローニングできます。

  1. ADMINISTER KEY MANAGEMENTまたはSYSKM権限を付与されたユーザーとしてルートにログインします。

    たとえば:

    sqlplus c##sec_admin as syskm
    Enter password: password
    Connected.
    
  2. クローニングを計画しているPDBのソフトウェア・キーストアが開いていることを確認します。

    V$ENCRYPTION_WALLETビューのSTATUS列を問い合せると、ソフトウェア・キーストアが開いているかどうかを確認できます。

    たとえば:

    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN FORCE KEYSTORE IDENTIFIED BY keystore_password;
  3. PDBをクローニングするには、CREATE PLUGGABLE DATABASE文をKEYSTORE IDENTIFIED BY句を指定して使用します。

    たとえば:

    CREATE PLUGGABLE DATABASE cdb1_pdb3 FROM cdb1_pdb1 FILE_NAME_CONVERT=('cdb1_pdb1', 'pdb3/cdb1_pdb3') KEYSTORE IDENTIFIED BY "keystore_password";

    keystore_passwordcdb1_pdb3クローンが作成されるCDBのキーストアのパスワードに置き換えます。

    クローニングされたPDBの作成後、暗号化データは、元のPDBのマスター暗号化キーを使用して、クローンにより引き続きアクセスできます。PDBがクローニングされた後、暗号化された表領域にユーザー・データがある場合があります。この暗号データは、ソースPDBのマスター・キーが宛先PDBにコピーされているため、引き続きアクセスできます。クローンはソースPDBのコピーでありながらも、結局は独自の動作に従い、独自のデータおよびセキュリティ・ポリシーがあるため、クローニングされたPDBのマスター・キーをキー更新する必要があります。
  4. クローニングされたPDBのマスター・キーをキー更新(ローテーション)します。

    たとえば:

    ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY keystore_password WITH BACKUP USING 'emp_key_backup';
    クローニングされたPDBのマスター・キーをキー更新する前に、クローンは引き続き元のPDBに属したマスター暗号化キーを使用できます。ただし、これらのマスター・キーはクローニングされたPDBのV$動的ビューには表示されません。マスター・キーをキー更新すると、クローニングされたPDBが独自の一意のキーを使用するようにでき、これはV$ビューで表示できます。
6.5.7.3 TDE Academyビデオ: 暗号化されたPDBのリモートでのクローニングおよびアップグレード

6.5.8 マルチテナント環境でのキーストアの開閉操作の機能

マルチテナント環境でキーストアの開閉操作がどのように機能するかを知っておく必要があります。

マルチテナント環境の各PDBについては、透過的データ暗号化の操作を続行できるように、PDBにおいてパスワードベースのソフトウェア・キーストアまたは外部キーストアを明示的に開く必要があります。(自動ログイン・ソフトウェア・キーストアおよびローカル自動ログイン・ソフトウェア・キーストアは自動的に開きます。)PDBのキーストアを閉じることによって、PDBのすべての透過的データ暗号化操作がブロックされます。

CDBにおいて、PDBにおけるキーストア操作の開閉操作は、rootにおけるキーストアの開閉状態に依存します。

次の点に注意してください。

  • マルチテナント環境では、各PDBについて個別のキーストア・パスワードを作成できます。

  • 個々のPDBにおいてパスワードベースのソフトウェア・キーストアまたは外部キーストアを手動で開くには、事前にrootでそのキーストアを開いている必要があります。

  • 自動ログイン・キーストアが使用されているか、キーストアが閉じている場合は、キーストアを開くまたは閉じるときに、ADMINISTER KEY MANAGEMENT文にFORCE KEYSTORE句を含めます。

  • キーストアが、パスワード用に外部ストアを使用するパスワードベースのソフトウェア・キーストアの場合、EXTERNAL STOREIDENTIFIED BY句を設定します。

  • 個々のPDBでTDEマスター暗号化キーを設定する前に、rootでキーを設定する必要があります。

  • (自動ログイン・ソフトウェア・キーストアおよびローカル自動ログイン・ソフトウェア・キーストアは自動的に開きます。)これらを最初にrootからまたはPDBから、手動で開く必要はありません。

  • rootでキーストアを閉じると、これに依存するPDBのキーストアも閉じられます。rootにおいてキーストアを閉じる操作は、CONTAINER句がALLに設定されていてキーストアを閉じる操作を実行することと同等です。

  • rootでキーストアを開いてCONTAINERALLに設定すると、これに依存するPDBのキーストアも開きます。

6.5.9 マルチテナント環境のすべてのPDBのキーストアのステータスの確認

V$ENCRYPTION_WALLETビューを使用する便利なファンクションを作成して、CDBにおけるすべてのPDBのキーストアのステータスを確認できます。

V$ENCRYPTION_WALLETビューでは、PDB内のキーストアのステータス(それが開いているか、閉じているか、ソフトウェア・キーストアまたは外部キーストアのどちらを使用しているかなど)が表示されます。

  • V$ENCRYPTION_WALLETビューを使用してキーストアのステータスを検出するファンクションを作成するには、CREATE PROCEDURE PL/SQL文を使用します。

例6-5では、このファンクションを作成する方法を示しています。

例6-5 CDBにおけるすべてのPDBに関するキーストアのステータスを確認するファンクション

CREATE OR REPLACE PROCEDURE all_pdb_v$encryption_wallet
IS
    err_occ            BOOLEAN;
    curr_pdb           VARCHAR2(30);
    pdb_name           VARCHAR2(30);
    wrl_type           VARCHAR2(20);
    status             VARCHAR2(30);
    wallet_type        VARCHAR2(20);
    wallet_order       VARCHAR2(12);
    fully_backed_up    VARCHAR2(15);
    wrl_parameter      VARCHAR2(4000);
    cursor sel_pdbs IS SELECT NAME FROM V$CONTAINERS
                       WHERE NAME <> 'PDB$SEED' order by con_id desc;
  BEGIN
 
    -- Store the original PDB name
    SELECT sys_context('userenv', 'con_name') INTO curr_pdb FROM DUAL;
    IF curr_pdb <> 'CDB$ROOT' THEN
      dbms_output.put_line('Operation valid in ROOT only');
    END IF;
 
    err_occ := FALSE;
    dbms_output.put_line('---');
    dbms_output.put_line('PDB_NAME                       WRL_TYPE STATUS                        ');
    dbms_output.put_line('------------------------------ -------- ------------------------------');
    dbms_output.put_line('WALLET_TYPE          WALLET_ORDER FULLY_BACKED_UP');
    dbms_output.put_line('-------------------- ------------ ---------------');
    dbms_output.put_line('WRL_PARAMETER');
    dbms_output.put_line('--------------------------------------------------------------------------');
    FOR pdbinfo IN sel_pdbs LOOP
 
      pdb_name := DBMS_ASSERT.ENQUOTE_NAME(pdbinfo.name, FALSE);
      EXECUTE IMMEDIATE 'ALTER SESSION SET CONTAINER = ' || pdb_name;
 
      BEGIN
        pdb_name := rpad(substr(pdb_name,1,30), 30, ' ');
        EXECUTE IMMEDIATE 'SELECT wrl_type from V$ENCRYPTION_WALLET' into wrl_type; 
        wrl_type := rpad(substr(wrl_type,1,8), 8, ' ');
        EXECUTE IMMEDIATE 'SELECT status from V$ENCRYPTION_WALLET' into status;
        status := rpad(substr(status,1,30), 30, ' ');
        EXECUTE IMMEDIATE 'SELECT wallet_type from V$ENCRYPTION_WALLET' into wallet_type;
        wallet_type := rpad(substr(wallet_type,1,20), 20, ' ');
        EXECUTE IMMEDIATE 'SELECT wallet_order from V$ENCRYPTION_WALLET' into wallet_order;        
        wallet_order := rpad(substr(wallet_order,1,9), 12, ' ');
        EXECUTE IMMEDIATE 'SELECT fully_backed_up from V$ENCRYPTION_WALLET' into fully_backed_up;
        fully_backed_up := rpad(substr(fully_backed_up,1,9), 15, ' ');
        EXECUTE IMMEDIATE 'SELECT wrl_parameter from V$ENCRYPTION_WALLET' into wrl_parameter;
        wrl_parameter := rpad(substr(wrl_parameter,1,79), 79, ' ');
        dbms_output.put_line(pdb_name || ' ' || wrl_type || ' ' || status);
        dbms_output.put_line(wallet_type || ' ' || wallet_order || ' ' || fully_backed_up);
        dbms_output.put_line(wrl_parameter);
 
      EXCEPTION
        WHEN OTHERS THEN
        err_occ := TRUE;
      END;
    END LOOP;
 
    IF err_occ = TRUE THEN
       dbms_output.put_line('One or more PDB resulted in an error');
    END IF;
  END;
.
/
set serveroutput on
exec all_pdb_v$encryption_wallet;

6.6 透過的データ暗号化とOracle Call Interfaceとの連携

透過的データ暗号化は、Oracle Call Interface (OCI)の動作に影響しません。

多くの実用的な目的のために、TDEは行の受渡し機能を除き、OCIに対して透過的です。行を使用可能にするキーは受信ポイントでは使用できないため、OCIの行の受渡し機能をTDEで使用できません。

6.7 透過的データ暗号化とエディションとの連携

透過的データ暗号化は、Oracle Databaseのエディション機能に影響しません。

多くの実用的な目的のために、TDEはエディションに対して透過的です。表は常に非エディション化オブジェクトです。TDEの列暗号化によって、表の列が暗号化されます。エディションは、TDEの表領域の暗号化によって影響されません。

6.8 マルチデータベース環境で機能するように透過的データ暗号化を構成

同じサーバー上の各Oracle Database (同じOracleバイナリを共有しているが異なるデータ・ファイルを使用しているデータベースなど)は、それぞれ独自のTDEキーストアにアクセスする必要があります。

キーストアは、データベース間で共有されるようには設計されていません。設計によって、データベースごとに1つのキーストアが必要となっています。複数のデータベースには同じキーストアを使用できません。

  • 複数データベース環境に対してsqlnet.oraファイルを構成するには、次のオプションを使用します。

    • オプション1: データベースが同じOracleホームを共有する場合、sqlnet.oraファイルをデフォルトの場所(ORACLE_HOME/network/adminディレクトリ)に保持します。

      この場合、デフォルトの場所を使用することをお薦めします。sqlnet.oraファイルに、WALLET_LOCATIONまたはENCRYPTION_WALLET_LOCATIONエントリがないことを確認します。これらの2つのエントリがsqlnet.oraファイルにない場合、透過的データ暗号化は、デフォルトのsqlnet.oraの場所からキーストアにアクセスします。

    • オプション2: オプション1がご使用のサイトで実行可能な場合、ORACLE_SIDのような環境変数設定に基づき、キーストアの場所を指定できます。

      たとえば:

      ENCRYPTION_WALLET_LOCATION =
       (SOURCE =
        (METHOD = FILE)
         (METHOD_DATA =
          (DIRECTORY = /home/oracle/wallet/$ORACLE_SID)
      
    • オプション3: オプション1および2が実行可能でない場合、個別のsqlnet.oraファイルを各データベースにつき1つ使用します。TNS_ADMIN環境変数が、正しいデータベース構成を指すように正確に設定されていることを確認します。

注意:

他のデータベースからキーストアを使用することによって、データの一部または全部が失われる可能性があります。

関連項目:

TNS_ADMIN変数の設定例の詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください