ページの先頭行へ戻る
Enterprise Postgres 17 SP1 知識データ管理機能 利用ガイド

3.5.2 テキスト意味検索のためのベクトルデータへのアクセスを制限する

ベクトルデータへのアクセスの制限は、ベクトルデータが格納されるテーブルに対するアクセス制御により実現します。アクセス制限の設定は、Fujitsu Enterprise Postgresの機密管理支援機能を使用して行います。

以下は機密管理支援機能を使用し、テキストデータを含むテーブルsampleと、本機能によって生成されるベクトルデータを含むテーブルsample_embedding_storeの参照権を付与する例です。

  1. “セキュリティ運用ガイド”の“機密管理支援機能”を参照して、機密管理ロール、機密マトリクス、機密レベル、機密グループを定義します。

  2. テーブルに対する機密権限を機密グループに付与します。

    SELECT pgx_grant_confidential_privilege('rag_matrix', 'level1', 'group1', '{"schema": ["ALL"], "table": ["SELECT"]}');
  3. 機密レベルに機密オブジェクトとしてテキストデータを含むテーブルと埋込みテーブルを追加します。

    SELECT pgx_add_object_to_confidential_level ('rag_matrix', 'level1',
    '[{
        "type":"table",
        "object":[
            {
                "schema":"public",
                "table":["sample"]
            },
            {
                "schema":"public",
                "table":["sample_embedding_store"]
            },
        ]
    }]');
  4. 機密グループにロールを追加します。

    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属性を付与してください。

  1. “セキュリティ運用ガイド”の“機密管理支援機能”を参照して、機密管理ロール、機密マトリクス、機密レベル、機密グループを定義します。

  2. rowsetに対する機密権限を機密グループに付与します。

    SELECT pgx_grant_confidential_privilege('rag_matrix', 'level1', 'group1',  '{"table": ["SELECT"], "schema": ["ALL"],"rowset":["SELECT"]}');
  3. 対象のテーブルに対して行レベルセキュリティを有効にします。

    ALTER TABLE sample ENABLE ROW LEVEL SECURITY;
    ALTER TABLE sample_embeddings_store ENABLE ROW LEVEL SECURITY;
  4. 対象のビューの基となるテーブルがビューのユーザーの権限に対してチェックされるようにします。

    ALTER VIEW sample_embeddings SET (security_invoker = true);
  5. 機密レベルに機密オブジェクトとして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"]
            }
        ]
    }]');
  6. 機密レベルに機密オブジェクトとしてテキストデータを含むテーブルと埋込みテーブルの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)"
            }]
        }
        ]
    }]');
  7. 機密グループにロールを追加します。

    SELECT pgx_add_role_to_confidential_group('rag_matrix', 'group1', '["rag_user"]');