データベース・セキュリティにおけるアクセスコントロールと権限管理
正しいID/パスワードを使ってログインしたユーザーはその後何をしてもよいわけではなく、アクセスコントロールのための原則のひとつ「最小権限の原則」(Least Privilege)に基づいて管理・制限されていなければならない。これは各ユーザーに業務上必要となる最低限の権限のみを付与するというものであり、データベース管理者、プログラム開発者、運用管理者、アプリケーション(プログラムそのもの)などRDBMS上のユーザーが付与されている権限はそれぞれの職務に必要なものだけに限定されていることが必要である。
1.オブジェクトに対するアクセスコントロール
具体的にはデータベース内の表、ビューといったオブジェクトに対する権限(主にSELECT,INSERT,UPDATE,DELETEといったDMLを使う権限)をユーザーごとに最小化する必要がある。どのユーザーはどの表に対して、どの権限を使うことができるかをアクセスマトリクスに整理して確認し、これに基づいて厳密な権限付与を行うことが重要となる。
この時Webアプリケーションのような三層構造のシステムでは「アプリケーションが利用しているユーザー」に対する権限付与を確実にチェックする必要があり、このことはSQLインジェクションなど外部からの攻撃に対する被害を最小化することにもつながる。また多くの権限を全て個別に管理していると運用が非常に煩雑になるためRole(ユーザー定義によるRole)を使って一定の単位でまとめて管理をしていくと良い。
しかし一つの表の中に「アクセスさせて良いデータ」と「アクセスを禁止したいデータ」が混在していて、特定の行、列単位でアクセスコントロールを行わなければならない場合があり、オブジェクトに対する権限を管理しただけでは十分ではない。このときの代表的な構成方法がViewを使って必要な部分だけをもとの表から抽出してアクセスさせる方法である。
しかし、このViewを使った制御は、アクセスコントロールの粒度が細かくなるとViewの数が増え、組織変更や人事異動、ポリシー変更などの際に管理・メンテナンスが複雑になり、人為的なミスや変更漏れなどが起きる可能性もある。
こうしたときにオラクルでは仮想プライベート・データベース(Virtual Private Database:VPD)を使って、Viewを使うことなく、行・列レベルでのアクセスコントロールが可能である。VPDではあらかじめ設定したアクセス・ポリシーに従ってSQL文を強制的に書き換える(where句を付加する)動作をする「ファイングレイン・アクセスコントロール」とアクセスコントロールを実施するために必要なユーザーの属性(部署名や職責など)を格納しておく「アプリケーション・コンテキスト」の二つの要素から構成されている。
ファイングレイン・アクセスコントロールが適用されている表に対してユーザーがアクセスを試みると、データベースはアプリケーション・コンテキストに格納された値を入手し、その値とアクセス・ポリシーに基づいて必要なwhere句をSQL文に付加する。ポリシーはあらかじめPL/SQLで作成し、アクセス制御を実施したい表・ビューなどに適用しておく。またアプリケーション・コンテキストはデフォルトで用意されたユーザ・コンテキストを使うこともできるが、あらかじめ格納したい属性値を決め、値を格納するためのパッケージを作成したうえで独自に定義することもできる。)
実際にSQLを処理するのはこの後になるため、あたかもはじめから条件句をつけて発行したSQL文であるかのように処理が行われ、その結果の値がユーザー側には返される。従ってユーザーからみると、あたかも自分が発行した(条件句が付加される前の)SQL文に対する結果が返ってきたように見える。これが仮想プライベート・データベースと呼ばれるゆえんである。
またVPDの場合性能に対する影響が非常に小さいことも特徴である。これは通常の処理以外に追加で行う動作はポリシーの参照とSQL文の変更(where句の追加)を1度実行するだけで良いからである。従って検索の場合、検索対象行数が増えるほど、性能に対する影響(VPDを使わなかった場合と比較した場合の比率)は相対的に小さくなっていく。
具体的な実装方法についてはセキュリティガイドなどを参照されたい。
Oracle Database 2日でセキュリティ・ガイド 11g リリース2(11.2) > Oracle Virtual Private Databaseによるデータ・アクセスの制御