DBMS_RLSパッケージを使用すると、特定のPolarDBデータベースオブジェクトで仮想プライベートデータベース (VPD) を実行できます。
関数またはストアドプロシージャ | データ型 | 戻り値タイプ | 説明 |
ADD POLICY (オブジェクトスキーマ、オブジェクト名、ポリシー名、関数スキーマ、ポリシー関数 [, statement types [, update check [, enable [, static policy [, policy type [, long predicate [, sec relevant cols [, sec relevant cols opt ]]]]]]]])) | ストアドプロシージャ | N/A | データベースオブジェクトにセキュリティポリシーを追加します。 |
DROP_POLICY(object_schema, object_name, policy_name) | ストアドプロシージャ | N/A | データベースオブジェクトからセキュリティポリシーを削除します。 |
ENABLE_POLICY(object_schema, object_name, policy_name, enable) | ストアドプロシージャ | N/A | セキュリティポリシーを有効または無効にします。 |
PolarDBのDBMS_RLSパッケージは、Oracleが提供するパッケージと比較して部分的に実装されています。 PolarDBは、前の表に示した関数とストアドプロシージャのみをサポートします。
Virtual Private Database は、セキュリティポリシーを使用するきめの細かいアクセス制御を採用しています。 Virtual Private Databaseのきめ細かいアクセス制御とは、特定の行までデータへのアクセスを制御できることを意味します。
セキュリティポリシーをエンコードするルールは、ポリシー関数で定義されます。 このポリシー関数は、特定の入力パラメーターと戻り値を持つ SPL 関数です。 セキュリティポリシーは、ポリシー関数を特定のデータベースオブジェクト (通常はテーブル) に関連付けることです。
- PolarDBでは、PolarDBでサポートされているすべての言語でポリシー関数を記述できます。 たとえば、Oracle互換のSPL言語とは別に、SQLおよびPL/pgSQL言語を使用することもできます。
- PolarDB Virtual Private databaseでサポートされているデータベースオブジェクトはテーブルです。 ポリシーはビューまたはシノニムには適用することができません。
- Virtual Private Database は、きめ細かいレベルのセキュリティを提供しています。 GRANT文によって与えられるデータベースオブジェクトレベルの特権は、データベースオブジェクトのインスタンス全体に対するアクセス特権を決定する。 対照的に、Virtual Private Database は、データベースオブジェクトインスタンスの個々の行に対するアクセスを制御できます。
- INSERT、UPDATE、DELETE、SELECTなど、SQL文の種類に基づいて異なるセキュリティポリシーを適用できます。
- セキュリティポリシーは動的であり、データベースオブジェクトに影響を与える適用可能なSQL文ごとに異なる場合があります。 セキュリティポリシーは、データベースオブジェクトにアクセスするアプリケーションのセッションユーザーなど、複数の要因によって決定されます。
- セキュリティポリシーの呼び出しは、データベースオブジェクトにアクセスするすべてのアプリケーションに対して透過的です。 したがって、セキュリティポリシーを適用するために個々のアプリケーションを変更する必要はありません。
- セキュリティポリシーを有効にすると、以下の注記に記載されているシステム権限を除いて、アプリケーション (新しいアプリケーションを含む) がセキュリティポリシーを回避することはできません。
- スーパーユーザーでさえ、ノートに記載されているシステム権限以外のセキュリティポリシーを回避することはできません。
DBMS_RLS パッケージは、ポリシーを作成、削除、有効化、および無効化するためのストアドプロシージャを提供しています。
- ポリシー関数を作成します。 この関数には、VARCHAR2 の型の 2 つの入力パラメーターが必要です。 最初の入力パラメーターは、ポリシーが適用されるデータベースオブジェクトを含むスキーマに使用されます。 2 番目の入力パラメーターは、データベースオブジェクトの名前に使用されます。 この関数の戻り値の型は VARCHAR2 である必要があります。 この関数は、WHERE 句の述語の形式で文字列を返す必要があります。 この述語は、データベースオブジェクトに作用するSQLステートメントにAND条件として動的に追加されます。 ポリシー関数の述語を満たさない行は、SQL文の結果セットから除外されます。
- ADD_POLICY ストアドプロシージャを使用して、ポリシー関数をデータベースオブジェクトに関連付ける新しいポリシーを定義します。 ADD_POLICYストアドプロシージャを使用して、ポリシーを適用するSQL文の種類 (INSERT、UPDATE、DELETE、またはSELECT) を指定できます。 作成時にポリシーを有効にするかどうかを指定することができます。 新しく挿入された行と更新された行の変更されたイメージにポリシーを適用できるかどうかを指定することもできます。
- ENABLE_POLICY ストアドプロシージャを使用して、既存のポリシーを無効または有効にします。
- DROP_POLICY ストアドプロシージャを使用して、既存のポリシーを削除します。 DROP_POLICY ストアドプロシージャは、ポリシー関数または関連するデータベースオブジェクトを削除しません。
ポリシーを作成すると、Oracle データベースと互換性のあるカタログビューで表示することができます。
SYS_CONTEXT(namespace, attribute)
namespace
はVARCHAR2データ型です。 有効な値は USERENV のみです。 このパラメーターに別の値が指定されている場合には、関数は NULL を返します。属性
はVARCHAR2データ型です。 下表に、属性パラメーターで使用可能な値を示します。パラメーター値 等価値 SESSION_USER pg_catalog.session_user CURRENT_USER pg_catalog.current_user CURRENT_SCHEMA pg_catalog.current_schema HOST pg_catalog.inet_host IP_ADDRESS pg_catalog.inet_client_addr SERVER_HOST pg_catalog.inet_server_addr
CREATE TABLE public.vpemp AS SELECT empno, ename, job, sal, comm, deptno FROM emp;
ALTER TABLE vpemp ADD authid VARCHAR2(12);
UPDATE vpemp SET authid = 'researchmgr' WHERE deptno = 20;
UPDATE vpemp SET authid = 'salesmgr' WHERE deptno = 30;
SELECT * からvpemp;
empno | ename | job | sal | comm | deptno | autid
------- -------- ----------- -------------------------------------------------------
7782 | CLARK | MANAGER | 2450.00 | | 10 |
7839 | KING | PRESIDENT | 5000.00 | | 10 |
7934 | MILLER | CLERK | 1300.00 | | 10 |
7369 | SMITH | CLERK | 800.00 | | 20 | researchmgr
7566 | JONES | MANAGER | 2975.00 | | 20 | researchmgr
7788 | SCOTT | ANALYST | 3000.00 | | 20 | researchmgr
7876 | ADAMS | CLERK | 1100.00 | | 20 | researchmgr
7902 | FORD | ANALYST | 3000.00 | | 20 | researchmgr
7499 | ALLEN | SALESMAN | 1600.00 | 300.00 | 30 | salesmgr
7521 | WARD | SALESMAN | 1250.00 | 500.00 | 30 | salesmgr
7654 | MARTIN | SALESMAN | 1250.00 | 1400.00 | 30 | salesmgr
7698 | BLAKE | MANAGER | 2850.00 | | 30 | salesmgr
7844 | TURNER | SALESMAN | 1500.00 | 0.00 | 30 | salesmgr
7900 | ジェームズ | CLERK | 950.00 | | 30 | salesmgr
(14行)
LOGIN PASSWORD「パスワード」でROLE salesmgrを作成します。vpempですべてをsalesmgrに付与します。
ADD_POLICY
ADD_POLICYストアドプロシージャは、ポリシー関数をデータベースオブジェクトに関連付けることによってポリシーを作成するために使用されます。
ADD_POLICY ストアドプロシージャを呼び出すには、スーパーユーザーである必要があります。
ADD_POLICY(object_schema VARCHAR2、object_name VARCHAR2、
policy_name VARCHAR2, function_schema VARCHAR2,
policy_function VARCHAR2
[, statement_types VARCHAR2
[, update_check BOOLEAN
[, enable BOOLEAN
[, static_policy BOOLEAN
[, policy_type INTEGER
[, long_predicate BOOLEAN
[, sec_relevant_cols VARCHAR2
[, sec_relevant_cols_opt INTEGER ]]]])
Parameters
パラメーター | 説明 |
object_schema | ポリシーが適用されるデータベースオブジェクトを含むスキーマの名前です。 |
object_name | ポリシーが適用されるデータベースオブジェクトの名前です。 データベースオブジェクトには、複数のポリシーを適用することができます。 |
policy_name | ポリシーに割り当てられた名前。 データベースオブジェクト (object_schema とobject_name で識別) とポリシー名の組み合わせは、データベース内で一意である必要があります。 |
function_schema | ポリシー関数を含むスキーマの名前です。 説明 ポリシー関数はパッケージに属している場合があります。 この場合、 function_schema には、パッケージが定義されているスキーマの名前を含める必要があります。 |
policy_function | セキュリティポリシーのルールを定義するSPL関数の名前。 同じ関数を複数のポリシーで指定することができます。 説明 ポリシー関数はパッケージに属している場合があります。 この場合、 policy_function にはパッケージ名もドット表記で含める必要があります (package_name . function_name ) 。 |
statement_types | ポリシーが適用されるSQL文のコンマ区切りのリスト。 有効なSQL文は、INSERT、UPDATE、DELETE、およびSELECT です。 デフォルト値: INSERT,UPDATE,DELETE,SELECT 説明 PolarDBは、INDEX型のステートメントを受け入れますが無視します。 ポリシーは、PolarDBのインデックス操作には適用できません。 |
update_check | update_check は、INSERTおよびupdate SQL文にのみ適用されます。
|
enable |
|
static_policy |
説明
|
policy_type | Oracleでは、policy_type はポリシー関数の再評価を決定します。 デフォルト値は NULL です。 説明 PolarDBは動的ポリシーのみを実装し、 policy_type パラメーターの値を無視します。 |
longpredicate | Oracleでは、long_predicate がTRUEに設定されている場合、述語の長さは最大32 KBになります。 それ以外の場合、述語の長さは 4 KB に制限されます。 デフォルト値は FALSE です。 説明 PolarDBは、 longpredicate パラメーターの値を無視します。 PolarDBポリシー関数は、すべての実用的な目的で無制限の長さの述語を返すことができます。 |
sec_relevant_cols | sec_related_cols は、object_name の列のコンマ区切りリストです。 このパラメーターは、リストされた列に列レベルの Virtual Private Database を提供します。 リストされた列がstatement_types で指定された型のSQLステートメントで参照されている場合、ポリシーが適用されます。 そのような列が参照されていない場合には、ポリシーは適用されません。 デフォルト値は NULL です。 データベースオブジェクトのすべての列が |
sec_relevant_cols_opt | Oracleでは、sec_relevant_cols_opt がDBMS_RLS.ALL_ROWS (値1のINTEGER定数) に設定されている場合、sec_related_cols にリストされている列は、適用されたポリシー述語がfalseのすべての行でNULLを返します。 sec_relevant_cols_opt がDBMS_RLS.ALL_ROWS に設定されていない場合、これらの行は結果セットで返されません。 デフォルト値は NULL です。 説明 PolarDBは DBMS_RLS.ALL_ROWS 機能をサポートしていません。 sec_relevant_cols_opt がDBMS_RLS.ALL_ROWS (INTEGER値1) に設定されている場合、PolarDBはエラーをスローします。 |
例
CREATE OR REPLACE FUNCTION verify_session_user ()
p_schema VARCHAR2,
p_object VARCHAR2
)
戻りVARCHAR2
IS
開始
RETURN 'authid = SYS_CONTEXT(''USERENV'' 、''SESSION_USER'')';
エンド;
この関数は、ADD_POLICYストアドプロシージャで指定された型の各SQLステートメントのWHERE句に追加される述語authid = SYS_CONTEXT('USERENV', 'SESSION_USER')
を生成します。
これにより、SQL文の効果は、authid列の内容がセッションユーザーと同じ行に制限されます。
次の匿名ブロックは、ADD_POLICYストアドプロシージャを呼び出して、secure_updateという名前のポリシーを作成します。 このポリシーは、vpempテーブルを参照するときにINSERT、UPDATE、またはDELETE SQL文が提供されているかどうかに関係なく、verify_session_user関数を使用してvpempテーブルに適用されます。
DECLARE
v_object_schema VARCHAR2(30) := 'public';
v_object_name VARCHAR2(30) := 'vpemp';
v_policy_name VARCHAR2(30) := 'secure_update';
v_function_schema VARCHAR2(30) := 'polardb';
v_policy_function VARCHAR2(30) := 'verify_session_user';
v_statement_types VARCHAR2(30) := 'INSERT,UPDATE,DELETE';
v_update_check BOOLEAN := TRUE;
v_enable BOOLEAN := TRUE;
開始
DBMS_RLS.ADD_POLICY(
v_object_schema,
v_object_name,
v_policy_name,
v_function_schema,
v_policy_function,
v_statement_types,
v_update_check,
v_enable
);
エンド;
ポリシーが作成された後、salesmgr ユーザーによってターミナルセッションが開始されます。 以下のクエリは、vpemp テーブルの内容を示しています。
\c polardb salesmgr
ユーザーsalesmgrのパスワード:
これで、ユーザー「salesmgr」としてデータベース「polardb」に接続されます。
SELECT * FROM vpemp;
empno | ename | job | sal | comm | deptno | autid
------- -------- ----------- -------------------------------------------------------
7782 | CLARK | MANAGER | 2450.00 | | 10 |
7839 | KING | PRESIDENT | 5000.00 | | 10 |
7934 | MILLER | CLERK | 1300.00 | | 10 |
7369 | SMITH | CLERK | 800.00 | | 20 | researchmgr
7566 | JONES | MANAGER | 2975.00 | | 20 | researchmgr
7788 | SCOTT | ANALYST | 3000.00 | | 20 | researchmgr
7876 | ADAMS | CLERK | 1100.00 | | 20 | researchmgr
7902 | FORD | ANALYST | 3000.00 | | 20 | researchmgr
7499 | ALLEN | SALESMAN | 1600.00 | 300.00 | 30 | salesmgr
7521 | WARD | SALESMAN | 1250.00 | 500.00 | 30 | salesmgr
7654 | MARTIN | SALESMAN | 1250.00 | 1400.00 | 30 | salesmgr
7698 | BLAKE | MANAGER | 2850.00 | | 30 | salesmgr
7844 | TURNER | SALESMAN | 1500.00 | 0.00 | 30 | salesmgr
7900 | ジェームズ | CLERK | 950.00 | | 30 | salesmgr
(14行)
修飾されていないUPDATEステートメント (WHERE句なし) がsalesmgrユーザーによって発行されます。
UPDATE vpemp SET comm = sal * .75;
更新6
ポリシーは、テーブルのすべての行を更新する代わりに、更新の影響を authid 列に salesmgr 値が含まれる行に制限します。 salesmgr値は、ポリシー関数述語authid = SYS_CONTEXT('USERENV', 'SESSION_USER')
によって指定されます。
以下のクエリは、authid に salesmgr が含まれている行の comm 列が変更されたことを示しています。 他のすべての行は変更されません。
SELECT * からvpemp;
empno | ename | job | sal | comm | deptno | autid
------- -------- ----------- -------------------------------------------------------
7782 | CLARK | MANAGER | 2450.00 | | 10 |
7839 | KING | PRESIDENT | 5000.00 | | 10 |
7934 | MILLER | CLERK | 1300.00 | | 10 |
7369 | SMITH | CLERK | 800.00 | | 20 | researchmgr
7566 | JONES | MANAGER | 2975.00 | | 20 | researchmgr
7788 | SCOTT | ANALYST | 3000.00 | | 20 | researchmgr
7876 | ADAMS | CLERK | 1100.00 | | 20 | researchmgr
7902 | FORD | ANALYST | 3000.00 | | 20 | researchmgr
7499 | ALLEN | SALESMAN | 1600.00 | 1200.00 | 30 | salesmgr
7521 | WARD | SALESMAN | 1250.00 | 937.50 | 30 | salesmgr
7654 | MARTIN | SALESMAN | 1250.00 | 937.50 | 30 | salesmgr
7698 | BLAKE | MANAGER | 2850.00 | 2137.50 | 30 | salesmgr
7844 | TURNER | SALESMAN | 1500.00 | 1125.00 | 30 | salesmgr
7900 | ジェームズ | CLERK | 950.00 | 712.50 | 30 | salesmgr
(14行)
ADD_POLICYストアドプロシージャでupdate_checkパラメーターがTRUEに設定されているため、次のINSERTステートメントは例外をスローします。 authid列に指定したresearchmgr値がsalesmgrセッションユーザーと一致しないため、ポリシーは無効です。
INSERT INTO vpemp VALUES (9001、'SMITH' 、'ANALYST' 、3200.00、NULL、20、'researchmgr');
エラー: チェックオプション違反のポリシー
詳細: ポリシー述語は、更新された値
でFALSEに評価されましたupdate_check
がFALSEに設定されている場合、前述のINSERTステートメントが有効になります。
次の例では、sec_related_cols
パラメーターを使用して、SQL文で特定の列が参照されている場合にのみポリシーを適用します。 この例では、次のポリシー関数を使用して、従業員の給与値が2000未満の行を選択します。
関数の作成または置き換えsal_lt_2000 (
p_schema VARCHAR2,
p_object VARCHAR2
)
戻りVARCHAR2
IS
開始
RETURN 'sal < 2000 ';
エンド;
ポリシーは、SELECTステートメントにsalまたはcomm列が含まれている場合にのみ適用されるように作成されます。
DECLARE
v_object_schema VARCHAR2(30) := 'public';
v_object_name VARCHAR2(30) := 'vpemp';
v_policy_name VARCHAR2(30) := 'secure_salary';
v_function_schema VARCHAR2(30) := 'polardb';
v_policy_function VARCHAR2(30) := 'sal_lt_2000';
v_statement_types VARCHAR2(30) := 'SELECT';
v_sec_relevant_cols VARCHAR2(30) := 'sal、comm';
開始
DBMS_RLS.ADD_POLICY(
v_object_schema,
v_object_name,
v_policy_name,
v_function_schema,
v_policy_function,
v_statement_types,
sec_relevant_cols => v_sec_relevant_cols
);
エンド;
クエリが sal または comm 列を参照しない場合には、ポリシーは適用されません。 以下のクエリは、vpemp テーブルの 14 行すべてを返します。
SELECT empno、ename、job、deptno、authid FROM vpemp;
empno | ename | job | deptno | autid
------- ------- -----------------------------------------
7782 | CLARK | MANAGER | 10 |
7839 | KING | PRESIDENT | 10 |
7934 | MILLER | CLERK | 10 |
7369 | SMITH | CLERK | 20 | researchmgr
7566 | JONES | MANAGER | 20 | researchmgr
7788 | SCOTT | ANALYST | 20 | researchmgr
7876 | ADAMS | CLERK | 20 | researchmgr
7902 | FORD | ANALYST | 20 | researchmgr
7499 | ALLEN | SALESMAN | 30 | salesmgr
7521 | WARD | SALESMAN | 30 | salesmgr
7654 | MARTIN | SALESMAN | 30 | salesmgr
7698 | BLAKE | MANAGER | 30 | salesmgr
7844 | TURNER | SALESMAN | 30 | salesmgr
7900 | ジェームズ | CLERK | 30 | salesmgr
(14行)
クエリが sal または comm 列を参照する場合には、ポリシーがクエリに適用されます。 このクエリは、salが2000以上の行を削除します。同様の出力が表示されます。
SELECT empno、ename、job、sal、comm、deptno、authid FROM vpemp;
empno | ename | job | sal | comm | deptno | autid
------- -------- ---------- -------------------------------------------------------
7934 | MILLER | CLERK | 1300.00 | | 10 |
7369 | SMITH | CLERK | 800.00 | | 20 | researchmgr
7876 | ADAMS | CLERK | 1100.00 | | 20 | researchmgr
7499 | ALLEN | SALESMAN | 1600.00 | 1200.00 | 30 | salesmgr
7521 | WARD | SALESMAN | 1250.00 | 937.50 | 30 | salesmgr
7654 | MARTIN | SALESMAN | 1250.00 | 937.50 | 30 | salesmgr
7844 | TURNER | SALESMAN | 1500.00 | 1125.00 | 30 | salesmgr
7900 | ジェームズ | CLERK | 950.00 | 712.50 | 30 | salesmgr
(8行)
DROP_POLICY
DROP_POLICY(object_schema VARCHAR2、object_name VARCHAR2、
policy_name VARCHAR2)
Parameters
パラメーター | 説明 |
object_schema | ポリシーが適用されるデータベースオブジェクトのスキーマ名。 |
object_name | ポリシーが適用されるデータベースオブジェクトの名前です。 |
policy_name | 削除するポリシーの名前です。 |
例
以下の例では、public.vpemp テーブルの secure_update ポリシーを無効にします。
DECLARE
v_object_schema VARCHAR2(30) := 'public';
v_object_name VARCHAR2(30) := 'vpemp';
v_policy_name VARCHAR2(30) := 'secure_update';
開始
DBMS_RLS.DROP_POLICY(
v_object_schema,
v_object_name,
v_policy_name
);
エンド;
ENABLE_POLICY
ENABLE_POLICY(object_schema VARCHAR2、object_name VARCHAR2、
policy_name VARCHAR2、BOOLEANを有効にします)
Parameters
パラメーター | 説明 |
オブジェクトスキーマ | ポリシーが適用されるデータベースオブジェクトのスキーマ名。 |
オブジェクト名 | ポリシーが適用されるデータベースオブジェクトの名前です。 |
ポリシー名 | 有効または無効にするポリシーの名前です。 |
enable | ポリシーを有効または無効にします。
|
例
以下の例では、public.vpemp テーブルの secure_update ポリシーを無効にします。
DECLARE
v_object_schema VARCHAR2(30) := 'public';
v_object_name VARCHAR2(30) := 'vpemp';
v_policy_name VARCHAR2(30) := 'secure_update';
v_enable BOOLEAN := FALSE;
開始
DBMS_RLS.ENABLE_POLICY(
v_object_schema,
v_object_name,
v_policy_name,
v_enable
);
エンド;