2.1.1 DBMS_SQL_FIREWALLパッケージを使用したOracle SQL Firewallの構成

SQL_FIREWALL_ADMINロールを持っているユーザーは、DBMS_SQL_FIREWALL PL/SQLパッケージを使用して、ルートまたはプラガブル・データベース(PDB)でOracle SQL Firewallを構成できます。

  1. SQL_FIREWALL_ADMINロールを付与されているユーザーとしてルートまたはPDBに接続します。
  2. SQLファイアウォールを有効にします。
    EXEC DBMS_SQL_FIREWALL.ENABLE;
  3. OracleデータベースのSQLファイアウォールで保護するすべてのデータベース・ユーザーについて、信頼できるデータベース接続パスを介してすべての認可済SQL文をキャプチャして、SQLファイアウォールでデータベース・ユーザーの通常のSQLトラフィックを学習できるようにします。
    この手順の例では、ユーザーがAPPという名前のPDBユーザーであることを前提としています。次に例を示します:
    BEGIN
      DBMS_SQL_FIREWALL.CREATE_CAPTURE (
        username         => 'APP',
        top_level_only   => TRUE,
        start_capture    => TRUE
      );
    END;
    /

    この指定内容についての説明は次のとおりです:

    • usernameは、SQLファイアウォールがモニタリングするアプリケーション・ユーザーの名前です。各ユーザーに対して作成できるキャプチャは1つのみです。SQLファイアウォール・キャプチャは、SYSSYSDGSYSBACKUPSYSRACSYSKMDVSYSLBACSYSまたはAUDSYSユーザーに対して作成できません。
    • top_level_onlyは、キャプチャされるSQL文のレベルを制御します。
      • TRUEは、トップレベルのSQL文、つまりユーザーが直接実行する文についてのみキャプチャ・ログを生成します。
      • FALSEは、トップレベルのSQL文とPL/SQLユニットから発行されたSQLコマンドの両方についてキャプチャ・ログを生成します。デフォルトはFALSEです。
    • start_captureは、キャプチャが有効になるタイミングを制御します。
      • TRUEを使用すると、SQLファイアウォールでターゲット・ユーザーのアクティビティのキャプチャをすぐに開始できます。デフォルトはTRUEです。
      • FALSEは、ユーザーのキャプチャを作成しますが、すぐにはキャプチャを開始しません。キャプチャを後で開始する場合は、そのユーザーに対してDBMS_SQL_FIREWALL.START_CAPTUREプロシージャを実行する必要があります。次に例を示します:
        EXEC DBMS_SQL_FIREWALL.START_CAPTURE ('APP');

    アプリケーション・サービス・アカウントとして、アプリケーション・サービス・アカウントに対してキャプチャが開始されたときに、信頼できるデータベース接続パスから通常のアプリケーションSQLワークロードを実行します。アプリケーションへのパッチ適用後にSQLワークロードでアプリケーションが変更された場合は、SQLファイアウォールの学習内容を破棄して最初から学習し直す必要があります。現在のキャプチャを削除し、新しいキャプチャを作成できます。具体的には、キャプチャ・プロセスを再開する場合は、まず、このキャプチャを停止し(開始されている場合)、キャプチャ・ログをパージしてこのキャプチャを再度開始するか、このキャプチャを削除してキャプチャを再度作成(および開始)する必要があります。

  4. キャプチャ・ログおよびセッション・ログを確認して、キャプチャの妥当性を判断します。
    次に例を示します:
    SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_CAPTURE_LOGS WHERE USERNAME = 'APP';
  5. キャプチャを停止します。
    次に例を示します:
    EXEC DBMS_SQL_FIREWALL.STOP_CAPTURE ('APP');
  6. ユーザーの許可リストを使用してSQLファイアウォール・ポリシーを生成します:
    許可リストを含むSQLファイアウォール・ポリシーは、許可されたSQL文と許可されたコンテキストのベースラインを設定します。許可されたSQL文は、承認されたSQL文を構成します。許可されたコンテキストは、信頼できるデータベース接続パスを表します。SQLファイアウォールでは、ユーザーの既存のキャプチャ・ログから収集されたデータに基づいて許可リストが作成されます。

    次に例を示します:

    EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST ('APP');
  7. ユーザーが実行できる許可されたSQL文を確認するには、DBA_SQL_FIREWALL_ALLOWED_*データ・ディクショナリ・ビューを問い合せます。
    次に例を示します:
    SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_ALLOWED_SQL WHERE USERNAME = 'APP';

    ユーザーの信頼できるデータベース接続パスを確認するには、次の問合せを実行します:

    SELECT OS_PROGRAM FROM DBA_SQL_FIREWALL_ALLOWED_OS_PROG WHERE USERNAME = 'APP';
    SELECT OS_USER FROM DBA_SQL_FIREWALL_ALLOWED_OS_USER WHERE USERNAME = 'APP';
    SELECT IP_ADDRESS FROM DBA_SQL_FIREWALL_ALLOWED_ALLOWED_IP_ADDR WHERE USERNAME = 'APP';
  8. 必要に応じて、DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXTおよびDBMS_SQL_FIREWALL.DELETE_ALLOWED_CONTEXTプロシージャを実行して、許可されたコンテキストのエントリを追加または変更します。
    コンテキストを追加できるのは、許可リストを生成した後のみです。コンテキストでは、クライアントIPアドレス、オペレーティング・システム・ユーザーの名前、またはデータベース接続に使用できるオペレーティング・システム・プログラムを指定できます。コンテキスト値は必要な数だけ追加できます。たとえば、ユーザーの許可されたコンテキスト・リストにIPアドレス192.0.2.1が含まれていないが、許可リストの有効化後にユーザーがこのIPから接続できるようにする場合:
    BEGIN
      DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT (
        username       => 'APP',
        context_type   => DBMS_SQL_FIREWALL.IP_ADDRESS,
        value          => '192.0.2.1'
       );
    END;
    /

    特定のcontext_typeについてあらゆる可能性を指定するには、%ワイルドカードを入力します。

    次の3つのタイプのcontext_type設定が有効です:

    • DBMS_SQL_FIREWALL.IP_ADDRESSは、CIDR表記法のIPv4およびIPv6アドレスとサブネットを受け入れます。IPアドレスが使用できない場合は、ローカル接続のための値Local (大/小文字を区別)を受け入れます。
    • DBMS_SQL_FIREWALL.OS_USERNAMEは、oracleなどの有効なオペレーティング・システム・ユーザー名を受け入れます。
    • DBMS_SQL_FIREWALL.OS_PROGRAMは、ユーザーがSQL文の実行に使用する有効なオペレーティング・システム・プログラム名(sqlplusSQL Developerなど)を受け入れます。

    次のデータ・ディクショナリ・ビューを問い合せて、コンテキストを確認できます:

    • DBA_SQL_FIREWALL_ALLOWED_IP_ADDR
    • DBA_SQL_FIREWALL_ALLOWED_OS_USER
    • DBA_SQL_FIREWALL_ALLOWED_OS_PROG
  9. 生成されたSQLファイアウォール・ポリシーを有効にして、データベース・ユーザーを保護します。
    SQLファイアウォールは、ユーザーがデータベースに接続してSQL文を発行するときに許可リストのチェックを強制します。
    この有効化は、ターゲット・ユーザーの既存のセッションでもすぐに有効になります。

    次に例を示します:

    BEGIN
      DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST (
        username       => 'APP',
        enforce        => DBMS_SQL_FIREWALL.ENFORCE_SQL,
        block          => TRUE
       );
    END;
    /

    この指定内容についての説明は次のとおりです:

    • usernameには、許可リストが生成されている特定のユーザーを指定することも、許可リストが現在有効になっていないすべてのユーザーを指定することもできます。すべてのユーザーを指定する場合は、値としてNULLを使用します。
    • enforceは、次の強制タイプのいずれかを指定します:
      • DBMS_SQL_FIREWALL.ENFORCE_CONTEXTは、構成済の許可されたコンテキストを強制します。
      • DBMS_SQL_FIREWALL.ENFORCE_SQLは、構成済の許可されたSQLを強制します。
      • DBMS_SQL_FIREWALL.ENFORCE_ALLは、許可されたコンテキストと許可されたSQLの両方を強制します。この設定がデフォルトです。
    • blockは、次のことを指定します:
      • TRUEの場合、ユーザーが許可リスト定義に違反するたびに、ユーザーのデータベース接続またはユーザーのSQL実行をブロックします。
      • FALSEの場合、一致しないユーザー・データベース接続またはSQLコマンドを続行できます。この設定がデフォルトです。

      SQLファイアウォールでは、強制オプションに関係なく、一致しないユーザー・データベース接続またはSQL文について違反ログが常に生成されます。

      この段階で、ユーザーが許可リストに違反するSQL問合せを実行しようとして、このSQLをブロックするようにSQLファイアウォールを指定していた場合は、「ORA-47605: SQLファイアウォール違反」というエラーが表示されます。

  10. 違反ログで、異常なSQL接続の試行または許可リストにない場合にレポートされるSQL問合せをモニタリングします。
    次に例を示します:
    SELECT SQL_TEXT, FIREWALL_ACTION, IP_ADDRESS, CAUSE, OCCURRED_AT
    FROM DBA_SQL_FIREWALL_VIOLATIONS WHERE USERNAME = 'APP';

    出力は、次のようになります。

    SQL_TEXT                                                  FIREWALL_ACTION  IP_ADDRESS   CAUSE            OCCURRED_AT
    –-------------------------------------------------------- –--------------- –----------  –---------------- –----------------------------------
    
    SELECT SALARY FROM HR.EMPLOYEES WHERE SALARY >:"SYS_B_0"  BLOCKED          192.0.2.146  Context violation 12-MAY-23 11.12.39.626053 PM +00:00