5 権限分析を実行した権限の使用の確認

権限分析では、ユーザーが使用中および未使用の権限とロールが動的に分析されます。

権限分析とは

権限分析により、データベース・ロールおよび権限に対する最低限の権限のベスト・プラクティスを実装することで、アプリケーションおよびデータベース操作のセキュリティが向上します。

権限分析について

Oracle Databaseカーネルの内部で実行する権限分析では、最低限の権限モデルを実装するための使用済および未使用の権限を識別することで、ユーザー、ツールおよびアプリケーション・アカウントの攻撃面を縮小するのに役立ちます。

権限分析は、データベース・ユーザーおよびアプリケーションによって使用される権限を動的に取得します。権限分析を使用すると、最低限の権限のガイドラインを迅速かつ効率的に実施するのに役立ちます。最低限の権限モデルでは、ユーザーにジョブの実行に必要な権限およびアクセス権のみが与えられます。ユーザーが様々なタスクを実行することがよくありますが、その場合でも、ユーザーにはすべて同じ強力な権限のセットが付与されます。権限分析なしでは、各ユーザーが持つ必要がある権限を見つけ出すのが困難で、多くの場合、様々なタスクがある場合でも、ユーザーは共通の権限のセットの一部で終わる可能性があります。権限を管理する組織であっても、ユーザーは時間の経過とともに権限を累積し、権限が失われることはほとんどありません。業務分離により、1つのプロセスが様々なユーザーの個別のタスクに分割されます。最低限の権限では、ユーザーが必要なタスクのみを実行できるように分離が強制されます。業務の分離の強制は内部制御に役立ちますが、特権資格証明を盗む悪質なユーザーからのリスクも減少します。

権限分析では、実行時にデータベース・ユーザーおよびアプリケーションによって使用される権限を取得し、問合せ可能なデータ・ディクショナリ・ビューにその結果を書き込みます。アプリケーションに定義者の権限および起動者の権限のプロシージャが含まれている場合、権限分析では、権限取得が作成され有効化される前にプロシージャがコンパイルされていた場合でも、プロシージャのコンパイルと実行に必要な権限が取得されます。

権限分析の利点およびユースケース

権限の使用の分析は、不必要に付与された権限の検索と最低限の権限のベスト・プラクティスの実装に役立ちます。

最低限の権限のベスト・プラクティス

データベースにアクセスするアカウントの権限は、アプリケーションまたはユーザーが厳密に必要とする権限に制限する必要があります。

ただし、特にサード・パーティがアプリケーションを開発する場合、必要以上の権限が便宜上アプリケーション接続プール・アカウントに付与される可能性があります。さらに、一部の開発者は、システム権限およびアプリケーションのオブジェクト権限をPUBLICロールに付与します。

たとえば、アプリケーション・データから選択してアプリケーション・プロシージャを実行するには、システム権限SELECT ANY TABLEおよびEXECUTE ANY PROCEDUREをアプリケーション・アカウントappsysに付与します。これで、appsysは、意図しない場合でもアプリケーション以外のデータにアクセスできます。この状況で、ユーザーappsysで権限の使用状況を分析し、結果に基づき必要に応じて権限を取り消したり付与できます。

セキュアなアプリケーションの開発

アプリケーションの開発フェーズで、多くの強力なシステム権限およびロールをアプリケーション開発者に付与する管理者もいます。

これは、管理者がその段階でアプリケーション開発者がどの権限を必要としているかを把握できないことが理由である場合があります。

アプリケーションが開発されて稼働すると、アプリケーション開発者に必要な権限とそうでない権限が明確になります。この時点で、セキュリティ管理者は不必要な権限の取消しを開始できます。ただし、アプリケーションが現在問題なく稼働しているため、アプリケーション開発者がこの考えに抵抗する場合があります。管理者は、権限分析を使用して、アプリケーションで使用されている各権限を調べることで、権限を取り消した場合に、アプリケーションの稼働を継続できるかを確認できます。

たとえば、app_ownerは、データベースに接続するアプリケーションのアプリケーション・データベース・ユーザーです。ユーザーapp_ownerは、OESHおよびPMスキーマの表を問い合せる必要があります。これらのスキーマの各表のSELECTオブジェクト権限を付与するかわりに、セキュリティ管理者は、SELECT ANY TABLE権限をapp_ownerに付与します。しばらくしてから、新しいスキーマHRが作成され、機密データがHR.EMPLOYEES表に挿入されます。ユーザーapp_ownerにはSELECT ANY TABLE権限があるため、この表を問い合せて機密データにアクセスできますが、これはセキュリティ上問題があります。システム権限(特にANY権限)を付与するかわりに、特定の表に対するオブジェクト権限を付与する方がはるかによい方法です。

権限分析を実行できるユーザー

権限分析を使用するには、CAPTURE_ADMINロールが付与されている必要があります。

DBMS_PRIVILEGE_CAPTURE PL/SQLパッケージを使用して、権限取得を管理します。権限分析から提供されるデータ・ディクショナリ・ビューを使用して、権限の使用を分析します。

権限分析のタイプ

様々なタイプの権限分析ポリシーを作成して、特定の目的を実現できます。

  • ロールベースの権限使用の取得。ロールのリストを提供する必要があります。リストのロールがデータベース・セッションで有効な場合、そのセッションの使用されている権限が取得されます。Oracleデフォルト・ロール、ユーザーが作成したロール、コード・ベース・アクセス制御(CBAC)ロール、およびセキュア・アプリケーション・ロールの権限使用を取得できます。

  • コンテキストベースの権限使用の取得。SYS_CONTEXT関数でのみ、ブール式を指定する必要があります。条件がTRUEと評価されると、使用されている権限が取得されます。この方法は、SYS_CONTEXTでユーザーを指定することによって、データベース・ユーザーにより使用される権限およびロールを取得するために使用できます。

  • ロールおよびコンテキストベースの権限使用の取得。有効なロールのリストと条件のSYS_CONTEXTブール式の両方を指定する必要があります。このようなロールのいずれかがセッションで有効であり、指定されたコンテキスト条件が満たされると、権限分析によって権限の使用の取得が開始されます。

  • データベース全体の権限の取得。権限分析ポリシーにタイプを指定しない場合、ユーザーSYSの権限を除いて、データベースの使用されている権限が取得されます。(条件なしで有効であるため、無条件の分析とも呼ばれます。)

次の制約に注意してください:

  • 一度に有効にできる権限分析ポリシーは1つのみです。唯一の例外は、ロールやコンテキスト属性ドリブン分析ポリシーなどのデータベース全体以外の権限分析ポリシーと同時にデータベース全体の権限分析ポリシーを有効化できることです。

  • SYSユーザーの権限は分析できません。

  • 権限分析には権限への付与パスが表示されますが、どの付与パスを維持するかは推奨されません。

  • ロール、ユーザーまたはオブジェクトが削除されると、権限分析データ・ディクショナリ・ビューでこれらについての権限取得を反映する値も削除されます。

マルチテナント環境による権限分析への影響について

マルチテナント環境での権限分析ポリシーの作成および使用が可能です。

