2022年12月9日金曜日

簡単なファイル管理アプリケーションの作成(7) - シークレットを使う

 暗号化キーの保存先をデータベースからOCIのボールトに変更してみました。暗号化キーは、ボールトのシークレットとして保存されます。

シークレットとしての操作は、以下の記事で作成したパッケージSFM_SECRET_UTILを使用します。

OCI PL/SQL SDKを使ってOCI Vaultのシークレットを操作する
http://apexugj.blogspot.com/2022/12/oci-secret-plsql-sdk.html

APEXアプリケーションとしての見た目や使い方に変更はありません。


表SFM_SECRETSの変更



暗号化キーを保存していた表SFM_SECRETSを作り直します。元の表はドロップし、以下の定義で表SFM_SECRETSを作成します。暗号化キーではなくシークレットのOCIDを保存します。
create table sfm_secrets (
    id                             number not null,
    version                        number not null,
    iv                             raw(16) not null,
    secret_ocid                  varchar2(400) not null,
    constraint sfm_secrets_pk primary key(id, version)
)
;


パッケージSFM_FILE_UTILの変更



変更したパッケージSFM_FILE_UTILのコードは以下になります。ファンクションの引数が増えているため、APEXアプリケーションの変更も必要です。


APEXアプリケーションの更新



シークレットを操作するPL/SQL SDKはコンパートメントマスター暗号化キーおよびボールトOCIDを引数に取ります。そのため、アプリケーション定義置換文字列としてG_COMPARTMENT_OCIDG_MASTER_KEY_OCIDG_VAULT_OCIDを追加します。

それぞれの値の取得方法は、パッケージSFM_SECRET_UTILに関する記事に記載があります。



パッケージSFM_FILE_UTILを呼び出しているプロセスに対して、パラメータの同期を実行します。

プロセス上でコンテキスト・メニューを表示させると、パラメータの同期が含まれています。


プロセスファイルのアップロードでは、パラメータとしてp_compartment_ocidp_master_key_ocidp_vault_ocidが追加されています。これらはそれぞれ置換文字列として追加したG_COMPARTMENT_OCIDG_MASTER_KEY_OCIDG_VAULT_OCIDを割り当てます。


プロセスファイルの削除では、パラメータとしてp_time_of_deletionが追加されています。こちらは、PL/SQL式として以下を記述します。

systimestamp + (interval '2' day)

削除したファイルに紐づくシークレットを、2日後に削除するようスケジュールします。


プロセスダウンロードでは、パラメータとしてp_vault_ocidが追加されています。これには置換文字列のG_VAULT_OCIDを割り当てます。


以上でアプリケーションの改変は完了です。

OCIのシークレットはこのような用途を想定しているのかどうかはわかりませんが、PL/SQL SDKのサンプルにはなっているでしょう。

また、APEX 22.2から使えるようになったプロセス・タイプAPIの呼び出しですが、本当に生産性が上がります。PL/SQLのコードをパッケージにまとめられるため、単体テストなども実施が容易です。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/simple-file-manager-secret.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。