32 ファイングレイン監査を使用した特定のアクティビティの監査

ファイングレイン監査では、非常に詳細なレベルで監査ポリシーを作成できます。

32.1 ファイングレイン監査の概要

ファイングレイン監査ポリシーを作成する前に、ファイングレイン監査の仕組みについて全体的な概念を理解する必要があります。

32.1.1 ファイングレイン監査について

ファイングレイン監査では、ポリシーを作成して、監査が実行される特定の条件を定義できます。

ファイングレイン監査を使用して統合監査ポリシーは作成できませんが、データのアクセス時間の監査など、詳細にカスタマイズされた監査設定はファイングレイン監査を使用して作成できます。

これにより、内容に基づいてデータ・アクセスを監視できるようになります。問合せと、INSERTUPDATE、およびDELETE操作に対して詳細な監査を提供します。ファイングレイン監査を使用すると、次のタイプのアクションを監査できます。

  • 午後9時から午前6時の間、または土曜日と日曜日に表にアクセスする場合

  • 社内ネットワーク外部のIPアドレスを使用する場合

  • 表の列を選択または更新する場合

  • 表の列の値を変更する場合

通常、ファイングレイン監査ポリシーは、選択的監査の条件である、表オブジェクトに対する単純なユーザー定義SQL述語に基づいています。フェッチ中に行がポリシーの条件を満たすと、その問合せが監査対象となります。

統合監査ポリシーでは、次のアクションを除き、ファイングレイン監査ポリシーで実行できるほとんどの操作を実行できます。

  • 特定の列の監査。給与や社会保障番号など、機密情報が格納されている特定の関連する列を監査できます。

  • イベント・ハンドラの使用。たとえば、夜中に変更されないようにする必要がある監査対象の列が更新された場合に、セキュリティ管理者に電子メール・アラートを送信する関数を作成できます。

ファイングレイン監査には、統合監査と比べて次のような利点があります。

  • 行値ベースの監査を実行できます。たとえば、更新された値が指定のしきい値より高い場合はsalary列に対する更新を監査できますが、そうでない場合は監査できません。
  • ファイングレイン監査イベント・ハンドラを使用して、管理者または他のユーザーに特定のイベントを事前に通知できます。
  • PL/SQLでBULK COLLECTおよびFORALLを使用したバルク・データ処理操作中に、様々なバインド変数に対して同じDML文を繰り返し実行すると、ファイングレイン監査により、適切なバインド変数値で繰返し実行された文を取得できます。

ノート:

  • ファイングレイン監査は、コストベースの最適化でのみサポートされています。ルールベースの最適化を使用する問合せでは、行フィルタを適用する前にファイングレイン監査が行われるため、不要な監査イベント・トリガーが発生します。

  • フラッシュバック問合せに含まれるオブジェクトで現在有効なポリシーが、指定したフラッシュバック・スナップショット(時間またはシステム変更番号(SCN)に基づく)から戻されたデータに適用されます。

  • ファイングレイン監査を使用して直接ロードされるデータを監査する場合(たとえばOracle Warehouse Builderを使用してDML文を実行する場合)、Oracle Databaseはデータベース・インスタンスで実行されているすべてのダイレクト・ロードを透過的に従来型ロードにします。データのダイレクト・ロードを保持する場合は、かわりに統合監査ポリシーの使用を検討してください。

32.1.2 ファイングレイン監査レコードが格納される場所

ファイングレイン監査レコードは統合監査証跡に格納され、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューを問い合せることで表示できます。

これらの監査レコードは、デフォルトでSYSAUX表領域に格納されます。DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATIONプロシージャを使用して、新しい表領域を指定できます。この表領域は暗号化された表領域にできます。有効な監査ポリシーに対して生成されたレコードを検索するために、AUDIT_ADMINロールまたはAUDIT_VIEWERロールを持つユーザーは、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューを問い合せることができます。

監査証跡では、SQL文内の表またはビューの参照ごとに監査レコードが取得されます。たとえば、HR.EMPLOYEES表を2回参照するUNION文を実行した場合、文の監査ポリシーによって2つ(HR.EMPLOYEES表へのアクセスごとに1つ)の監査レコードが生成されます。

32.1.3 ファイングレイン監査の実行者

Oracleには、ファイングレイン監査ポリシーを作成したり、ファイングレイン監査ポリシーのデータを表示および分析するために必要な権限のロールが用意されています。

ファイングレイン監査には、次の権限があります。

  • ファイングレイン監査ポリシーを作成するには、AUDIT_ADMINロールまたはDBMS_FGAパッケージに対するEXECUTE権限が付与されている必要があります。また、次のように、ADMINISTER FINE GRAINED AUDIT POLICYシステム権限も付与されている必要があります。

    • ファイングレイン監査ポリシーがデータベース全体のSYS以外のすべてのスキーマに適用される場合のADMINISTER FINE GRAINED AUDIT POLICY権限付与の構文:
      GRANT ADMINISTER FINE GRAINED AUDIT POLICY TO grantee;
    • ファイングレイン監査ポリシーが特定のスキーマに制限される場合のADMINISTER FINE GRAINED AUDIT POLICY権限付与の構文:
      GRANT ADMINISTER FINE GRAINED AUDIT POLICY ON SCHEMA schema TO grantee;
  • ファイングレイン監査データを表示および分析するには、AUDIT_VIEWERロールが付与されている必要があります。