権限分析ポリシーは、CDBルートまたは個々のPDBのいずれかで作成できます。権限分析ポリシーは、それが作成されたコンテナで、CDBルートまたはアプリケーション・ルート内で使用された権限、またはPDB内で使用された権限のどちらかにのみ適用されます。マルチテナント環境全体にグローバルに適用することはできません。CAPTURE_ADMINロールをローカル・ユーザーまたは共通ユーザーにローカルに付与できます。CAPTURE_ADMINロールを共通ユーザーに共通に付与できます。

権限分析でのプリコンパイル済データベース・オブジェクトの処理

権限分析を使用すると、プリコンパイル済データベース・オブジェクトで使用されている権限を取得できます。

これらのオブジェクトの例として、PL/SQLパッケージ、プロシージャ、ファンクション、ビュー、トリガーおよびJavaクラスとデータがあります。

このような権限は、ストアド・プロシージャがコールされると実行時に使用されないことがあるため、データベース全体の取得について結果を生成するときに、実行時に取得された権限とともに収集されます。権限は、プリコンパイル済データベース・オブジェクトまたは実行時取得で使用されていない場合、使用されていない権限として扱われ、実行時取得名の下に保存されます。権限がプリコンパイル済データベース・オブジェクトに使用されている場合は、取得名ORA$DEPENDENCYの下に保存されます。権限が実行時に取得された場合は、実行時取得名の下に保存されます。プリコンパイル済データベース・オブジェクトと実行時使用の両方について使用されている権限を把握する場合は、ORA$DEPENDENCYと実行時の両方の取得を問い合せる必要があります。使用されていない権限の場合、実行時取得名で問い合せるだけです。

権限分析を使用できるプリコンパイル済オブジェクトの詳細なリストを確認するには、ALL_DEPENDENCIESデータ・ディクショナリ・ビューのTYPE列を問い合せます。

権限分析ポリシーの作成および管理

SQL*PlusまたはEnterprise Manager Cloud Controlのいずれかで権限分析ポリシーの作成および管理を行うことができます。

権限分析ポリシーの作成および管理について

Oracle Enterprise Manager Cloud ControlまたはDBMS_PRIVILEGE_CAPTURE PL/SQLパッケージを使用して、権限を分析できます。

そのためには、CAPTURE_ADMINロールが付与されている必要があります。DBMS_PRIVILEGE_CAPTUREパッケージでは、権限分析ポリシーを作成、有効化、無効化および削除できます。DBA_*ビューで表示できる権限の使用状況を示すレポートも生成します。

権限分析の管理の一般ステップ

権限分析の一般的な一連のステップに従う必要があります。

  1. 権限分析ポリシーを定義します。
  2. 権限分析ポリシーを有効化します。

    このステップでポリシーが定義した権限使用の記録が始まります。必要に応じて、この取得実行の名前を指定します。権限分析ポリシーを有効にするたびに、それに対して異なる取得実行を作成できます。このようにして、後で行う比較分析のために複数の名前付き取得実行を作成できます。

  3. 定義者の権限および起動者の権限のプログラム単位によって使用される権限を取得する必要がある場合は、オプションで、依存性権限を取得するポリシーを有効にします。
  4. データの収集に十分な期間が経過したら、権限分析ポリシーの権限使用記録を無効にします。

    このステップでポリシーの権限使用の取得が終了します。

  5. 権限分析の結果を生成します。

    このステップでは、権限分析ポリシーおよびレポート・データ・ディクショナリ・ビューに結果を書き込みます。

  6. オプションで、権限分析ポリシーおよび取得実行を無効化してから削除します。

    権限分析ポリシーを削除すると、ポリシーによって取得されたデータが削除されます。

権限分析ポリシーの作成

権限分析ポリシーを作成するには、DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREプロシージャを使用できます。

権限分析ポリシーを作成した後、DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューのリストで確認できます。ポリシーが作成されると、Oracleデータ・ディクショナリおよびSYSスキーマに配置されます。ただし、SYS、およびポリシーを作成したユーザーは、それを削除できます。権限使用の分析を開始できるように、ポリシー作成後に手動で有効にする必要があります。

  1. CAPTURE_ADMINロールを割り当てられたユーザーとしてCDBまたはPDBにログインします。

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

  2. DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREプロシージャに次の構文を使用します。
    DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
       name              VARCHAR2, 
       description       VARCHAR2 DEFAULT NULL, 
       type              NUMBER DEFAULT DBMS_PRIVILEGE_CAPTURE.G_DATABASE, 
       roles             ROLE_NAME_LIST DEFAULT ROLE_NAME_LIST(), 
       condition         VARCHAR2 DEFAULT NULL);
    

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

    • name: 作成する権限分析ポリシーの名前を指定します。この名前は必ず一意にし、128文字以下にしてください。名前には空白を使用できますが、参照するときは必ず一重引用符でその名前を囲む必要があります。既存のポリシーの名前を確認するには、DBA_PRIV_CAPTURESビューのNAME列を問い合せます。

    • description: 大/小文字混在で最大1024文字で権限分析ポリシーの目的を説明します。オプション。

    • type: 取得条件のタイプを指定します。typeパラメータを省略する場合、デフォルトはDBMS_PRIVILEGE_CAPTURE.G_DATABASEとなります。オプション。

      次のいずれかのタイプを入力します。

      • DBMS_PRIVILEGE_CAPTURE.G_DATABASE: ユーザーSYSの権限を除いて、データベース全体で使用されている権限をすべて取得します。

      • DBMS_PRIVILEGE_CAPTURE.G_ROLE: ロールが有効になっているセッションの権限を取得します。typeパラメータのDBMS_PRIVILEGE_CAPTURE.G_ROLEを入力する場合、rolesパラメータも指定する必要があります。ロールが複数の場合、各ロール名をカンマで分けます。

      • DBMS_PRIVILEGE_CAPTURE.G_CONTEXT: conditionパラメータで指定された条件がTRUEと評価されているセッションの権限を取得します。typeパラメータのDBMS_PRIVILEGE_CAPTURE.G_CONTEXTを入力する場合、conditionパラメータも指定する必要があります。

      • DBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXT: ロールが有効になっており、コンテキスト条件がTRUEと評価されているセッションの権限を取得します。typeパラメータのDBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXTを入力する場合、rolesconditionの両方のパラメータも指定する必要があります。

    • roles: 使用された権限が分析されるロールを指定します。つまり、指定されたロールのいずれかの権限が使用される場合、権限が分析されます。type引数にDBMS_PRIVILEGE_CAPTURE.G_ROLEまたはDBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXTを指定する場合、この引数を指定する必要があります。入力する各ロールは、データベースに存在する必要があります。(DBA_ROLESデータ・ディクショナリ・ビューを問い合せて、既存のロールを確認できます。)複数のロールでは、可変長配列型role_name_listを使用してロール名を入力します。最大10のロールを指定できます。

      たとえば、2つのロールを指定するには、次のようにします。

      roles => role_name_list('role1', 'role2'),
      
    • condition: 最大4000文字でブール式を指定します。type引数にDBMS_PRIVILEGE_CAPTURE.G_CONTEXTまたはDBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXTを指定する場合、この引数を指定する必要があります。関係演算子(==、>、>=<<=<>BETWEENおよびIN)を使用したSYS_CONTEXT式のみがこのブール式で許可されます。

      condition式の構文は次のとおりです。

      predicate::= SYS_CONTEXT(namespace, attribute) relop constant_value |
                   SYS_CONTEXT(namespace, attribute)
                   BETWEEN 
                   constant_value 
                   AND constant_value | SYS_CONTEXT(namespace, attribute) 
                   IN {constant_value (,constant_value)* }
      
      relop::= = | < | <= | > | >= | <>
      
      context_expression::= predicate | (context_expression) 
                   AND (context_expression) | (context_expression) 
                   OR (context_expression )
      

      たとえば、conditionを使用してIPアドレス192.0.2.1を指定するには、次のようにします。

      condition => 'SYS_CONTEXT(''USERENV'', ''IP_ADDRESS'')=''192.0.2.1''';
      

    権限分析ポリシーを作成したら、ポリシーを有効にして権限およびロールの使用を取得する必要があります。

