本页面介绍如何将 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 CAST和DROP 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 角色的一部分,拥有以���特性(权限):CREATEROLE、CREATEDB 和 LOGIN。它没有 SUPERUSER 或 REPLICATION 特性。
默认 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 用户相同的属性集:CREATEROLE、CREATEDB 和 LOGIN。您可以使用 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_shadow 或 pg_authid 访问权限。
更改任一标志不需要重启数据库。
如需详细了解受支持的标志,请参阅配置数据库标志。
选择密码存储格式
Cloud SQL for PostgreSQL 以哈希格式存储用户密码。您可以使用 password_encryption 标志将加密算法设置为 md5 或 scram-sha-256。md5 算法提供最广泛的兼容性,而 scram-sha-256 更安全,但可能与旧版客户端不兼容。
在启用 pg_shadow 访问权限以从 Cloud SQL 实例导出角色属性时,请考虑使用您的客户端支持的最安全算法。
在 PostgreSQL 文档中,另请参阅:
后续步骤
- 创建和管理用户。
- 创建和管理数据库。
- 查看有关角色的 PostgreSQL 文档。
- 了解连接到实例的选项。