※ 本記事は2017年7月20日に公開されたものです。

Oracle Databaseで外部ファイル操作をおこなう際に利用するのがディレクトリオブジェクトです。
ディレクトリオブジェクトを利用することで、外部ファイルに対するアクセス権限をユーザーごとに細かく設定することができます。

昔はUTL_FILE_DIR初期化パラメータも外部ファイル操作をおこなう際のディレクトリ指定に使用してきましたが、現在は非推奨となっています。第40回「セキュリティ関連の初期化パラメータ (6)」のUTL_FILE_DIRの記載も併せて参照してください。

セキュリティの考え方で重要なのが「最小権限の原則」ですが、ディレクトリオブジェクトへのアクセス権限でも当てはまります。
データベースの中できちんとアクセス制御をおこなっていても、ディレクトリオブジェクトへのアクセス権限が適切でない場合、データベースのアクセス制御が及ばないOSファイルにデータベースのデータを書き出すことができるようになってしまいます。

ディレクトリオブジェクトを利用するケースで一番多く利用されるであろうものが、エクスポート/インポート処理です。
この処理では表やスキーマ、データベース全体のデータを一度にファイルに書き出すことができます。書き出されたダンプファイルにはデフォルトではセキュリティはかかっていませんので、このダンプファイルは誰でも別のデータベースにインポートすることができます。ダンプファイルからの情報漏えいには十分注意してください。Oracle Advanced Securityオプションを利用することでダンプファイルを暗号化することもできますので、必要であれば考慮してください。
また、エクスポート/インポート処理をおこなうユーザーにEXP_FULL_DATABASE、IMP_FULL_DATABASEロールを付与するケースもあると思いますが、このロールには非常に強力な権限が付与されています。エクスポート/インポート処理をおこなう際には専用のユーザーを作成しパスワードを厳重に保護するなど厳密なアカウント管理をおこなってください。第18回「エクスポート/インポートで利用する権限の注意点」も併せて参照してください。

しているシステムもあるかもしれません。しかし、エクスポート/インポートをバックアップとして利用する場合にはデータロスが発生するなどの注意点があります。詳細はDB ONLINEの記事「目指せ黒帯!Oracle Database バックアップ&リカバリ道場」の「論理バックアップはDBバックアップとして適切か?」を参照してください。

ディレクトリオブジェクトはUTL_FILEパッケージで入出力可能なファイルのディレクトリを指定するためにも利用します。
下記のサンプルスクリプトを見てください。

declare
  vHandle utl_file.file_type;
begin
  vHandle := utl_file.fopen('BATCHDIR','dailybatch.sh','w',32767);
  utl_file.put_line(vHandle,'sqlplus / as sysdba <<EOF');
  utl_file.put_line(vHandle,'shutdown abort');
  utl_file.put_line(vHandle,'EOF');
  utl_file.fflush(vHandle);
  utl_file.fclose(vHandle);
exception when others then
  utl_file.fclose_all;
  raise;
end;
/

   

このスクリプトはdailybatch.shというファイルをデータベースを停止するスクリプトに書き換えています。
もしこの書き換えられたバッチが実行されてしまった場合、データベースが停止してしまいます。
バッチで利用するデータをUTL_FILEパッケージを利用して作成することもあると思いますが、実行可能なバッチ本体をディレクトリオブジェクトで指定したディレクトリに配置することは非常に危険です。
なお、UTL_FILEパッケージでファイル操作をおこなう際には、ローカル接続の場合はサーバープロセスを起動したユーザー権限で、リスナー経由の接続の場合にはリスナーを起動したユーザー権限でファイル操作をおこないます。新規ファイルを作成する場合には該当ユーザーのumaskで設定したパーミッションでファイルが作成されますので、不用意に実行可能なファイルが作成されないように注意が必要です。

UTL_FILEパッケージに関しては、このパッケージはデフォルトでPUBLICロールに対してEXECUTE権限が付与されています。つまり、ディレクトリオブジェクトへのアクセス権限を付与されたデータベースユーザーは誰でもUTL_FILEパッケージを利用してファイル入出力を実行できることになります。ディレクトリオブジェクトへの不必要な読み取り権限があるだけで、ほかの人がデータベースから書き出した本来その人はアクセスすることができないデータにアクセスされてしまったり、書き込み権限があれば改ざん・破壊されてしまう可能性もあります。
UTL_FILEパッケージのEXECUTE権限に関しては、デフォルトでは下位互換のために付与されていますが、Database Vaultを有効にするとセキュリティ強化のため、PUBLICロールからUTL_FILEパッケージのEXECUTE権限が取り消されます

Database Vaultを利用していない場合でも、既存のアプリケーションに影響がない場合には権限を取り消すこともセキュリティ強化のために有効です。

データ連携などのために外部ファイルにデータを書き出す必要がある場合も多いと思いますが、なるべく外部ファイルに書き出さないようにするとともに、外部ファイルに書き出したデータもデータベース内に格納されているデータと同様のセキュリティポリシーで保護されるように注意してください。

「もくじ」にもどる