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角色重新生成凭证,您可以使用带有 RESET ACCESS FOR 参数的 ALTER POSTGRES INSTANCE 命令。您指定的值是一个带引号的字符串,可以是'snowflake_admin'或'application'。例如:
需要 OWNERSHIP 权限
该命令返回包含以下列的一行:
password
凭据轮换示例
重置名为
my_instance的 Snowflake Postgres 实例中snowflake_admin角色的访问权限:
为其他 Postgres 角色设置密码¶
Snowflake Postgres 实例默认配置为 scram-sha-256 密码身份验证。设置新密码时,服务器会生成并存储 scram-sha-256 哈希值;但当 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 服务器日志中的最简单方法,是在运行这些语句的事务中禁用 log_statement 参数。为此,请使用 SET LOCAL:
使用 psql Postgres 客户端的 \password 命令¶
Postgres psql (https://www.postgresql.org/docs/current/app-psql.html) 客户端程序拥有可用于更改现有用户密码的 password (https://www.postgresql.org/docs/current/app-psql.html) 元命令。\password 元命令会预先计算所输入密码的 scram-sha-256 哈希值,并在发送给服务器的 ALTER ROLE 命令中使用该哈希值。要使用此方法,先创建无密码的新用户,再通过 psql \password 元命令为每个用户设置密码。
如果将 log_statement 设置为除 'none' 以外的值,则 psql 为上述 \password 命令发送的 ALTER ROLE 命令的日志条目会包含计算得到的 scram-sha-256 哈希值,而非实际明文密码。您可以将此方法与完全禁用 ``log_statement``(如上所述)结合使用,以防止该哈希值出现在 Postgres 日志中:
泄露密码保护¶
为 Snowflake Postgres 实例上的角色提供密码泄露保护。检测与通知机制遵循主:doc:/user-guide/leaked-password-protection 的描述。当 Snowflake 发现您的某个 Snowflake Postgres 角色的密码泄露时:
该角色已添加到特殊
snowflake_nologinPostgres 组角色中,以防止将来使用它登录。该角色的所有现有连接都将终止。
您收到的电子邮件通知的主题为“紧急 – Snowflake Postgres 角色密码重置以防止未经授权的访问”。
如果您收到此电子邮件,应立即按照上述说明安全地更新角色的密码。为托管角色重新生成凭据时,它们会自动从 snowflake_nologin Postgres 角色组中移除。对于非托管角色,在更新角色密码后,可以将其从 snowflake_nologin 组角色中移除,方法是使用 snowflake_admin 角色运行此 Postgres SQL:
角色限制¶
在 Snowflake Postgres 中,某些操作是为服务本身保留的,任何客户管理角色(包括 snowflake_admin)均无法执行。
受限制的操作示例包括:
使用超级用户角色登录,例如
postgres或snowflake_superuser,或通过使用 SET ROLE 来承担此类角色。正在创建其他超级用户。
执行 ALTER SYSTEM 命令。
更改由 Snowflake 管理的受保护服务器级配置参数。
修改或禁用 Snowflake 管理的核心组件或扩展。
访问或更改服务使用的 Snowflake 管理的系统数据库或架构。
访问或更改 Snowflake Postgres 实例文件系统。
直接修改系统目录表。
在实例中创建超过 64 个角色。
在实例中创建超过 32 个数据库。
访问 Postgres 通用文件访问函数 (https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADMIN-GENFILE) 以获取文件系统访问权限。
Snowflake Postgres 扩展可能对 snowflake_admin 和 application 在实例内的操作施加额外限制。这些扩展特有的限制可能随时间演变,并将随扩展行为文档同步更新。如果某个操作被阻止,您会收到一条错误,指示 Snowflake Postgres 中不允许进行该操作。