機密レベルと機密グループの考え方の例を説明します。
ここでは、顧客の購入情報を取り扱う簡単な業務を想定します。
まずは、これらの情報の機密管理を行うための機密マトリクスを作成しておきます。
SELECT pgx_create_confidential_matrix('購入情報管理', '顧客の購入情報の機密管理');
取り扱うデータの中には個人が特定できる情報も含まれていることがあります。そのようなデータに関しては、アクセスできる人物を限定し、情報が漏洩するリスクを最小限に抑える必要があります。
個人が特定できる情報を含む顧客の購入情報は次のようなテーブルで管理しています。
CREATE TABLE 購入管理.顧客情報( -- 顧客の情報 顧客id integer, -- 顧客のID 氏名 text, 住所 text, 電話番号 char(12), 顧客ランク integer -- 顧客のサービスランク ); CREATE TABLE 購入管理.購入履歴( -- 顧客が商品を購入した履歴 顧客id integer, -- 購入した顧客のID 購入日 date, -- 商品を購入した日付 商品コード char(12), -- 購入した商品のコード 数量 integer, -- 購入した数量 金額 integer -- 購入した商品の金額 );
顧客情報の中で、氏名、住所、電話番号はそれらを合わせると個人が特定できてしまうため、個人情報となります。このような情報を適切に取り扱うために、適切な教育を受けた特定のグループに属した従業員だけが取り扱えるようにしました。
そこで、機密度の高い個人情報を意味する「個人情報」と、それ以外の情報を意味する「顧客情報」の2つの機密レベルを用意します。
SELECT pgx_create_confidential_level('購入情報管理', '個人情報', NULL, '個人を特定できる情報'); SELECT pgx_create_confidential_level('購入情報管理', '顧客情報', NULL, '個人を特定できない情報');
さらに、個人情報の取り扱いに関して教育を受け、適切に個人情報を取り扱いうことができる「有資格者」と、それ以外の「一般従業員」の2つの機密グループを用意します。
SELECT pgx_create_confidential_group('購入情報管理', '有資格者', NULL, '個人情報取り扱い有資格者'); SELECT pgx_create_confidential_group ('購入情報管理', '一般従業員', NULL, '一般従業員');
取り扱うデータに関して、もう少し詳しく見ていきます。
顧客情報テーブルは個人情報を含むので個人情報に該当します。しかし、顧客情報テーブルに含まれる顧客idと顧客ランクは個人を特定できる情報ではないため、個人情報ではありません。また、この顧客idと顧客ランクは経営分析に必要となる情報でもあるため、それらの情報を個人情報の取り扱い有資格者しかアクセスできないのは不便です。
そこで、顧客情報テーブルはカラムを用いた機密管理を行うことにします。顧客情報テーブル全体は個人情報として保護を行い、個人情報とはならないカラムを一般の顧客情報とすることでアクセスできる範囲を広げます。
この方針に従い、機密グループに対する機密レベルの権限を設定します。
SELECT pgx_grant_confidential_privilege('購入情報管理', '個人情報', '有資格者', '{"table":["ALL"]}'); SELECT pgx_grant_confidential_privilege('購入情報管理', '顧客情報', '有資格者', '{"table":["ALL"]}'); SELECT pgx_grant_confidential_privilege('購入情報管理', '顧客情報', '一般従業員', '{"table":["ALL"], "column":["SELECT"]}');
「個人情報」を取り扱えるのは「有資格者」のみです。「顧客情報」は「有資格者」も「一般従業員」も扱うことができます。「個人情報」を扱うテーブルの一部のカラムは「顧客情報」として参照することを許可します。
これで機密マトリクスでの権限設定が完了しました。
続いて購入情報を取り扱うデータベースオブジェクトを機密マトリクスに登録していきます。
SELECT pgx_add_object_to_confidential_level('購入情報管理', '個人情報', '[{ "type":"table", "object":[{ "schema": "購入管理", "table": ["顧客情報"] }] }]'); SELECT pgx_add_object_to_confidential_level('購入情報管理', '顧客情報', '[{ "type":"column", "object":[{ "schema": "購入管理", "table": "顧客情報", "column": ["顧客id", "顧客ランク"] }] }]'); SELECT pgx_add_object_to_confidential_level('購入情報管理', '顧客情報', '[{ "type":"table", "object":[{ "schema": "購入管理", "table": ["購入履歴"] }] }]');
顧客情報テーブル全体は「個人情報」、顧客情報テーブルの顧客idカラムと顧客ランクカラムは「顧客情報」、購入履歴テーブル全体も「顧客情報」となります。
最後に、従業員を機密グループに登録します。「相田」さんと「飯田」さんは個人情報管理の教育を受けた「有資格者」、「上田」さんと「江田」さんはまだ個人情報管理の教育を受けてはいないため「一般従業員」です。
SELECT pgx_add_role_to_confidential_group('購入情報管理', '有資格者', '["相田", "飯田"]'); SELECT pgx_add_role_to_confidential_group('購入情報管理', '一般従業員', '["上田", "江田"]');