IAM 身份验证

Google Cloud 提供 Identity and Access Management (IAM),可让您授予对特定 Google Cloud 资源的访问权限,并防止对其他资源进行不必要的访问。本页面介绍了 Cloud SQL 如何与 IAM 集成,以及如何使用 IAM 来管理对 Cloud SQL 资源的访问权限以及进行数据库身份验证。如需详细了解 Google Cloud IAM,请参阅 IAM 文档

Cloud SQL 提供了一组预定义角色,旨在帮助您控制对 Cloud SQL 资源的访问权限。如果预定义角色无法提供您所需的权限集,您还可以创建自己的自定义角色。此外,旧版基本角色(Editor、Viewer、Owner)仍可供您使用,但这些角色提供的控制不如 Cloud SQL 角色那样精细。具体而言,基本角色提供的是对整个 Google Cloud 资源的访问权限,而不仅仅是对 Cloud SQL 的访问权限。如需详细了解基本 Google Cloud 角色,请参阅基本角色

您可以在资源层次结构中的任一层级设置 IAM 政策:组织级、文件夹级或项目级。资源会继承其所有父级资源的政策。

适用于 Cloud SQL 的 IAM 参考文档

IAM 身份验证概念

使用 IAM 身份验证时,不会直接向最终用户授予资源(Cloud SQL 实例)访问权限。而是将权限分组为多个角色,然后将这些角色授予主账号。如需了解详情,请参阅 IAM 概览

让用户通过 IAM 数据库身份验证登录的管理员可以使用 IAM 身份验证通过 IAM 政策集中管理其实例的访问权限控制。

IAM 政策涉及以下实体:

  • 主账号。在 Cloud SQL 中,您可以使用多种类型的主账号:用户账号、服务账号(对于应用)或群组。 如需了解详情,请参阅与身份相关的概念
  • 角色。角色是一组权限的集合。您可以向主账号授予角色,以便为他们提供完成特定任务所需的权限。例如,使用 IAM 数据库身份验证时,主账号需要 cloudsql.instances.login 权限才能登录实例,Cloud SQL Instance User 角色可提供此权限。如需获得此权限,请将用户、服务账号或群组绑定到预定义的 Cloud SQL 角色或可提供该权限的自定义角色。如需详细了解 IAM 角色,请参阅角色
  • 资源。主账号有权访问的资源是 Cloud SQL 实例。默认情况下,IAM 政策绑定在项目级层应用,以便主账号获得项目中所有 Cloud SQL 实例的角色权限。

IAM 数据库身份验证

数据库身份验证是验证尝试访问数据库的用户身份的过程。在 Cloud SQL 中,您可以为数据库用户使用以下类型的数据库身份验证:

  • 数据库的内置身份验证使用用户名和密码对数据库用户进行身份验证。
  • IAM 数据库身份验证通过访问令牌使用 IAM 对用户进行身份验证。

比较数据库身份验证选项

下表比较了 Cloud SQL 的不同数据库身份验证方法。

功能 内置数据库身份验证 IAM 数据库身份验证(单独) IAM 群组身份验证
身份验证方法 密码 临时身份验证令牌 临时身份验证令牌
网络流量加密 无需 SSL 需要 SSL 需要 SSL
用户管理 手动 通过 IAM 集中管理 通过 IAM 和 Cloud Identity 群组集中管理

IAM 群组身份验证

IAM 群组身份验证让您可在群组级管理 Cloud SQL 用户。群组的示例包括 Cloud Identity 群组。 此功能简化了数据库用户管理。您可以同时管理多个账号的 Cloud SQL IAM 角色或权限,而无需单独更新每个用户或服务账号。您还可以授予和撤消 Cloud Identity 群组的数据库权限。 您添加到 Cloud Identity 群组的任何新账号都会继承该群组的权限。

使用 IAM 群组身份验证,您可以执行以下操作:

  • 将用户添加到群组,并让用户自动继承其 IAM 角色和数据库权限。
  • 从群组中移除用户,从 Cloud SQL 数据库中移除其登录访问权限和数据库权限。
  • 向群组一次性授予登录或数据库权限,而不必多次向不同用户授予相同的权限。
  • 同时移除群组的登录权限或对数据库对象的访问权限。

