- 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_ADDR
DBA_SQL_FIREWALL_ALLOWED_OS_USER
DBA_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