権限分析について

*以下は、サポート契約締結中のお客様に2015年10月号として配信しているサポートレターより一部抜粋して掲載しています。

権限分析について

セキュリティの観点から権限の付与は必要最小限であることが理想とされています。
しかしながら必要な権限が付与されていないことは比較的簡単に確認ができますが、使用されていない権限が付与されているかどうかというのは確認が難しいと感じたことはないでしょうか。

Oracle Database 12c で実装された権限分析は DBMS_PRIVILEGE_CAPTURE パッケージを使用して SYS ユーザー以外の任意の処理を監視し、使用した権限と使用されなかった権限をそれぞれ分析し、分析結果をビューに格納する機能です。

簡単な操作で実際に行っている処理から権限の使用有無をビューで確認できるため、不要な権限の取り消しを検討しやすくなりました。

※ 権限分析は Oracle Database 12c Enterprise Edition の Oracle Database Vault オプションライセンスが必要です。

権限分析の種類

権限分析を行うために目的に合わせて権限分析ポリシーを作成します。権限分析ポリシーのタイプは4種類あります。() 内はポリシー作成時に指定するタイプ名です。


1. データベース分析( G_DATABASE )
分析期間中にユーザーによって使用された権限が分析されます。これ以降で記載するポリシーの中で最も広範囲の分析を行うポリシーです。
2. ロール分析( G_ROLE )
指定されたロールが付与されたユーザーのロール内における権限使用状況を分析します。
3. SYS_CONTEXT 分析( G_CONTEXT )
SYS_CONTEXT で作成した評価式が true に評価された場合の権限使用状況を分析します。
4. ロールと SYS_CONTEXT 分析( G_ROLE_AND_CONTEXT )
SYS_CONTEXT で作成した評価式が true に評価された場合に、指定されたロール内の権限使用状況を分析します。

権限分析の実行方法

※ 権限分析は、 CAPTURE_ADMIN ロールを付与されたユーザーで行う必要があります。

1. 権限ポリシーの作成と有効化

上記4つの権限ポリシーから、目的に合わせて作成し有効化します。
※ 同時に複数の権限分析ポリシーを有効化することはできません。

構文

ポリシー作成
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE (
    name         :権限ポリシーの任意の名前
    description  :ポリシーの説明(省略可能)
    type         :権限ポリシーのタイプ
    roles        :ロール分析の場合に権限が分析対象であるロール名
    condition    :SYS_CONTEXT 分析の場合に SYS_CONTEXT での評価式
    );
ポリシー有効化
DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('name: 設定したポリシー名');

例) ロールと SYS_CONTEXT 分析タイプの権限分析ポリシー作成と有効化

BEGIN
  DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
  name            => 'role_syscontext_policy',
  type            => DBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXT,
  roles           => role_name_list('TEST_ROLE1'),
  condition       => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=''TEST_USER1''');
 END;
 /
 
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('role_syscontext_policy');

上記は SYS_CONTEXT の SESSION_USER で設定された TEST_USER1 の TEST_ROLE1 に含まれる権限の使用を分析するポリシーの作成と有効化です。SYS_CONTEXT 詳細については「参考情報」で記載のマニュアルをご参照いただけますようお願いいたします。

2. 分析対象となる処理の実施と無効化

分析対象となる処理を行い、完了後、無効化を行います。

構文

DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE (name : 作成したポリシー名 );

EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('role_syscontext_policy');

無効化後もポリシーの削除を行わなければ手順1の有効化( ENABLE_CAPTURE )で再利用 することができます。

権限分析レポートの生成

ポリシーの無効化後にレポートの生成を行います。

構文

DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ( name : 作成したポリシー名);

EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('role_syscontext_policy');

生成されたレポートは使用された権限( DBA_USED_XXXX )と、使用されなかった権限( DBA_UNUSED_XXXX )で別々にビューに格納されます。
格納されたレポートはポリシーの削除を行うまで格納されます。

分析結果の見方

上記で作成したポリシーで、使用した権限と使用しなかった権限を見ていきます。

使用した権限

SQL> SELECT SYS_PRIV, OBJ_PRIV, OBJECT_NAME, PATH FROM DBA_USED_PRIVS
   2  WHERE USERNAME = 'TEST_USER1' AND CAPTURE = 'role_syscontext_policy';
 
SYS_PRIV          OBJ_PRIV  OBJEC PATH
 ----------------- --------- ----- ----------------------------------------
 CREATE ANY TABLE                  GRANT_PATH('TEST_USER1', 'TEST_ROLE1',  --①
                                   'TEST_ROLE2')
                   SELECT    EMP   GRANT_PATH('TEST_USER1', 'TEST_ROLE1')  --②
                   SELECT    DEPT  GRANT_PATH('TEST_USER1', 'TEST_ROLE1',
                                   'TEST_ROLE2')

SYS_PRIV : システム権限
OBJ_PRIV : オブジェクト権限
OBJECT_NAME : オブジェクト権限で使用されたオブジェクト名
PATH : 使用されている権限のパス、複数出力している場合は右側から付与の階層になっています

①は CREATE ANY TABLE システム権限を持つ TEST_ROLE2 が TEST_ROLE1 に付与され、TEST_ROLE1 経由で TEST_USER1 に CREATE ANY TABLE 権限が付与され使用されたことを意味します。

②は EMP 表に対して SELECT 権限を持つ TEST_ROLE1 が TEST_USER1 に付与され使用されたことを意味します。

使用しなかった権限

SQL> SELECT SYS_PRIV, OBJ_PRIV, OBJECT_NAME, PATH FROM DBA_UNUSED_PRIVS
   2  WHERE CAPTURE = 'role_syscontext_policy';
 
SYS_PRIV         OBJ_PRIV  OBJECT_NAM PATH
 ---------------- --------- ---------- -------------------------------------
 CREATE ANY VIEW                       GRANT_PATH('TEST_ROLE1')   --③
                  SELECT    SALGRADE   GRANT_PATH('TEST_ROLE1', 'TEST_ROLE2')--④

各カラムの意味については DBA_USED_PRIVS と同じです。

③は TEST_ROLE1 に含まれる CREATE ANY VIEW 権限は使用されなかったことを意味します。

④は SALGRADE 表に対する SELECT オブジェクト権限が含まれる TEST_ROLE2 が TEST_ROLE1 ロールに付与されていますが、この SELECT 権限は使用されなかったことを意味します。

なお、今回は表示しておりませんが、DBA_USED_PRIVS と DBA_UNUSED_PRIVS に USERNAME列があります。ロール分析を使用時、DBA_USED_PRIVS にはユーザー名が格納されますが DBA_UNUSED_PRIVS にはユーザー名は格納されませんのでご注意ください。

まとめ

実行方法で示しましたとおり、少ない工程で実行でき、権限の確認も非常に簡単です。
権限分析により権限使用状況を把握することで、権限の最小数を特定でき、セキュリティの強化につながりますので、ぜひ一度ご活用頂ければと思います。

参考情報

(オラクル事業部 サポートセンター 加藤)

権限分析について