24 Oracle Key Vault統合アクセラレータ

Oracle Key Vaultには、ユースケースとKey Vaultの統合を迅速にスピンアップするためのアクセラレータが用意されています。アクセラレータは、提供されたまま使用することも、アプリケーションのニーズにあわせて拡張して使用することもできます。

統合アクセラレータは、Oracle Key Vault管理コンソールからダウンロードできます。Oracle Key Vaultには、次の統合アクセラレータが用意されています:

Oracle DBMS_CRYPTOのキー管理統合アクセラレータ

リリース21.10以降、Oracle Key Vaultには、Oracle Key VaultでのDBMS_CRYPTO操作で使用される暗号化キーを管理するために、Oracle DBMS_CRYPTOのキー管理統合アクセラレータが用意されています。

Oracle DBMS_CRYPTOパッケージには、暗号化操作と復号化操作を実行するためのPL/SQLインタフェースが用意されています。PL/SQLアプリケーションでは、DBMS_CRYPTO操作で使用される暗号化キーを安全に管理する必要があります。この統合アクセラレータを使用すると、Oracle Key VaultでのOracle DBMS_CRYPTO操作で使用される対称キーを管理できます。この統合アクセラレータ・パッケージには、Oracle Key Vault JAVA SDKプログラム上に構築されたPL/SQLラッパーが用意されています。

Oracle DBMS_CRYPTOのキー管理統合アクセラレータのダウンロード

Oracle DBMS_CRYPTOのキー管理統合アクセラレータは、Oracle Key Vault管理コンソールからダウンロードできます。

  1. Oracle Key Vault管理コンソールに接続します。

    たとえば:

    https://192.0.2.254
    Oracle Key Vault管理コンソールへのログイン・ページが表示されます。ログインしないでください。
  2. ログイン・ページの右下隅にある「Login」で、「Endpoint Enrollment and Software Download」をクリックします。
    「Enroll Endpoint & Download Software」ページが表示されます。

    2110_dbms_crypto.pngの説明が続きます
    図2110_dbms_crypto.pngの説明

  3. ページ上部の「Download Integration Accelerator」タブをクリックします。
  4. 「Download Integration Accelerator」ページで、「Integration Accelerator」ドロップダウン・メニューから「Key Management for DBMS_CRYPTO」パッケージを選択します。
  5. 「Download」をクリックします。
  6. okv_key_management_dbms_crypto.zipファイルを目的の場所に保存します。

Oracle DBMS_CRYPTOのキー管理統合アクセラレータの使用

DBMS_CRYPTOのキー管理統合アクセラレータを使用する方法について学習します。

Oracle DBMS_CRYPTOのキー管理統合アクセラレータを使用するための前提条件

Oracle DBMS_CRYPTOのキー管理統合アクセラレータの使用を開始する前に、次の前提条件を満たしていることを確認します。

  • サンプルOracle DBMS_CRYPTOアプリケーションを実行する予定のOracle Key Vault 21.10以降に、Oracle Databaseをエンドポイントとしてエンロールします。

  • Java 8以降があることを確認します。
  • Oracle Databaseに最新のOracle JVMがパッチ適用されていることを確認します。
  • OKV_HOME環境変数を適切に設定します。

    ノート:

    $OKV_HOMEは、エンドポイントのインストール時に-dオプションで指定したエンドポイント・ソフトウェアの宛先ディレクトリです。
  • okvclient.oraファイルが使用可能であり、エンドポイント・エンロールの一部として作成されているかどうかを確認します。okvclient.oraファイルは通常、$OKV_HOME/conf/okvclient.oraにあります。
  • okv_jsdk.zip$OKV_HOMEに解凍されていることを確認します。

    Bash UNIXシェルの場合:
     $ cd $OKV_HOME
     $ unzip -o okv_jsdk.zip

    ノート:

    Oracle Key Vault Java SDKのダウンロードの詳細は、『Oracle Key Vault開発者ガイド』を参照してください
  • okv_key_management_dbms_crypto.zipの内容を別のフォルダに抽出します。

    okv_key_management_dbms_crypto.zipファイルの内容は、次のとおりです:

    • setup_java_permissions.sql: このSQLスクリプトは、データベース内に格納されているリソースにアクセスするために必要なJavaセキュリティ権限およびデータベース権限を設定します。
    • KeyManager.java: このプログラムは、Oracle Key Vault Java SDKのAPIを使用して、Oracle Key Vaultサーバーから対称キーを作成およびフェッチします。
    • okv_key_mgmt.pkb: Oracle Key Vault Java SDK APIを(KeyManager.javaを介して)起動して、Oracle Key Vaultで対称キーの作成およびフェッチ操作を実行するPL/SQLラッパー。
    • dbms_crypto_using_okv_keymgmt.sql: Java SDKを使用してOracle Key Vaultでのキー管理を示すためのOracle DBMS_CRYPTOのユースケース。
    • README.txt: サンプルOracle DBMS_CRYPTOアプリケーションを設定および実行する手順。
