データ編集¶
データ編集 は、特定のユーザーに表示されるデータを動的に変更することにより、機密データの露出を制限します。
たとえば、社会保障番号(SSN)は 021-23-9567 として保存されます。特権ユーザーは完全なSSNを見ることができますが、他のユーザーは最後の4桁の xxx-xx-9567 しか見ることができません。
データ改訂は、改訂が適用される各フィールドに関数を定義することにより実装されます。この関数は、データ修正の対象となるユーザーに表示される値を返します。
したがって、たとえば、SSNフィールドの場合、redaction関数は 021-23-9567 の入力SSNに対して xxx-xx-9567 を返します。
給与フィールドの場合、入力された給与値に関係なく、redaction関数は常に $0.00 を返します。
これらの機能は、 CREATE REDACTION POLICY コマンドを使用して編集ポリシーに組み込まれます。このコマンドは、ポリシーが適用されるテーブル、指定されたリダクション関数の影響を受けるテーブル列、影響を受けるセッションユーザーを決定する式、およびその他のオプションを指定します。
postgresql.conf ファイルの edb_data_redaction パラメータは、データ修正を適用するかどうかを決定します。
デフォルトでは、パラメーターは有効になっているため、redactionポリシーが有効になり、次のことが行われます。
スーパーユーザーとテーブル所有者は、データ編集をバイパスして、元のデータを表示します。
他のすべてのユーザーは、redactionポリシーが適用され、再フォーマットされたデータが表示されます。
セッション中にパラメーターを FALSE に設定して無効にすると、次のことが発生します。
スーパーユーザーとテーブル所有者は、データ編集をバイパスして、元のデータを表示します。
他のすべてのユーザーが取得すると、エラーが発生します。
改訂ポリシーは、 ALTER REDACTION POLICY コマンドを使用して変更するか、 DROP REDACTION POLICY コマンドを使用して削除できます。
リダクションポリシーコマンドについては、以降のセクションで詳しく説明します。
編集ポリシーの作成¶
CREATE REDACTION POLICY は、テーブルの新しいデータ編集ポリシーを定義します。
Synopsis
CREATE REDACTION POLICY <name> ON <table_name>
[ FOR ( <expression> ) ]
[ ADD [ COLUMN ] <column_name> USING <funcname_clause>
[ WITH OPTIONS ( [ <redaction_option> ]
[, <redaction_option> ] )
]
] [, ...]
ここで、 redaction_option は次のとおりです。
{ SCOPE <scope_value> |
EXCEPTION <exception_value> }
Description
CREATE REDACTION POLICY コマンドは、リダクション機能を使用して列データを編集することにより、テーブルの新しい列レベルのセキュリティポリシーを定義します。新しく作成されたデータ修正ポリシーは、デフォルトで有効になります。ポリシーは ALTER REDACTION POLICY ... DISABLE を使用して無効にできます。
FOR ( expression )
このフォームは、redactionポリシー式を追加します。
ADD [ COLUMN ]
このオプションのフォームは、テーブルの列をデータ改訂ポリシーに追加します。
USINGはredaction関数式を指定します。作成中のデータ改訂ポリシーにテーブルの複数の列を追加する場合は、複数のADD [ COLUMN ]フォームを使用できます。オプションのWITH OPTIONS ( ... )句は、適用されるデータ改訂ポリシーのスコープまたは例外を指定します。スコープや例外が指定されていない場合、スコープと例外のデフォルト値はそれぞれqueryとnoneになります。
Parameters
name
作成するデータ改訂ポリシーの名前。これは、テーブルの他の既存のデータ改訂ポリシーの名前とは異なる必要があります。
table_name
データ修正ポリシーが適用されるテーブルの名前(オプションでスキーマ修飾)。
expression
データ改訂ポリシー式。この式がfalseと評価された場合、編集は適用されません。
column_name
データ修正ポリシーが作成されるテーブルの既存の列の名前。
funcname_clause
改訂された列の値を計算する方法を決定するデータ改訂関数。リダクション関数の戻り値の型は、データリダクションポリシーが追加される列の型と同じである必要があります。
scope_value
スコープは、列に編集が適用されるクエリパーツを識別しました。スコープ値は
query, top_tlistまたはtop_tlist_or_errorです。スコープがqueryの場合、クエリ内のどこに表示されているかに関係なく、列に編集が適用されます。スコープがtop_tlistの場合、列の編集はクエリのトップターゲットリストに表示されたときにのみ適用されます。スコープがtop_tlist_or_errorの場合、動作はtop_tlistと同じになりますが、クエリのどこかに列が表示されるとエラーがスローされます。
exception_value
例外は、リダクションが免除されるクエリ部分を識別しました。例外値は
none, equalまたはleakproofです。例外がnoneの場合、免除はありません。例外がequalの場合、列は同等性テストで使用されても編集されません。例外がleakproofの場合、漏れ防止機能が適用されても列は編集されません。
Notes:
データリダクションポリシーを作成または変更するには、テーブルの所有者である必要があります。
スーパーユーザーとテーブル所有者は、データ改訂ポリシーから免除されます。
Examples
以下は、この機能を実稼働環境で使用する方法の例です。 employees テーブルにデータ修正ポリシーのコンポーネントを作成します。
CREATE TABLE employees (
id integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name varchar(40) NOT NULL,
ssn varchar(11) NOT NULL,
phone varchar(10),
birthday date,
salary money,
email varchar(100)
);
-- Insert some data
INSERT INTO employees (name, ssn, phone, birthday, salary, email)
VALUES
( 'Sally Sample', '020-78-9345', '5081234567', '1961-02-02', 51234.34,
'sally.sample@enterprisedb.com'),
( 'Jane Doe', '123-33-9345', '6171234567', '1963-02-14', 62500.00,
'jane.doe@gmail.com'),
( 'Bill Foo', '123-89-9345', '9781234567','1963-02-14', 45350,
'william.foe@hotmail.com');
-- Create a user hr who can see all the data in employees
CREATE USER hr;
-- Create a normal user
CREATE USER alice;
GRANT ALL ON employees TO hr, alice;
-- Create redaction function in which actual redaction logic resides
CREATE OR REPLACE FUNCTION redact_ssn (ssn varchar(11)) RETURN varchar(11) IS
BEGIN
/* replaces 020-12-9876 with xxx-xx-9876 */
return overlay (ssn placing 'xxx-xx' from 1) ;
END;
CREATE OR REPLACE FUNCTION redact_salary () RETURN money IS BEGIN return
0::money;
END;
ここで、 employees にデータのリダクションポリシーを作成して、等価条件でアクセスできるはずの列 ssn と、デフォルトのスコープと例外で salary を編集します。 hr ユーザーのredactionポリシーは免除されます。
CREATE REDACTION POLICY redact_policy_personal_info ON employees FOR
(session_user != 'hr')
ADD COLUMN ssn USING redact_ssn(ssn) WITH OPTIONS (SCOPE query,
EXCEPTION equal),
ADD COLUMN salary USING redact_salary();
hr ユーザーの表示データは次のとおりです。
-- hr can view all columns data
edb=# \c edb hr
edb=> SELECT * FROM employees;
id | name | ssn | phone | birthday |
salary | email
----+--------------+-------------+------------+--------------------+---
--+---------------------
1 | Sally Sample | 020-78-9345 | 5081234567 | 02-FEB-61 00:00:00 |
$51,234.34 | sally.sample@enterprisedb.com
2 | Jane Doe | 123-33-9345 | 6171234567 | 14-FEB-63 00:00:00 |
$62,500.00 | jane.doe@gmail.com
3 | Bill Foo | 123-89-9345 | 9781234567 | 14-FEB-63 00:00:00 |
$45,350.00 | william.foe@hotmail.com
(3 rows)
通常のユーザー alice の表示データは次のとおりです。
-- Normal user cannot see salary and ssn number.
edb=> \c edb alice
edb=> SELECT * FROM employees;
id | name | ssn | phone | birthday | salary |
email
----+--------------+-------------+------------+--------------------+--------+-
------------------------------
1 | Sally Sample | xxx-xx-9345 | 5081234567 | 02-FEB-61 00:00:00 | $0.00 |
sally.sample@enterprisedb.com
2 | Jane Doe | xxx-xx-9345 | 6171234567 | 14-FEB-63 00:00:00 | $0.00 |
jane.doe@gmail.com
3 | Bill Foo | xxx-xx-9345 | 9781234567 | 14-FEB-63 00:00:00 | $0.00 |
william.foe@hotmail.com
(3 rows)
ただし、 exception_value に設定されているため、等値チェックに使用する場合、 ssn データにアクセスできます。
-- Get ssn number starting from 123
edb=> SELECT * FROM employees WHERE substring(ssn from 0 for 4) = '123';
id | name | ssn | phone | birthday | salary |
email
----+----------+-------------+------------+--------------------+--------+-----
--------------------
2 | Jane Doe | xxx-xx-9345 | 6171234567 | 14-FEB-63 00:00:00 | $0.00 |
jane.doe@gmail.com
3 | Bill Foo | xxx-xx-9345 | 9781234567 | 14-FEB-63 00:00:00 | $0.00 |
william.foe@hotmail.com
(2 rows)
Caveats
継承階層で作成されたデータ改訂ポリシーはカスケードされません。たとえば、データリダクションポリシーが親に対して作成される場合、それを継承する子テーブルには適用されません。子テーブルはそれを継承します。これらの子テーブルにアクセスできる人は、編集されていないデータを見ることができます。継承階層の詳細については、次の場所にあるPostgreSQLCoreDocumentationの
Inheritanceを参照してください。スーパーユーザーまたはテーブル所有者がテーブルにマテリアライズドビューを作成し、テーブルおよびマテリアライズドビューに対するアクセス権
GRANT SELECTを非スーパーユーザーに提供している場合、非スーパーユーザーは非スーパーユーザーにアクセスできます。マテリアライズドビューを介してデータを編集しました。リダクション関数の本体でアクセスされるオブジェクトは、スキーマ修飾されている必要があります。そうでない場合、
pg_dumpが失敗する可能性があります。
Compatibility
CREATE REDACTION POLICY はEDB拡張機能です。
See Also
ALTER REDACTION POLICY, DROP REDACTION POLICY
ALTERREDACTIONPOLICY¶
ALTER REDACTION POLICY は、テーブルのデータ改訂ポリシーの定義を変更します。
Synopsis
ALTER REDACTION POLICY <name> ON <table_name> RENAME TO <new_name>
ALTER REDACTION POLICY <name> ON <table_name> FOR ( <expression> )
ALTER REDACTION POLICY <name> ON <table_name> { ENABLE | DISABLE}
ALTER REDACTION POLICY <name> ON <table_name>
ADD [ COLUMN ] <column_name> USING <funcname_clause>
[ WITH OPTIONS ( [ <redaction_option> ]
[, <redaction_option> ] )
]
ALTER REDACTION POLICY <name> ON <table_name>
MODIFY [ COLUMN ] <column_name>
{
[ USING <funcname_clause> ]
|
[ WITH OPTIONS ( [ <redaction_option> ]
[, <redaction_option> ] )
]
}
ALTER REDACTION POLICY <name> ON <table_name>
DROP [ COLUMN ] <column_name>
ここで、 redaction_option は次のとおりです。
{ SCOPE <scope_value> |
EXCEPTION <exception_value> }
Description
ALTER REDACTION POLICY は、既存のデータ改訂ポリシーの定義を変更します。
ALTER REDACTION POLICY を使用するには、データ改訂ポリシーが適用されるテーブルを所有する必要があります。
FOR ( expression )
このフォームは、データ編集ポリシー式を追加または置換します。
ENABLE
以前に無効化されたテーブルのデータ修正ポリシーを有効にします。
DISABLE
テーブルのデータ改訂ポリシーを無効にします。
ADD [ COLUMN ]
このフォームは、テーブルの列を既存のredactionポリシーに追加します。詳細については、
CREATE REDACTION POLICYを参照してください。
MODIFY [ COLUMN ]
このフォームは、テーブルの列のデータ編集ポリシーを変更します。列のredaction関数句やredactionオプションを更新できます。
USING句は更新するリダクション関数式を指定し、WITH OPTIONS ( ... )句はスコープまたは例外、あるいはその両方を指定します。リダクション関数句、リダクションスコープ、およびリダクション例外の詳細については、CREATE REDACTION POLICYを参照してください。
DROP [ COLUMN ]
このフォームは、テーブルの列をデータ改訂ポリシーから削除します。
Parameters
name
変更する既存のデータ改訂ポリシーの名前。
table_name
データ改訂ポリシーが有効になっているテーブルの名前(オプションでスキーマ修飾)。
new_name
データ改訂ポリシーの新しい名前。これは、テーブルの他の既存のデータ改訂ポリシーの名前とは異なる必要があります。
expression
データ改訂ポリシー式。
column_name
データ編集ポリシーが変更またはドロップされるテーブルの既存の列の名前。
funcname_clause
列のデータ修正関数式。詳細については、
CREATE REDACTION POLICYを参照してください。
scope_value
スコープは、列に編集が適用されるクエリパーツを識別しました。詳細については、
CREATE REDACTION POLICYを参照してください。
exception_value
例外は、リダクションが免除されるクエリ部分を識別しました。詳細については、
CREATE REDACTION POLICYを参照してください。
Examples
employees という名前のテーブルの redact_policy_personal_info というデータ修正ポリシーを更新します。
ALTER REDACTION POLICY redact_policy_personal_info ON employees
FOR (session_user != 'hr' AND session_user != 'manager');
また、同じポリシーの列 ssn のデータ編集機能を更新するには:
ALTER REDACTION POLICY redact_policy_personal_info ON employees
MODIFY COLUMN ssn USING redact_ssn_new(ssn);
Compatibility
ALTER REDACTION POLICY はEDB拡張機能です。
See Also
CREATE REDACTION POLICY, DROP REDACTION POLICY
ドロップ修正ポリシー¶
DROP REDACTION POLICY は、テーブルからデータ改訂ポリシーを削除します。
Synopsis
DROP REDACTION POLICY [ IF EXISTS ] <name> ON <table_name>
[ CASCADE | RESTRICT ]
Description
DROP REDACTION POLICY は、指定されたデータ改訂ポリシーをテーブルから削除します。
DROP REDACTION POLICY を使用するには、redactionポリシーが適用されるテーブルを所有する必要があります。
Parameters
IF EXISTS
データ編集ポリシーが存在しない場合でもエラーをスローしないでください。この場合、通知が発行されます。
name
削除するデータ改訂ポリシーの名前。
table_name
データ改訂ポリシーが有効になっているテーブルの名前(オプションでスキーマ修飾)。
CASCADE
RESTRICT
これらのキーワードは、データ編集ポリシーに依存関係がないため、効果がありません。
Examples
employees という名前のテーブルに redact_policy_personal_info というデータ編集ポリシーを削除するには:
DROP REDACTION POLICY redact_policy_personal_info ON employees;
Compatibilities
DROP REDACTION POLICY はEDB拡張機能です。
See Also
CREATE REDACTION POLICY, ALTER REDACTION POLICY
システムカタログ¶
このセクションでは、redactionポリシー情報を保存するシステムカタログについて説明します。
edb_redaction_column¶
edb_redaction_column システムカタログには、テーブルの列に添付されたデータ修正ポリシーに関する情報が格納されます。
コラム |
種類 |
参照資料 |
説明 |
|---|---|---|---|
oid |
oid |
行識別子(非表示属性、明示的に選択する必要があります) |
|
rdpolicyid |
oid |
edb_redaction_policy.oid |
データ改訂ポリシーは、説明されている列に適用されます |
rdrelid |
oid |
pg_class.oid |
説明された列が属するテーブル |
rdattnum |
int2 |
pg_attribute.attnum |
記載されている列の番号 |
rdscope |
int2 |
リダクションスコープ:1=クエリ、2=top_tlist、4=top_tlist_or_error |
|
rdexception |
int2 |
リダクション例外:8=なし、16=等しい、32=漏れ防止 |
|
rdfuncexpr |
pg_node_tree |
データ修正関数式 |
注釈
表のredactionポリシー edb_redaction_column.rdpolicyid が有効で、redactionポリシー式 edb_redaction_policy.rdexpr が true に評価される場合、説明されている列はredactionされます。
edb_redaction_policy¶
カタログ edb_redaction_policy には、テーブルのredactionポリシーに関する情報が格納されます。
コラム |
種類 |
参照資料 |
説明 |
|---|---|---|---|
oid |
oid |
行識別子(非表示属性、明示的に選択する必要があります) |
|
rdname |
お名前 |
データ編集ポリシーの名前 |
|
rdrelid |
oid |
pg_class.oid |
データ編集ポリシーが適用されるテーブル |
rdenable |
ブール値 |
データ編集ポリシーは有効になっていますか? |
|
rdexpr |
pg_node_tree |
データ改訂ポリシー式 |
注釈
データ編集ポリシーは、テーブルが有効で、式が真と評価された場合にテーブルに適用されます。