0

ポリシーを追加して関数を作成した後、Oracle VPD を使用して、権限のないユーザーから列を隠すことができました。

しかし、(null)の代わりに「xxxxxx」のようなものを表示するにはどうすればよいですか

また、関数では、次のようにユーザーログインの検証を行っています

if sys_context( 'userenv', 'session_user' ) = 'USER1'

関数内のこのハードコーディングを削除する最善の方法は何ですか?

前もって感謝します。

4

1 に答える 1

2

null 以外の場所にテキストを返すには、テーブルの上にビューを作成して、null を必要な静的リテラルに変更する必要があります。VPD の唯一のオプションは、行を非表示にするか、シークレット列を NULL にします。

質問の2番目の部分で、そのチェックを使用して機密列にアクセスできるユーザーを特定している場合は、代わりにロールを使用して、VPD関数に次のようにチェックさせることができます:

return 'exists (select null from session_roles where role = ''XXXXXX'')';

つまりXXXXXX、セッションに設定された役割 (適切な役割を作成し、それを特権ユーザーに付与するだけ) を持つ人は誰でもデータを見ることができます。そうすれば、多数のユーザー ID をハードコーディングする必要がなくなります。

例えば:

ロールを作成してテスト ユーザーに付与すると、次のようになります。

SQL> create role ACCESS_TABLEA_SEC_COL;

Role created.

SQL> grant ACCESS_TABLEA_SEC_COL to test;

Grant succeeded.

私のセットアップでは、簡単なテストテーブルと、your_sec_col列を読む人を止めるポリシーを作成しました。

SQL> create or replace package pkg_security_control
  2  as
  3    function apply_access(p_owner in varchar2, p_obj_name  in  varchar2) return varchar2;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_security_control
  2  as
  3    function apply_access(p_owner in varchar2, p_obj_name  in  varchar2)
  4      return varchar2
  5    is
  6    begin
  7      return 'exists (select null from session_roles where role = ''ACCESS_TABLEA_SEC_COL'')';
  8    end;
  9  end;
 10  /

Package body created.

SQL> create table TABLEA
  2  (
  3    id number primary key,
  4   your_sec_col  varchar2(30)
  5  );

Table created.

SQL> insert into tablea values (1, 'secret text1');

1 row created.

SQL> insert into tablea values (2, 'secret text2');

1 row created.

そのテーブルから選択し、ACCESS_TABLEA_SEC_COL役割がない場合は、次のようになります。

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1
         2

のような文字列が必要ですxxxxx。VPD 自体はこれを実行できませんが、ビューはNULLその文字列にデコードできます。

SQL> create view v_tablea
  2  as
  3  select id, case when your_sec_col is null then 'xxxxxx' else your_sec_col end your_sec_col
  4    from TABLEA;

View created.

ビューから選択すると、役割が設定されているかどうかに応じて次のようになります。

SQL> set role none;

Role set.

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1
         2

SQL> select *
  2    from v_tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 xxxxxx
         2 xxxxxx

SQL> set role all;

Role set.

SQL> select *
  2    from v_tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 secret text1
         2 secret text2

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 secret text1
         2 secret text2

そのため、VPD は引き続きテーブルから選択する人からテーブルを保護しますが、代わりにリテラル文字列を取得するためにクライアントにビューから選択させることになります。保護された文字列に NULL を含めることができ、それらをアクセスなしと区別したい場合は、代わりにロール チェックをビューに配置できます。

create view v_tablea
as
select id, 
       case (select 'A' from session_roles where role = 'ACCESS_TABLEA_SEC_COL') 
         when 'A' then your_sec_col else 'xxxxxxxx' end your_sec_col
  from TABLEA;
于 2013-02-12T11:35:43.580 に答える