ファイングレイン監査(FGA: Fine Grained Auditing)は、Oracleが提供する高度な監査機能で、特定の条件に合致したデータアクセスだけを記録できます。従来の監査が「誰がどの表にアクセスしたか」といった大まかな単位だったのに対し、FGAでは「特定の列に対するアクセス」「WHERE句に合致したデータの取得」など細かい条件で制御できるのが特徴です。ここではFGAの基本概念と、PL/SQLを用いた設定・運用方法を解説します。
FGAの特徴と利用シーン
FGAはDBMS_FGAパッケージを使って設定します。次のようなケースで利用が有効です。
– 個人情報や給与データのアクセスを監査したい
– 特定条件(例: 高額な取引データ)へのアクセスだけ記録したい
– SELECTだけでなくUPDATEやDELETEも含めた監査をしたい
従来の監査よりもログが絞られるため、実務に直結する証跡を効率的に残せます。
監査ポリシーの作成
DBMS_FGA.ADD_POLICYを使ってポリシーを定義します。例として、employees表のsalary列を監査対象にします。
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'FGA_EMP_SAL',
audit_condition => 'salary >= 10000',
audit_column => 'SALARY',
handler_module => NULL,
enable => TRUE
);
END;
/
この設定では、HR.EMPLOYEES表に対するクエリで、salary列を参照し、かつ給与が10000以上の行にアクセスした場合のみ監査ログが記録されます。
監査ログの確認
FGAの結果はデフォルトでDBA_FGA_AUDIT_TRAILに格納されます。以下のように検索できます。
SELECT db_user, os_user, timestamp, sql_text
FROM dba_fga_audit_trail
WHERE policy_name = 'FGA_EMP_SAL'
ORDER BY timestamp DESC;
ここにはSQL文やユーザー名、実行時刻などが記録されるため、後追い調査が可能です。
PL/SQLハンドラとの連携
FGAでは特定のアクセスが発生したときにPL/SQLプロシージャを呼び出すことができます。これにより、リアルタイムでアラートを飛ばしたり、補助的なログテーブルへ書き込む運用が可能です。
CREATE OR REPLACE PROCEDURE fga_alert_handler(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2
) IS
BEGIN
INSERT INTO fga_alert_log(object_schema, object_name, policy_name, log_time)
VALUES (object_schema, object_name, policy_name, SYSTIMESTAMP);
-- 必要に応じてメール通知やアラート送信処理を追加
END;
/
このプロシージャをhandler_moduleとして登録すれば、監査イベントの発生時に自動で実行されます。
ポリシーの管理と削除
ポリシーは無制限に積み重ねられるため、不要になったら削除します。
BEGIN
DBMS_FGA.DROP_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'FGA_EMP_SAL'
);
END;
/
また、ENABLE_POLICYやDISABLE_POLICYで一時的に有効・無効を切り替えることもできます。
注意点とベストプラクティス
FGAは高機能ですが、監査の条件を細かくしすぎるとログ量が増えすぎたり、SQLの実行に若干のオーバーヘッドがかかります。実務では以下の点に留意します。
– 必要な列や条件に絞る(全件監査は避ける)
– 監査ログの定期的なアーカイブ・削除を行う
– PL/SQLハンドラは軽量に設計する(重い処理は非同期に回す)
まとめ
ファイングレイン監査は、アクセス条件を細かく制御できるOracleの強力な監査機能です。DBMS_FGAを用いて条件や列単位でログを記録し、さらにPL/SQLハンドラで通知やログ拡張を組み合わせれば、セキュリティ監視の即応性が高まります。運用ではログ量と性能のバランスを考慮し、必要最小限のポリシーを設計することが成功の鍵となります。