DBMS_RLS パッケージを使用すると、Oracle データベースオブジェクトと互換性のある特定の POLARDB に Virtual Private Database を実装することができます。
関数/ストアドプロシージャ | 関数またはストアドプロシージャ | 戻り値の型 | 説明 |
---|---|---|---|
ADD_POLICY(object_schema, object_name, policy_name, function_schema, policy_function [, 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 | セキュリティポリシーを有効または無効にします。 |
Oracle 互換の POLARDB の DBMS_RLS パッケージは、Oracle のバージョンと比較すると部分的に実装されています。 Oracle 互換の POLARDB は、上表にリストされている関数とストアドプロシージャのみをサポートしています。
Virtual Private Database は、セキュリティポリシーを使用するきめの細かいアクセス制御を採用しています。 Virtual Private Database のきめ細かなアクセス制御とは、データへのアクセスを、セキュリティポリシーで定義された特定の行まで制御できることを意味します。
セキュリティポリシーをエンコードするルールは、ポリシー関数で定義されます。 このポリシー関数は、特定の入力パラメーターと戻り値を持つ SPL 関数です。 セキュリティポリシーは、ポリシー関数を特定のデータベースオブジェクト (通常はテーブル) に関連付けることです。
- Oracle 互換の POLARDB では、ポリシー関数は、SQL、PL/pgSQL、SPL など、サポートされている任意の言語で記述することができます。 たとえば、Oracle 互換の SPL 言語の他に、SQL 言語や PL/pgSQL 言語も使用することができます。
- Oracle 互換の POLARDB の Virtual Private Database は、1 種類のデータベースオブジェクト (テーブル) のみをサポートしています。 ポリシーはビューまたはシノニムには適用することができません。
- Virtual Private Database は、きめ細かいレベルのセキュリティを提供しています。 GRANT コマンドによって付与されるデータベースオブジェクトレベルの権限は、データベースオブジェクトのインスタンス全体へのアクセス権限を決定します。 対照的に、Virtual Private Database は、データベースオブジェクトインスタンスの個々の行に対するアクセスを制御できます。
- SQL コマンドのタイプ (INSERT、UPDATE、DELETE、または SELECT) に応じて、異なるセキュリティポリシーを適用することができます。
- セキュリティポリシーは動的であり、データベースオブジェクトに影響を与える適用可能な 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 を返します。attribute
のデータ型は 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 * FROM vpemp;
empno | ename | job | sal | comm | deptno | authid
-------+--------+-----------+---------+---------+--------+-------------
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 | JAMES | CLERK | 950.00 | | 30 | salesmgr
(14 rows)
CREATE ROLE salesmgr WITH LOGIN PASSWORD 'password';
GRANT ALL ON vpemp TO 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 ]]]]]]]])
パラメーター
パラメーター | 説明 |
---|---|
object_schema | ポリシーが適用されるデータベースオブジェクトを含むスキーマの名前です。 |
object_name | ポリシーが適用されるデータベースオブジェクトの名前です。 データベースオブジェクトには、複数のポリシーを適用することができます。 |
policy_name | policy_name は、ポリシーに割り当てられた名前です。 データベースオブジェクト (object_schema と object_name で識別) とポリシー名の組み合わせは、データベース内で一意である必要があります。
|
function_schema | ポリシー関数を含むスキーマの名前です。
注 ポリシー関数はパッケージに属している場合があります。 この場合、
function_schema には、パッケージが定義されているスキーマの名前が含まれている必要があります。
|
policy_function | policy_function は、セキュリティポリシーのルールを定義する SPL 関数の名前です。 同じ関数を複数のポリシーで指定することができます。
注 ポリシー関数はパッケージに属している場合があります。 この場合、
policy_function には、ドット表記のパッケージ名 (package_name .function_name ) も含める必要があります。
|
statement_types | statement_types は、ポリシーが適用される SQL コマンドをコンマで区切ったリストです。 有効な SQL コマンドは、INSERT、UPDATE、DELETE、および SELECT です。 デフォルト値は、INSERT, UPDATE, DELETE, SELECT です。
注 Oracle 互換の POLARDB は、INDEX を文の型として受け入れますが、無視されます。 ポリシーは、Oracle 互換の POLARDB の INDEX
操作には適用されません。
|
update_check | update_check は、INSERT および UPDATE SQL コマンドにのみ適用されます。
|
enable |
|
static_policy |
注
|
policy_type | Oracle では、policy_type でポリシー関数がいつ再評価されるかを決定します。 したがって、ポリシー関数によって返される述語文字列が変更されるかどうか、いつ変更されるかも決定されます。 デフォルト値は
NULL です。
注 Oracle 互換の POLARDB は、
policy_type パラメーターの設定を無視します。 Oracle 互換の POLARDB は、常に動的ポリシーを前提としています。
|
long_predicate | Oracle では、long_predicate が TRUE に設定されている場合、述語の長さは最大 32 KB になります。 それ以外の場合、述語の長さは 4 KB に制限されます。 デフォルト値は FALSE
です。
注 Oracle 互換の POLARDB は、
long_predicate パラメーターの設定を無視します。 Oracle ポリシー関数と互換性のある POLARDB は、すべての実用的な用途のために無制限の長さの述語を返すことができます。
|
sec_relevant_cols | sec_relevant_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_relevant_cols にリストされている列は、適用されたポリシー述語が false であるすべての行で NULL を返します。 sec_relevant_cols_opt が DBMS_RLS.ALL_ROWS に設定されていない場合には、これらの行は結果セットで返されません。 デフォルト値は NULL です。
注 Oracle 互換の POLARDB は、
DBMS_RLS.ALL_ROWS 関数をサポートしていません。 sec_relevant_cols_opt がDBMS_RLS.ALL_ROWS (INTEGER 値 1) に設定されている場合、Oracle 互換の POLARDB はエラーをスローします。
|
例
この例では、以下のポリシー関数を使用しています。
CREATE OR REPLACE FUNCTION verify_session_user (
p_schema VARCHAR2,
p_object VARCHAR2
)
RETURN VARCHAR2
IS
BEGIN
RETURN 'authid = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')';
END;
この関数は、述語 authid = SYS_CONTEXT ('USERENV', 'SESSION_USER') を生成します。この述語は、ADD_POLICY ストアードプロシージャで指定されたタイプの各 SQL コマンドの WHERE 句に追加されます。
これにより、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) := 'enterprisedb';
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;
BEGIN
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
);
END;
ポリシーが作成された後、salesmgr ユーザーによってターミナルセッションが開始されます。 以下のクエリは、vpemp テーブルの内容を示しています。
edb=# \c edb salesmgr
Password for user newuser:
You are now connected to database "mygpdb" as user "mygpdb".
> SELECT * FROM pet;
empno | ename | job | sal | comm | deptno | authid
-------+--------+-----------+---------+---------+--------+-------------
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 | JAMES | CLERK | 950.00 | | 30 | salesmgr
(14 rows)
salesmgr ユーザーは、修飾されていない UPDATE コマンド (WHERE 句なし) を発行します。
edb=> UPDATE vpemp SET comm = sal * .75;
UPDATE 6
ポリシーは、テーブルのすべての行を更新する代わりに、更新の影響を authid 列に salesmgr 値が含まれる行に制限します。 salesmgr 値は、ポリシー関数述語によって指定されます。authid = SYS_CONTEXT ('USERENV', 'SESSION_USER')。
以下のクエリは、authid に salesmgr が含まれている行の comm 列が変更されたことを示しています。 他のすべての行は変更されません。
> SELECT * FROM pet;
empno | ename | job | sal | comm | deptno | authid
-------+--------+-----------+---------+---------+--------+-------------
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 | JAMES | CLERK | 950.00 | 712.50 | 30 | salesmgr
(14 rows)
以下の INSERT コマンドは、ADD_POLICY ストアドプロシージャで update_check パラメーターが TRUE に設定されているため、例外をスローします。 authid 列に指定された researchmgr 値が salesmgr セッションユーザーと一致しないため、ポリシーは無効です。
edb=> INSERT INTO vpemp VALUES (9001,'SMITH','ANALYST',3200.00,NULL,20, 'researchmgr');
ERROR: policy with check option violation
DETAIL: Policy predicate was evaluated to FALSE with the updated values
update_check が FALSE に設定されていた場合、前述の INSERT コマンドは成功していました。
以下の例は、sec_relevant_cols パラメーターを使用して、SQL コマンドで特定の列が参照されている場合にのみポリシーを適用する方法を示しています。 この例では、以下のポリシー関数を使用しています。この関数は、従業員の給与が月額 USD 2,000 未満の行を選択します。
CREATE OR REPLACE FUNCTION sal_lt_2000 (
p_schema VARCHAR2,
p_object VARCHAR2
)
RETURN VARCHAR2
IS
BEGIN
RETURN 'sal < 2000';
END;
ポリシーは、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) := 'enterprisedb';
v_policy_function VARCHAR2(30) := 'sal_lt_2000';
v_statement_types VARCHAR2(30) := 'SELECT';
v_sec_relevant_cols VARCHAR2(30) := 'sal,comm';
BEGIN
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
);
END;
クエリが sal または comm 列を参照しない場合には、ポリシーは適用されません。 以下のクエリは、vpemp テーブルの 14 行すべてを返します。
edb=# SELECT empno, ename, job, deptno, authid FROM vpemp;
empno | ename | job | deptno | authid
-------+--------+-----------+--------+-------------
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 | JAMES | CLERK | 30 | salesmgr
(14 rows)
クエリが sal または comm 列を参照する場合には、ポリシーがクエリに適用されます。 このクエリは、以下の例に示すように、sal が 2000 以上の行を削除します。
edb=# SELECT empno, ename, job, sal, comm, deptno, authid FROM vpemp;
empno | ename | job | sal | comm | deptno | authid
--------------+-----------------------------------+-----------+---------------
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 | JAMES | CLERK | 950.00 | 712.50 | 30 | salesmgr
(8 rows)
DROP_POLICY
DROP_POLICY ストアドプロシージャは、既存のポリシーを削除します。 ただし、DROP_POLICY ストアドプロシージャは、ポリシー関数およびポリシーに関連付けられたデータベースオブジェクトを削除することはできません。
DROP_POLICY ストアドプロシージャを実行するには、スーパーユーザーである必要があります。
DROP_POLICY(object_schema VARCHAR2, object_name VARCHAR2,
policy_name VARCHAR2)
パラメーター
パラメーター | 説明 |
---|---|
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';
BEGIN
DBMS_RLS.DROP_POLICY(
v_object_schema,
v_object_name,
v_policy_name
);
END;
ENABLE_POLICY
ENABLE_POLICY ストアドプロシージャは、指定されたデータベースオブジェクトの既存のポリシーを有効または無効にします。
ENABLE_POLICY ストアドプロシージャを実行するには、スーパーユーザーである必要があります。
ENABLE_POLICY(object_schema VARCHAR2, object_name VARCHAR2,
policy_name VARCHAR2, enable BOOLEAN)
パラメーター
パラメーター | 説明 |
---|---|
object_schema | ポリシーが適用されるデータベースオブジェクトを含むスキーマの名前です。 |
object_name | ポリシーが適用されるデータベースオブジェクトの名前です。 |
policy_name | 有効または無効にするポリシーの名前です。 |
enable | enable パラメーターを TRUE に設定すると、ポリシーが有効になります。 enable パラメーターが FALSE に設定されている場合には、ポリシーは無効になります。 |
例
以下の例では、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;
BEGIN
DBMS_RLS.ENABLE_POLICY(
v_object_schema,
v_object_name,
v_policy_name,
v_enable
);
END;