Oracle Label Security。 最初の知り合い

Oracle Label Security(OLS)は、Oracle Database Serverのデータアクセスを区別するもう1つの方法です。 OLSの特徴的な機能は、マルチレベルアクセスポリシーと、アクセス制御属性とデータの保存です。



ポリシー内では、情報へのアクセスレベルが決定されます。たとえば、「トップシークレット」、「シークレット」、「チップボード」です。 高いレベルのアクセス権を持つユーザーは、自分のレベルと低いレベルでマークされたデータにアクセスできます。



Oracle Label Securityは、Oracle Database Enterprise Editionの有料オプションです。



以下では、基本概念とOLSの使用例を検討します。



はじめに



Oracle Label Securityは、作業にOracle Virtual Private Database(VPD)を使用しますが、VPDとは異なり、PL / SQLコードを記述する必要はありません。 PL / SQLパッケージとOracle Enterprise Managerの両方を使用して、OLSのすべての側面を管理できます。



この記事では、Oracle Databse 12cのバージョンに対するOLSの実装について説明します 。以前のバージョンとの違いについては、 こちらをご覧ください



OLSコンポーネント



ラベル ラベルは、データアクセス属性の表現です。

ラベルは次のコンポーネントで構成されています。



方針 タグ、テーブル、および承認をリンクします。



問題の声明



地域構造を持つ会社Zがあります。

同社は、顧客の支払いに関するデータを受信するシステムを運用しています。 これらはERPから取得され、 PAYMENTSテーブルに入力されます。

支払い金額と地域ごとに読み取りアクセスを区別する必要があります。 特に大規模な支払いに関するデータは、暗号化されたディスク上の別のパーティションに保存する必要があります。 ERPから支払いを受け取る場合、金額と地域を考慮してラベルを割り当てる必要があります。 テーブルへの書き込みは、標準のOracleメカニズムに制限されており、ERPからのみ可能です。



支払い額は3つの部分に分かれています。

  1. ビッグ(大)-10000から
  2. 中(中)-5,000から9,999
  3. 小(小)-最大5000


地域:

  1. MO(モスクワと地域)
  2. NW(北西)


ユーザー:

  1. big_boss-最大アクセスレベルを持ち、すべてのデータを表示します
  2. med_boss-すべての地域で5000〜9999の支払いが表示されます
  3. mo_big_boss-すべての支払いを見るが、MO地域のみ


実装



Oracle Label Securityオプションを有効にする方法は、 こちらを参照してください

TESTスキームにテーブルを作成し、そこに支払いを受け取ります:

非表示のテキスト
create table PAYMENTS ( ID number, CNAME varchar2(64), /*    */ REGION char(2), /*   MO/NW */ AMOUNT number, /*   */ ols_payments number(10), /*      */ CONSTRAINT "PAYMENTS_PK" PRIMARY KEY ("ID") ) PARTITION BY RANGE (ols_payments) ( PARTITION SP VALUES LESS THAN (80000), PARTITION MP VALUES LESS THAN (90000), PARTITION BP VALUES LESS THAN (MAXVALUE) /*           */ ); grant select on payments to public;
      
      







ols_payments列は、パーティション化を行えるように事前に作成されてます。 これが不要な場合は、ポリシーを適用することで自動的に作成できます。

以降の構成作業はすべて、ユーザーLBACSYSから行われます。

ポリシーごとに、policy_DBAという形式の特別なロールが作成されます。 役割の所有者はこのポリシーを変更できます。



ポリシーpayments_polを作成します。

非表示のテキスト
 EXEC SA_SYSDBA.CREATE_POLICY ( policy_name => 'payments_pol', /*  policy */ column_name => 'ols_payments', /*      */ default_options => 'read_control'); /*       */
      
      







ポリシーの金額ごとにアクセスレベルを作成します。

非表示のテキスト
 BEGIN SA_COMPONENTS.CREATE_LEVEL ( policy_name => 'payments_pol', level_num => 90, /*   */ short_name => 'B', /*   */ long_name => 'BIG_PAYMENT'); /*   */ SA_COMPONENTS.CREATE_LEVEL ( policy_name => 'payments_pol', level_num => 80, short_name => 'M', long_name => 'MEDIUM_PAYMENT'); SA_COMPONENTS.CREATE_LEVEL ( policy_name => 'payments_pol', level_num => 70, short_name => 'S', long_name => 'SMALL_PAYMENT'); END; /
      
      







各レベルについて、その数値、略称、およびフルネームを示す必要があります。 略称は、すべての参照で以下で使用されます。



地域ごとにグループを作成します。

非表示のテキスト
 BEGIN /*   */ SA_COMPONENTS.CREATE_GROUP ( policy_name => 'payments_pol', group_num => 10, /*   */ short_name => 'RG', /*   */ long_name => 'REGIONS'); /*   */ SA_COMPONENTS.CREATE_GROUP ( policy_name => 'payments_pol', group_num => 20, short_name => 'MO', long_name => 'MOSCOW_REGION', parent_name => 'RG'); /*  */ SA_COMPONENTS.CREATE_GROUP ( policy_name => 'payments_pol', group_num => 30, short_name => 'NW', long_name => 'NW_REGION', parent_name => 'RG'); END; /
      
      







グループごとに、その数値、略称、およびフルネームを示す必要があります。 ルートを除くすべてのグループに対して、親が指定されます。



