今回は、Oracle Database 23cのセキュリティ新機能として、Column Level Auditを紹介します。
従来の監査ポリシーは、SELECTなどのDMLの監査を指定するのはテーブルまででしたが、23cではテーブルのカラム単位までに絞って設定することができるようになりました。
この機能により機密データの列を対象にした監査の実行を限定することで、監査によるパフォーマンスのオーバーヘッドを最小化し、監査ログの出力も抑制できます。
また、Unified AuditにはSYS_CONTEXTで取得できるIPアドレスやプログラムなどのセッション情報を条件に監査を絞ることもできるので、Column Level Auditと組み合わせてより対象を絞った監査ポリシーの作成ができます。
主な特徴としてはこちらのスライドをご覧ください
使い方は従来の監査ポリシーで明示的に列を指定するだけです。前回作成したHRスキーマと同様に用意した2つのターミナルを使った動作確認を紹介します。
-SYSユーザーでUnified Auditを削除(A)
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL (audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE);
-Unified Auditのログ件数を確認(A)
select count(*) from unified_audit_trail;
COUNT(*)
----------
1
-EMPLOYEES表のSALARY列のSELECTに対する監査ポリシーを作成(A)
CREATE AUDIT POLICY emp_sal_pol ACTIONS SELECT(SALARY) ON HR.EMPLOYEES;
AUDIT POLICY emp_sal_pol;
-SALARY列を含むSELECTを実行(B) -> Unified Auditの件数は増加する
SELECT SALARY FROM EMPLOYEES;
SELECT * FROM EMPLOYEES;
-SALARY列を含まないSELECTを実行(B) -> Unified Auditの件数は増加しない
SELECT EMPLOYEE_ID from EMPLOYEES;
-Unified Auditのログ内容を確認(A)
SELECT EVENT_TIMESTAMP,DBUSERNAME,SQL_TEXT FROM UNIFIED_AUDIT_TRAIL ORDER BY EVENT_TIMESTAMP DESC;
EVENT_TIMESTAMP DBUSERNAME SQL_TEXT
------------------------------ ---------- ----------------------------------------
20-JUL-23 01.56.08.683548 PM HR SELECT SALARY FROM EMPLOYEES
20-JUL-23 01.53.08.888481 PM HR select * from employees
Unified Auditについてはこちらで解説していますので、ご参考にして下さい。
テーブルのSELECTの監査はどうしてもログ件数や膨大になってしまうので、機密列のみのアクセスに限定したSELECTということであれば監査が実行する回数の削減が期待できるのではないかと思います。