- Oracle SQL Firewallユーザーズ・ガイド
- Oracle SQL Firewallの構成
- DBMS_SQL_FIREWALLパッケージを使用したOracle SQL Firewallの構成および管理
- DBMS_SQL_FIREWALLパッケージを使用したOracle SQL Firewallの構成
2.1.1 DBMS_SQL_FIREWALLパッケージを使用したOracle SQL Firewallの構成
SQL_FIREWALL_ADMINロールを持っているユーザーは、DBMS_SQL_FIREWALL PL/SQLパッケージを使用して、ルートまたはプラガブル・データベース(PDB)でOracle SQL Firewallを構成できます。
SQL_FIREWALL_ADMINロールを付与されているユーザーとしてルートまたはPDBに接続します。- SQLファイアウォールを有効にします。
EXEC DBMS_SQL_FIREWALL.ENABLE; - 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ファイアウォール・キャプチャは、SYS、SYSDG、SYSBACKUP、SYSRAC、SYSKM、DVSYS、LBACSYSまたは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ファイアウォールの学習内容を破棄して最初から学習し直す必要があります。現在のキャプチャを削除し、新しいキャプチャを作成できます。具体的には、キャプチャ・プロセスを再開する場合は、まず、このキャプチャを停止し(開始されている場合)、キャプチャ・ログをパージしてこのキャプチャを再度開始するか、このキャプチャを削除してキャプチャを再度作成(および開始)する必要があります。
- キャプチャ・ログおよびセッション・ログを確認して、キャプチャの妥当性を判断します。次に例を示します:
SELECT SQL_TEXT FROM DBA_SQL_FIREWALL_CAPTURE_LOGS WHERE USERNAME = 'APP'; - キャプチャを停止します。次に例を示します:
EXEC DBMS_SQL_FIREWALL.STOP_CAPTURE ('APP'); - ユーザーの許可リストを使用してSQLファイアウォール・ポリシーを生成します:許可リストを含むSQLファイアウォール・ポリシーは、許可されたSQL文と許可されたコンテキストのベースラインを設定します。許可されたSQL文は、承認されたSQL文を構成します。許可されたコンテキストは、信頼できるデータベース接続パスを表します。SQLファイアウォールでは、ユーザーの既存のキャプチャ・ログから収集されたデータに基づいて許可リストが作成されます。
次に例を示します:
EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST ('APP'); - ユーザーが実行できる許可された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'; - 必要に応じて、
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文の実行に使用する有効なオペレーティング・システム・プログラム名(sqlplusやSQL Developerなど)を受け入れます。
次のデータ・ディクショナリ・ビューを問い合せて、コンテキストを確認できます:
DBA_SQL_FIREWALL_ALLOWED_IP_ADDRDBA_SQL_FIREWALL_ALLOWED_OS_USERDBA_SQL_FIREWALL_ALLOWED_OS_PROG
- 生成された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ファイアウォール違反」というエラーが表示されます。
- 違反ログで、異常な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