行レベル・セキュリティの操作

このトピックでは、セマンティック・モデルの行レベル・セキュリティの理解と定義に役立つ情報を提供します。

行レベル・セキュリティについて

一部のデータ・ソースでは、行レベルのセキュリティ・ポリシーを適用して、個々のユーザーが問合せできるデータを判別します。

データ・セキュリティは、行レベル・セキュリティ、データ・レベル・セキュリティ、仮想プライベート・データベース(VPD)ポリシーなどの様々な用語を使用して記述されます。このドキュメントでは、行レベル・セキュリティという用語を使用します。

一部のデータ・ソースでは、問合せを実行しているエンド・ユーザーを偽装できる特権ユーザーを使用した接続がサポートされています。接続プールを使用すると、接続文字列情報、およびデータ問合せの前に実行される接続時スクリプトと問合せ時スクリプトをパラメータ化できます。Oracle Analyticsが、実際のエンド・ユーザーを偽装できる特権ユーザーを使用してデータ・ソースに接続すると、そのデータ・ソースのデータ・セキュリティ・ポリシーがエンド・ユーザーの問合せに適用されます。

接続文字列および問合せスクリプトの構成に加えて、Oracle Analyticsでは、セマンティック・モデルの物理レイヤー内の各データベースに対して仮想プライベート・データベース(VPD)データ・ソース・プロパティが提供されます。仮想プライベート・データベース(VPD)オプションを有効にすると、各ユーザーは問合せを許可されているデータのみを取得する必要があるため、ユーザー間で問合せキャッシュが共有されないようにすることができます。

データベースのユーザー、権限およびセキュリティ・ポリシーを定義する必要があります。詳細は、データベースのドキュメントを参照してください。

接続スクリプトを使用して、Oracle Databaseデータ・ソースに対して同じ行レベル・セキュリティを実現できます。

行レベル・セキュリティを設定する場所

セマンティック・モデルまたはデータベースで行レベル・セキュリティを設定できます。

セマンティック・モデルに行レベル・セキュリティを実装すると、次のような利点があります:

  • すべてのユーザーがデータベース接続プールを共有することによって、パフォーマンスが向上します。

  • すべてのユーザーがキャッシュを共有することによって、パフォーマンスが向上します。

  • 多くのフェデレーテッド・データ・ソースに適用するセキュリティ・ルールを定義し、維持できます。

データベースに行レベル・セキュリティを実装することは、複数のアプリケーションで同じデータベースが共有されているような状況において有用です。データベースで行レベル・セキュリティを設計して実装する場合は、セマンティック・モデルでオブジェクト権限を定義して適用することも必要です。

セマンティック・モデルとデータベースの両方で行レベル・セキュリティを設定することが可能ですが、特別な必要性がないかぎり、両方の場所に行レベル・セキュリティを適用することは通常はありません。

データベースでの行レベル・セキュリティの設定

複数のアプリケーションで同じデータベースが共有されている場合は、データベースに行レベル・セキュリティを実装します。

仮想プライベート・データベース(VPD)機能を使用するようにデータベースを構成した場合は、セマンティック・モデルを介してデータベース問合せを行うために、このタスクを実行します。

物理データベースの「詳細」プロパティで「仮想プライベート・データベース」フィールドを選択すると、Oracle Analytics問合せエンジンによって各ユーザーのキャッシュ・エントリが保護されるようになります。Oracle Analytics問合せエンジンは、セキュリティ・センシティブ変数のリストとそれぞれの見込みのキャッシュ・ヒットをマッチングします。キャッシュ・ヒットは、すべてのセキュリティ・センシティブ変数が含まれて一致しているキャッシュ・エントリでのみ発生します。

データベースで行レベル・セキュリティを設定した後、プレゼンテーション・レイヤーなどのオブジェクトについてセマンティック・モデルでオブジェクト権限を設定できます。また、問合せ制限(ガバナー)を設定することもできます。「プレゼンテーション・オブジェクトの権限の設定」および「データベース問合せの行数の制限」を参照してください。

  1. ホーム・ページで、「ナビゲータ」「セマンティック・モデル」の順にクリックします。
  2. 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
  3. 「物理レイヤー」「物理レイヤー」タブには、物理データを表すオブジェクトが含まれています。をクリックし、編集するデータベースをダブルクリックします。
  4. 「詳細」タブをクリックします。
  5. 「データソース・プロパティ」で、「仮想プライベート・データベース」を選択します。
  6. 「保存」をクリックします。

