ページの先頭行へ戻る
Enterprise Postgres 15 セキュリティ運用ガイド

7.2.1 機密マトリクスを設計する

機密マトリクスとは、機密レベルと機密グループのマトリクスです。機密マトリクスの要素は機密権限です。ここでは、これらを定義します。

機密レベルは同じ機密性の度合いを持つデータのグループであり、機密グループは機密性のあるデータに対して同じアクセス権限を持つロールのグループです。詳細は、以降で説明します。

最終的には、データベースオブジェクトを機密レベルに分類し、ロールを機密グループに分類します。しかし、最初のステップでは、具体的なテーブルやロールなどを意識せずに、機密マトリクスを抽象的に定義してください。そうすることによって、機密レベルと機密グループの関係を、異なるデータベースオブジェクト群を持つデータベースに適用することもできます。

複数の機密マトリクスを定義することができます。これらの機密マトリクスには名前を付けて識別しますが、その名前はデータベース(データベースクラスタではなく)の中で一意です。

機密マトリクスを管理するロールは、機密管理ロールと呼びます。後で詳細に説明します。

複数の機密マトリクスを作るときの考え方

様々な設計の方法がありますが、下記に例を示します。

7.2.1.1 機密レベルを定義する

機密レベルとは、どのくらい外部に漏洩してはならないデータの集合なのかを示す概念です。例えば、個人情報を含むテーブルと含まないテーブルを分類するような機密レベルを決めます。

機密レベルに分類するデータの集合は、テーブルのようなデータベースのオブジェクトです。このようなオブジェクトを機密オブジェクトと呼びます。機密オブジェクトについては、“機密オブジェクト”を参照してください。

機密レベルには属性を設定することができます。例えば、機密レベルに暗号化を要求する属性を設定したならば、その機密レベルに属するテーブルは、暗号化されることを要求されます。機密管理支援機能が、所属する機密オブジェクトの属性を自動的に変更する場合としない場合があります。また、属性ごとに、ターゲットとなる機密オブジェクトは異なります。

以下の表は、属性の説明、ターゲットとなる機密オブジェクト、および機密オブジェクトの属性を変更するかどうかを示しています。

機密レベルの属性

指定できる値

機密オブジェクトの型

自動変更

説明

encryption_algorithm

AES128

AES256

none

table

column

rowset

No

機密オブジェクトが、指定されたアルゴリズムで暗号化されていることを要求します。詳細は、“運用ガイド”の“透過的データ暗号化による格納データの保護”を参照してください。

noneが指定されると暗号化を要求しません。

デフォルトはnoneです。

暗号化と復号は、大規模なデータ更新を伴うので自動的に属性を変更しません。そのかわり、指定された暗号化強度よりも低い暗号化強度の機密オブジェクトを追加することはできません。また、暗号化強度を強くするように変更するときに、変更後の条件を満たさない機密オブジェクトが含まれていてはいけません。


機密オブジェクトとは

機密オブジェクトには次の表に示したような型があります。例えば、テーブルTに含まれる一部のデータを機密レベルL1に追加し、そのほかのデータを機密レベルL2に追加することもできます。

機密オブジェクトの型

説明

schema

スキーマに含まれるすべてのテーブルを意味しません。単にシステムカタログに存在するオブジェクトを意味します。GRANT文によるアクセス制御のターゲットとなるスキーマ自身を意味します。

table

テーブルだけでなく、ビュー、マテリアライズドビュー、パーティションを含みます。今は、外部テーブルをサポートしていません。

column

カラムを意味します。

rowset

指定された条件を満たすような行の集合です。

PostgreSQLのシステムカタログにはrowsetを意味するオブジェクトは存在しませんが、機密管理支援機能では、使い易さのために機密オブジェクトとして扱われます。

rowset型の機密オブジェクトのアクセス制御は、PostgreSQLの行レベルセキュリティの機能を内部的に使います。よって、どのようにアクセスを制御するかは行レベルセキュリティの仕様に従います。

以下のオブジェクトにも機密にするべき情報が含まれる可能性があります。しかし、現在の機密管理支援機能は機密オブジェクトとしてサポートしていません。これらを管理するときには、機密管理ロールとは異なるロールで管理することをお勧めします。詳細は、“7.5 監視方法の提案”で説明しています。

