2. OLSポリシーの準備#

レベルを作成#

レベルはアクセス制御の範囲を定義するラベルの構成要素の1つです。

ラベルは「レベル」「区分」「グループ」の3つから構成されますが、ここでは必須となるレベルのみを作成します

BEGIN
SA_COMPONENTS.CREATE_LEVEL (
    policy_name => 'OLS_POL_DEMO',
    level_num   => 4000,
    short_name  => 'SENS',
    long_name   => 'SENSITIVE');

SA_COMPONENTS.CREATE_LEVEL (
    policy_name => 'OLS_POL_DEMO',
    level_num   => 3000,
    short_name  => 'CONF',
    long_name   => 'CONFIDENTIAL');

SA_COMPONENTS.CREATE_LEVEL (
    policy_name => 'OLS_POL_DEMO',
    level_num   => 2000,
    short_name  => 'INTL',
    long_name   => 'INTERNAL');
END;
/

SA_COMPONENTS.CREATE_LEVELプロシージャについては こちら をご参照ください。

作成したレベルを確認します

SQL> select * from ALL_SA_LEVELS;
"POLICY_NAME" ,"LEVEL_NUM","SHORT_NAME","LONG_NAME"
"OLS_POL_DEMO",3000       ,"CONF"      ,"CONFIDENTIAL"
"OLS_POL_DEMO",2000       ,"INTL"      ,"INTERNAL"
"OLS_POL_DEMO",4000       ,"SENS"      ,"SENSITIVE"

データ・ラベルの作成#

データに付与する具体的なラベルを作成します。 今回作成するラベルは先ほど作成したレベルしか用いませんので、先ほどのレベルと同じ内容のラベルを作成します。

BEGIN
    SA_LABEL_ADMIN.CREATE_LABEL (
        policy_name  => 'OLS_POL_DEMO',
        label_tag    => 400,
        label_value  => 'SENS',
        data_label   => TRUE);

    SA_LABEL_ADMIN.CREATE_LABEL (
        policy_name  => 'OLS_POL_DEMO',
        label_tag    => 300,
        label_value  => 'CONF',
        data_label   => TRUE);

    SA_LABEL_ADMIN.CREATE_LABEL (
        policy_name  => 'OLS_POL_DEMO',
        label_tag    => 200,
        label_value  => 'INTL',
        data_label   => TRUE);
END;
/

SA_LABEL_ADMIN.CREATE_LABELプロシージャについては こちら をご参照ください。

作成されたラベルを確認します。

SQL> select * from ALL_SA_LABELS;
"POLICY_NAME" ,"LABEL","LABEL_TAG","LABEL_TYPE"
"OLS_POL_DEMO","SENS" ,400        ,"USER/DATA LABEL"
"OLS_POL_DEMO","CONF" ,300        ,"USER/DATA LABEL"
"OLS_POL_DEMO","INTL" ,200        ,"USER/DATA LABEL"

ユーザー・ラベルの作成#

各ユーザーに許可されるアクセス範囲(最大/最小レベル)を割り当てます。 割り当てるユーザーはHRユーザーとSALES_APPユーザーです。

BEGIN
    SA_USER_ADMIN.SET_LEVELS (
        policy_name  => 'OLS_POL_DEMO',
        user_name    => 'HR',
        max_level    => 'SENS',
        min_level    => 'INTL');

    SA_USER_ADMIN.SET_LEVELS (
        policy_name  => 'OLS_POL_DEMO',
        user_name    => 'SALES_APP',
        max_level    => 'CONF',
        min_level    => 'INTL');
END;
/

表にポリシーを適用する#

作成したOLSポリシーをJOB_HISTORY_4OLS表に適用します。

BEGIN
    SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
        policy_name    => 'OLS_POL_DEMO',
        schema_name    => 'HR',
        table_name     => 'JOB_HISTORY_4OLS',
        table_options  => 'READ_CONTROL');
END;
/

READ_CONTROLを指定すると、ユーザーが後で実行するすべての問合せにポリシーが適用されます。

ポリシーを適用すると、JOB_HISTORY_4OLS表にラベル用の列が追加されていることがわかります。

SQL> desc hr.JOB_HISTORY_4OLS;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID                               NOT NULL NUMBER(6)
START_DATE                                NOT NULL DATE
END_DATE                                  NOT NULL DATE
JOB_ID                                    NOT NULL VARCHAR2(10)
DEPARTMENT_ID                                      NUMBER(4)
OLS_LABEL_DEMO                                     NUMBER(10)

OLS_LABEL_DEMO列が追加され、NUMBER型であることが確認できます。

OLSポリシーでの制御を有効化します。

BEGIN
    SA_POLICY_ADMIN.ENABLE_TABLE_POLICY (
        policy_name => 'OLS_POL_DEMO',
        schema_name => 'HR',
        table_name  => 'JOB_HISTORY_4OLS');
END;
/

データにラベルを適用#

以下を順に実行して、条件ごとにデータに適切なラベルを設定します。

JOB_IDがAC_MGRやSA_MANのレコードは SENSITIVE ラベルを設定します。

UPDATE HR.JOB_HISTORY_4OLS
SET    OLS_LABEL_DEMO = CHAR_TO_LABEL('OLS_POL_DEMO','SENS')
WHERE  JOB_ID LIKE '%_MGR'
OR     JOB_ID LIKE '%_MAN';

2 rows updated. されるのを確認します。

JOB_IDがAC_ACCOUNTとMK_REPのレコードに対しては CONFIDENTIAL ラベルを設定します。

UPDATE HR.JOB_HISTORY_4OLS
SET    OLS_LABEL_DEMO = CHAR_TO_LABEL('OLS_POL_DEMO','CONF')
WHERE  JOB_ID LIKE '%_ACCOUNT'
OR     JOB_ID LIKE '%_REP';

4 rows updated. されるのを確認します。

IT_PROGまたはST_CLERK のレコードは INTERNAL ラベルを設定します。

UPDATE HR.JOB_HISTORY_4OLS
SET    OLS_LABEL_DEMO = CHAR_TO_LABEL('OLS_POL_DEMO','INTL')
WHERE  JOB_ID LIKE '%_PROG'
OR     JOB_ID LIKE '%_CLERK'
OR     JOB_ID LIKE '%_ASST';

4 rows updated. されるのを確認します。

最後にcommitをし、ラベルの設定を保存します。

SQL> commit;

最後にラベルが正しく設定されたかを確認します。

SQL> select JOB_ID, OLS_LABEL_DEMO from HR.JOB_HISTORY_4OLS;
"JOB_ID"    ,"OLS_LABEL_DEMO"
"IT_PROG"   ,200
"AC_ACCOUNT",300
"AC_MGR"    ,400
"MK_REP"    ,300
"ST_CLERK"  ,200
"ST_CLERK"  ,200
"AD_ASST"   ,200
"SA_REP"    ,300
"SA_MAN"    ,400
"AC_ACCOUNT",300

10 rows selected.