Oracle
Label Security

Oracle Label SecurityおよびOracle Virtual Private Databaseを使用して無許可のアクセスから機密データを保護する

Oracle Label Security(OLS)は、データベースの他の多くのセキュリティ機能と連携して、細かく設定されたデータ・アクセス要件に対応します。Virtual Private Database(VPD)はOLSと連携して、列に格納された機密データを保護します。

 

Oracle Label Securityは、ユーザー認可ラベルとデータ分類ラベル(行ラベル)の2つで構成されています。ユーザーの認可ラベルとデータ分類ラベルを比較することで、ポリシーが行へのアクセス権を決定します。ただしこの例では、OLSのポリシーは表に適用されず、保護された表には列が追加されていません。列が追加される場合は、そこに行ラベルが格納されます。しかし、ポリシーを最初から作成するには、追加の列には名前が必要です。このポリシーは表に追加されないため、デフォルトのポリシー適用オプションは'NO_CONTROL'に設定され、実際にアクティブなポリシーが原因で発生するオーバーヘッドが最小限に抑えられます。

以下のスクリプトを使用した場合でも同様の結果になります。

Begin
     SA_SYSDBA.CREATE_POLICY
     policy_name => 'PROTECT_PII'
     column_name => 'OLS_COLUMN',
     default_options => 'NO_CONTROL');
END;
/

 

ラベルは、レベル(必須)、コンパートメント(オプション)、グループ(オプション)の3つのコンポーネントで構成されています。この例では、レベルは'Confidential'と'Sensitive'、コンパートメントは'PII'で、グループは使用されていません。

以下のスクリプトを使用した場合でも同様の結果になります。

BEGIN
     SA_COMPONENTS.CREATE_LEVEL (
     policy_name => 'PROTECT_PII',
     level_num => 1000,
     short_name => 'C',
     long_name => 'CONFIDENTIAL');
END;
/

BEGIN
     SA_COMPONENTS.CREATE_COMPARTMENT (
     policy_name => 'PROTECT_PII',
     comp_num => 100,
     short_name => 'PII',
     long_name => 'PERS_INFO');
END;
/

BEGIN
     SA_COMPONENTS.CREATE_LEVEL (
     policy_name => 'PROTECT_PII',
     level_num => 2000,
     short_name => 'S',
     long_name => 'SENSITIVE');
END;
/

 

ユーザー'SKing'のみが、'S:PII'ラベルと一致するラベル、または'S:PII'ラベルより上位のラベルを取得して、PII情報が含まれる表のすべての列を閲覧できます。他のすべてのユーザー('LDoran'など)のラベルは'S:PII'ラベルより上位ではないため、'salary'列は空欄になります。このOracle By Exampleでは、OLSポリシーが非データベース・ユーザーに割り当てられています。

以下のスクリプトを使用した場合でも同様の結果になります。

BEGIN
     SA_USER_ADMIN.SET_USER_LABELS (
     policy_name => 'PROTECT_PII',
     user_name => 'SKING',
     max_read_label => 'S:PII',
     max_write_label => 'S:PII',
     min_write_label => 'C',
     def_label => 'S:PII',
     row_label => 'S:PII');
END;
/

BEGIN
     SA_USER_ADMIN.SET_USER_LABELS (
     policy_name => 'PROTECT_PII',
     user_name => 'LDORAN',
     max_read_label => 'C',
     max_write_label => 'C',
     min_write_label => 'C',
     def_label => 'C',
     row_label => 'C');
END;
/

 

VPDポリシーで以下のことを実行できます。

ユーザーの現在のラベルから、数値のラベル・タグを取得
'S:PII'ラベルから、数値のラベル・タグを取得
ユーザー・ラベルが'S:PII'以上→機密情報列のすべての行にアクセス
ユーザー・ラベルが'S:PII'未満→すべての行にアクセスできるが、機密のPII列は空白
この例では、VPDポリシーがhr.EMPLOYEES表に適用されます。

BEGIN
     DBMS_RLS.ADD_POLICY(
     object_schema => 'HR',
     object_name => 'EMPLOYEES',
     policy_name => 'vpd_protect_pii',
     function_schema => 'LBACSYS',
     policy_function => 'f_protect_pii',
     statement_types => 'select',
     sec_relevant_cols => 'SALARY',
     sec_relevant_cols_opt => dbms_rls.ALL_ROWS,
     policy_type => dbms_rls.CONTEXT_SENSITIVE);
END;
/

デモ・スクリプト全体はこちらからダウンロードしてください。