
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;
/
デモ・スクリプト全体はこちらからダウンロードしてください。
