Virtual Private Database

Virtual Private Database(VPD)は、サーバー規定のファイングレイン・アクセス・コントロールと、Oracleデータベース・サーバー内へのアプリケーション・コンテキスト値の安全な格納を組み合せたものです。 VPDを使用すると、オブジェクト・レベルに行レベルのセキュリティ・ポリシーを規定するアプリケーションを作成できます。 ポリシーの実行により、保護が必要であると特定したデータを問い合せるSQL文に対して、述語(WHERE句)が動的に追加されます。
アプリケーション開発者はアプリケーション・コンテキスト機能を使用することにより、可変長のアプリケーション属性とその値を定義、設定およびアクセスすることができます。 このような属性は、ファイングレイン・アクセス・コントロール・ポリシーの述語の値として使用できます。 アプリケーション・コンテキストには次の2種類があります。

  • ローカル(セッション・ベース)アプリケーション・コンテキストはUGAに格納され、アプリケーション・ユーザーがデータベースに接続するたびに起動されます。
  • グローバル(非セッション・ベース)アプリケーション・コンテキストはSGAに格納され、接続プールを使用してデータベースにアクセスする複数層環境ユーザーに使用されます。

VPDの概要

  • Virtual Private Database(VPD)を使用すると、表、ビューまたはシノニムに対するセキュリティを直接詳細なレベルまで規定できます。
  • セキュリティ・ポリシーは、表、ビューまたはシノニムに直接付加されており、ユーザーがデータにアクセスすると自動的に適用されるため、セキュリティを回避できません。
  • ユーザーがVPDポリシーで保護されている表、ビューまたはシノニムに直接的または間接的にアクセスすると、サーバーはユーザーのSQL文を動的に変更します。
  • カスタマイズで性的なポリシーと動的なポリシーを定義できます。
  • 共有ポリシーによって、1つのポリシーに複数のオブジェクトを関連付けます。
  • 索引にDDL操作を実行する時、索引にセキュリティポリシーを規定できます。

列レベルポリシー作成

BEGIN
dbms_rls.add_policy(object_schema => 'hr',
object_name => 'employees',
policy_name => 'hr_policy',
function_schema =>'hr',
policy_function => 'hrsec',
statement_types =>'select,insert',
sec_relevant_cols=>'salary,commission_pct');
END;

ポリシータイプ

  • DBMS_RLS.STATIC
  • DBMS_RLS.SHARED_STATIC
  • DBMS_RLS.CONTEXT_SENSITIVE
  • DBMS_RLS.SHARED_CONTEXT_SENSITIVE
  • DBMS_RLS.DYNAMIC:デフォルト

Staticポリシー

  • VPDは同じ記述のアクセス制御を規定されて、全てのユーザーに適用します。
  • Oracleはポリシー関数を一回のみ実行して、結果記述をSGAにキャッシュされます。
  • Oracleは問い合わせ毎にポリシー関数を再実行しないため、速度は速いです。
  • DBMS_RLS.ADD_POLICYのPOLICY_TYPE引数にDBM_RLS.STATIC或いはDBMS_RLS.SHARED_STATICを渡します
exec dbms_rls.add_policy(
object_schema =>'hr', object_name => 'employees', -
policy_name => 'hr_policy' , -
function_schema =>'hr',policy_function=>'hrsec' , -
statement_types => 'select,insert' , -
policy_type => dbms_rls.static , -
sec_relevant_cols =>'salary,commission_pct');

Context-Sensitiveポリシー

  • 初めて問い合わせのparseが処理された時と関連のローカルアプリケーションコンテキストが変更された時、セッション毎にポリシー関数を評価されます。
  • 記述結果をユーザーのセッションメモリにキャッシュされます。
exec dbms_rls.add_policy(
object_schema =>'hr', object_name =>'employees2', -
policy_name => 'hr_policy2' , -
function_schema =>'hr',policy_function=>'hrsec2', -
statement_types => 'select,insert' , -
policy_type => dbms_rls.context_sensitive , -
sec_relevant_cols =>'salary,commission_pct');
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License