ポリシーを追加して関数を作成した後、Oracle VPD を使用して、権限のないユーザーから列を隠すことができました。
しかし、(null)の代わりに「xxxxxx」のようなものを表示するにはどうすればよいですか
また、関数では、次のようにユーザーログインの検証を行っています
if sys_context( 'userenv', 'session_user' ) = 'USER1'
関数内のこのハードコーディングを削除する最善の方法は何ですか?
前もって感謝します。
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;