Skip to content

SQL Firewall

SQL Firewall は、Oracle Database 23ai から搭載されたセキュリティ機能です。 対象ユーザーが実行する SQL を事前に学習し、許可リスト(Allow List)に登録されていない SQL や接続コンテキストをブロック・記録します。

パスワード漏えいや SQL インジェクションなど、認証を突破した後の不正クエリ実行を防ぐ「最後の防衛ライン」として機能します。 DBMS_SQL_FIREWALL パッケージを通じて管理し、追加のエージェントやハードウェアは不要です。

SQL Firewall は以下の3段階で機能します。

  1. キャプチャ(学習)
  2. 許可リスト生成
  3. 強制(Enforce)
フェーズプロシージャ説明
キャプチャ開始DBMS_SQL_FIREWALL.CREATE_CAPTURE対象ユーザーの SQL を収集・正規化して記録する
キャプチャ停止DBMS_SQL_FIREWALL.STOP_CAPTURE収集を終了する
許可リスト生成DBMS_SQL_FIREWALL.GENERATE_ALLOW_LISTキャプチャログから許可リストを作成する
許可リスト有効化DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST許可リストに基づく制御を開始する

キャプチャ時、SQL 内のリテラル値はバインド変数(:SYS_B_0 など)に置換されて正規化されます。 これにより、値が異なっても構造が同じ SQL は同一のシグネチャとして扱われます。

-- 実行したSQL(異なる値)
SELECT first_name FROM hr.employees WHERE employee_id IN (102, 200);
SELECT first_name FROM hr.employees WHERE employee_id IN (101, 300);
-- キャプチャされる正規化済みSQL(同一シグネチャ)
SELECT FIRST_NAME FROM HR.EMPLOYEES WHERE EMPLOYEE_ID IN (:SYS_B_0, :SYS_B_1)

許可リスト有効化後は、同じ構造であれば値が変わっても実行できます。逆に構造が異なると ORA-47605: SQL Firewall violation でブロックされます。

ビュー内容
DBA_SQL_FIREWALL_STATUSSQL Firewall 全体の有効/無効状態
DBA_SQL_FIREWALL_CAPTURE_LOGSキャプチャしたSQLとシグネチャ(SQL_SIGNATURE
DBA_SQL_FIREWALL_ALLOWED_SQL許可リストに登録されたSQL(ALLOWED_SQL_ID
DBA_SQL_FIREWALL_VIOLATIONS違反ログ(SQL文・IP・クライアントプログラム・OSユーザーなど)

HR スキーマにアクセスする SALES_APP ユーザーを対象に、SQL キャプチャ→許可リスト生成→ブロック確認の一連の流れを体験します。

  1. SQL Firewall の有効化

    DBMS_SQL_FIREWALL.ENABLE で SQL Firewall を有効化し、DBA_SQL_FIREWALL_STATUS でステータスを確認します。

  2. SQL をキャプチャして学習する

    SALES_APP ユーザーのキャプチャを開始し、複数の SQL を実行します。停止後に DBA_SQL_FIREWALL_CAPTURE_LOGS でキャプチャ結果と SQL シグネチャを確認します。

  3. SQL の許可リストを作成する

    GENERATE_ALLOW_LIST でキャプチャログから許可リストを生成し、ENABLE_ALLOW_LIST で強制モードを有効化します(ENFORCE_ALLblock => TRUE)。

  4. 動作を確認する

    許可リストに含まれる SQL は実行でき、含まれない SQL は ORA-47605 でブロックされることを確認します。違反ログ(DBA_SQL_FIREWALL_VIOLATIONS)の確認と、許可リストからの個別削除も行います。