Oracle DBMS_CRYPTOのキー管理統合アクセラレータを使用するための環境の準備

Oracle DBMS_CRYPTOのキー管理統合アクセラレータの実行に必要な権限でOracle Database環境を準備していることを確認します。

  1. JAVA_HOME環境変数がJava Development Toolkit (JDK)の場所を指していることを確認します。
  2. Oracle Key Vault Java SDK jar $OKV_HOME/jsdk/lib/okvjsdk.jarが含まれるようにCLASSPATHを設定します。
    Bash UNIXでCLASSPATHを設定します:
    $ export CLASSPATH=$CLASSPATH:$OKV_HOME/jsdk/lib/okvjsdk.jar
  3. 現在のディレクトリ'.'もCLASSPATHに含まれていることを確認します。含まれていない場合は、CLASSPATHの先頭に現在のディレクトリを追加します。

    Bash UNIXシェルで、次のように設定します:

    $ export CLASSPATH=.:$CLASSPATH
  4. KeyManager.javaファイルをコンパイルします。
    現在のディレクトリを、okv_key_management_dbms_crypto.zipファイルを抽出したディレクトリに設定します。
    Bash UNIXで KeyManager.javaをコンパイルします:
    $ cd folder_path
    $ javac KeyManager.java
  5. sysユーザーとしてOracle Databaseにログインし、データベース・ユーザーを設定します。
    次の問合せを使用して、データベース・ユーザーdb_usernameのデフォルトの表領域default_tablespaceを確認します:
    SQL> select default_tablespace from dba_users where username = db_username;

    ノート:

    db_usernameは、必ず大文字にします。
    db_usernameに次の権限を付与します:
    SQL> grant execute on sys.dbms_crypto to db_username;
    SQL> grant create session to db_username;
    SQL> grant create procedure, create table to db_username;
    SQL> alter user db_username quota 100M on default_tablespace;
    SQL> commit;
    SQL> exit;
  6. $ORACLE_HOME/binディレクトリをPATH環境変数に必ず追加します。
  7. データベース・ユーザーdb_username、データベース・ユーザー・パスワードdb_pswdおよびデータベース名db_nameとして、Javaクラス・ファイルKeyManager.classおよび依存JARファイルokvjsdk.jarをOracle Databaseにロードします。
    $ loadjava -user db_username/db_pswd@db_name -verbose $OKV_HOME/jsdk/lib/okvjsdk.jar
    $ cd folder_path
    $ loadjava -user db_username/db_pswd@db_name -verbose KeyManager.class
  8. sysユーザーとしてデータベースにログインし、データベース・ユーザーdb_usernameおよびOKV_HOMEの実際の値を引数として渡して、次のSQLファイルを実行します。
     SQL> @folder_path/setup_java_permissions.sql db_username OKV_HOME;
  9. sysユーザーとしてデータベースにログインし、データベース・ユーザーdb_usernameがOracle Key Vaultとのセキュア・ソケット接続を確立できるようにするために必要な権限を付与します。
    SQL> exec dbms_java.grant_permission( db_username, 'SYS:java.net.SocketPermission', 'Oracle Key Vault IP Address:Port#', 'connect,resolve' );
    SQL> commit;
    SQL> exit;

    ノート:

    マルチマスター・クラスタ・デプロイメントでは、IPアドレスおよびポート番号を使用してクラスタ・ノードごとに権限を付与します。これらのコマンドの入力db_usernameは、必ず大文字にします。

    IPアドレスおよびポート番号情報は、$OKV_HOME/conf/okvclient.oraファイルで入手できます。

    たとえば、各ノードのIPアドレスが100.100.100.101、100.100.100.102および100.100.100.103の3ノードOracle Key Vaultクラスタのエンドポイント構成ファイル$OKV_HOME/conf/okvclient.oraは、次のようになります:

    SERVER=100.100.100.101:5696/CN=server_cert,OU=Key_Vault,O=Oracle,L=Redwood_City,ST=California,C=us,100.100.100.102:5696/CN=node_2_cert,OU=Key_Vault,O=Oracle,L=Redwood_City,ST=California,C=us
    READ_SERVER=100.100.100.103:5696/CN=node_3_cert,OU=Key_Vault,O=Oracle,L=Redwood_City,ST=California,C=us
    

    前述の構成ファイルからIPアドレスおよびポートの詳細を抽出し、次のように、前述のクラスタ例に対してSQLコマンドをsysユーザーとして実行します:

    SQL> exec dbms_java.grant_permission( db_username, 'SYS:java.net.SocketPermission', '100.100.100.101:5696', 'connect,resolve' );
    SQL> exec dbms_java.grant_permission( db_username, 'SYS:java.net.SocketPermission', '100.100.100.102:5696', 'connect,resolve' );
    SQL> exec dbms_java.grant_permission( db_username, 'SYS:java.net.SocketPermission', '100.100.100.103:5696', 'connect,resolve' );
    SQL> commit;
    SQL> exit;

    クラスタ・ノードの追加や削除など、Oracle Key Vaultクラスタ・ノード構成に変更がある場合は、必ずこれらの権限を変更します。

    たとえば、新しいクラスタ・ノード100.100.100.104を追加した場合:

    SQL> exec dbms_java.grant_permission( db_username,'SYS:java.net.SocketPermission', '100.100.100.104:5696', 'connect,resolve' ); 
    SQL> commit; 
    SQL> exit; 

    クラスタ・ノード100.100.100.103を削除した場合:

    SQL> exec dbms_java.revoke_permission( db_username, 'SYS:java.net.SocketPermission','100.100.100.103:5696', 'connect,resolve' );
    SQL> commit;
    SQL> exit;
  10. データベース・ユーザー名およびパスワードを使用してデータベースにログインし、データベース・ユーザーdb_usernameに次の権限を付与して、データベース・ユーザーがOracle Key Vaultとのセキュアな接続を確立するときに、$OKV_HOME/sslファイル下にエンドポイント・ウォレットをロードできるようにします。
    SQL> exec dbms_java.grant_policy_permission( db_username, db_username, 'oracle.security.pki.OracleWalletPermission', 'load' );
    SQL> exec dbms_java.grant_permission( db_username, 'db_username:oracle.security.pki.OracleWalletPermission', 'load', '' );
    SQL> commit;
    SQL> exit;

    ノート:

    これらのコマンドの入力db_usernameは、必ず大文字にします。
  11. データベース・ユーザー名およびパスワードを使用してデータベースに接続し、パッケージokv_key_mgmt.pkbをロードします。
    SQL> @folder_path/okv_key_mgmt.pkb;
    SQL> exit;
    