PL/SQLパッケージにはAUDIT_ADMINロールがすでに付与されています。すべての権限と同様に、管理者がこれらのロールを信頼できるユーザーにのみ付与する必要があります。DBA_ROLE_PRIVSデータ・ディクショナリ・ビューを問い合せることで、ユーザーに付与されているロールを確認できます。

32.1.4 Oracle VPDポリシーがある表またはビューでのファイングレイン監査

この監査証跡は、Oracle VPDポリシーに含まれているファイングレイン監査表またはビューからVPD述語を取得します。

この動作は、統合監査証跡で統合監査ポリシーのVPD述語を取得する場合の動作に似ています。

監査証跡では、Oracle Label SecurityおよびOracle Real Application Securityのポリシーの内部述語も取得されます。

VPD述語監査レコードを取得するために特別な監査ポリシーを作成する必要はありません。述語情報は自動的に、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューのRLS_INFO列に格納されます。

同じ表またはビューに適用されるVPDポリシーが複数ある場合、これらのポリシーの述部は、デフォルトでRLS_INFO列に連結されます。各述語がそれ自体の行(対応するVPDポリシー名などの情報で特定)に含まれるように出力を再フォーマットするには、DBMS_AUDIT_UTIL PL/SQL パッケージのファンクションを使用します。

32.1.5 マルチテナント環境でのファイングレイン監査

ファイングレイン監査ポリシーは、CDBルート、アプリケーション・ルート、CDB PDBおよびアプリケーションPDBで作成できます。

ファイングレイン監査ポリシーには、次のような一般的なルールがあります。

  • ファイングレイン監査ポリシーは、SYSオブジェクトに対して作成できません。

  • ファイングレイン監査ポリシーは(ローカルまたはアプリケーション共通を問わず)、拡張データ・リンク・オブジェクトに対して作成できません。

  • CDBルートでファイングレイン監査ポリシーを作成する場合、すべてのPDBにポリシーを適用することはできません。ポリシーはCDBルート内のオブジェクトに適用されます。(つまり、CDBルートに対する共通のファイングレイン監査ポリシーは存在しません。)すべてのPDBで共通オブジェクトのアクセスを監査するようにファイングレイン監査ポリシーを作成する場合は、監査ポリシーを各PDBで明示的に作成し、PDBでアクセス可能にする共通オブジェクトに対してそのポリシーを有効化する必要があります。

  • PDBでファイングレイン監査ポリシーを作成する場合、ポリシーはPDB内のオブジェクトにのみ適用されます。マルチテナント環境全体に1つのポリシーを作成することはできません。PDB内でオブジェクトにポリシーを指定する必要があります。

  • アプリケーション共通ファイングレイン監査ポリシーは、アプリケーション・ルートに接続し、BEGIN/ENDブロック内にいる場合にのみ作成できます。アプリケーション・ルートに接続し、BEGIN/ENDブロック外でファイングレイン監査ポリシーを作成すると、ファイングレイン監査ポリシーはアプリケーション・ルートに作成されます。

  • アプリケーション共通ファイングレイン監査ポリシーは、ローカルPDBオブジェクトに対して作成できません。

  • アプリケーション共通ファイングレイン監査ポリシーにハンドラがある場合、このハンドラはアプリケーション共通ユーザーまたはCDB共通ユーザーによって所有されている必要があります。

  • アプリケーション・ファイングレイン監査ポリシーは、ローカル(PDB)オブジェクトおよびCDB共通オブジェクトに対して作成できます。ポリシーはそのコンテナに対してローカルであるため、ポリシーが定義されたオブジェクトは、ポリシーが定義された特定のコンテナ内でのみ監査されます。たとえば、ファイングレイン監査ポリシーをhr_pdb PDBで作成する場合、このポリシーを作成する対象のオブジェクトは、hr_pdb PDB内に存在する必要があります。

  • ローカル・ファイングレイン監査ポリシーは、アプリケーションPDB内のオブジェクト・リンク・オブジェクトおよび拡張データ・リンク・オブジェクトに対して作成できません。メタデータリンク・オブジェクトは、ファイングレイン監査ポリシーで使用できます。

  • アプリケーション・ルート・ローカル・ポリシーは、アプリケーション共通オブジェクトに対して使用できます。

  • ファイングレイン監査ポリシーを共通監査ポリシーとしてアプリケーション・ルートで作成する場合、このアプリケーション・ルートに属する各PDBで有効になります。したがって、アプリケーションPDBのアプリケーション共通オブジェクトおよびCDB共通オブジェクト(アプリケーション共通ファイングレイン監査ポリシーが定義されたもの)は、そのアプリケーションPDB内のファイングレイン監査証跡において監査されます。

  • アプリケーションのインストール、アップグレード、パッチ適用またはアンインストール操作用のスクリプトを作成する際、ALTER PLUGGABLE DATABASE app_name BEGIN INSTALLおよびALTER PLUGGABLE DATABASE app_name END INSTALLブロック内にSQL文を含めて、様々な操作を実行できます。ファイングレイン監査ポリシー文は、これらのブロック内にのみ含めることができます。

  • アプリケーション共通ファイングレイン監査ポリシーの有効化、無効化または削除の実行は、アプリケーション・ルートから、およびスクリプト内のALTER PLUGGABLE DATABASE app_name BEGIN INSTALLおよびALTER PLUGGABLE DATABASE app_name END INSTALLブロック内からに限定されます。

32.1.6 ファイングレイン監査ポリシーとエディション

エディション環境で使用するためのDBMS_FGAポリシーを作成できます。

