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」ラベルと一致またはそれより上位のラベルを取得します。これにより、SKingは、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を含む機密情報の列は空白になる
この例では、hr.EMPLOYEESテーブルに以下のVPDポリシーが適用されます。
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;
/
デモスクリプト全体はこちらからダウンロードできます。