即使 IAM 角色和权限在群组级分配,用户和服务账号也会使用各自的 IAM 账号和凭据(而不是共享群组账号)登录。首次登录后,Cloud SQL 会在该实例上为用户或服务账号创建一个数据库账号。

每个用户或服务账号的单独登录和数据库活动均会显示在审核日志中。出于审核目的,您可以查看哪个账号在数据库中执行了哪项操作。

如需详细了解如何使用 Cloud Identity 群组,请参阅 Cloud Identity 概览

将用户或服务账号添加到群组时,Cloud SQL 会发生以下更改:

  • 如果您已向群组授予 IAM 登录权限,则用户或服务账号将有权登录 Cloud SQL 实例,因为用户或服务账号属于该群组。
  • 用户会自动继承已授予该群组的任何数据库权限

从群组中移除用户或服务账号后,Cloud SQL 会发生以下更改:

  • 用户会失去之前由该群组成员继承的所有数据库权限。
  • 如果用户通过其他群组成员资格接收 Cloud SQL 实例的 IAM 登录权限,则他们可能仍然可以登录。不过,用户在登录后将不会拥有其之前群组成员资格所拥有的数据库权限。

IAM 群组身份验证最佳实践

  • 在 Cloud Identity 中撤消 IAM 群组的登录权限 (cloudsql.instances.login) 时,请务必同时从 Cloud SQL 实例中删除该群组。
  • 从 Cloud Identity 中删除群组时,请务必同时从 Cloud SQL 实例中删除该群组。
  • 使用群组在数据库中配置基于角色的访问控制。请始终向群组提供所需的最小权限。
  • 请勿向内置用户授予 IAM 群组身份验证角色。例如,如果您有内置用户 user-a 并创建了一个 IAM 群组身份验证用户 user-b@example.com,则请勿向 user-a 授予 user-b@example.com 角色。

IAM 群组身份验证限制

  • 使用 IAM 群组身份验证时,如果您有一个具有读取副本的 Cloud SQL 实例,则必须先登录主实例,然后再登录读取副本实例。首次登录主实例后,群组用户信息会复制到读取副本。对于后续登录,您可以直接登录读取副本。
  • 您最多可以向一个实例添加 200 个 IAM 群组。
  • 您不能添加属于同一实例上的群组的单个 IAM 用户或服务账号。换句话说,如果已存在类型为 CLOUD_IAM_GROUP_USERCLOUD_IAM_GROUP_SERVICE_ACCOUNT 的同一账号,则无法添加类型为 CLOUD_IAM_USERCLOUD_IAM_SERVICE_ACCOUNT 的账号。
  • 如果实例中已存在类型为 CLOUD_IAM_USERCLOUD_IAM_SERVICE_ACCOUNT 的个人账号,则该账号不能用于 IAM 群组身份验证。这些用户类型不会继承群组的 IAM 角色和数据库权限。

    如需解决此问题并将该账号用于 IAM 群组身份验证,请移除个人 IAM 用户或服务账号。

    如需了解详情,请参阅现有 IAM 用户或服务账号未继承授予其群组的数据库权限
  • 对 Cloud Identity 群组成员资格的更改(例如添加账号)大约需要 15 分钟才能完成传播。此时间是出了 IAM 更改所需的时间之外。

自动 IAM 数据库身份验证与手动 IAM 数据库身份验证

Cloud SQL for PostgreSQL 有两种 IAM 数据库身份验证选项:自动和手动。

自动 IAM 数据库身份验证

自动 IAM 数据库身份验证可让您将请求和管理访问令牌工作交给中间 Cloud SQL 连接器(例如 Cloud SQL Auth 代理或 Cloud SQL 语言连接器之一)。通过自动 IAM 数据库身份验证,用户只需要在来自客户端的连接请求中传递 IAM 数据库用户名。连接器代表客户端提交密码特性的访问令牌信息。

自动 IAM 数据库身份验证需要使用 Cloud SQL 连接器,并且受 Cloud SQL Auth 代理Go 连接器Java 连接器Python 连接器支持。

为了获得最安全、最可靠的体验,我们建议您使用自动 IAM 数据库身份验证。IAM 数据库身份验证使用 OAuth 2.0 访问令牌,这些令牌短期有效,仅在一小时内有效。Cloud SQL 连接器能够请求和刷新这些令牌,从而确保依赖于连接池的长期有效进程或应用具有稳定的连接。强烈建议您使用自动 IAM 数据库身份验证,而非手动身份验证。

