データ編集

データ編集 は、特定のユーザーに表示されるデータを動的に変更することにより、機密データの露出を制限します。

たとえば、社会保障番号(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

  1. 継承階層で作成されたデータ改訂ポリシーはカスケードされません。たとえば、データリダクションポリシーが親に対して作成される場合、それを継承する子テーブルには適用されません。子テーブルはそれを継承します。これらの子テーブルにアクセスできる人は、編集されていないデータを見ることができます。継承階層の詳細については、次の場所にあるPostgreSQLCoreDocumentationの Inheritance を参照してください。

  2. スーパーユーザーまたはテーブル所有者がテーブルにマテリアライズドビューを作成し、テーブルおよびマテリアライズドビューに対するアクセス権 GRANT SELECT を非スーパーユーザーに提供している場合、非スーパーユーザーは非スーパーユーザーにアクセスできます。マテリアライズドビューを介してデータを編集しました。

  3. リダクション関数の本体でアクセスされるオブジェクトは、スキーマ修飾されている必要があります。そうでない場合、 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

データ改訂ポリシー式

注釈

データ編集ポリシーは、テーブルが有効で、式が真と評価された場合にテーブルに適用されます。