次のことに注意してください。

  • エディション・ベースの再定義のアプリケーションを作成し、アプリケーションが編集ビューで使用する各表を対象とすることができます。これを行う場合、編集ビューに対してこれらの表を保護するファイングレイン監査ポリシーを移動する必要があります。DBA_EDITIONSデータ・ディクショナリ・ビューを問い合せることで、現在構成されているエディションについて情報を確認できます。ファイングレイン監査ポリシーに関する情報を確認するには、DBA_AUDIT_POLICIESを問い合せます。

  • DBMS_FGAパッケージ・ポリシーを異なる複数のエディションで使用する場合、ポリシーの結果を制御できます。つまり、結果をすべてのエディションで同一にするか、またはポリシーが使用されているエディションに固有にできます。

32.2 ファイングレイン監査ポリシーの作成

DBMS_FGA.ADD_POLICYプロシージャで、ファイングレイン監査ポリシーを作成します。

32.2.1 ファイングレイン監査ポリシーの作成について

ファイングレイン監査ポリシーを作成するには、ファイングレイン監査ポリシーを作成および管理するためのプロシージャが含まれるDBMS_FGA PL/SQLパッケージを使用します。

DBMS_FGA PL/SQLパッケージを使用すると、SELECTINSERTUPDATEおよびDELETE文のすべての組合せを1つのポリシーに追加できます。また、基礎となるアクションのINSERTおよびUPDATEを監査することによって、MERGE文も監査できます。MERGE文を監査するには、INSERTおよびUPDATE文に対するファイングレイン・アクセスを構成します。成功したMERGE操作についてポリシーごとにレコードが1つのみ生成されます。

ファイングレイン監査ポリシーを作成する実表にマテリアライズド・ビューを作成する場合は、同じ表にマテリアライズド・ビューを作成する前に、実表にファイングレイン監査ポリシーを作成する必要があります。そうしないと、マテリアライズド・ビューに対するリフレッシュ操作はORA-12008: 「マテリアライズド・ビューのリフレッシュ・パスでエラーが発生しました。」エラーで失敗します。

ファイングレイン監査ポリシーを管理するには、AUDIT_ADMINロールを付与する必要があります。DBMS_FGAパッケージのEXECUTE権限は強制的に監査されることにも注意してください。

監査ポリシーは、監査ポリシーを作成した表にバインドされます。これにより、それぞれのアプリケーションではなく、データベースで一度だけポリシーを変更すればよいため、監査ポリシーの管理が容易です。また、データベースへの接続方法(接続元がアプリケーション、Webインタフェース、SQL*PlusやOracle SQL Developerのいずれであるか)に関係なく、ポリシーに影響を与えるアクションがすべて記録されます。

問合せから戻された行が定義した監査条件と一致すると、ファイングレイン監査証跡に監査エントリが挿入されます。このエントリでは、通常の監査証跡でレポートされるすべての情報が除外されます。つまり、TRUEと評価されたすべてのファイングレイン監査ポリシーに対して、1行の監査情報のみが監査証跡に挿入されます。

DBMS_FGA.ADD_POLICYプロシージャで、指定された述語を監査条件として使用し、監査ポリシーを作成します。

デフォルトでは、ポリシーを所有するユーザーの権限で、ポリシーの述語がOracle Databaseによって実行されます。表オブジェクトまたはビュー・オブジェクトに設定可能なファイングレイン・ポリシーの最大数は256です。Oracle Databaseでは、ポリシーはデータ・ディクショナリ表に格納されますが、SYSスキーマ内に存在しない表またはビューに関するポリシーを作成できます。ファイングレイン・ポリシーは、ローカルPDBでのみ作成されます。

ファイングレイン監査ポリシーを作成後に変更することはできません。ポリシーを変更する必要がある場合は、削除してから再作成します。

ファイングレイン監査ポリシーに関する情報を検索するには、ALL_AUDIT_POLICIESDBA_AUDIT_POLICIESおよびUSER_AUDIT_POLICIESビューを問い合せます。UNIFIED_AUDIT_TRAILビューには、FGA_POLICY_NAMEという名前の列が含まれ、この列を使用すると、特定のファイングレイン監査ポリシーを使用して生成された行をフィルタできます。

32.2.2 ファイングレイン監査ポリシーの作成の構文

DBMS_FGA.ADD_POLICYプロシージャには、複雑な監査のハンドラを使用する機能など、様々な設定が含まれています。

DBMS_FGA.ADD_POLICYプロシージャの構文は次のとおりです。

DBMS_FGA.ADD_POLICY(
   object_schema      IN  VARCHAR2 DEFAULT NULL 
   object_name        IN  VARCHAR2,
   policy_name        IN  VARCHAR2, 
   audit_condition    IN  VARCHAR2 DEFAULT NULL, 
   audit_column       IN  VARCHAR2 DEFAULT NULL 
   handler_schema     IN  VARCHAR2 DEFAULT NULL, 
   handler_module     IN  VARCHAR2 DEFAULT NULL, 
   enable             IN  BOOLEAN DEFAULT TRUE, 
   statement_types    IN  VARCHAR2 DEFAULT SELECT,
   audit_trail        IN  BINARY_INTEGER DEFAULT NULL, 
   audit_column_opts  IN  BINARY_INTEGER DEFAULT ANY_COLUMNS, 
   policy_owner       IN  VARCHAR2 DEFAULT NULL);