* 必要な数の定数値を追加できます(たとえば、IN {constant_value1}IN {constant_value1, constant_value2, constant_value3}など)。

権限分析ポリシーの有効化

権限分析ポリシーを作成したら、そのポリシーを有効化して権限の使用を取得する必要があります。

DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTUREプロシージャは、権限ポリシーを有効化し、その取得実行名を作成します。実行名では、取得が行われる期間を定義します。
  1. CAPTURE_ADMINロールを割り当てられたユーザーとしてCDBまたはPDBにログインします。

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

  2. 既存の権限分析ポリシーおよびそれらが現在有効かどうかを確認するために、DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューのNAMEおよびENABLED列に問い合せます。
  3. DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTUREプロシージャを実行して、ポリシーを有効にし、必要に応じて取得実行の名前を作成します。

    たとえば、権限分析ポリシーlogon_users_analysisを有効にするには、次のようにします。

    BEGIN
      DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE (
        name     => 'logon_users_analysis_pol',
        run_name => 'logon_users_04092016');
    END;
    /

権限分析ポリシーの作成および有効化の例

様々な権限分析ポリシーを作成できます。

例: データベース全体の権限の権限分析

DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREは、データベース全体の権限を分析するために使用できます。

例5-1は、データベースのすべての権限の使用を記録するために、DBMS_PRIVILEGE_CAPTUREパッケージを使用して権限分析ポリシーを作成し、有効化する方法を示しています。

例5-1 データベース全体の権限の権限分析

BEGIN
 DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
  name          => 'db_wide_capture_pol',
  description   => 'Captures database-wide privileges',
  type          => DBMS_PRIVILEGE_CAPTURE.G_DATABASE);
END;
/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('db_wide_capture_pol');
例: 2つのロールの権限の使用状況の権限分析

DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREプロシージャを使用すると、複数のロールの権限の使用状況を分析できます。

例5-2は、2つのロールの権限の使用状況の分析方法を示しています。

例5-2 2つのロールの権限の使用状況の権限分析

BEGIN
 DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
  name          => 'dba_roles_capture_pol',
  description   => 'Captures DBA and LBAC_DBA role use',
  type          => DBMS_PRIVILEGE_CAPTURE.G_ROLE,
  roles         => role_name_list('dba', 'lbac_dba'));
END;
/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('dba_roles_capture_pol');
例: SQL*Plus使用中の権限の権限分析

DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREプロシージャは、分析用に権限を取得するために使用できます。

例5-3は、SQL*Plusの実行に使用される権限の分析方法を示しています。

例5-3 SQL*Plus使用中の権限の権限分析

BEGIN
 DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
  name             => 'sqlplus_capture_pol',
  description      => 'Captures privilege use during SQL*Plus use',
  type             => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
  condition        => 'SYS_CONTEXT(''USERENV'', ''MODULE'')=''sqlplus''');
END;
/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('sqlplus_capture_pol');
例: SQL*Plusアクセス中のPSMITH権限の権限分析

DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREを使用すると、ユーザーがSQL*Plusを実行する際に、ユーザー・アクセスを分析できます。

例5-4は、SQL*Plusの実行時にセッション・ユーザーPSMITHにより使用される権限の分析方法を示しています。

例5-4 SQL*Plusアクセス中のPSMITH権限の権限分析

