ベクトルデータへのアクセスの制限は、ベクトルデータが格納されるテーブルに対するアクセス制御により実現します。アクセス制限の設定は、Fujitsu Enterprise Postgresの機密管理支援機能を使用して行います。
以下は機密管理支援機能を使用し、テキストデータを含むテーブルsampleと、本機能によって生成されるベクトルデータを含むテーブルsample_embedding_storeの参照権を付与する例です。
“セキュリティ運用ガイド”の“機密管理支援機能”を参照して、機密管理ロール、機密マトリクス、機密レベル、機密グループを定義します。
テーブルに対する機密権限を機密グループに付与します。
SELECT pgx_grant_confidential_privilege('rag_matrix', 'level1', 'group1', '{"schema": ["ALL"], "table": ["SELECT"]}');機密レベルに機密オブジェクトとしてテキストデータを含むテーブルと埋込みテーブルを追加します。
SELECT pgx_add_object_to_confidential_level ('rag_matrix', 'level1',
'[{
"type":"table",
"object":[
{
"schema":"public",
"table":["sample"]
},
{
"schema":"public",
"table":["sample_embedding_store"]
},
]
}]');機密グループにロールを追加します。
SELECT pgx_add_role_to_confidential_group('rag_matrix', 'group1', '["rag_user"]');参考
ベクトルテーブルには、外部キー、ベクトルデータおよびチャンクが含まれますが、列単位でアクセス権を設定する必要はなく、テーブル単位のアクセス権の設定で十分です。
以下は、テキストデータを含むテーブルsampleと、本機能によって生成されるベクトルデータを含むテーブルsample_embedding_storeに対して行レベルセキュリティを設定する例です。この例ではsampleとsample_embedding_storeには、usernameというカラムにユーザー名が入っており、sample_embedding_storeはsampleの主キー(id)を外部キー(id)として持っています。行レベルセキュリティを使用する場合、VECTORIZE_USERに設定したユーザーにBYPASSRLS属性を付与してください。
“セキュリティ運用ガイド”の“機密管理支援機能”を参照して、機密管理ロール、機密マトリクス、機密レベル、機密グループを定義します。
rowsetに対する機密権限を機密グループに付与します。
SELECT pgx_grant_confidential_privilege('rag_matrix', 'level1', 'group1', '{"table": ["SELECT"], "schema": ["ALL"],"rowset":["SELECT"]}');対象のテーブルに対して行レベルセキュリティを有効にします。
ALTER TABLE sample ENABLE ROW LEVEL SECURITY; ALTER TABLE sample_embeddings_store ENABLE ROW LEVEL SECURITY;
対象のビューの基となるテーブルがビューのユーザーの権限に対してチェックされるようにします。
ALTER VIEW sample_embeddings SET (security_invoker = true);
機密レベルに機密オブジェクトとしてaiスキーマ、テキストデータを含むテーブルと埋込みテーブル、埋込みビューを追加します。
SELECT pgx_add_object_to_confidential_level ('rag_matrix', 'level1',
'[{
"type":"schema",
"object":[
{"schema":"ai"},
{"schema":"pgx_vectorizer"}
]
},
{
"type":"table",
"object":[
{
"schema":"public",
"table": ["sample", "sample_embeddings_store", "sample_embeddings"]
},
{
"schema":"ai",
"table": ["vectorizer"]
}
]
}]');機密レベルに機密オブジェクトとしてテキストデータを含むテーブルと埋込みテーブルのrowsetを追加します。
SELECT pgx_add_object_to_confidential_level ('rag_matrix', 'level1',
'[{
"type":"rowset",
"object":[
{
"schema":"public",
"table": "sample",
"rowset_name": "rowset1",
"rowset_expression":[
{
"as": "permissive",
"using": "username = current_user"
}]
},
{
"schema":"public",
"table": "sample_embeddings_store",
"rowset_name": "rowset1",
"rowset_expression":[
{
"as": "permissive",
"using": "EXISTS (SELECT 1 FROM public.sample WHERE public.sample.id = public.sample_embeddings_store.id AND public.sample.\"username\" = current_user)"
}]
}
]
}]');機密グループにロールを追加します。
SELECT pgx_add_role_to_confidential_group('rag_matrix', 'group1', '["rag_user"]');