AlloyDB for PostgreSQL リソースを保護するためのベスト プラクティス

AlloyDB for PostgreSQL リソースのセキュリティ ポスチャーを強化するには、このページで説明するベスト プラクティスに従ってください。

検索パスのハイジャックを防止する

検索パスのハイジャックを防ぐには、高い権限を持つユーザーの search_path パラメータを pg_catalog に設定します。この構成により、検索パスが保護され、public などの信頼できないスキーマがバイパスされます。

ユーザーに対してこのパラメータを永続的に設定するには、次のコマンドを実行します。

ALTER ROLE USER_NAME SET search_path = pg_catalog,pg_temp;

このパラメータを現在のセッションにのみ設定するには、次のコマンドを実行します。

SET search_path TO pg_catalog,pg_temp;

データベースに接続しているすべてのユーザーにこのパラメータを設定するには、次のコマンドを実行します。

ALTER DATABASE DB_NAME SET search_path TO schema1, schema2, public;

public スキーマの保護の詳細については、安全なスキーマの使用に関する PostgreSQL のドキュメントと CVE-2018-1058 ガイドをご覧ください。

外部データラッパーを使用して BigQuery データアクセスを保護する

BigQuery 外部データラッパー(FDW)を使用すると、AlloyDB から BigQuery へのすべてのクエリは、AlloyDB クラスタのサービス アカウントを使用して認証されます。このサービス アカウントは複数の機密性の高い BigQuery データセットにアクセスできる可能性があるため、通常のデータベース ユーザーが未承認のテーブルをマッピングできないようにすることが重要です。

最小権限のアクセスを適用するには、管理者以外のユーザーが CREATE FOREIGN TABLE ステートメントを実行できないように、外部サーバーの USAGE 権限を制限します。

  1. 外部サーバーで USAGE を制限する: 管理者以外のロールに USAGE 権限が付与されないようにし、必要に応じて PUBLIC から USAGE を取り消します。

  2. テーブルの作成を一元化する: alloydbsuperuser ロールを持つユーザーなど、データベース管理者のみに外部テーブルの作成を許可します。

  3. 選択的なアクセス権を付与する: 特定の外部テーブルで GRANT SELECT を使用して読み取りアクセス権を管理します。

例: 最小権限アクセスを構成する

次のワークフローは、管理者が一般ユーザー(bob)に特定の BigQuery テーブルへのアクセス権を安全に付与し、任意のデータセットをマッピングできないようにする方法を示しています。

  1. 管理者として外部サーバーを作成し、PUBLIC から USAGE 権限を取り消して、不正なテーブルの作成を防止します。

    CREATE EXTENSION IF NOT EXISTS bigquery_fdw;
    CREATE SERVER bq_server FOREIGN DATA WRAPPER bigquery_fdw;
    
    -- Explicitly revoke USAGE from all users to prevent unauthorized table creation
    REVOKE ALL ON FOREIGN SERVER bq_server FROM PUBLIC;
    
  2. 管理者は、標準ユーザーのユーザー マッピングを作成します。

    CREATE USER MAPPING FOR bob SERVER bq_server;
    
  3. 管理者として、外部テーブルを作成します。

    -- Because 'bob' does not have USAGE on bq_server, only the administrator can run this.
    CREATE FOREIGN TABLE example_table (
        id INT,
        state VARCHAR
    ) SERVER bq_server OPTIONS (
        project 'BIGQUERY_PROJECT_ID',
        dataset 'BIGQUERY_DATASET_NAME',
        table 'example_table'
    );
    
  4. 管理者として、特定の外部テーブルに対する選択的な読み取りアクセス権を一般ユーザーに付与します。

    GRANT SELECT ON public.example_table TO bob;