※ 本記事は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」で検索すると簡単に探すことができます。

DBSATレポートの「Privileges and Roles」セクションには他にもアカウント管理権限(Account Management Privileges、PRIV.ACCT)や監査設定管理権限(Audit Management Privileges、PRIV.AUDIT)などの特権が誰に割り当てられているかを確認することができます。DBSATをぜひご活用ください。

DBSATの使い方はこちら

「もくじ」にもどる