Oracleデータベースの権限分析: DBMS_PRIVILEGE_CAPTUREを使いこなす

Oracle Master Silver

はじめに

権限の管理はデータベースセキュリティの要です。過剰な権限はシステムの脆弱性を引き起こし、最小権限の原則を遵守することで、不正アクセスやデータ漏洩リスクを軽減できます。本記事では、Oracle Databaseで権限の使用状況を効率的にモニタリングできるDBMS_PRIVILEGE_CAPTUREの使い方を徹底解説します。具体的な操作例と設定方法に加え、注意点やよくある質問についても詳しく取り上げます。

DBMS_PRIVILEGE_CAPTUREとは?

DBMS_PRIVILEGE_CAPTUREはOracle Database 12cで導入された、ユーザーやロールが実際に使用した権限のみをキャプチャして記録するためのツールです。これを活用することで、不要な権限を削除し、システムの安全性を大幅に向上させることができます。

主な機能

  • 権限の見直し: キャプチャデータをもとに実際に必要な権限だけを付与。
  • セキュリティの強化: 使用されていない権限を削除してリスクを低減。
  • コンプライアンス対応: 最小権限の原則に基づく運用をサポート。

DBMS_PRIVILEGE_CAPTUREの利用シナリオ

  • 新規アプリケーション導入時: 必要な権限だけを付与することで、最小権限設定をスムーズに行えます。
  • 定期監査: 既存ユーザーの権限を見直し、業務に不要な権限を削除することでコンプライアンス対応が可能です。
  • 権限エラー対応: 実際に必要な権限を調べて正確に付与することで、アクセス権不足による業務影響を軽減できます。

DBMS_PRIVILEGE_CAPTUREのタイプと詳細設定

この機能には、4種類のキャプチャタイプがあり、監視範囲に応じた権限キャプチャが可能です。

キャプチャタイプ説明
G_DATABASEデータベース全体の権限をキャプチャ
G_ROLE特定のロールに関連する権限をキャプチャ
G_USER特定のユーザーに関連する権限をキャプチャ
G_CONTEXT条件付きで権限をキャプチャ(アプリケーションコンテキストに基づく)

設定手順:権限キャプチャの開始から結果の生成と分析まで

ステップ1: キャプチャポリシーの作成

まず、どの範囲の権限をキャプチャするかを設定します。ここでは、データベース全体でのキャプチャを例に説明します。

BEGIN
DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'example_capture',
type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE,
description => 'データベース全体の権限キャプチャ');
END;
/

ステップ2: キャプチャの開始

キャプチャポリシーが作成されたら、キャプチャを開始し、指定した範囲の権限の使用状況を記録します。

BEGIN
DBMS_PRIVILEGE_CAPTURE.enable_capture(name => 'example_capture');
END;
/

ポイント: 業務が活発な時間帯に設定すると、より実際の業務に沿ったデータが得られます。キャプチャの負荷が気になる場合は、負荷が低い時期を選んで実施しましょう。

ステップ3: キャプチャの無効化

必要な情報が収集できたら、キャプチャを停止します。この時点でキャプチャデータが固定され、次のステップで分析用のデータ生成を行います。

BEGIN
DBMS_PRIVILEGE_CAPTURE.disable_capture(name => 'example_capture');
END;
/

ステップ4: キャプチャ結果の生成 (DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT)

キャプチャデータを確認しやすい形式で集計するために、DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTを実行します。この手順を行うことで、キャプチャ結果がシステムビュー(DBA_USED_OBJPRIVSDBA_UNUSED_OBJPRIVS)に格納され、分析を容易に行えます。

BEGIN
DBMS_PRIVILEGE_CAPTURE.generate_result(name => 'example_capture');
END;
/

注意: GENERATE_RESULTは必ずキャプチャを無効化した後に実行します。この手順によって、使用された権限や未使用の権限が表示されるため、精度の高い権限管理が実現できます。

ステップ5: 結果の確認と分析

キャプチャ結果が生成されると、権限の使用状況がシステムビューから参照できるようになります。

  • 使用された権限の確認: DBA_USED_OBJPRIVS
  • 未使用の権限の確認: DBA_UNUSED_OBJPRIVS
-- 使用された権限の表示
SELECT * FROM DBA_USED_OBJPRIVS WHERE capture = 'example_capture';

-- 未使用の権限の表示
SELECT * FROM DBA_UNUSED_OBJPRIVS WHERE capture = 'example_capture';

この結果をもとに、業務に不要な権限を明確化し、最小限の権限でユーザーやロールを管理することが可能になります。

SQL> BEGIN  ★キャプチャポリシーの作成
2 DBMS_PRIVILEGE_CAPTURE.create_capture(
3 name => 'example_capture',
4 type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE,
5 description => 'データベース全体の権限キャプチャ');
6 END;
7 /

