IBM Cloud Docs
Hyper Protect Crypto Services PKCS #11 for Oracle Transparent Database Encryption の使用

Hyper Protect Crypto Services PKCS #11 for Oracle Transparent Database Encryption の使用

透過的データ暗号化 (TDE) とは、データベース内の機密データを暗号化するための確立されたテクノロジーです。 TDE は、Oracle® データベースのように、クラウドとオンプレミスの両方で、さまざまな一般的なデータベース・システムによってサポートされます。 TDE を使用すると、データベース・システムが、データベース・ストレージ・メディア (表スペースやファイルなど) およびバックアップ・メディアのデータを暗号化します。 許可されたユーザーとアプリケーションがデータを使用するときに、データベース・システムがデータの暗号化と復号を自動的かつ透過的に行います。 データベース・ユーザーが TDE を認識する必要はなく、また、データベース・アプリケーションを TDE のために特に調整する必要もありません。

通常、TDE では、TDE マスター暗号化鍵と TDE データ暗号化鍵という 2 階層で構成される鍵階層が使用されます。 TDE データ暗号化鍵がデータの暗号化と復号に使用され、TDE マスター暗号化鍵が TDE データ暗号化鍵の暗号化と復号に使用されます。

そのため、TDE を計画するときには、「TDE マスター暗号鍵をどこに保管し、どのように保護するか」が重要な問題の 1 つになります。

目標

このチュートリアルでは、TDE マスター暗号鍵を IBM Cloud® Hyper Protect Crypto Services に保管して、マスター暗号鍵を所有者が完全かつ排他的に管理する方法について説明します。 このためには、Hyper Protect Crypto Services の PKCS #11 統合機能を使用する必要があります。

このチュートリアルでは、次のイラストに示しているセットアップを実装します。

標準 PKCS #11 API を使用した Transparent Database Encryption
図 1. 標準 PKCS #11 API を使用した透過的データベース暗号化

このセットアップでは、Oracle Database が、TDE のマスター暗号鍵を管理するための操作を Hyper Protect Crypto Services の PKCS #11 ライブラリーを使用して呼び出します。 Hyper Protect Crypto Services の PKCS #11 ライブラリーが Hyper Protect Crypto Services インスタンスと対話し、TDE のマスター暗号鍵を保管および管理するための最高クラスのテクノロジーを提供します。

開始前に

このチュートリアルを実行するには、以下の前提条件を満たしていなければなりません。

タスク・フロー

このソリューションを完成させるには、以下の手順を実行します。

  1. Hyper Protect Crypto Services インスタンスを初期設定する
  2. Oracle Database 環境に Hyper Protect Crypto Services の PKCS #11 ライブラリーをセットアップする
  3. Oracle Database の TDE をセットアップしてデータを暗号化する

まず、Hyper Protect Crypto Services インスタンスの初期設定プロセスから始めましょう。

Hyper Protect Crypto Services インスタンスを初期設定する

  1. このチュートリアルでは、まず Hyper Protect Crypto Services インスタンスを初期設定する必要があります。

    Hyper Protect Crypto Services インスタンスの ID と EP11 エンドポイントのアドレスをメモします。 後の手順でこの情報が必要になります。

  2. Hyper Protect Crypto Services インスタンスにアクセスするための API キーを生成します。 以下のコマンドを実行して、IBM Cloud アカウントの API キーを作成します。

    ibmcloud iam api-key-create apikeyhpcs -d "API key for Hyper Protect Crypto Services PKCS11"
    
  3. 後の手順で使用するために API キーの値を保存します。

Oracle Database 環境に Hyper Protect Crypto Services の PKCS #11 ライブラリーをセットアップする

1. Oracle Database のセットアップ

Oracle Advanced Security を適用した Oracle Database Enterprise Edition インストール環境が必要です。 このチュートリアルでは、単一インスタンスの Oracle Database 19.3 Enterprise Edition Docker コンテナーを使用します。 Oracle Database コンテナーについて、およびそれぞれのコンテナーのビルド手順について詳しくは、 Oracle Database(Docker の場合)を参照してください。

  1. Oracle Database コンテナーを開始します。

    docker run --name oradb -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=password oracle/database:19.3.0-ee
    

    インスタンスとデータベースの作成が完了するまで待ちます。

  2. ホスト・システムのコマンド・ラインから以下のコマンドを実行します。

    docker exec -it --user root --workdir / oradb bash
    

    後の手順で root としてコマンドを実行するときに、このシェルを使用できます。

2. Hyper Protect Crypto Services の PKCS #11 ライブラリーの構成

次は、Hyper Protect Crypto Services の PKCS #11 機能の構成ファイルを作成します。 構成ファイルの名前は grep11client.yaml です。