詳細は、次のとおりです。

  • object_schemaには、監査するオブジェクトのスキーマを指定します。(NULLの場合、現行のログオン・ユーザーのスキーマと想定されます。)

  • object_nameには、監査するオブジェクトの名前を指定します。

  • policy_nameには、作成するポリシーの名前を指定します。この名前は必ず一意にしてください。

  • audit_conditionには、行のブール条件を指定します。NULLも指定できます(TRUEとして機能します)。監査条件にNULLを指定するか、何も指定しない場合は、そのポリシーが設定された表に対するアクションが行われると、行が戻されるかどうかに関係なく監査レコードが作成されます。

    次のガイドラインに従ってください。

    • ファンクションは、同じ実表で監査可能な文を実行するため、audit_condition設定に含めないでください。たとえば、HR.EMPLOYEES表に対してINSERT文を実行するファンクションを作成するとします。ポリシーのaudit_conditionには、このファンクションが含まれていて、これは(statement_typesにより設定される)INSERT文のポリシーです。このポリシーが使用されると、ファンクションはシステムのメモリーが足りなくなるまで再帰的に実行します。これにより、ORA-1000: 最大オープン・カーソル数を超えました。またはORA-00036: 再帰的SQLレベルの最大値(50)を超えましたのエラーが発生する場合があります。

    • DBMS_FGA.ENABLE_POLICY文またはDBMS_FGA.DISABLE_POLICY文を、ポリシーの条件に含まれるファンクションから発行しないでください。

  • audit_columnには、監査対象の1つ以上の列(非表示列も含む)を指定します。NULLに設定するかまたは省略すると、すべての列が監査されます。Oracle Label Securityの非表示列やオブジェクト・タイプ列も対象になります。デフォルトのNULLの場合、アクセスまたは影響を受ける列があれば監査が行われます。

  • handler_schema: ポリシーに違反した場合の応答のトリガーにアラートが使用される場合は、イベント・ハンドラが含まれているスキーマの名前を指定します。デフォルトのNULLでは、現行のスキーマが使用されます。

  • handler_moduleには、イベント・ハンドラの名前を指定します。イベント・ハンドラが含まれるパッケージも対象になります。このファンクションは、問合せの監査条件と一致する最初の行が処理された後でのみ実行されます。

    次のガイドラインに従ってください。

    • 再帰的ファイングレイン監査ハンドラを作成しないでください。たとえば、HR.EMPLOYEES表に対してINSERT文を実行するハンドラを作成するとします。このハンドラに関連付けられるポリシーは、(statement_typesパラメータにより設定される)INSERT文のポリシーです。このポリシーが使用されると、ハンドラはシステムのメモリーが足りなくなるまで再帰的に実行します。これにより、ORA-1000: 最大オープン・カーソル数を超えました。またはORA-00036: 再帰的SQLレベルの最大値(50)を超えましたのエラーが発生する場合があります。

    • DBMS_FGA.ENABLE_POLICY文またはDBMS_FGA.DISABLE_POLICY文をポリシー・ハンドラから発行しないでください。これらの文を発行すると、 ORA-28144: ファイングレイン監査ハンドラの実行に失敗しましたエラーが発生する場合があります。

  • enableは、TRUEまたはFALSEを使用してポリシーを使用可能または使用禁止にします。省略した場合、ポリシーは使用可能になります。デフォルトはTRUEです

  • statement_types: 監査対象のSQL文を指定します。INSERTUPDATEDELETEまたはSELECTのみです。MERGE操作を監査する場合は、statement_types'INSERT,UPDATE'に設定します。デフォルト値はSELECTです。

  • audit_trail: 統合監査に移行している場合は、Oracle Databaseによってこのパラメータは無視され、監査レコードが統合監査証跡に即座に書き込まれます。Oracle Database 23c以降、従来の監査はサポートされないため、audit_trailは無視されます。

    クレジット・カード情報などの機密データもクリアテキストで記録できることに注意してください。

  • audit_column_opts: audit_columnパラメータで複数の列を指定した場合は、すべての列を監査するか特定の列を監査するかをこのパラメータで決定します。

  • policy_ownerは、ファイングレイン監査ポリシーを所有するユーザーです。ただし、この設定はユーザー指定の引数ではありません。Oracle Data Pumpクライアントは、この設定を内部で使用して、ファイングレイン監査ポリシーを適宜再作成します。

32.2.3 例: DBMS_FGA.ADD_POLICYを使用してファイングレイン監査ポリシーを作成する方法

DBMS_FGA.ADD_POLICYプロシージャで、複数の文タイプを使用してファイングレイン監査ポリシーを作成できます。

例32-1に、表HR.EMPLOYEESに対する文INSERTUPDATEDELETEおよびSELECTを監査する方法を示します。

この例では、audit_column_optsパラメータが必須パラメータではないため省略されていることに注意してください。

例32-1 DBMS_FGA.ADD_POLICYを使用してファイングレイン監査ポリシーを作成する方法

BEGIN
  DBMS_FGA.ADD_POLICY(
   object_schema      => 'HR',
   object_name        => 'EMPLOYEES',
   policy_name        => 'chk_hr_employees',
   audit_column       => 'SALARY',
   enable             =>  TRUE,
   statement_types    => 'INSERT, UPDATE, SELECT, DELETE');
END;
/

ポリシーを作成した後、DBA_AUDIT_POLICIESビューを問い合せると、新しいポリシーがリストされることを確認できます。

SELECT POLICY_NAME FROM DBA_AUDIT_POLICIES;

POLICY_NAME
-------------------------------
CHK_HR_EMPLOYEES

その後、次のようなSQL文を発行すると、監査イベント・レコードが記録されます。