データ・フィルタと行レベル・セキュリティについて

特定のアプリケーション・ロールについてセマンティック・モデル・オブジェクトに対するデータ・フィルタを定義します。

データベースに行レベル・セキュリティを実装した場合、通常はデータ・フィルタを設定しません。行レベル・セキュリティ・ポリシーは、Oracle Analyticsではなく、データベースによって適用されます。

データ・フィルタは、論理レイヤーおよびプレゼンテーション・レイヤーのオブジェクトに対して設定できます。論理オブジェクトにフィルタを適用すると、そのオブジェクトを使用するすべてのプレゼンテーション・レイヤー・オブジェクトに影響が及びます。プレゼンテーション・レイヤー・オブジェクトにフィルタを設定すると、基礎となる論理オブジェクトに設定されているその他すべてのフィルタとともに、そのフィルタがオブジェクトに適用されます。

Oracle Analytics問合せエンジンでデータ・フィルタ・ルールがどのように適用されるかを図に示します。セキュリティ・ルールは接続するすべてのクライアントに適用され、たとえ論理SQL問合せが変更される場合であっても違反は許可されません。

この例では、アプリケーション・ロールにフィルタが適用されています。Anne Green(そのロールのメンバー)がリクエストを送信するとき、返される結果はこのフィルタに基づいて制限されます。管理者ユーザーのアプリケーション・ロールにはフィルタは適用されないため、すべての結果が返されます。Oracle Analytics問合せエンジンによって生成されるSQLでは、定義されているすべてのデータ・フィルタが考慮されます。

セマンティック・モデルでのデータ・フィルタの設定

特定のアプリケーション・ロールにデータ・フィルタを割り当てて、セマンティック・モデルで行レベル・セキュリティ・ルールを適用できます。

フィルタを作成するには、フィルタを適用するサブジェクト領域からオブジェクトを選択し、個々のオブジェクトについてフィルタ式情報を指定します。たとえば、表内の他の列の値の範囲に基づいて結果を制限するための、「"Sample Sales"."D2 Market"."M00 Mkt Key" > 5」のようなフィルタを定義できます。

セマンティック・モデルおよびセッション変数をフィルタ定義で使用することもできます。

論理ファクト表などのセマンティック・モデル・オブジェクトに対して複数のアプリケーション・ロールから異なるレベルのアクセスがある場合、機能グループを作成して、特定のアプリケーション・ロールで表示が制限されているデータがアプリケーション・ロールに表示されないようにすることができます。

たとえば、地域の店員に対してその割当て地域の四半期の売上を表示しても、すべての地域における全セグメントの売上を表示しないようにして、機密情報が公開されないようにするとします。このシナリオでは、フィルタ処理する特定のアプリケーション・ロールに適した、異なるアクセス・レベルの機能グループを作成します。「データ・フィルタのアプリケーション・ロールの機能グループの指定」を参照してください。

  1. ホーム・ページで、「ナビゲータ」「セマンティック・モデル」の順にクリックします。
  2. 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
  3. 「論理レイヤー」論理レイヤー・アイコンまたは「プレゼンテーション・レイヤー」プレゼンテーション・レイヤー・アイコンをクリックし、データ・フィルタを設定する表をダブルクリックします。
  4. 「データ・フィルタ」タブをクリックします。
  5. 「追加」で、データ・フィルタを設定するアプリケーション・ロールを検索して選択します。
  6. 「式エディタを開く」をクリックします。
  7. 式エディタで、セマンティック・モデル・オブジェクトと演算子を使用して条件を定義します。
  8. 「保存」をクリックします。

データ・フィルタでのアプリケーション・ロールの機能グループの指定について

論理ファクト表などのセマンティック・モデル・オブジェクトに対して複数のアプリケーション・ロールから異なるレベルのアクセスがある場合、機能グループを指定して、特定のアプリケーション・ロールで表示が制限されているデータがアプリケーション・ロールに表示されないようにすることができます。

