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

其他 PostgreSQL 用户

您可以创建其他 PostgreSQL 用户或角色。您使用 Cloud SQL 创建的所有用户均属于 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 文档中,另请参阅:

后续步骤