BEGIN
 DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
  name         => 'psmith_sqlplus_analysis_pol',
  description  => 'Analyzes PSMITH role priv use for SQL*Plus module',
  type         => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
  condition    => 'SYS_CONTEXT(''USERENV'', ''MODULE'')=''sqlplus'' 
                  AND SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=''PSMITH''');
END;
/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('psmith_sqlplus_analysis_pol');

権限分析ポリシーの無効化

権限分析レポートを生成する前に、権限分析ポリシーを無効化する必要があります。

ポリシーを無効化すると、権限は記録されなくなります。権限分析ポリシーの無効化は、権限分析ポリシーの無効化の前後にログオンしたユーザーに対して直接有効になります。権限分析ポリシーを無効にするには、DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTUREプロシージャを使用できます。
  1. CAPTURE_ADMINロールを割り当てられたユーザーとしてCDBまたはPDBにログインします。

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

  2. 既存の権限分析ポリシーおよびそれらが現在無効かどうかを確認するために、DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューのNAMEおよびENABLED列に問い合せます。
  3. DBMS_PRIVILEGE_CAPTURE.DISBLE_CAPTUREプロシージャを実行して、ポリシーを有効にします。

    たとえば、権限分析ポリシーlogon_users_analysisを無効にするには、次のようにします。

    EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('logon_users_analysis_pol');

権限分析レポートの生成

DBMS_PRIVILEGE_CAPTURE PL/SQLパッケージを使用すると、Enterprise Manager Cloud ControlまたはSQL*Plusのいずれかで、権限分析ポリシー・レポートを生成できます。

権限分析レポートの生成について

権限分析ポリシーが無効になると、権限分析ポリシー用に作成した取得実行に基づいてレポートを生成できます。

レポート結果をSQL*Plusに表示するには、権限分析固有のデータ・ディクショナリ・ビューを問い合せます。Enterprise Manager Cloud Controlでは、「権限分析」ページの「アクション」メニューからレポートを参照でき、ここから、必要に応じてロールおよび権限の取消しと再付与を行います。権限分析プロセス中に権限を使用してレポートを生成する前に取り消す場合、権限付与パスなしで権限が使用された権限として引き続きレポートされます。

複数の名前付き取得実行を管理するための一般的なプロセス

権限分析ポリシーを有効にすると、そのポリシーの結果に対して名前付き取得実行を作成できます。

取得実行では、取得が有効になる(開始される)ときから無効になる(停止される)ときまでの期間を定義します。このように、複数の実行を作成した後、権限取得結果の生成時にそれらを比較できます。チュートリアル: 取得実行の使用によるANY権限使用の分析では、複数の取得実行を作成および生成する方法の例を示します。

複数の名前付き取得実行を管理するための一般的なプロセスは、次のとおりです。

  1. ポリシーを作成します。

  2. 最初の実行のためにポリシーを有効にします。

  3. ユーザー挙動データの収集期間の後、このポリシーおよびその実行を無効にします。

  4. 結果を生成してから、この取得実行に関する情報を権限分析データ・ディクショナリ・ビューに問い合せます。

    run_nameパラメータをDBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTプロシージャから省略した場合、このプロシージャは、すべてのレコードをまとめて参照し、それらを分析します。

  5. 2番目の実行のためにポリシーを再度有効にします。ポリシーが最初に無効になっていないと、新しい取得実行を作成できません。

  6. ユーザー・データを収集した後、ポリシーおよび2番目の実行を無効にします。

  7. 結果を生成します。

  8. 権限分析データ・ディクショナリ・ビューを問い合せます。両方の取得実行からの結果が、ビューに表示されます。取得実行のどちらかの結果のみを表示する必要がある場合は、結果を再度生成し、権限分析ビューを再度問合せできます。

有効にすると、条件を満たす場合に権限分析ポリシーが権限の使用状況の記録を開始します。任意の時点で、データベースの1つの権限分析ポリシーのみ有効化できます。唯一の例外は、タイプDBMS_PRIVILEGE_CAPTURE.G_DATABASEの権限分析ポリシーを異なるタイプの権限分析と同時に有効化できることです。

権限分析ポリシーを削除すると、その関連付けられた取得実行は同様に削除され、権限分析データ・ディクショナリ・ビューに反映されません。

データベースの再起動は、権限分析のステータスを変更しません。たとえば、データベースの停止前に権限分析ポリシーを有効化すると、このポリシーは、データベースの停止後および再起動後に継続して有効です。

DBMS_PRIVILEGE_CAPTUREによる権限分析レポートの生成

DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTプロシージャは、権限取得結果を示すレポートを生成します。

  1. CAPTURE_ADMINロールを割り当てられたユーザーとしてCDBまたはPDBにログインします。

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

  2. 既存の権限分析ポリシーおよびそれらが現在無効かどうかを確認するために、DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューのNAMEおよびENABLED列に問い合せます。

    権限分析ポリシーは、それに関する権限分析レポートを生成する前に無効化する必要があります。

  3. 次の構文を使用してDBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTプロシージャを実行します。
    DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT(
      name         VARCHAR2,
      run_name     VARCHAR2 DEFAULT NULL,
      dependency   BOOLEAN DEFAULT NULL);

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

    • name: 権限分析ポリシーの名前を指定します。DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューには、既存のポリシーの名前が示されます。

    • run_name: 計算する必要がある権限取得の実行名を指定します。この設定を省略すると、指定した権限取得のすべての実行が計算されます。

    • dependency: Y (はい)またはN (いいえ)を入力して、PL/SQL計算権限使用状況をレポートに含める必要があるかどうかを指定します。

    たとえば、権限分析ポリシーlogon_users_analysisのレポートを生成するには、次のようにします。

    EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('logon_users_analysis');
    
  4. 権限付与パスを持つDBA_USED_*データ・ディクショナリ・ビューで、使用された権限を問い合せます。
Cloud Controlによる権限分析レポートの生成

Cloud Controlを使用すると、権限分析レポートを生成できます。

  1. CAPTURE_ADMINロールおよびSELECT ANY DICTIONARY権限を付与されているユーザーとして、Cloud Controlにログインします。『Oracle Database 2日でデータベース管理者』で、ログイン方法を説明しています。
  2. 「セキュリティ」メニューから、「権限分析」を選択します。
  3. 「ポリシー」から、レポートを生成するポリシーを選択します。
  4. 「レポートの生成」を選択します。
  5. 「権限分析: レポートの生成」ダイアログ・ボックスで、レポートを生成する時間を指定します。

    レポートを今すぐに生成する場合は、「即時」を選択します。レポートを後で生成するには、「後で」を選択してから、レポートを生成する時、分、秒およびタイムゾーンを指定します。

  6. 「OK」をクリックします。

    「権限分析」ページに確認メッセージ表示されて、レポートが送信されたことを通知します。このページは、ジョブが完了するまでリフレッシュできます。レポートを表示するには、ポリシー名を選択してから「レポートの表示」をクリックします。

Cloud Controlによる権限分析レポートへのアクセス

権限分析レポートは、使用されている権限と使用されていない権限の両方に関する情報を提供します。

  1. 権限分析レポートの生成。

    詳細は、「Cloud Controlによる権限分析レポートの生成」を参照してください。

  2. 「権限分析」ページで、レポートを生成したポリシーを選択します。
  3. 「レポートの表示」を選択します。

    「権限分析レポート」ページが表示されます。

  4. レポートを表示するには、次のようにします。
    • デフォルトでは選択されているレポートが表示されますが、別のポリシーのレポートを検索するには、「検索」リージョンを使用して、別のレポートを見つけるか現在選択しているポリシーの別の権限受領者を選択します。
    • 未使用の権限を表示するには、「未使用」タブを選択します。使用した権限を表示するには、「使用済」を選択します。両方のサマリーを表示するには、「サマリー」を選択します。

    ここから、必要に応じてユーザーに対して取消しや再付与を行うロールを選択できます。これを行うには、「権限受領者」の下でロールを選択してから、「取消」または「再付与」をクリックします。

権限分析ポリシーの削除

権限分析ポリシーを削除するには、そのポリシーを無効にする必要があります。

権限分析ポリシーの削除は、この権限分析に関連付けられているすべての使用されたおよび使用されていない権限レコードも削除します。ポリシーの取得実行を作成した場合、それらはポリシーの削除時に削除されます。
  1. CAPTURE_ADMINロールを割り当てられたユーザーとしてCDBまたはPDBにログインします。

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

  2. ポリシーおよびポリシーが有効か無効かを確認するために、DBA_PRIV_CAPTURESデータ・ディクショナリ・ビューのNAMEおよびENABLE列に問い合せます。
  3. ポリシーが有効な場合、無効にします。

    例:

    EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('logon_users_analysis_pol');
    
  4. DBMS_PRIVILEGE_CAPTURE.DROP_CAPTUREプロシージャを実行して、ポリシーを削除します。

    例:

    EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE ('logon_users_analysis_pol');

    取得実行を含むポリシーを有効にした場合は、その取得実行も削除されます。取得実行を個別に削除するには、DBMS_PRIVILEGE_CAPTURE.DELETE_RUNプロシージャを実行します。ただし、この文を実行する前に、そのポリシーが存在する必要があります。

Cloud Controlによるロールの作成および権限の管理

権限分析レポートで検出された権限を使用して新規ロールを作成し、次にこのロールをユーザーに付与できます。

Cloud Controlでの権限分析レポートからのロールの作成

レポート・サマリーを使用して、アプリケーションで必要とされる最低限の権限を検索し、これらの権限をロールにカプセル化できます。

  1. CAPTURE_ADMINロールおよびSELECT ANY DICTIONARY権限を付与されているユーザーとして、Cloud Controlにログインします。『Oracle Database 2日でデータベース管理者』で、ログイン方法を説明しています。
  2. 「権限分析」ページで、ポリシー名を選択してから、「アクション」メニューの「ロールの作成」をクリックします。
  3. 「ロールの作成」ページで、次の詳細情報を入力してから、「OK」をクリックします。
    • 新しいロールの作成元となるポリシーを選択します。

    • 作成する新しいロールの一意の名前を入力します。

    • ロールで何をカプセル化するかに応じて、「使用済」または「未使用」チェック・ボックスを選択します。ロールには、使用中または未使用のシステムおよびオブジェクトの権限およびロールを使用できます。

    • 「直接付与されたシステム権限」「直接付与されたオブジェクト権限」および「直接付与されたロール」の対応するラジオ・ボタンを選択します。

      たとえば、「使用済」チェック・ボックスを選択し、次を選択します。

      • すべてのシステム権限: 取得されたシステム権限のうち使用中のものすべてが、作成する新しいロールに含まれます。

      • ロールなし: ポリシーで取得されたロールはどれも、新しいロールでは使用されません。

      • オブジェクト権限のカスタマイズ: 取得された使用中のオブジェクト権限が一覧表示されるので、ロールに割り当てる権限をこのリストから選択する必要があります。

Cloud Controlによるロールおよび権限の取消しおよび再付与

Enterprise Manager Cloud Controlを使用して、ロールおよび権限をユーザーに対して取り消したり、再付与したりできます。

  1. Oracle Database Vaultが有効な場合、Oracleシステム権限およびロール管理レルムの所有者として認可されていることを確認します。

    SQL*Plusでは、DV_OWNERロールを付与されているユーザーがDBA_DV_REALM_AUTHデータ・ディクショナリ・ビューを問い合せることで認可を確認できます。ユーザーに認可を付与するには、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。

  2. 権限分析レポートの生成。
  3. 「権限分析」ページで、レポートを生成したポリシーを選択します。
  4. 「レポートの表示」を選択します。
  5. 「権限分析: レポート」ページで、サマリー」タブを選択します。
  6. 「検索」の下で、「ポリシー」および「権限受領者」メニュー・オプションが設定されていることを確認します。
  7. 「権限受領者」領域の下で、権限受領者オプションを展開します。
    たとえば、HR_ADMINロールというロールのロール権限分析レポートの場合は、HR_ADMINロールを展開して、それに関連付けられている権限を表示します。
  8. 取り消す各権限を選択してから「取消」をクリックするか、「再付与」を選択して権限をロールに付与します。

Cloud Controlによる取消しまたは再付与スクリプトの生成

権限分析レポートの結果に基づいて、ユーザーに対して権限を取り消したり、再付与するスクリプトを生成できます。

取消しおよび再付与スクリプトの生成について

システムやオブジェクトに対する未使用の権限およびロールの一括取消しを実行するためのスクリプトを、権限分析の生成後にダウンロードできます。

後で、これらの権限をユーザーに再付与することが必要になった場合は、再付与スクリプトを生成できます。再付与スクリプトを生成するには、対応する取消しスクリプトが必要です。

開発環境またはテスト環境で取消スクリプトを実行します。Oracleによって提供されているアカウントおよびロールから権限およびロールを取り消すことはできないということを知っておいてください。

取消しスクリプトの生成

Enterprise Manager Cloud Controlを使用すると、ユーザーから権限を取り消すスクリプトを生成できます。

  1. Oracle Database Vaultが有効な場合、Oracleシステム権限およびロール管理レルムの所有者として認可されていることを確認します。

    SQL*Plusでは、DV_OWNERロールを付与されているユーザーがDBA_DV_REALM_AUTHデータ・ディクショナリ・ビューを問い合せることで認可を確認できます。ユーザーに認可を付与するには、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。

  2. Enterprise Managerで、CAPTURE_ADMINロールおよびSELECT ANY DICTIONARY権限が付与されているユーザーとしてターゲット・データベースのホームページにアクセスします。

    詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。

  3. 「セキュリティ」メニューから、「権限分析」を選択します。
  4. 必要な権限分析レポートが生成されたことを確認します。
  5. 「権限分析」ページの「アクション」メニューで「取消スクリプト」を選択します。
  6. 「取消スクリプト」ページで、「生成」をクリックします。

    取消しスクリプトの詳細を生成するためのウィザードが表示されます。

  7. 「スクリプト詳細」ページで、取消スクリプトを準備する必要のあるポリシーの名前を「ポリシー名」メニューから選択します。
  8. 「スクリプト名」フィールドに一意の名前を入力し、「説明」にスクリプトの説明を入力します。

    たとえば、未使用の権限をすべて取り消す場合は、未使用のすべての権限およびロールを表す「すべて」オプションを選択して、「次へ」をクリックします。

    選択内容に基づいて、取消し対象の使用可能な権限、未使用のすべての権限、オブジェクト権限、およびロールがそれぞれのページに表示されます。

  9. 「権限受領者(ユーザー/ロール)」で、「すべて」または「カスタマイズ」を選択します。
  10. 「未使用のシステム権限」「未使用のオブジェクト権限」および「未使用のロール」設定で、「すべて」なしまたは「カスタマイズ」を選択します。
  11. 「次へ」をクリックします。

    表示される次のページは、「すべて」なしまたは「カスタマイズ」のどれを選択したかで異なります。「すべて」を選択した場合、ページには権限のリストが表示されます。なしを選択した場合、ページは省略されます。「カスタマイズ」を選択した場合は、取り消す権限を個別に選択できます。表示される最後のページは、「確認」ページです。

  12. 「保存」をクリックします。

    「取消スクリプト」ページが表示されます。

  13. 「取消スクリプト」ページで、新しく作成したSQLスクリプトを選択してから、「取消スクリプトのダウンロード」をクリックしてこのスクリプトをダウンロードします。これには、各権限またはロールのREVOKE SQL文が含まれています。

    スクリプトを表示するには、「取消スクリプトの表示」ボタンをクリックします。

  14. 「権限分析」ページに戻るには、「戻る」をクリックします。
再付与スクリプトの生成

Enterprise Manager Cloud Controlを使用すると、ユーザーから取り消した権限を再付与するスクリプトを生成できます。

  1. Oracle Database Vaultが有効な場合、Oracleシステム権限およびロール管理レルムの所有者として認可されていることを確認します。

    SQL*Plusでは、DV_OWNERロールを付与されているユーザーがDBA_DV_REALM_AUTHデータ・ディクショナリ・ビューを問い合せることで認可を確認できます。ユーザーに認可を付与するには、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。

  2. Enterprise Managerで、CAPTURE_ADMINロールおよびSELECT ANY DICTIONARY権限が付与されているユーザーとしてターゲット・データベースのホームページにアクセスします。

    詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。

  3. 「セキュリティ」メニューから、「権限分析」を選択します。
  4. 目的のレポートが生成済であることを確認します。

    詳細は、「Cloud Controlによる権限分析レポートの生成」を参照してください。

  5. 「権限分析」ページで、取消スクリプトが基づいているポリシーを選択します。
  6. 「アクション」メニューから、「取消スクリプト」を選択します。
  7. 「取消スクリプト」ページで、前に作成したポリシーの名前を選択してから、「再付与スクリプトのダウンロード」をクリックしてこのスクリプトをダウンロードします。

    「取消スクリプトの表示」ボタンおよび「再付与スクリプトの表示」ボタンを選択することで、ポリシーに関連付けられているスクリプトを表示できます。

チュートリアル: 取得実行の使用によるANY権限使用の分析

このチュートリアルでは、取得実行を作成してREAD ANY TABLEシステム権限の使用を分析する方法を示します。

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

2つのユーザーを作成する必要があります。1つはポリシーを作成するユーザーで、もう1つはその権限の使用が分析対象となるユーザーです。

  1. CREATE USERシステム権限があるユーザーとしてPDBにログインします。

    例:

    sqlplus sec_admin@pdb_name
    Enter password: password
    

    利用可能なPDBを検索するには、DBA_PDBSデータ・ディクショナリ・ビューを問い合せます。現在のPDBを確認するには、show con_nameコマンドを実行します。

  2. 次のユーザーを作成します。
    CREATE USER pa_admin IDENTIFIED BY password;
    CREATE USER app_user IDENTIFIED BY password;
    
  3. ロールおよびシステム権限を他のユーザーに付与する権限を持ち、Oracleシステム権限およびロール管理レルムの所有者認可を付与されているユーザーとして接続します。(ユーザーSYSはデフォルトでこれらの権限を持っています。)

    例:

    CONNECT dba_psmith@pdb_name 
    Enter password: password
    

    SQL*Plusでは、DV_OWNERロールを付与されているユーザーがDBA_DV_REALM_AUTHデータ・ディクショナリ・ビューを問い合せることで認可を確認できます。ユーザーに認可を付与するには、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。

  4. 次のロールおよび権限をユーザーに付与します。
    GRANT CREATE SESSION, CAPTURE_ADMIN TO pa_admin;
    GRANT CREATE SESSION, READ ANY TABLE TO app_user;
    

    ユーザーpa_adminは、ユーザーapp_userが実行するREAD ANY TABLE問合せを分析する権限分析ポリシーを作成します。

ステップ2: 権限分析ポリシーの作成および有効化

ユーザーpa_adminは権限分析ポリシーを作成して有効にする必要があります。

  1. ユーザーpa_adminとしてPDBに接続します。
    CONNECT pa_admin@pdb_name
    Enter password: password
    
  2. 次の権限分析ポリシーを作成します。
    BEGIN
     DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
      name           => 'ANY_priv_analysis_pol',
      description    => 'Analyzes system privilege use',
      type           => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
      condition      => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=''APP_USER''');
    END;
    /
    

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

    • typeは、次に説明するconditionパラメータで定義される取得条件のタイプを指定します。このポリシーでは、タイプはコンテキスト・ベースの条件です。

    • conditionは、ポリシーを有効にするためにTRUEに評価する必要があるBoolean式を使用して条件を指定します。この場合、セッション・ユーザーがapp_userかどうかを条件でチェックします。

  3. ポリシーを有効にし、それに対する取得実行を作成します。
    BEGIN
      DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE (
       name       => 'ANY_priv_analysis_pol',
       run_name   => 'ANY_priv_pol_run_1');
    END;
    /
    

    この時点で、ポリシーはユーザーapp_userのアクションの記録を開始できます。