PL/SQLプロシージャが正常に完了しました。

SQL> BEGIN ★キャプチャの開始
2 DBMS_PRIVILEGE_CAPTURE.enable_capture(name => 'example_capture');
3 END;
4 /

PL/SQLプロシージャが正常に完了しました。

SQL> conn user1/user1
接続されました。
SQL> select empno,ename from scott.emp where empno=7369;

EMPNO ENAME
---------- ------------------------------
7369 SMITH

SQL> conn / as sysdba
接続されました。
SQL> BEGIN
2 DBMS_PRIVILEGE_CAPTURE.disable_capture(name => 'example_capture');
3 END;
4 /

PL/SQLプロシージャが正常に完了しました。

SQL> BEGIN ★キャプチャの無効化
2 DBMS_PRIVILEGE_CAPTURE.generate_result(name => 'example_capture');
3 END;
4 /

PL/SQLプロシージャが正常に完了しました。

SQL> set lin 1000 pages 1000
SQL> col username for a10
SQL> col obj_priv for a10
SQL> col capture for a20
SQL> col used_role for a10
SQL> col object_name for a30
SQL> col object_owner for a10
SQL> select capture,username,used_role,obj_priv,object_name,object_owner from dba_used_objprivs
2 where username='USER1';

CAPTURE USERNAME USED_ROLE OBJ_PRIV OBJECT_NAME OBJECT_OWN
-------------------- ---------- ---------- ---------- ------------------------------ ----------
example_capture USER1 USER1 SELECT EMP SCOTT
example_capture USER1 PUBLIC EXECUTE DBMS_APPLICATION_INFO SYS
example_capture USER1 PUBLIC SELECT DUAL SYS
example_capture USER1 PUBLIC SELECT DUAL SYS
example_capture USER1 PUBLIC SELECT DUAL SYS
example_capture USER1 PUBLIC EXECUTE DBMS_APPLICATION_INFO SYS
example_capture USER1 PUBLIC EXECUTE DBMS_APPLICATION_INFO SYS

7行が選択されました。

不要な権限の削除

キャプチャ結果を参考に、実際に業務で使用されていない権限を削除します。不要な権限は、DBA_UNUSED_OBJPRIVSビューから確認し、削除スクリプトを作成して整理します。

-- 不要な権限の削除例
REVOKE SELECT ON schema_name.table_name FROM user_name;

注意事項とベストプラクティス

  • キャプチャポリシーの設定: 権限キャプチャは、正確な分析を行うため、対象範囲を十分に考慮して設定しましょう。
  • キャプチャ期間の短縮: キャプチャを実行する期間は必要最小限に抑え、システム負荷の影響を最小限にします。
  • 定期的な権限の見直し: システムの安定運用を維持するため、定期的なキャプチャの実施が推奨されます。

よくある質問 (FAQ)

  • Q1: キャプチャを実行中にシステムへの影響はありますか?
    • A1: DBMS_PRIVILEGE_CAPTUREは軽微なシステム負荷を発生させるため、ピーク時や重要な処理が行われる時間帯を避けて実施することが推奨されます。
  • Q2: キャプチャデータはどのくらいの期間保持されますか?
    • A2: キャプチャ結果はシステムに保存されるため、分析が完了したら削除することで、ストレージの効率化が図れます。
  • Q3: 使用されていない権限はすぐに削除しても大丈夫ですか?
    • A3: 重要な権限については、影響を検証したうえで削除するようにしましょう。特にシステムユーザーの権限については、慎重に確認が必要です。

DBMS_PRIVILEGE_CAPTUREを使った最小権限の原則の維持

キャプチャを定期的に実施し、結果をもとに不要な権限を整理することで、最小権限の原則を維持できます。これにより、システムセキュリティの強化と運用効率の向上が実現します。


まとめ

DBMS_PRIVILEGE_CAPTUREは、データベースの権限管理において不可欠なツールです。この機能を活用することで、ユーザーやロールの権限を効率的に管理し、最小限のリスクでセキュアなデータベース運用を実現できます。継続的な権限監査と適切なポリシー設定を行い、システム全体の安全性を向上させましょう。

[参考]
Oracle Database セキュリティ・ガイド 19c

【初心者向け】Oracleデータベースにおけるユーザー作成と削除
データベース管理者(DBA)やシステム管理者として、Oracleデータベースを運用する際に避けては通れないのが「ユーザーの作成」と「ユーザーの削除」です。ユーザー管理はセキュリティの観点からも重要で、適切な権限を持ったユーザーを作成し、不要...

コメント

タイトルとURLをコピーしました