PL/SQLアプリケーションでのOracle DBMS_CRYPTOのキー管理統合アクセラレータの使用

PL/SQLアプリケーションで、統合アクセラレータによって提供されるPL/SQLパッケージokv_key_mgmtを使用できるようになりました。

okv_key_mgmtパッケージには、キー管理をOracle Key Vaultと統合するための次のファンクションが用意されています。
  • create_key: Oracle Key Vaultで対称キーを作成します。これは、Oracle Key Vault Java SDK APIを使用してOracle Key Vaultで対称キーを作成するKeyManager.java:createKey()をコールするラッパー・ファンクションです。
  • fetch_key: Oracle Key Vaultから対称キーをフェッチします。これは、Oracle Key Vault Java SDK APIを使用してOracle Key Vaultの対称キーをフェッチするKeyManager.java:fetchKey()をコールするラッパー・ファンクションです。

okv_key_mgmtパッケージを使用してOracle Key Vaultからキーをフェッチして使用するように、DBMS_CRYPTOを使用して対称キー・ベースの暗号化操作を実行するPL/SQLアプリケーションを変更できます。このようにして、PL/SQLアプリケーションのキー管理を簡素化できます。

okv_key_mgmtパッケージのキー管理ファンクションの使用方法を学習するには、統合アクセラレータに付属するサンプル・アプリケーションdbms_crypto_using_okv_keymgmt.sqlを確認します。