定義された機能グループがない場合、関連付けられたロールにかかわらず、特定の表に適用されたすべてのセキュリティ・フィルタがOR演算子を使用して結合されます。ロールはセキュリティ・フィルタによって選択されたすべての行の結合を表示できるため、OR演算子の使用はほとんどの場合に機能します。たとえば、次のようなフィルタがあるとします。

ロールAにフィルタProduct = 'Camera'が割り当てられます

ロールBにフィルタProduct = 'Monitor'が割り当てられます

アプリケーション・ロールにロールAとロールBが付与されている場合、そのロールはCameraとMonitorの両方の製品のデータを表示できます。

同じ表の2つのセキュリティ・フィルタが問合せで結合される場合、フィルタ条件はOR演算子を使用して結合されます(このことは、ディメンション表で定義されたほとんどのセキュリティ・フィルタに該当します)。たとえば:

Product = 'Camera' OR Product = 'Monitor'

異なるディメンションのデータ・フィルタを使用して1つのファクト表を保護する場合は、機能グループを使用する必要があります。

この例では、ファクト表は次のフィルタを使用して保護されます。

ロールAにフィルタProduct = 'Camera'が割り当てられます

ロールBにフィルタProduct = 'Monitor'が割り当てられます

ロールCにフィルタRegion = 'Southwest'が割り当てられます

機能グループを使用しない場合、ロールA、BおよびCのユーザーの問合せでは、3つのフィルタ条件がすべてOR演算子を使用して結合されます。たとえば:

(Product = 'Camera' OR Product = 'Monitor' OR Region = 'Southwest')

ProductとRegionは独立したディメンションであるため、ロールA、BおよびCの結果を結合しても意味をなしません。OR演算子を使用して異なるディメンションのデータ・フィルタを結合すると、アプリケーション・ロールは、そのロールで表示する必要のないデータ値にアクセスできるようになります。

この例では、アプリケーション・ロールは、CameraおよびMonitor製品内のすべての地域のデータに加えて、Southwest地域内のすべての製品のデータを表示できます。

想定された動作を得るには(つまり、Southwest地域内のCameraおよびMonitor製品のデータのみをアプリケーション・ロールが表示できるようにするには)、AND演算子を使用して製品フィルタと地域フィルタを結合して、フィルタを変更する必要があります。たとえば:

(Product = 'Camera' OR Product = 'Monitor') AND (Region = 'Southwest')

機能グループを使用してこれを行うには、次のようにセキュリティ・フィルタを機能グループに割り当てる必要があります。

ロールAにフィルタProduct = 'Camera' with functional group "Product"が割り当てられます

ロールBにフィルタProduct = 'Monitor' with functional group "Product"が割り当てられます

ロールCにフィルタRegion = 'Southwest' with functional group "Region"が割り当てられます

同じ機能グループ内のすべてのフィルタはOR演算子を使用して結合され、異なる機能グループ内のすべてのフィルタのセットはAND演算子を使用して結合されます。各セキュリティ・フィルタに関連付けられた機能グループを選択することで、OR演算子とAND演算子を使用してフィルタを結合する方法を制御できます。

データ・フィルタのアプリケーション・ロールの機能グループの指定

同じセマンティック・モデル・オブジェクト(通常は論理ファクト表)に対する異なるデータ・アクセス・フィルタを使用して、アプリケーション・ロールの機能グループを指定できます。

  1. ホーム・ページで、「ナビゲータ」「セマンティック・モデル」の順にクリックします。
  2. 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
  3. 「論理レイヤー」論理レイヤー・アイコンまたは「プレゼンテーション・レイヤー」プレゼンテーション・レイヤー・アイコンをクリックし、機能グループを指定するデータ・フィルタを含む表をダブルクリックします。
  4. 「データ・フィルタ」タブをクリックします。
  5. 機能グループを指定するフィルタを選択します。
  6. 「機能グループ」フィールドをクリックし、既存のグループを選択するか、新しいグループの名前を入力します。
  7. 「保存」をクリックします。