ステップ3: READ ANY TABLEシステム権限の使用

ユーザーapp_userとして、READ ANY TABLEシステム権限を使用します。

  1. ユーザーapp_userとして接続します。
    CONNECT app_user@pdb_name
    Enter password: password
    
  2. HR.EMPLOYEES表を問い合せます。
    SELECT FIRST_NAME, LAST_NAME, SALARY FROM HR.EMPLOYEES WHERE SALARY > 12000 ORDER BY SALARY DESC;
    
    FIRST_NAME           LAST_NAME                     SALARY
    -------------------- ------------------------- ----------
    Steven               King                           24000
    Neena                Kochhar                        17000
    Lex                  De Haan                        17000
    John                 Russell                        14000
    Karen                Partners                       13500
    Michael              Hartstein                      13000
    Shelley              Higgins                        12008
    Nancy                Greenberg                      12008

ステップ4: 権限分析ポリシーの無効化

ユーザーapp_userのアクションを取得するレポートを生成するには、ポリシーを無効にする必要があります。

  1. ユーザーpa_adminとして接続します。
    CONNECT pa_admin@pdb_name
    Enter password: password
    
  2. ANY_priv_analysis_pol権限ポリシーを無効にします。
    EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('ANY_priv_analysis_pol');

ステップ5: 権限分析レポートの生成および表示

