PostgreSQL 用户和角色简介

本页面介绍如何将 Cloud SQL 与 PostgreSQL 用户和角色配合使用。 通过 PostgreSQL 角色,您可以控制用户访问 PostgreSQL 实例时所具有的访问权限和能力。

如需查看 PostgreSQL 角色的完整文档,请参阅 PostgreSQL 文档中的数据库角色。如需了解如何创建和管理 Cloud SQL 用户,请参阅创建和管理用户

用户与角色之间的区别

PostgreSQL 角色可以是单个角色,也可以作为一组角色工作。用户是一个能够登录的角色(该角色具有 LOGIN 特性)。由于 Cloud SQL 创建的所有角色都具有 LOGIN 特性,因此在 Cloud SQL 中,��角色”和“用户”这两个术语可以互换使用。但是,如果您使用 psql 客户端创建角色,则该角色不一定具有 LOGIN 属性。

所有 PostgreSQL 用户都必须拥有密码。您不能使用缺少密码的用户登录。

超级用户限制和特权

由于 Cloud SQL for PostgreSQL 是一项托管式服务,因此它会限制对需要高级特权的特定系统过程和表的访问权限。在 Cloud SQL 中,使用者无法创建或访问具有超级用户属性的用户。

您无法创建具有超级用户特权的数据库用户。但是,您可以创建具有 cloudsqlsuperuser 角色的数据库用户,该角色具有一些超级用户特权,包括:

  • 创建需要超级用户特权的扩展程序。
  • 创建事件触发器。
  • 创建复制用户。
  • 创建复制发布和订阅。
  • 以具有 cloudsqlsuperuser 角色的数据库用户身份执行 CREATE CASTDROP CAST 语句。不过,此用户必须对源数据类型和目标数据类型都拥有 USAGE 特权。例如,用户可以创建类型转换,将源 int 数据类型转换为目标 boolean 数据类型。

  • 拥有对 pg_largeobject 目录表的完整访问权限。

默认 PostgreSQL 用户

创建新的 Cloud SQL for PostgreSQL 实例时,系统会创建默认管理员用户 postgres,但不会创建密码。您需要先为此用户设置密码,然后才能登录。您可以在 Google Cloud 控制台中或使用以下 gcloud 命令执行此操作:

gcloud sql users set-password postgres \
--instance=INSTANCE_NAME \
--password=PASSWORD

postgres 用户是 cloudsqlsuperuser 角色的一部分,拥有以���特性(权限):CREATEROLECREATEDBLOGIN。它没有 SUPERUSERREPLICATION 特性。

默认 cloudsqlimportexport 用户具备 CSV 导入/导出操作所需的一组最低权限。您可以创建自己的用户来执行这些操作,如果未创建,则系统将使用默认的 cloudsqlimportexport 用户。cloudsqlimportexport 用户是系统用户,客户无法直接使用。

用于 IAM 身份验证的 Cloud SQL IAM 用户

Identity and Access Management (IAM) 与 Cloud SQL 在名为 IAM 身份验证的功能中集成。使用此功能创建实例时,IAM 用户可以使用其 IAM 用户名和密码登录实例。使用 IAM 身份验证的优势在于,您可以在向用户授予数据库访问权限时使用用户现有的 IAM 凭据。当用户离开组织时,其 IAM 账号会被暂停,系统会自动移除其访问权限。

其他 PostgreSQL 用户

您可以创建其他 PostgreSQL 用户或角色。使用 Cloud SQL 创建且未使用 IAM 创建的用户属于 cloudsqlsuperuser 角色的一部分,并具有与 postgres 用户相同的属性集:CREATEROLECREATEDBLOGIN。您可以使用 ALTER ROLE 命令更改任何用户的属性。

如果您使用 psql 客户端创建新用户,则可以选择将其与其他角色相关联,或为其分配不同的特性。

访问 pg_shadow 视图和 pg_authid

您可以使用 pg_shadow 视图来处理 pg_authid 目录表中标记为 rolcanlogin 的角色的属性。

pg_shadow 视图包含允许登录集群的角色(用户)的哈希密码和其他属性。pg_authid 目录表包含所有数据库角色的哈希密码和其他属性。

在 Cloud SQL 中,客户无法使用默认特权访问 pg_shadow 视图或 pg_authid 表。但是,在某些情况下,访问角色名称和哈希密码很有用,包括:

  • 使用现有用户和密码设置代理或负载均衡
  • 迁移用户,而无需更改密码
  • 实现密码政策管理的自定义解决方案

pg_shadow 视图和 pg_authid 表设置标志

如需访问 pg_shadow 视图,请将 cloudsql.pg_shadow_select_role 标志设置为 PostgreSQL 角色名称。如需访问 pg_authid 表,请将 cloudsql.pg_authid_select_role 标志设置为 PostgreSQL 角色名称。

如果存在 cloudsql.pg_shadow_select_role,则它拥有对 pg_shadow 视图的只读 (SELECT) 权限。如果存在 cloudsql.pg_authid_select_role,它将拥有对 pg_authid 表的 SELECT 访问权限。

如果任一角色不存在,则这些设置无效,但不会出现错误。但是,当用户尝试访问视图或表时,系统会记录错误。该错误记录在 PostgreSQL 数据库日志 (cloudsql.googleapis.com/postgres.log) 中。如需了解如何查看此日志,请参阅查看实例日志

确保存在已配置的角色,并且 cloudsql.pg_shadow_select_role 标志或 cloudsql.pg_authid_select_role 标志的值没有拼写错误。您还可以使用 pg_has_role 函数来验证用户是否是这些角色的成员。如需了解此函数,请参阅系统信息函数和运算符页面。

您可以将 cloudsql.pg_shadow_select_role 标志或 cloudsql.pg_authid_select_role 标志与 PostgreSQL 角色成员资格搭配使用,以管理多个用户的 pg_shadowpg_authid 访问权限。

更改任一标志不需要重启数据库。

如需详细了解受支持的标志,请参阅配置数据库标志

选择密码存储格式

Cloud SQL for PostgreSQL 以哈希格式存储用户密码。您可以使用 password_encryption 标志将加密算法设置为 md5scram-sha-256md5 算法提供最广泛的兼容性,而 scram-sha-256 更安全,但可能与旧版客户端不兼容。

在启用 pg_shadow 访问权限以从 Cloud SQL 实例导出角色属性时,请考虑使用您的客户端支持的最安全算法。

在 PostgreSQL 文档中,另请参阅:

后续步骤