以下のファイル・テンプレートを調整して、ファイルに grep11client.yaml という名前を付けます。

  • <instance_ID> を Hyper Protect Crypto Services インスタンスの ID に置き換えます。
  • <EP11_endpoint_URL> および <EP11_endpoint_port_number> を、Hyper Protect Crypto Services インスタンスの EP11 エンドポイント・アドレスの各パラメーターに置き換えます。
  • <your_api_key> を、作成した API キーの値に置き換えます。
iamcredentialtemplate: &defaultiamcredential
          enabled: true
          endpoint: "https://iam.cloud.ibm.com"
          # Keep the 'apikey' empty. It will be overridden by the Anonymous user API key configured later.
          apikey:
          # The Universally Unique IDentifier (UUID) of your Hyper Protect Crypto Services instance.
          instance: "<instance_ID>"

tokens:
  0:
    grep11connection:
      # The EP11 endpoint address starting from 'ep11'.
      # For example: "<instance_ID>.ep11.us-south.hs-crypto.appdomain.cloud"
      address: "<EP11_endpoint_URL>"
      # The EP11 endpoint port number
      port: "<EP11_endpoint_port_number>"
      tls:
        # Grep11 requires TLS connection.
        enabled: true
        # Grep11 requires server only authentication, so 'mutual' needs to be set as 'false'.
        mutual: false
        # 'cacert' is a full-path certificate file.
        # In Linux with the 'ca-ca-certificates' package installed, this is normally not needed.
        cacert:
        # Grep11 requires the server-only authentication, so 'certfile' and 'keyfile' need to be empty.
        certfile:
        keyfile:
    storage:
      filestore:
        enabled: false
        storagepath:
        # 'remotestore' needs to be enabled if you want to generate keys with the attribute CKA_TOKEN.
      remotestore:
        enabled: true
    users:
      0: # The index of the Security Officer (SO) user MUST be 0.
        # The name for the Security Officer (SO) user. For example: "Administrator".
        # NEVER put the API key under the SO user for security reasons.
        name: "Administrator"
        iamauth:
          <<: *defaultiamcredential
      1: # The index of the normal user MUST be 1.
        # The name for the normal user. For example: "Normal user".
        # NEVER put the API key under the normal user for security reasons.
        name: "Normal user"
         # The Space ID is a 128-bit UUID and can be chosen freely.
         # The UUID can be generated by third-party tools, such as 'https://www.uuidgenerator.net/'.
         # For example: "f00db2f1-4421-4032-a505-465bedfa845b".
         # 'tokenspaceID' under the normal user is to identify the private keystore.
        tokenspaceID: "f00db2f1-4421-4032-a505-465bedfa845b"
        iamauth:
          <<: *defaultiamcredential
      2: # The index of the anonymous user MUST be 2.
        # The name for the anonymous user. For example: "Anonymous".
        name: "Anonymous"
        # The Space ID is a 128-bit UUID and can be chosen freely.
        # The UUID can be generated by third-party tools, such as 'https://www.uuidgenerator.net/'.
        # For example: "ca22be26-b798-4fdf-8c83-3e3a492dc215".
        # 'tokenspaceID' under the anonymous user is to identify the public keystore.
        tokenspaceID: "ca22be26-b798-4fdf-8c83-3e3a492dc215"
        iamauth:
          <<: *defaultiamcredential
          # This API key for the Anonymous user must be provided.
          # It will overide the 'apikey' in the previous defaultcredentials.iamauth.apikey field
          apikey: "<your_api_key>"
logging:
  # Set the logging level.
  # The supported levels, in an increasing order of verboseness, are:
  # 'panic', 'fatal', 'error', 'warning'/'warn', 'info', 'debug', 'trace'.
  # The Default value is 'debug'.
  loglevel: debug
  # The full path of your logging file.
  # For example: /tmp/grep11client.log
  logpath: /tmp/grep11client.log

3. Hyper Protect Crypto Services の PKCS #11 ライブラリーのインストール

  1. 最新の PKCS #11 ライブラリーをダウンロードします

  2. 作成した構成ファイル grep11client.yaml および PKCS #11 ライブラリー pkcs11-grep11-<platform>.so.<version> を Oracle Database コンテナーのホーム・フォルダーにコピーします。

  3. root として以下のコマンドを実行することで、Oracle Database のセットアップに Hyper Protect Crypto Services の PKCS #11 ライブラリーをインストールします。

    mkdir /etc/ep11client
    chmod a+rx /etc/ep11client/
    cp grep11client.yaml /etc/ep11client/grep11client.yaml
    chmod a+r /etc/ep11client/grep11client.yaml
    
    mkdir -p /opt/oracle/extapi/64/hsm/ibm
    cp pkcs11-grep11.so.1.1.3 /opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so
    chown -R oracle:oinstall /opt/oracle/extapi
    
    touch /tmp/grep11client.log
    chmod a+rw /tmp/grep11client.log
    chown oracle:oinstall /tmp/grep11client.log
    

