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_backendpg_use_reserved_connectionspg_create_subscriptionpg_read_all_settingspg_read_all_statspg_stat_scan_tablespg_monitorsnowflake_admin_group
application 角色¶
application 角色是一个非超级用户角色,默认具有在 postgres 数据库中创建对象的权限。该角色的新权限或所有权应由 snowflake_admin 角色授予。
Postgres 密码安全¶
为 Snowflake Postgres 托管角色重新生成凭据¶
snowflake_admin 和 application 角色的凭据在创建实例时生成,且仅显示一次。这些凭据可随时重新生成,届时现有凭据将失效。
从仪表板中,您可以为实例的 snowflake_admin 角色重新生成凭据。
在导航菜单中,选择 Postgres。
选择您的实例。
在右上角的 Manage 菜单中选择 Regenerate credentials。
点击 Acknowledge & continue 按钮确认操作。
要为
snowflake_admin或application角色重新生成凭据,可使用 ALTER POSTGRES SERVICE 命令搭配 RESET ACCESS 参数。ALTER POSTGRES SERVICE [IF EXISTS] <name> RESET ACCESS FOR { 'snowflake_admin' | 'application' }
需要 OWNERSHIP 或 OPERATE 权限
将返回包含以下列的一行:
password
凭据轮换示例
重置名为
my_instance的 Snowflake Postgres 实例中snowflake_admin角色的访问权限:ALTER POSTGRES SERVICE my_instance RESET ACCESS FOR 'snowflake_admin';
为其他 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;
使用 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:
如果将 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
角色限制¶
在 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_admin 和 application 在实例内的操作施加额外限制。这些扩展特有的限制可能随时间演变,并将随扩展行为文档同步更新。如果某个操作被阻止,您将收到错误提示,表明该操作在 Snowflake Postgres 中不受支持。