※ 本記事は2016年11月28日に公開されたものです。
権限管理の分野で近年よく聞く言葉のひとつに「特権管理」があります。各種ガイドラインなどでも遵守事項、考慮事項として掲載されていることも少なくありません。
では、特権とは具体的にどのようなものを指すのでしょうか?
とくに「Oracle Databaseのインストールで事前に定義されているロール」の付与には注意が必要です。よく知られているDBA、RESOURCE、CONNECTロールの利用は、マニュアルでは実は「非推奨」とされています。これらのロールはバージョンによってロールに含まれる権限が変わる点も注意が必要です。たとえばDBAロールは新機能を管理するための権限がどんどん追加されていきますし、CONNECTロールは以前はCREATE TABLEなどの権限が含まれていましたが、10gR2以降ではCREATE SESSION権限のみになっています。厳密に最小権限の原則を適用するためには、これらの事前定義のロールを利用せずに独自にロールを定義して必要なシステム権限を付与していく必要があります。
さて、システム権限の中でも特に中が必要な権限があります。ANYキーワードを使用するシステム権限です。たとえばSELECT ANY TABLEシステム権限を付与すると、他スキーマを含めデータベース内のすべてのデータを参照可能となります。管理者の権限に次ぐ特権です。
実はこの強力な権限が多くのユーザーに付与されているケースが少なくありません。ユーザーを新しく作成した時に他スキーマのアプリケーションデータを参照するために個々の表のオブジェクト権限を付与するのではなく、簡単のためにこの強力な権限を付与してしまうケースです。データの更新が可能なUPDATE ANY TABLE権限が付与されていると、商品や顧客のマスター表やSOX法で保護対象となっている経理データまで更新できてしまいます。さらにデータベース統合などでひとつのデータベースに複数のアプリケーションのデータが格納されている環境では、他のアプリケーションのデータまで参照・更新できることになってしまいます。面倒でもこれらの特権は利用せずに、アクセスしてもよいオブジェクトに対するオブジェクト権限をまとめたロールを作成してください。
ANYシステム権限が割り当てられている対象は、DBA_SYS_PRIVSデータディクショナリビューから確認できます。ただし、ユーザーに直接割り当てられている場合はよいのですが、ロールに割り当てられている場合には、そのロールが誰に割り当てられているかを確認する必要があります。ロールは別のロールに割り当てることもできますので再帰的に検索していく必要があります。
DBSATのレポートでは「Privileges and Roles」セクションの「Data Access Privileges」から確認できます。レポートを「PRIV.DATA」で検索すると簡単に探すことができます。