権限分析ポリシーを無効にすると、ユーザーpa_adminは権限分析レポートの生成および表示を行うことができます。

  1. ユーザーpa_adminとして、権限分析の結果を生成します。
    BEGIN
      DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT (
        name      => 'ANY_priv_analysis_pol',
        run_name  => 'ANY_priv_pol_run_1');
    END;
    /
    

    生成された結果は、権限分析データ・ディクショナリ・ビューに格納されます。

  2. 次のコマンドを入力して、データ・ディクショナリ・ビューの出力の書式を設定します。
    col username format a10
    col sys_priv format a16
    col object_owner format a13
    col object_name format a23
    col run_name format a27
  3. app_userで使用されるシステム権限と、権限分析中に使用されるオブジェクトを確認します。
    SELECT SYS_PRIV, OBJECT_OWNER, OBJECT_NAME, RUN_NAME FROM DBA_USED_PRIVS WHERE USERNAME = 'APP_USER';
    

    次のような出力結果が表示されます。最初の行は、app_userHR.EMPLOYEES表に対するREAD ANY TABLE権限を使用したことを示します。

    SYS_PRIV         OBJECT_OWNER  OBJECT_NAME             RUN_NAME
    ---------------- ------------- ----------------------- ------------------
                     SYSTEM        PRODUCT_PRIVS           ANY_PRIV_POL_RUN_1
                     SYS           DUAL                    ANY_PRIV_POL_RUN_1
                     SYS           DUAL                    ANY_PRIV_POL_RUN_1
    CREATE SESSION                                         ANY_PRIV_POL_RUN_1
                     SYS           DBMS_APPLICATION_INFO   ANY_PRIV_POL_RUN_1
    READ ANY TABLE   HR            EMPLOYEES               ANY_PRIV_POL_RUN_1
この段階では、権限分析結果は、将来追加で取得実行を作成する場合でも、権限分析データ・ディクショナリ・ビューで引き続き利用可能です。

ステップ6: 2番目の取得実行の作成

これで、いつでもANY_priv_analysis_pol権限分析ポリシーの2番目の取得実行を作成できます。

  1. ユーザーpa_adminとして、ANY_priv_analysis_pol権限分析ポリシーを有効にして取得実行ANY_priv_pol_run_1を使用します。
    BEGIN
      DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE (
       name       => 'ANY_priv_analysis_pol',
       run_name   => 'ANY_priv_pol_run_2');
    END;
    /
    
  2. ユーザーapp_userとして接続します。
    CONNECT app_user@pdb_name
    Enter password: password
    
  3. HR.JOBS表を問い合せます。
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 20000;
  4. ユーザーpa_adminとして接続します。
    CONNECT pa_admin@pdb_name
    Enter password: password
  5. ANY_priv_analysis_pol権限ポリシーを無効にします。
    EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('ANY_priv_analysis_pol');
  6. 2番目の権限分析レポートを生成します。
    BEGIN
      DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT (
        name      => 'ANY_priv_analysis_pol',
        run_name  => 'ANY_priv_pol_run_2');
    END;
    /
    
  7. app_userで使用されるシステム権限と、権限分析中に使用されるオブジェクトを確認します。
    SELECT SYS_PRIV, OBJECT_OWNER, OBJECT_NAME, RUN_NAME FROM DBA_USED_PRIVS WHERE USERNAME = 'APP_USER' ORDER BY RUN_NAME;
    

    次のような出力が表示されます。これには、ユーザーpa_adminが作成した両方の取得実行の結果が示されています。

    SYS_PRIV         OBJECT_OWNER  OBJECT_NAME             RUN_NAME
    ---------------- ------------- ----------------------- ----------------------
    READ ANY TABLE   HR            EMPLOYEES               ANY_PRIV_POL_RUN_1
                     SYS           DUAL                    ANY_PRIV_POL_RUN_1
    CREATE SESSION                                         ANY_PRIV_POL_RUN_1
                     SYS           DUAL                    ANY_PRIV_POL_RUN_1
                     SYSTEM        PRODUCT_PRIVS           ANY_PRIV_POL_RUN_1
                     SYS           DBMS_APPLICATION_INFO   ANY_PRIV_POL_RUN_1
                     SYS           DUAL                    ANY_PRIV_POL_RUN_2
                     SYS           DBMS_APPLICATION_INFO   ANY_PRIV_POL_RUN_2
                     SYSTEM        PRODUCT_PRIVS           ANY_PRIV_POL_RUN_2
                     SYS           DUAL                    ANY_PRIV_POL_RUN_2
    READ ANY TABLE   HR            JOBS                    ANY_PRIV_POL_RUN_2

