本页面介绍如何将 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) 在名为 IAM 身份验证的功能中与 Cloud SQL 集成。使用此功能创建实例时,IAM 用户可以使用其 IAM 用户名和密码登录实例。使用 IAM 身份验证的优势在于,您可以在向用户授予数据库访问权限时使用用户现有的 IAM 凭据。当用户离开组织时,其 IAM 账号会被暂停,系统会自动移除其访问权限。
其他 PostgreSQL 用户
您可以创建其他 PostgreSQL 用户或角色。您使用 Cloud SQL 创建的所有用户均属于 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 文档。
- 了解连接到实例的选项。