Snowflake Postgres 角色

Postgres 拥有基于角色的身份验证机制,用于管理数据库连接及 Postgres 服务器上的数据库操作。这些角色与 Snowflake 角色相互独立。Postgres 角色用于访问和管理 Snowflake Postgres 实例内的数据库、表及其他对象。

创建实例时,Snowflake 会自动为您创建两个特殊管理角色,具体说明如下。

有关管理 Postgres 角色的更多信息,请参阅 Postgres 文档 (https://www.postgresql.org/docs/current/user-manag.html)。

备注

在这里和许多其他地方,您会看到术语“角色”和“用户”在 Postgres 用户管理上下文中交替使用。这是因为 Postgres 用户本质上就是具有 postgres 角色 LOGIN 属性的角色。

Snowflake Postgres 托管角色

Snowflake Postgres 提供两个托管角色,这些角色会在实例创建时自动生成。

snowflake_admin 角色

snowflake_admin 角色是用于管理 Snowflake Postgres 实例的高权限 Postgres 角色。它 不是 完整的 Postgres 超级用户,部分操作仍受限制并由 Snowflake 管理。但是,它具有提升的权限,包括:

  • 创建和管理 Postgres 角色。

  • 创建和管理数据库。

  • 管理 Snowflake Postgres 实例的复制。

  • 绕过行级安全性 (RLS) 策略(如适用)。

此外,snowflake_admin 同时隶属于多个 Postgres 内置角色,这些角色赋予其监控和运维能力,包括:

  • pg_signal_backend

  • pg_use_reserved_connections

  • pg_create_subscription

  • pg_read_all_settings

  • pg_read_all_stats

  • pg_stat_scan_tables

  • pg_monitor

  • snowflake_admin_group

application 角色

application 角色是一个非超级用户角色,默认具有在 postgres 数据库中创建对象的权限。该角色的新权限或所有权应由 snowflake_admin 角色授予。

Postgres 密码安全

为 Snowflake Postgres 托管角色重新生成凭据

snowflake_adminapplication 角色的凭据在创建实例时生成,且仅显示一次。这些凭据可随时重新生成,届时现有凭据将失效。

从仪表板中,您可以为实例的 snowflake_admin 角色重新生成凭据。

  1. 在导航菜单中,选择 Postgres

  2. 选择您的实例。

  3. 在右上角的 Manage 菜单中选择 Regenerate credentials

  4. 点击 Acknowledge & continue 按钮确认操作。

为其他 Postgres 角色设置密码

Snowflake Postgres 实例默认配置为 scram-sha-256 密码身份验证。 设置新密码时,服务器会生成并存储 scram-sha-258 哈希值。但若 Postgres 的 log_statement (https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-LOG-STATEMENT) 参数设置为除 none 以外的任何值,则 CREATE ROLE 和 ALTER ROLE DDL 命令将完整记录至 Postgres 服务器日志。因此,应确保明文密码不会作为这些语句的一部分记录。

禁用 CREATEROLE 和 ALTERROLE Postgres DDL 命令的语句日志记录

防止 CREATE ROLE 和 ALTER ROLE DDL 语句中使用的明文密码出现在 Postgres 服务器日志中的最简便方法,是在执行这些语句的事务中通过 SET LOCAL 禁用 log_statement 参数:

BEGIN;
SET LOCAL log_statement = 'none';
CREATE USER mynewrole PASSWORD 'mynewpassword';
COMMIT;
Copy

使用 psql Postgres 客户端的 \password 命令

Postgres 的 psql (https://www.postgresql.org/docs/current/app-psql.html) 提供名为 password <https://www.postgresql.org/docs/current/app-psql.html>_ 的元命令,可用于更改现有用户的密码。该命令会预先计算输入密码的 scram-sha-256 哈希值,并在发送至服务器的 ALTER ROLE 命令中使用该哈希值。 使用此方法时,应先创建无密码的新用户,再通过 psql 的 \password 元命令为每个用户设置密码。

postgres=# CREATE ROLE mynewrole LOGIN;
CREATE ROLE

postgres=# \password mynewrole
Enter new password for user "mynewrole":
Enter it again:
Copy

如果将 log_statement 设置为除“none”以外的值,则 psql 为上述 \password 命令发送的 ALTER ROLE 命令日志条目将包含计算得到的 scram-sha-256 哈希值,而非实际明文密码。 此方法可结合完全禁用 ``log_statement``(如上所述)使用,以防止该哈希值出现在 Postgres 日志中:

postgres=# CREATE ROLE mynewrole LOGIN;
CREATE ROLE

postgres=# BEGIN;
BEGIN

postgres=# SET LOCAL log_statement = 'none';
SET

postgres=# \password mynewrole
Enter new password for user "mynewrole":
Enter it again:

postgres=# COMMIT;
COMMIT
Copy

角色限制

在 Snowflake Postgres 中,某些操作是为服务本身保留的,任何客户管理角色(包括 snowflake_admin)均无法执行。示例包括:

  • 更改由 Snowflake 管理的受保护服务器级配置参数

  • 修改或禁用 Snowflake 管理的核心组件或扩展

  • 访问或更改服务使用的 Snowflake 管理的系统数据库或架构

  • 访问或更改 Snowflake Postgres 实例文件系统

  • 直接修改系统目录表

  • 创建其他超级用户

  • 在实例中创建超过 64 个角色

  • 在实例中创建超过 32 个数据库

  • 执行 ALTER SYSTEM 命令

  • 访问 Postgres 通用文件访问函数 (https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADMIN-GENFILE) 以获取文件系统访问权限。

Snowflake Postgres 扩展可能对 snowflake_adminapplication 在实例内的操作施加额外限制。这些扩展特有的限制可能随时间演变,并将随扩展行为文档同步更新。如果某个操作被阻止,您将收到错误提示,表明该操作在 Snowflake Postgres 中不受支持。

语言: 中文