ステップ7: この例で使用したコンポーネントの削除

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

  1. ユーザーpa_adminとして、ANY_priv_analysis_pol権限分析ポリシーおよびその関連付けられた取得実行を削除します。
    EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE ('ANY_priv_analysis_pol');
    

    このポリシーに関連付けられている取得実行は、DBMS_PRIVILEGE_CAPTURE.DROP_CAPTUREプロシージャを実行すると自動的に削除されます。

    pa_adminユーザーのスキーマに作成されたオブジェクトはSYSスキーマにあるため、次のステップで、このユーザー(このオブジェクトを含む)を削除する場合でも、ANY_priv_analysis_pol権限分析ポリシーを手動で削除する必要があります。

  2. ユーザー・アカウントを作成したユーザーとして接続します。

    例:

    CONNECT sec_admin@pdb_name
    Enter password: password
    
  3. ユーザーpa_adminおよびapp_userを削除します。
    DROP USER pa_admin;
    DROP USER app_user;

チュートリアル: DBAロールを持つユーザーによる権限の使用の分析

このチュートリアルでは、DBAロールを持ち、データベースのチューニング操作を実行するユーザーの権限の使用を分析する方法を示します。

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

2つのユーザーを作成する必要があります。1つは権限分析ポリシーを作成するユーザーで、もう1つはその権限の使用が分析対象となるユーザーです。

  1. CREATE USERシステム権限があるユーザーとしてPDBにログインします。

    例:

    sqlplus sec_admin@pdb_name
    Enter password: password
    

    利用可能なPDBを検索するには、DBA_PDBSデータ・ディクショナリ・ビューを問い合せます。現在のPDBを確認するには、show con_nameコマンドを実行します。

  2. 次のユーザーを作成します。
    CREATE USER pa_admin IDENTIFIED BY password;
    CREATE USER tjones IDENTIFIED BY password;
    
  3. ロールおよびシステム権限を他のユーザーに付与する権限を持ち、Oracleシステム権限およびロール管理レルムの所有者認可を付与されているユーザーとして接続します。(ユーザーSYSはデフォルトでこれらの権限を持っています。)

    例:

    CONNECT dba_psmith@pdb_name
    Enter password: password
    

    SQL*Plusでは、DV_OWNERロールを付与されているユーザーがDBA_DV_REALM_AUTHデータ・ディクショナリ・ビューを問い合せることで認可を確認できます。ユーザーに認可を付与するには、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。

  4. 次のロールおよび権限をユーザーに付与します。
    GRANT CREATE SESSION, CAPTURE_ADMIN TO pa_admin;
    GRANT CREATE SESSION, DBA TO tjones;
    

    ユーザーpa_adminは、ユーザーtjonesが実行するデータベースのチューニング操作を分析する権限分析ポリシーを作成します。

ステップ2: 権限分析ポリシーの作成および有効化

