2022年12月8日木曜日

簡単なファイル管理アプリケーションの作成(6) - ファイルの暗号化

 オブジェクト・ストレージにファイルを保存するにあたってセキュリティが気になったので、ファイルをオブジェクト・ストレージにアップロードするときにAES256で暗号化、ダウンロードした後ブラウザに戻す際に復号するように実装してみました。

(追記: 引数opc_sse_customer_keyを指定することによりオブジェクト・ストレージに保存するファイルを暗号化できるので、そちらを使う方が正解でした。)

暗号キーと初期ベクターはデータベースに保存します。

ファイルをデータベースに保存していれば、オラクル・データベースが提供する各種のアクセス制御の機能(Database Vault、Virtual Private Database、Real Application Securityなど)が使えますが、ファイルを丸ごとデータベースのストレージに保存するのは高コストです。コストを下げるためにオブジェクト・ストレージにオフロードすると、セキュリティが心配になります。暗号化してファイルをオブジェクト・ストレージにオフロードすれば、それだけが盗まれても読めませんし、また、改ざんもできません。

データベースに暗号キーが保存されているので、それはアクセス制御をかけて保護する必要があります。ただし、ファイル丸ごとよりは容量を消費しません。

以下より実施した作業を説明します。


DBMS_CRYPTOの実行権限の付与


データベースでの暗号化および復号にはパッケージDBMS_CRYPTOを使用します。このパッケージを使用するため、APEXのワークスペース・スキーマにDBMS_CRYPTOの実行権限を与えます。

grant execute on dbms_crypto to <APEXのワークスペース・スキーマ>;

Autonomous Databaseでは、データベース・アクション開発SQLから実行します。APEXのワークスペース名がAPEXDEVである場合は、以下のgrant文を実行します。

grant execute on dbms_crypto to wksp_apexdev;


暗号キーを保存する表の作成


暗号キーと初期ベクターを保存する表SFM_SECRETSを作成します。

create table sfm_secrets (
    id                             number not null,
    version                        number not null,
    iv                             raw(16) not null,
    key                            raw(32) not null,
    constraint sfm_secrets_pk primary key(id, version)
)
;

SQLワークショップSQLコマンドから実行します。


パッケージSFM_FILE_UTILの置き換え


パッケージSFM_FILE_UTILを暗号化処理を組み込んだものに置き換えます。以下のコードを実行します。アップロードを行うプロシージャupload_fileではDBMS_CRYPTO.ENCRYPTを呼び出してファイルの内容を暗号化しています。download_fileではDBMS_CRYPTO.DECRYPTを呼び出し、ファイルを復号しています。それぞれ追加した行数は数行です。

APEXアプリケーションへの変更は不要です。