如需了解详情,请参阅使用自动 IAM 数据库身份验证登录

手动 IAM 数据库身份验证

手动 IAM 数据库身份验证要求 IAM 主账号在客户端连接请求中明确传递密码特性的访问令牌。主账号必须先登录 Google Cloud 并向 IAM 明确请求访问令牌。

使用 gcloud CLI,您可以明确请求一个具有 Cloud SQL Admin API 范围的 OAuth 2.0 令牌,用于登录数据库。当您使用 IAM 数据库身份验证以数据库用户身份登录时,将您的电子邮件地址用作用户名,并将访问令牌用作密码。您可以将此方法与数据库的直接连接或 Cloud SQL 连接器搭配使用。

使用 IAM 数据库身份验证登录只能通过 SSL 连接执行。

如需了解详情,请参阅使用手动 IAM 数据库身份验证登录

用户和服务账号管理

如需为用户和服务账号授予使用 IAM 数据库身份验证访问实例上的数据库的权限,您需要将它们添加到实例中或将其添加到有权访问实例的群组中。如需了解详情,请参阅添加使用 IAM 的用户或服务账号

如果您使用 Google Cloud 控制台添加用户或服务账号,则 Cloud SQL 会要求您为用户添加“Cloud SQL User”角色。用户必须登录此角色才能登录实例。

如果您使用 gcloud 或 API 添加用户,则需要手动授予登录权限。使用 PostgreSQL GRANT 命令授予数据库权限

Cloud SQL IAM 数据库身份验证的实例配置

您可以使用 cloudsql.iam_authentication 标志在实例上启用 IAM 数据库身份验证。启用此标志后,实例即可支持已配置为使用 IAM 数据库身份验证的账号登录。

IAM 群组身份验证和 IAM 数据库身份验证需要使用此标志。

设置此标志不会阻止现有的非 IAM 用户使用其用户名和密码登录。但是,如果您在实例上停用了此标志,则之前使用 IAM 数据库身份验证添加的任何用户都将无法访问该实例。如需了解详情,请参阅配置实例以使用 IAM 数据库身份验证

不同实例场景的 Cloud SQL IAM 数据库身份验证

读取副本 读取副本中不会自动启用 IAM 数据库身份验证,即使主实例启用了此功能也不例外。创建读取副本后,您需要添加 IAM 数据库身份验证。如需了解详情,请参阅配置读取副本登录以使用 IAM 数据库身份验证
恢复的实例 如果先前备份了某个实例,后来在同一项目的相同或不同实例中恢复它,则当前用户登录授权适用。如果您要将备份恢复到另一个项目中的新实例,则需要为新实例设置用户授权。如需了解详情,请参阅添加使用 IAM 数据库身份验证的用户或服务账号

IAM 条件简介

IAM Conditions 允许您根据多个特性授予角色。例如,您可以只允许在特定日期和时间访问,或仅授予对特定名称的 Cloud SQL 资源的访问权限。

如需详细了解 IAM Conditions,请参阅 IAM Conditions 概览页面。 您还可以详细了解如何将 IAM Conditions 与 Cloud SQL 搭配使用,包括示例。

使用 Cloud Audit Logs

如需保留数据访问(包括登录)的记录,您可以使用审核日志。Cloud Audit Logs 默认处于关闭状态。您需要开启数据访问审核日志才能进行登录跟踪。将审核日志记录用于此目的会产生数据日志记录费用。如需了解详情,请参阅审核日志配置数据访问审核日志日志记录数据的价格

限制

  1. IAM 数据库身份验证用户账号的登录名必须全部采用小写字母。例如 example-user@example.com。不允许使用 Example-User@example.com
  2. 为了安全起见,使用 IAM 数据库身份验证的登录仅适用于 SSL 连接。未加密的连接会被拒绝。
  3. 每个实例都有每分钟登录(包括成功的登录和失败的登录)配额。超出配额时,登录暂时无法进行。我们建议您不要频繁登录,并使用已获授权的网络限制登录。 登录授权的配额为每个实例每分钟 12000 次。

后续步骤