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;
詳細については、安全なスキーマの使用に関する PostgreSQL のドキュメント と CVE-2018-1058 ガイドをご覧ください。
外部データラッパーを使用して BigQuery データアクセスを保護する
BigQuery 外部データラッパー(FDW)を使用する場合、AlloyDB から BigQuery へのすべてのクエリは、AlloyDB クラスタのサービス アカウントを使用して認証されます。このサービス アカウントは複数の機密性の高い BigQuery データセットにアクセスできる可能性があるため、通常のデータベース ユーザーが承認されていないテーブルをマッピングできないようにすることが重要です。
最小権限のアクセスを適用するには、管理者は外部サーバーに対する USAGE 権限を制限する必要があります。これにより、管理者以外のユーザーが CREATE FOREIGN TABLE ステートメントを実行できなくなります。
- 管理者以外のロールに外部サーバーに対する
USAGE権限がないことを確認して、外部サーバーに対するUSAGEを制限します。必要に応じて、PUBLICから取り消します。 - テーブルの作成を一元化します。外部テーブルを作成できるのは、データベース管理者(
alloydbsuperuserロールを持つユーザーなど)のみです。 - 選択的なアクセス権を付与します。管理者は、特定の外部テーブルで
GRANT SELECTを使用して読み取りアクセスを管理します。
例: 最小権限のアクセスを構成する
次のワークフローでは、管理者が任意のデータセットをマッピングできるようにすることなく、通常のユーザー(bob)に特定の BigQuery テーブルへのアクセス権を安全に付与する方法を示します。
-- Step 1: Create the server and restrict access (Executed as Administrator) ```sql 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; ```
-- Step 2: Create a User Mapping for the regular user (Executed as Administrator)
sql
CREATE USER MAPPING FOR bob SERVER bq_server;
-- Step 3: Create the Foreign Table (Executed as Administrator)
-- Because 'bob' does not have USAGE on bq_server, only the administrator can run this.
sql
CREATE FOREIGN TABLE example_table (
id INT,
state VARCHAR
) SERVER bq_server OPTIONS (
project 'BIGQUERY_PROJECT_ID',
dataset 'BIGQUERY_DATASET_NAME',
table 'example_table'
);
-- Step 4: Grant Selective Read Access (Executed as Administrator)
-- Explicitly grant read access to the regular user for this specific table.
sql
GRANT SELECT ON public.example_table TO bob;