SELECT COUNT(*) FROM HR.EMPLOYEES WHERE COMMISSION_PCT = 20 AND SALARY > 4500;

SELECT SALARY FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 50;

DELETE FROM HR.EMPLOYEES WHERE SALARY > 1000000;

32.2.4 特定の列および行の監査

条件が一致した列(関連列)を監査対象にするなど、監査動作を細かく調節できます。

これを実行するには、audit_columnパラメータを使用して、機密情報が含まれた列を1つ以上指定します。また、audit_conditionパラメータを使用してブール条件を定義すると、特定の行のデータを監査できます。(ただし、ポリシーで条件の監査のみが必要な場合は、監査ポリシー条件の使用を検討してください。)

次の設定によって部門50 (DEPARTMENT_ID = 50)のユーザーがSALARYおよびCOMMISSION_PCT列にアクセスしようとしたときに監査を実行できます。

audit_condition    => 'DEPARTMENT_ID = 50', 
audit_column       => 'SALARY,COMMISSION_PCT,'

この機能は非常に有用です。監査対象を特定の重要なデータ・タイプに限定できるだけでなく、社会保障番号、給与情報、診断書などの機密データを含む列をより強力に保護できます。

audit_columnに複数の列がリストされている場合は、audit_column_optsパラメータを使用すると、文の監査が、audit_columnパラメータで指定されたいずれかの列が問合せで参照されたときに実行されるか、またはすべての列が参照されたときにのみ実行されるかを指定できます。例:

audit_column_opts   => DBMS_FGA.ANY_COLUMNS,

audit_column_opts   => DBMS_FGA.ALL_COLUMNS,

関連列を指定しない場合、監査はすべての列に適用されます。

32.3 ファイングレイン監査ポリシーの管理

ファイングレイン監査ポリシーの作成後、変更または削除できます。

32.3.1 ファイングレイン監査ポリシーを使用可能にする方法

DBMS_FGA.ENABLE_POLICYプロシージャで、ファイングレイン監査ポリシーを有効にします。

  • 次の構文を使用して、ファイングレイン監査ポリシーを有効にします。
    DBMS_FGA.ENABLE_POLICY(
       object_schema  VARCHAR2, 
       object_name    VARCHAR2, 
       policy_name    VARCHAR2,
       enable         BOOLEAN);
    

    たとえば、DBMS_FGA.ENABLE_POLICYプロシージャを使用してchk_hr_empポリシーを再度使用可能にするとします。

    BEGIN
     DBMS_FGA.ENABLE_POLICY(
      object_schema        => 'HR',
      object_name          => 'EMPLOYEES',
      policy_name          => 'chk_hr_employees',
      enable               => TRUE);
    END;
    /
    

32.3.2 ファイングレイン監査ポリシーを使用禁止にする方法

DBMS_FGA.DISABLE_POLICYプロシージャで、ファイングレイン監査ポリシーを無効にします。

  • 次の構文を使用して、ファイングレイン監査ポリシーを無効にします。
    DBMS_FGA.DISABLE_POLICY(
       object_schema  VARCHAR2, 
       object_name    VARCHAR2, 
       policy_name    VARCHAR2); 
    

    例:

    BEGIN
     DBMS_FGA.DISABLE_POLICY(
      object_schema        => 'HR',
      object_name          => 'EMPLOYEES',
      policy_name          => 'chk_hr_employees');
    END;
    /
    

32.3.3 ファイングレイン監査ポリシーの削除

DBMS_FGA.DROP_POLICYプロシージャで、ファイングレイン監査ポリシーを削除します。

DBMS_FGA.ADD_POLICYプロシージャのobject_nameパラメータで指定されたオブジェクトを削除したり、監査ポリシーを作成したユーザーを削除した場合、自動的に監査ポリシーが削除されます。
  • 次の構文を使用して、ファイングレイン監査ポリシーを削除します。
    DBMS_FGA.DROP_POLICY(
       object_schema  VARCHAR2, 
       object_name    VARCHAR2, 
       policy_name    IVARCHAR2);
    

    例:

    BEGIN
     DBMS_FGA.DROP_POLICY(
      object_schema      => 'HR',
      object_name        => 'EMPLOYEES',
      policy_name        => 'chk_hr_employees');
    END;
    /
    

32.4 例: ファイングレイン監査ポリシーへの電子メール・アラートの追加

このチュートリアルでは、ユーザーがポリシーに違反したときに電子メールのアラートを生成するファイングレイン監査ポリシーの作成方法を示します。

32.4.1 このチュートリアルについて

このチュートリアルでは、ユーザー(または侵入者)がポリシーに違反したときに実施される電子メールのアラートをファイングレイン監査ポリシーに追加する方法を示します。

ノート:

  • このチュートリアルを完了するには、SMTPサーバーのあるデータベースを使用する必要があります。

  • このチュートリアルは、現在のPDBにのみ適用されます。

ファイングレイン監査ポリシーに電子メール・アラートを追加するには、最初にアラートを生成するプロシージャを作成し、次のDBMS_FGA.ADD_POLICYパラメータを使用して、ユーザーがこのポリシーに違反した場合にこのファンクションをコールする必要があります。

  • handler_schema: ハンドラ・イベントが格納されるスキーマ

  • handler_module: イベント・ハンドラの名前

アラートは、電子メールまたはポケベルによる通知や、特定のファイルまたは表の更新など、環境に適した形式で生成できます。アラートを作成すると、California Senate Bill 1386などの特定のコンプライアンス規制を満たすことも可能です。この例では、電子メール・アラートを作成します。