DBMS_CRYPTOのキー管理統合アクセラレータ・パッケージに付属するサンプル・アプリケーションdbms_crypto_using_okv_keymgmt.sqlは実行できます。

  1. 構成済データベースに対するユーザー名およびパスワードを使用してデータベースにログインします。
  2. 次のコマンドを使用して、dbms_crypto_using_okv_keymgmt.sqlファイルを実行します:
    SQL> @folder_path/dbms_crypto_using_okv_keymgmt.sql;

    ノート:

    • このSQLスクリプトは、インストールされているOracle Key Vaultエンドポイント・ソフトウェアの自動ログイン・ウォレットに対してのみ機能します。エンドポイントがパスワードで保護されている場合は、このSQLファイルに存在する'endpt_pswd'変数にエンドポイントのパスワードを入力します。
    • Oracle Key Vaultで作成されたキーの名前を指定する場合は、このSQLファイルに存在する'key_name'変数にキー名の値を入力します。

DBMS_CRYPTOのキー管理統合アクセラレータには、Oracle Key VaultでのPL/SQLアプリケーションのキー管理を示す基本ファンクションが用意されています。提供されているJava SDKプログラムKeyManager.java およびPL/SQLラッパー・パッケージokv_key_mgmt.pkbを変更して、より高度な使用方法に対応するようにその機能を拡張できます。

Oracle DBMS_CRYPTOのキー管理統合アクセラレータの機能拡張

Oracle DBMS_CRYPTOのキー管理統合アクセラレータの機能をアプリケーションのニーズにあわせて拡張できます。

使用可能なPL/SQLラッパー・パッケージokv_key_mgmt.pkbでは、キーの作成およびフェッチをそれぞれ実行するための基本ファンクションcreate_key()およびfetch_key()のみを提供します。ファンクションfetch_key()には、入力としてキーの一意の識別子(キーID)が必要です。

多くの場合、わかりやすい名前をキーに関連付ける方が簡単です。その方法では、まずキーの名前を使用してキーを検索し、キーのIDを取得した後、取得したキーIDをfetch_key()に渡して、DBMS_CRYPTO操作で使用するキーを取得する必要があります。使用可能なcreate_key()ファンクションは、新しく作成されたキーに関連付ける名前をすでに受け入れています。ただし、キーを名前で検索するファンクションは使用できません。