ユーザーpa_adminは権限分析ポリシーを作成して有効にする必要があります。

  1. ユーザーpa_adminとしてPDBに接続します。
    CONNECT pa_admin@pdb_name
    Enter password: password
    
  2. 次の権限分析ポリシーを作成します。
    BEGIN
     DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
      name             => 'dba_tuning_priv_analysis_pol',
      description      => 'Analyzes DBA tuning privilege use',
      type             => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
      condition        => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=''TJONES''');
    END;
    /
    

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

    • typeは、次に説明するconditionパラメータで定義される取得条件のタイプを指定します。このポリシーでは、タイプはコンテキスト・ベースの条件です。

    • conditionは、ポリシーを有効にするためにTRUEに評価する必要があるBoolean式を使用して条件を指定します。この場合、セッション・ユーザーがtjonesかどうかを条件でチェックします。

  3. ポリシーを有効にします。
    EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('dba_tuning_priv_analysis_pol');
    

    この時点で、ポリシーはユーザーtjonesのアクションの記録を開始できます。

ステップ3: データベース・チューニング操作の実行

ユーザーtjonesは、DBAロールを使用して、データベースのチューニング操作を実行します。

  1. ユーザーtjonesとしてPDBに接続します。
    CONNECT tjones@pdb_name
    Enter password: password
    
  2. 次のスクリプトを実行して、PLAN_TABLE表を作成します。
    @$ORACLE_HOME/rdbms/admin/utlxplan.sql
    

    このスクリプトの場所は、オペレーティング・システムによって異なる場合があります。このスクリプトでは、PLAN_TABLE表をtjonesスキーマに作成します。

  3. 次のEXPLAIN PLAN SQL文をHR.EMPLOYEES表で実行します。
    EXPLAIN PLAN
     SET STATEMENT_ID = 'Raise in Tokyo' 
     INTO PLAN_TABLE
     FOR UPDATE HR.EMPLOYEES
     SET SALARY = SALARY * 1.10
     WHERE DEPARTMENT_ID = 
      (SELECT DEPARTMENT_ID FROM HR.DEPARTMENTS WHERE LOCATION_ID = 110);
    

    次に、ユーザーtjonesHR.EMPLOYEES表を分析します。

  4. 次のいずれかのスクリプトを実行して、CHAINED_ROWS表を作成します。
    @$ORACLE_HOME/rdbms/admin/utlchain.sql
    

    または

    @$ORACLE_HOME/rdbms/admin/utlchn1.sql
    
  5. ANALYZE TABLE文をHR.EMPLOYEES表で実行します。
    ANALYZE TABLE HR.EMPLOYEES LIST CHAINED ROWS INTO CHAINED_ROWS;

ステップ4: 権限分析ポリシーの無効化

ユーザーtjonesのアクションを取得するレポートを生成するには、ポリシーを無効にする必要があります。

  1. ユーザーpa_adminとして接続します。
    CONNECT pa_admin@pdb_name
    Enter password: password
    
  2. dba_tuning_priv_analysis_pol権限ポリシーを無効にします。
    EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('dba_tuning_priv_analysis_pol');

ステップ5: 権限分析レポートの生成および表示

権限分析ポリシーを無効にすると、ユーザーpa_adminは権限分析レポートの生成および表示を行うことができます。

  1. ユーザーpa_adminとして、権限分析の結果を生成します。
    EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('dba_tuning_priv_analysis_pol');
    

    生成された結果は、権限分析データ・ディクショナリ・ビューに格納されます。

  2. 次のコマンドを入力して、データ・ディクショナリ・ビューの出力の書式を設定します。
    col username format a8
    col sys_priv format a18
    col used_role format a20
    col path format a150
    col obj_priv format a10
    col object_owner format a10
    col object_name format a10
    col object_type format a10
    
  3. 権限分析中にtjonesで使用されるシステム権限とロールを確認します。
    SELECT USERNAME, SYS_PRIV, USED_ROLE, PATH
     FROM DBA_USED_SYSPRIVS_PATH
     WHERE USERNAME = 'TJONES'
     ORDER BY 1, 2, 3;
    

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

    USERNAME SYS_PRIV           USED_ROLE
    -------- ------------------ --------------------
    PATH
    -------------------------------------------------------------------------------
    TJONES   ANALYZE ANY        IMP_FULL_DATABASE
    GRANT_PATH('TJONES', 'DBA')
    
    TJONES   ANALYZE ANY        IMP_FULL_DATABASE
    GRANT_PATH('TJONES', 'DBA', 'IMP_FULL_DATABASE')
    
    TJONES   ANALYZE ANY        IMP_FULL_DATABASE
    GRANT_PATH('TJONES', 'DBA', 'DATAPUMP_IMP_FULL_DATABASE', 'IMP_FULL_DATABASE')
    ...
  4. 権限分析中にtjonesで使用されるオブジェクト権限とロールを確認します。
    col username format a9
    col used_role format a10
    col object_name format a22
    col object_type format a12
    
    SELECT USERNAME, OBJ_PRIV, USED_ROLE,
     OBJECT_OWNER, OBJECT_NAME, OBJECT_TYPE
     FROM DBA_USED_OBJPRIVS 
     WHERE USERNAME = 'TJONES'
     ORDER BY 1, 2, 3, 4, 5, 6;
    

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

    USERNAME  OBJ_PRIV   USED_ROLE  OBJECT_OWN OBJECT_NAME            OBJECT_TYPE
    --------- ---------- ---------- ---------- ---------------------- ------------
    TJONES    EXECUTE    PUBLIC     SYS        DBMS_APPLICATION_INFO  PACKAGE
    TJONES    SELECT     PUBLIC     SYS        DUAL                   TABLE
    TJONES    SELECT     PUBLIC     SYS        DUAL                   TABLE
    TJONES    SELECT     PUBLIC     SYSTEM     PRODUCT_PRIVS          VIEW
    ...
    
  5. ユーザーtjonesの未使用の権限を確認します。
    col username format a9
    col sys_priv format a35
    
    SELECT USERNAME, SYS_PRIV
     FROM DBA_UNUSED_SYSPRIVS
     WHERE USERNAME = 'TJONES'
     ORDER BY 1, 2;
    
    USERNAME SYS_PRIV
    -------- ------------------------------
    TJONES   ADMINISTER ANY SQL TUNING SET
    TJONES   ADMINISTER DATABASE TRIGGER
    TJONES   ADMINISTER RESOURCE MANAGER
    TJONES   ADMINISTER SQL TUNING SET
    TJONES   ALTER ANY ASSEMBLY
    TJONES   ON COMMIT REFRESH
    ...

ステップ6: この例で使用したコンポーネントの削除

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

  1. ユーザーpa_adminとして、dba_tuning_priv_analysis_pol権限分析ポリシーを削除します。
    EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE ('dba_tuning_priv_analysis_pol');
    

    pa_adminユーザーのスキーマに作成されたオブジェクトはSYSスキーマにあるため、次のステップで、このユーザー(このオブジェクトを含む)を削除する場合でも、dba_tuning_priv_analysis_pol権限分析ポリシーを手動で削除する必要があります。

  2. ユーザー・アカウントを作成したユーザーとして接続します。

    例:

    CONNECT sec_admin@pdb_name
    Enter password: password
    
  3. ユーザーpa_adminおよびtjonesを削除します。
    DROP USER pa_admin;
    DROP USER tjones CASCADE;

権限分析ポリシーおよびレポート・データ・ディクショナリ・ビュー

Oracle Databaseには、分析された権限について情報を提供する一連のデータ・ディクショナリ・ビューが用意されています。

表5-1に、これらのデータ・ディクショナリ・ビューを示します。

表5-1 権限分析情報を表示するデータ・ディクショナリ・ビュー

ビュー 説明

DBA_PRIV_CAPTURES

既存の権限分析ポリシーの情報をリストします

DBA_USED_PRIVS

レポートされた権限分析ポリシーに使用された権限および取得実行をリストします

DBA_UNUSED_GRANTS

使用されていない権限付与をリストします

DBA_UNUSED_PRIVS

レポートされた権限分析ポリシーに使用されていない権限および取得実行をリストします

DBA_USED_OBJPRIVS

レポートされた権限分析ポリシーに使用されたオブジェクト権限および取得実行をリストします。オブジェクト付与パスを含みません。

DBA_UNUSED_OBJPRIVS

レポートされた権限分析ポリシーに使用されていないオブジェクト権限および取得実行をリストします。オブジェクト権限付与パスを含みません。

DBA_USED_OBJPRIVS_PATH

レポートされた権限分析ポリシーに使用されたオブジェクト権限および取得実行をリストします。オブジェクト権限付与パスを含みます。

DBA_UNUSED_OBJPRIVS_PATH

レポートされた権限分析ポリシーに使用されていないオブジェクト権限および取得実行をリストします。オブジェクト権限付与パスを含みます。

DBA_USED_SYSPRIVS

レポートされた権限分析ポリシーに使用されたシステム権限および取得実行をリストします。システム権限付与パスを含みません。

DBA_UNUSED_SYSPRIVS

レポートされた権限分析ポリシーに使用されていないシステム権限および取得実行をリストします。システム権限付与パスを含みません。

DBA_USED_SYSPRIVS_PATH

レポートされた権限分析ポリシーに使用されたシステム権限および取得実行をリストします。システム権限付与パスを含みます。

DBA_UNUSED_SYSPRIVS_PATH

レポートされた権限分析ポリシーに使用されていないシステム権限および取得実行をリストします。システム権限付与パスを含みます

DBA_USED_PUBPRIVS

レポートされた権限分析ポリシーに使用されたPUBLICロールの権限および取得実行をすべてリストします

DBA_USED_USERPRIVS

レポートされた権限分析ポリシーに使用されたユーザー権限および取得実行をリストします。ユーザー権限付与パスを含みません。

DBA_UNUSED_USERPRIVS

レポートされた権限分析ポリシーに使用されていないユーザー権限および取得実行をリストします。ユーザー権限付与パスを含みません。

DBA_USED_USERPRIVS_PATH

レポートされた権限分析ポリシーに使用されたユーザー権限および取得実行をリストします。ユーザー権限付与パスを含みます。

DBA_UNUSED_USERPRIVS_PATH

レポートされた権限分析ポリシーに使用されていない権限および取得実行をリストします。ユーザー権限付与パスを含みます。

関連項目:

これらのデータ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。