ラベルのテキスト形式は「LEVEL:COMPARTMENT1、..、COMPARTMENTN:GROUP1、...、GROUPN」のようになります。

モスクワ地域の10,000を超える金額を含むレコードのラベルは、「B :: MO」のようになります。



テキストラベルを数値で表示するために、 ラベルタグが作成されます。 ラベルタグは、自動または手動で生成できます。 ラベル付けタグを含むフィールドでパーティション化が使用されるため、手動で作成します。 ラベルタグの値は、データベースのフレームワーク内で一意である必要があり、異なるポリシーで複製できないことを覚えておくことが重要です。 ラベルタグは、グループ番号またはレベル番号のいずれにも関連付けられていません。



タグを作成します。

非表示のテキスト
 BEGIN -- RG labels SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 90010, /*    */ label_value => 'B::RG', /*    */ data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 80010, label_value => 'M::RG', data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 70010, label_value => 'S::RG', data_label => TRUE); -- MO LABELS SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 90020, label_value => 'B::MO', data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 80020, label_value => 'M::MO', data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 70020, label_value => 'S::MO', data_label => TRUE); -- NW LABELS SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 90030, label_value => 'B::NW', data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 80030, label_value => 'M::NW', data_label => TRUE); SA_LABEL_ADMIN.CREATE_LABEL ( policy_name => 'payments_pol', label_tag => 70030, label_value => 'S::NW', data_label => TRUE); END; /
      
      







データに従ってラベルを生成する関数を記述することは残っています。

非表示のテキスト
 create or replace function payments_label(region varchar2, amount number) return LBACSYS.LBAC_LABEL as lvl varchar2(32); reg varchar2(32); rvalue number(10); begin case region when 'MO' then reg := 'MO'; when 'NW' then reg := 'NW'; else raise_application_error(-20000, 'invalid region.'); end case; case when amount >= 10000 then lvl := 'B'; when amount >= 5000 then lvl := 'M'; else lvl := 'S'; end case; return LBACSYS.to_lbac_label('PAYMENTS_POL', lvl || '::' || reg); end;
      
      







そして、あなたは私たちのポリシーをテーブルに適用できます:

非表示のテキスト
 EXEC SA_POLICY_ADMIN.APPLY_TABLE_POLICY ( policy_name => 'payments_pol', schema_name => 'test', table_name => 'payments', table_options => 'READ_CONTROL,HIDE', /*  ,     */ label_function => 'test.payments_label(:new.region,:new.amount)', /*   ,         insert  update.     */ predicate => NULL);
      
      







ERPからの支払いの受領をシミュレートするテストデータをテーブルに入力します。

非表示のテキスト
 $ sqlplus test/test insert into payments values(1, '  , ', 'MO', 100000); insert into payments values(2, '  , ', 'MO', 7000); insert into payments values(3, '  , ', 'MO', 100000); insert into payments values(4, '  , ', 'NW', 150000); insert into payments values(5, '  , ', 'NW', 3000);
      
      







そして、ユーザーに権利を分配します。

非表示のテキスト
 -- big boss BEGIN SA_USER_ADMIN.SET_LEVELS ( policy_name => 'payments_pol', user_name => 'big_boss', max_level => 'B'); SA_USER_ADMIN.SET_GROUPS ( policy_name => 'payments_pol', user_name => 'big_boss', read_groups => 'RG'); -- medium boss SA_USER_ADMIN.SET_LEVELS ( policy_name => 'payments_pol', user_name => 'med_boss', max_level => 'M'); SA_USER_ADMIN.SET_GROUPS ( policy_name => 'payments_pol', user_name => 'med_boss', read_groups => 'RG'); -- big boss of MO region SA_USER_ADMIN.SET_LEVELS ( policy_name => 'payments_pol', user_name => 'mo_big_boss', max_level => 'B'); SA_USER_ADMIN.SET_GROUPS ( policy_name => 'payments_pol', user_name => 'mo_big_boss', read_groups => 'MO'); END; /
      
      







それでは、何が起こったのかを確認しましょう。



big_bossにすべてのエントリが表示されることを確認してください。

 $ sqlplus big_boss/qw SQL> select label_to_char (ols_payments) label, id, cname, amount from test.payments; LABEL ID CNAME AMOUNT ---------- ---------- ------------------------------ ---------- S::MO 3   ,  2000 S::NW 5   ,  3000 M::MO 2   ,  7000 B::MO 1   ,  100000 B::NW 4   ,  150000
      
      





すべての地域でmed_bossが10,000未満の量のレコードを表示するようにします。

 sqlplus med_boss/qw SQL> select label_to_char (ols_payments) label, id, cname, amount from test.payments; LABEL ID CNAME AMOUNT ---------- ---------- ------------------------------ ---------- S::MO 3   ,  2000 S::NW 5   ,  3000 M::MO 2   ,  7000
      
      





mo_big_bossがすべての金額のレコードを見ることができるようにしますが、モスクワ地域のみです。

 $ sqlplus mo_big_boss/qw SQL> select label_to_char (ols_payments) label, id, cname, amount from test.payments; LABEL ID CNAME AMOUNT ---------- ---------- ------------------------------ ---------- S::MO 3   ,  2000 M::MO 2   ,  7000 B::MO 1   ,  100000
      
      





PS。 Oracle Label Securityは、INSERT / DELETE / UPDATEのアクセス制御をサポートしていますが、記事のサイズではすべてについて話すことはできません。 ドキュメントはこちらから入手できます




All Articles