Oracle DBMS_CRYPTOのキー管理統合アクセラレータを拡張して、名前でキーを検索するためのファンクションをサポートするには、次のプロシージャを使用して、使用可能なJava SDKプログラムKeyManager.javaおよびPL/SQLラッパー・パッケージokv_key_mgmt.pkbを変更する必要があります。
  1. KeyManager.javaでOracle Key Vault Java SDK APIを使用してキーを検索するためのファンクションlocateKey()を追加します:
    public static String locateKey(String epPswd, String nameAttrValue) 
                                                      throws OKVException {
    
            /* Create a connection to Oracle Key Vault */
            char[] endpointPswd = null;
    
            if ((epPswd != null) && !(epPswd.trim().isEmpty())) {
                endpointPswd = epPswd.toCharArray();
            }
            OKVService service = setupOKVConnection(endpointPswd);
    
            /* Locate the key */
            System.out.println("\nLocate a key on Oracle Key Vault");
    
            /* Create the attribute list for locate operation */
            OKVTTLV attrList = OKVTTLV.okvEnvGetOpRequestObj();
            OKVTTLV nameAttr = attrList.okvAddAttributeObject(OKVTag.NAME, 0);
            nameAttr.okvAttrAddName(nameAttrValue,
                                 OKVTagEnum.NAME_TYPE_UNINTERPRETED_TEXT_STRING);
            OKVTTLV stateAttr = attrList.okvAddAttributeObject(OKVTag.STATE, 0);
            stateAttr.okvAttrAddState(OKVTagEnum.STATE_ACTIVE);
    
            OKVUidListResponse result = service.okvLocate(null, 0, null, 
                                                          attrList);
    
            /* Verify if the key is located */
            int count = result.getUidCnt();
            String uniqueId = null;
            if (count == 1) {
                uniqueId = result.getUids().get(0);
                System.out.println("\tSuccessfully located the key. " + 
                                   "Unique ID of the key: " + uniqueId);
            }
            else {
                System.out.println("\tUnable to locate the key, " + 
                                   "number of unique ID's got: " + count);
            }
    
            /* Release the connection from Oracle Key Vault */
            releaseOKVConnection(service);
    
            return uniqueId;
       }
  2. okv_key_mgmt.pkbでラッパー・ファンクションlocate_key()を追加します。
    1. 宣言:
      function locate_key(ep_pswd varchar2, key_name varchar2) return varchar2;
    2. 定義:
      function locate_key(ep_pswd varchar2, key_name varchar2) return varchar2 as language java name 'KeyManager.locateKey (java.lang.String,java.lang.String) return java.lang.String';
  3. 次のように、dbms_crypto_using_okv_keymgmt.sqlokv_key_mgmt.fetch_key()をコールする前にokv_key_mgmt.locate_key()をコールします。
    key_id := okv_key_mgmt.locate_key(endpt_pswd, key_name);
    key_value := okv_key_mgmt.fetch_key(endpt_pswd, trim(key_id));
    

    ノート:

    dbms_crypto_using_okv_keymgmt.sqlファイルで'key_name'が空の文字列またはnullでないことを確認します。
  4. 変更したKeyManager.javaを再コンパイルします。
    $ cd folder_path        
    $ javac KeyManager.java
    
  5. KeyManager.classをOracle Databaseに再ロードして、新しい変更を組み込みます:
    $ cd folder_path
    $ loadjava -user db_username/db_pswd@db_name -verbose KeyManager.class
    
  6. ユーザー名およびパスワードを使用してデータベースに接続し、okv_key_mgmt.pkbを再ロードして新しいlocate_key()機能を組み込みます:
    SQL> @folder_path/okv_key_mgmt.pkb;
    SQL> exit;
    
  7. 新しく組み込んだLocate操作を確認するには、ユーザー名およびパスワードでデータベースに接続し、次のコマンドを使用してdbms_crypto_using_okv_keymgmt.sqlファイルを実行します:
    SQL> @folder_path/dbms_crypto_using_okv_keymgmt.sql;