この例では、セキュリティ管理者に対して、人事部門の担当者がHR.EMPLOYEES表内の給与情報を選択または変更しようとしていることを通知する電子メール・アラートを作成します。担当者はこの表を変更することを許可されていますが、コンプライアンス規制を満たすために、表内の給与情報に対するすべての選択および変更操作に関するレコードを作成できます。

32.4.2 ステップ1: UTL_MAIL PL/SQLパッケージのインストールおよび構成

UTL_MAIL PL/SQLで、添付、CCおよびBCCなど一般に使用される電子メール機能が組み込まれた電子メールを管理します。

このパッケージを使用するには、インストールして構成する必要があります。このコンポーネントは、デフォルトではインストールおよび構成されません。
  1. SYSDBA管理権限があるユーザーSYSとしてPDBにログインします。
    sqlplus sys@pdb_name as sysdba
    Enter password: password
    

    CDB内の使用可能なPDBを確認するには、CDBルート・コンテナにログインし、DBA_PDBSデータ・ディクショナリ・ビューのPDB_NAME列を問い合せます。現在のコンテナを確認するには、show con_nameコマンドを実行します。

  2. UTL_MAILパッケージをインストールします。
    @$ORACLE_HOME/rdbms/admin/utlmail.sql
    @$ORACLE_HOME/rdbms/admin/prvtmail.plb
    

    UTL_MAILパッケージにより、電子メールの管理が可能になります。

    現在、UTL_MAIL PL/SQLパッケージではSSLサーバーはサポートされていないことに注意してください。

  3. この例が終了した後に元に戻すことができるよう、SMTP_OUT_SERVER初期化パラメータの現行の値を調べてノートにとっておきます。

    例:

    SHOW PARAMETER SMTP_OUT_SERVER
    

    SMTP_OUT_SERVERパラメータがすでに設定されている場合は、次のような出力が表示されます。

    NAME                    TYPE              VALUE
    ----------------------- ----------------- ----------------------------------
    SMTP_OUT_SERVER         string            some_imap_server.example.com
    
  4. 次のALTER SYSTEM文を発行します。
    ALTER SYSTEM SET SMTP_OUT_SERVER="imap_mail_server.example.com";
    

    imap_mail_server.example.comを、電子メール・ツールのアカウント設定にあるSMTPサーバーの名前に置き換えます。これらの設定を引用符で囲んでください。例:

    ALTER SYSTEM SET SMTP_OUT_SERVER="my_imap_server.example.com";
    
    
  5. SYSOPER権限を使用してSYSとして接続し、データベースを再起動します。
    CONNECT SYS@pdb_name AS SYSOPER 
    Enter password: password
    
    SHUTDOWN IMMEDIATE
    STARTUP
    
  6. SMTP_OUT_SERVERパラメータの設定が正しいことを確認します。
    CONNECT SYS@pdb_name AS SYSDBA 
    Enter password: password
    
    SHOW PARAMETER SMTP_OUT_SERVER
    

    次のような出力が表示されます。

    NAME                    TYPE              VALUE
    ----------------------- ----------------- ----------------------------------
    SMTP_OUT_SERVER         string            my_imap_server.example.com

32.4.3 ステップ2: ユーザー・アカウントの作成

管理アカウントおよび監査ユーザーを作成する必要があります。

  1. SYSとしてSYSDBA管理権限で接続していることを確認し、fga_adminユーザー(ファイングレイン監査ポリシーの作成者)を作成します。

    例:

    CONNECT SYS@pdb_name AS SYSDBA 
    Enter password: password
    
    CREATE USER fga_admin IDENTIFIED BY password;
    GRANT CREATE SESSION, CREATE PROCEDURE, AUDIT_ADMIN TO fga_admin;
    GRANT ADMINISTER FINE GRAINED AUDIT POLICY TO fga_admin;
    GRANT EXECUTE ON UTL_TCP TO fga_admin;
    GRANT EXECUTE ON UTL_SMTP TO fga_admin;
    GRANT EXECUTE ON UTL_MAIL TO fga_admin;
    GRANT EXECUTE ON DBMS_NETWORK_ACL_ADMIN TO fga_admin;
    

    passwordを安全なパスワードに置き換えます。

    UTL_TCPUTL_SMTPUTL_MAILおよびDBMS_NETWORK_ACL_ADMIN PL/SQLパッケージは、作成する電子メール・セキュリティ・アラートで使用されます。

  2. このポリシーの監査証跡をチェックする監査者ユーザーを作成します。
    GRANT CREATE SESSION TO fga_auditor IDENTIFIED BY password;
    GRANT AUDIT_VIEWER TO fga_auditor;
    
  3. ユーザーSYSTEMで接続します。
    CONNECT SYSTEM@pdb_name
    Enter password: password
    
  4. HRスキーマ・アカウントのロックが解除され、パスワードが付与されていることを確認します。必要に応じて、HRのロックを解除し、このユーザーにパスワードを付与します。
    SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'HR';
    

    アカウント・ステータスはOPENである必要があります。DBA_USERSビューに、ユーザーHRがロックされて期限切れになっていると表示された場合は、次の文を入力して、HRアカウントのロックを解除し、新しいパスワードを作成します。

    ALTER USER HR ACCOUNT UNLOCK IDENTIFIED BY password;
    

    安全なパスワードを作成してください。セキュリティを向上させるため、以前のリリースのOracle Databaseと同じパスワードをHRアカウントに指定しないでください

  5. 人事部門の担当者であるSusan Mavris(アクションの監査対象)用のユーザー・アカウントを作成し、このユーザーにHR.EMPLOYEES表へのアクセス権を付与します。
    GRANT CREATE SESSION TO smavris IDENTIFIED BY password;
    GRANT SELECT, INSERT, UPDATE, DELETE ON HR.EMPLOYEES TO SMAVRIS; 