ディレクトリー /opt/oracle/extapi/64/hsm とそのサブディレクトリーには、ライブラリー・ファイルを 1 つしか入れることができません。 そのディレクトリーとサブディレクトリーに他のライブラリー・ファイルがある場合は削除してください。

4. ライブラリーのセットアップの確認

  1. 以下のコマンドを使用して、コマンド・ライン・ユーティリティー OpenSC (pkcs11-tool) をインストールします。

    sudo yum install opensc
    
  2. 以下のコマンドを root として実行してライブラリーのセットアップを確認します。

    pkcs11-tool --module=/opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so -I
    

    このコマンドを実行すると、次のように、製造元とライブラリーに関する情報が表示されます。

    Cryptoki version 2.40
    Manufacturer     IBM ...
    Library          GREP11 PKCS11 client ...
    

5. Hyper Protect Crypto Services PKCS #11 ライブラリーの初期化

  1. ホスト・システムのコマンド・ラインから以下のコマンドを実行します。

    docker exec -it oradb bash
    

    このシェルは、続くステップでユーザー oracle としてコマンドを実行するために使用できます。

  2. トークンを初期化するには、以下のコマンドを実行し、作成した API キーで <your_api_key> を置き換えます。

    pkcs11-tool  --module /opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so --init-token --label dbtoken --so-pin=<your_api_key>
    

    このコマンドを実行すると、次のような状況メッセージが表示されます。

    Using slot 0 with a present token (0x0)
    Token successfully initialized
    

Oracle Database のセットアップとデータの暗号化

それでは、データベース管理者のロールについて説明します。

  1. ディレクトリー「$ORACLE_HOME/network/admin」のファイル「sqlnet.ora」を、以下の行を追加して更新します。

    encryption_wallet_location=(source=(method=hsm))
    

    これには、例えば以下のコマンドを実行します。

    echo "encryption_wallet_location=(source=(method=hsm))" >> $ORACLE_HOME/network/admin/sqlnet.ora
    

    ファイル「sqlnet.ora」には encryption_wallet_location の別の設定が含まれないようにしてください。

  2. 以下のコマンドを使用して、キー・ストアを開きます。 <your_api_key> を、作成した API キーに置き換えます。

    export ORACLE_SID=<your SID, e.g. ORCLCDB>
    sqlplus / as sysdba
    SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<your_api_key>" CONTAINER=ALL;
    
  3. 以下のコマンドを使用して、マスター・キーを作成します。 <your_api_key> を、作成した API キーに置き換えます。

    SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "<your_api_key>" WITH BACKUP CONTAINER=ALL;
    
  4. 以下のコマンドを使用して、暗号化されたテーブル・スペースを作成します。

    SQL> CREATE TABLESPACE encrypted_ts DATAFILE 'tbs1_data.dbf' SIZE 128K AUTOEXTEND ON NEXT 64K ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
    
  5. セットアップを検証するには、暗号化されたテーブル・スペースに表を作成し、テスト・データをいくつか挿入します。

    SQL> CREATE TABLE tde_ts_test (id    NUMBER(10), data  VARCHAR2(50)) TABLESPACE encrypted_ts;
    SQL> INSERT INTO tde_ts_test VALUES (1, 'This is a secret!');
    SQL> COMMIT;
    SQL> SELECT * FROM TDE_TS_TEST;
    
  6. 暗号化された列を持つ表を作成し、テスト・データをいくつか挿入することもできます。

    SQL> CREATE USER C##test IDENTIFIED BY test;
    SQL> GRANT UNLIMITED TABLESPACE TO C##test;
    SQL> CREATE TABLE C##test.tde_test (id NUMBER(10), data VARCHAR2(50) ENCRYPT);
    SQL> INSERT INTO C##test.tde_test VALUES (1, 'This is also a secret!');
    SQL> COMMIT;
    SQL> SELECT * FROM C##test.tde_test;
    
    # Verify encrypted tablespace and encrypted column
    SQL> SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES;
    SQL> SELECT * FROM dba_encrypted_columns ;
    

次のステップ

これで、暗号化されたテーブル・スペースと暗号化された列に機密データが安全に保管されるようになりました。 また、TDE マスター暗号鍵は、非常に安全で、改ざん不能な方法によって Hyper Protect Crypto Services に保管されました。

このチュートリアルでは、Hyper Protect Crypto Services を使用して Oracle Database TDE をセットアップする方法について学習しました。