7.2.1.2 機密グループを定義する

機密グループとは、どの機密レベルにアクセスしてよいロールなのかを示すオブジェクトです。例えば、個人情報にアクセスしても良いロールのグループとそうではないグループを決めます。機密グループは、実際にはPostgreSQLのロール(ロールグループ)として自動的に定義されます。このロールを機密グループロールと呼びます。

機密グループロールとは

機密グループロールは、機密管理支援機能が内部で実行するGRANT文やREVOKE文のターゲットです。そして、機密グループにロールを追加すると、追加されたロールは機密グループロールのメンバーに加えられます。追加されたロールの権限は、機密管理支援機能が機密グループロールに与えた権限を継承する形で与えられます。

機密グループを作成する関数を介して、機密グループロールには以下の属性を設定することができます。属性の意味とデフォルトの値は、CREATE ROLE文の仕様と同じです。これらは、機密を管理するときに必要であろう属性に限定しています。ですから、機密管理支援機能を使って変更してください。機密管理支援機能が、機密グループに追加されたロールに対して、以下の属性を自動的に設定します。

これら以外の属性は、PostgreSQLのCREATE ROLE文のデフォルトに従います。もし、ALTER ROLE文を使って属性を変更しても、機密管理支援機能の動作は妨げられません。


機密グループロールの命名規則は以下のとおりです。

pgx_cgroup_role_${serial_number}

機密グループを削除するときに、機密グループロールを削除しないことを選択できます。そうしたときに、後から機密グループロールであったことを知る手段になります。

注意

この命名規則にしたがうような文字列を使ったロールを定義しないでください。なぜならば、この命名規則にしたがうようなロールの${serial_number}の最大値の次の数値を新たな機密グループロールの名前に使うからです。例えば、もし、pgx_cgroup_role_999999999999999999という名前のロールが存在すると、新しい機密グループロールを作成できなくなります。

7.2.1.3 機密権限を定義する

機密権限とは、ある機密グループが、ある機密レベルに登録された機密オブジェクトへ、どのようにアクセスできるかを示します。

例えば、機密グループRが、機密レベルLに属するtable型の機密オブジェクトへSELECT、INSERT、UPDATE、DELETE権限を持つように定義することができます。

機密オブジェクトやロールが、機密レベルや機密グループに追加されたならば、機密権限の定義にしたがって、本機能が自動的にGRANT文またはCREATE POLICY文を使用して、機密グループロールに実際のデータベースのオブジェクトへの権限を付与します。

rowset型の場合には、機密権限は、CREATE POLICY文で指定できる権限です。rowset以外の場合には、GRANT文で指定できる権限です。詳細な権限は、“PostgreSQL Documentation”のそれぞれのSQL文のリファレンスを参照してください。

注意

この機能が内部的に作成したPOLICYの定義を変更しないでください。もし、変更しても、この機能の関数が、警告なく変更前の状態へ戻すことがあるからです。

ポイント

機密マトリクスに登録されているロールに対して、ある機密オブジェクトへの権限が機密権限よりも広く与えられていたならば、機密権限に合わせてそれらの権限を剥奪します。

機密マトリクスに登録されていないロールまたはPUBLICに対して、機密マトリクスに登録されている機密オブジェクトへの権限が付与されていたならば、この機能は、そのようなロールから権限を剥奪せずに、機密オブジェクトやロールを追加するための関数が失敗します。この機能が管理することを許されていないからです。

以下のように、もう少し複雑な状況であっても、機密オブジェクトやロールを追加する関数が失敗することで、機密マトリクスに追加されたロールが機密権限を逸脱しないようにします。

  • 機密マトリクスに登録されていないロールを機密マトリクスに登録されたロールが継承できるように設定されていて、かつ、結果的に機密権限よりも大きな権限を持っている。

  • 機密マトリクスに登録されているロールに対して、この機能が作成していないPOLICYによって権限が与えられている。このケースでは、機密権限を逸脱しているかを厳密には検査せずに、このようなPOLICYが存在していたならば、関数が失敗します。