32.4.4 ステップ3: ネットワーク・サービス用のアクセス制御リスト・ファイルの構成

アクセス制御リスト(ACL)ファイルを使用して、外部ネットワーク・サービスへのファイングレイン・アクセスを有効にできます。

UTL_MAILなどのPL/SQLネットワーク・ユーティリティ・パッケージを使用するには、このタイプのアクセス制御リスト(ACL)ファイルを構成する必要があります。
  1. ユーザーfga_adminとしてPDBに接続します。
    CONNECT fga_admin@pdb_name
    Enter password: password
    
  2. 次のアクセス制御設定とその権限定義を構成します。
    BEGIN
     DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
      host       => 'SMTP_OUT_SERVER_setting',
      lower_port => 25,
      ace        =>  xs$ace_type(privilege_list => xs$name_list('smtp'),
                                 principal_name => 'FGA_ADMIN',
                                 principal_type => xs_acl.ptype_db));
    END;
    /
    
    

    この例では、次のようになります。

    • SMTP_OUT_SERVER_setting: UTL_MAIL PL/SQLパッケージをインストールして構成したときにSMTP_OUT_SERVERパラメータに設定したSMTP_OUT_SERVER設定を入力します。この設定は、電子メール・ツールで送信サーバーに指定されている設定と完全に一致させてください。

    • lower_port: 電子メール・ツールで送信サーバーに指定されているポート番号を入力します。通常、この設定は25です。この値をlower_port設定に入力します。(現在、UTL_MAILパッケージではSSLをサポートしていません。電子メール・サーバーがSSLサーバーの場合、その電子メール・サーバーが別のポート番号を使用していても、ポート番号に25を入力します。)

    • ace: ここで権限を定義します。

32.4.5 ステップ4: 電子メール・セキュリティ・アラートPL/SQLプロシージャの作成

電子メール・セキュリティ・アラートPL/SQLプロシージャは、違反について説明するメッセージを生成し、このメッセージを適切なユーザーに送信します。

  • ユーザーfga_adminで、次のプロシージャを作成します。

    CREATE OR REPLACE PROCEDURE email_alert (sch varchar2, tab varchar2, pol varchar2)
    AS
    msg varchar2(20000) := 'HR.EMPLOYEES table violation. The time is: ';
    BEGIN
      msg := msg||TO_CHAR(SYSDATE, 'Day DD MON, YYYY HH24:MI:SS'); 
    UTL_MAIL.SEND (
        sender      => 'youremail@example.com',
        recipients  => 'recipientemail@example.com',
        subject     => 'Table modification on HR.EMPLOYEES',
        message     => msg); 
    END email_alert;
    /

    この例では、次のようになります。

    • CREATE OR REPLACE PROCEDURE ...AS: 次のステップで監査ポリシーに定義するスキーマ名(sch)、表名(tab)および監査プロシージャ名(pol)を表す署名を指定する必要があります。

    • senderおよびrecipients: youremail@example.comを自分の電子メール・アドレス、recipientemail@example.comを通知の受信対象者の電子メール・アドレスに置き換えます。

32.4.6 ステップ5: ファイングレイン監査ポリシー設定の作成とテスト

ファイングレイン監査ポリシーは、ポリシーの違反があるとアラートをトリガーします。

  1. ユーザーfga_adminで、chk_hr_empポリシーをファイングレイン監査ポリシーとして次のように作成します。
    BEGIN
     DBMS_FGA.ADD_POLICY (
      object_schema      =>  'HR',
      object_name        =>  'EMPLOYEES',
      policy_name        =>  'CHK_HR_EMP',
      audit_column       =>  'SALARY', 
      handler_schema     =>  'FGA_ADMIN',
      handler_module     =>  'EMAIL_ALERT',
      enable             =>   TRUE,
      statement_types    =>  'SELECT, UPDATE');
    END;
    /
    
  2. データベースに加えた変更をコミットします。
    COMMIT;
    
  3. これまでに作成した設定をテストします。
    EXEC email_alert ('hr', 'employees', 'chk_hr_emp');
    

    SQL*Plusに「PL/SQL procedure successfully completed」というメッセージが表示されます。まもなく、電子メール・サーバーの速度に応じて、電子メール・アラートを受信します。

    ORA-24247「アクセス制御リスト(ACL)によりネットワーク・アクセスが拒否されました」エラーの後にORA-06512「stringstringエラーが発生した場合は、アクセス制御リスト・ファイル内の設定を確認してください。

32.4.7 ステップ6: アラートのテスト

