保护 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 数据集的访问权限,因此必须防止常规数据库用户映射未经授权的表。

如需强制执行最小权限访问,请限制外部服务器上的 USAGE 权限,以便非管理员用户无法运行 CREATE FOREIGN TABLE 语句:

  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;