コンポーネントの準備ができたら、アラートをテストします。

  1. ユーザーsmavrisとしてPDBに接続し、自分の給与を確認して金額を引き上げます。
    CONNECT smavris@pdb_name
    Enter password: password
    
    SELECT SALARY FROM HR.EMPLOYEES WHERE LAST_NAME = 'Mavris';
    
    SALARY
    -----------
    6500
    
    UPDATE HR.EMPLOYEES SET SALARY = 38000 WHERE LAST_NAME = 'Mavris';
    

    ここまでの手順を実行すると、電子メール・サーバーの速度に応じて、自分自身(または通知の受信対象者)にTable modification on HR.EMPLOYEESという件名ヘッダーの電子メールが届き、HR.EMPLOYEES表の改ざんについて通知されます。違反者を検索するのに必要なのは、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューを問い合せるのみです。

  2. 次のようにユーザーfga_auditorとして、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューを問い合せます。
    CONNECT fga_auditor@pdb_name
    Enter password: password
    
    col dbusername format a20
    col sql_text format a66
    col audit_type format a17
    
    SELECT DBUSERNAME, SQL_TEXT, AUDIT_TYPE 
    FROM UNIFIED_AUDIT_TRAIL 
    WHERE OBJECT_SCHEMA = 'HR' AND OBJECT_NAME = 'EMPLOYEES';
    

    次のような出力が表示されます。

    DBUSERNAME  SQL_TEXT                                                          AUDIT_TYPE
    ----------  ----------------------------------------------------------------- ----------------
    SMAVRIS     UPDATE HR.EMPLOYEES SET SALARY = 38000 WHERE LAST_NAME = 'Mavris' FineGrainedAudit
    

    監査証跡では、Susan Mavrisが実行し、HR.EMPLOYEES表のSALARY列に影響を与えたSQL文が取得されます。Susanが実行した最初の文(現在の給与に関して尋ねた文)は、監査ポリシーの影響を受けなかったため記録されませんでした。これは、Oracle Databaseでは、監査関数は自律型トランザクションとして実行され、handler_module設定のアクションのみをコミットし、ユーザー・トランザクションはコミットしないためです。この関数はユーザーのSQLトランザクションには影響を与えません。

32.4.8 ステップ7: このチュートリアルのコンポーネントの削除

このチュートリアルのコンポーネントが不要になった場合、それらを削除できます。

  1. SYSTEM権限を持つユーザーでSQL*Plusに接続し、ユーザーfga_admin (fga_adminスキーマ内のオブジェクトを含む)、fga_auditorおよびsmavrisを削除します。
    CONNECT SYSTEM@pdb_name
    Enter password: password
    
    DROP USER fga_admin CASCADE;
    DROP USER fga_auditor;
    DROP USER smavris;
    
  2. ユーザーHRで接続し、Susan Mavrisの引き上げた給与を元に戻します。
    CONNECT HR@pdb_name
    Enter password: password
    
    UPDATE HR.EMPLOYEES SET SALARY = 6500 WHERE LAST_NAME = 'Mavris';
    
  3. 他のユーザーがHRを使用しない場合、このアカウントはロックして期限切れにできます。
    ALTER USER HR PASSWORD EXPIRE ACCOUNT LOCK;
    
  4. 次のALTER SYSTEM文を発行して、ステップ1: UTL_MAIL PL/SQLパッケージのインストールおよび構成のステップ4からSMTP_OUT_SERVERパラメータを前の値にリストアします。
    ALTER SYSTEM SET SMTP_OUT_SERVER="previous_value";
    

    この設定は引用符で囲みます。例:

    ALTER SYSTEM SET SMTP_OUT_SERVER="some_imap_server.example.com"
    
  5. SYSDBA管理権限があるユーザーとしてCDBルートに接続します。
    CONNECT / AS SYSDBA
  6. PDBをクローズしてから再度オープンします。
    ALTER PLUGGABLE DATABASE pdb_name CLOSE IMMEDIATE;
    ALTER PLUGGABLE DATABASE pdb_name OPEN;

32.5 ファイングレイン監査ポリシーのデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューおよび動的ビューを問い合せると、ファイングレイン監査ポリシーについて詳細な監査情報を確認できます。

表31-20に、これらのビューを示します。

ヒント:

監査ポリシーに関するエラー情報を検索するには、トレース・ファイルを確認します。USER_DUMP_DEST初期化パラメータは、トレース・ファイルの位置を示します。

表32-1 ファイングレイン監査ポリシーで使用するビュー

ビュー 説明

ALL_AUDIT_POLICIES

すべてのファイングレイン監査ポリシーに関する情報が表示されます。

ALL_DEF_AUDIT_OPTS

オブジェクトの作成時に適用されるデフォルトのオブジェクト監査オプションがリストされます。

AUDITABLE_SYSTEM_ACTIONS

監査可能なシステム・アクション番号がアクション名にマップされます。

CDB_UNIFIED_AUDIT_TRAIL

UNIFIED_AUDIT_TRAILビューと同様、監査レコードを表示しますが、マルチテナント環境のすべてのPDBからの監査レコードを表示します。このビューは、CDBルートのみで使用可能で、そこから問い合せる必要があります。

DBA_AUDIT_POLICIES

ファイングレイン監査ポリシーに関する情報が表示されます。

DBA_SA_AUDIT_OPTIONS

ユーザーによって実行される監査対象のOracle Label Securityイベントが表示され、ユーザーのアクションが成功したか失敗したかが示されます。

SYSTEM_PRIVILEGE_MAP (表)

権限(監査オプション)型コードが表示されます。この表を使用して、権限(監査オプション)の型番号を型名にマップできます。

USER_AUDIT_POLICIES

現行ユーザーによって所有される表およびビューのすべてのファイングレイン監査ポリシーに関する情報が表示されます。

UNIFIED_AUDIT_TRAIL

すべての監査レコードが表示されます。

V$XML_AUDIT_TRAIL

XML形式のファイルに書き込まれた標準監査、ファイングレイン監査、SYS監査および必須監査のレコードが表示されます。