项目访问权限控制

本页面介绍如何使用 Identity and Access Management (IAM) 控制 Cloud SQL 项目访问和权限。

概览

Google Cloud 提供 Identity and Access Management (IAM),可让您授予对特定 Google Cloud 资源的更细化访问权限,并防止对其他资源进行不必要的访问。本页面介绍了 Cloud SQL IAM 角色和权限。如需详细了解 Google Cloud IAM,请参阅 IAM 文档

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

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

Cloud SQL 还支持 IAM Conditions,它可以在个别 Cloud SQL 资源级层(例如项目中的实例)上优化角色和权限。您可以将条件添加为 IAM 政策绑定的特性,以指定主帐号可以访问的实例子集。

IAM Conditions 允许您根据多个特性授予角色。例如,您可以只允许在特定日期和时间访问,或仅授予对特定名称的 Cloud SQL 资源的访问权限。本页面包含一些将 IAM Conditions 与 Cloud SQL 搭配使用的示例。如需详细了解 IAM 条件,请参阅 IAM Conditions 概览页面。

权限和角色

本部分汇总了 Cloud SQL 支持的各种权限和角色。

预定义角色

Cloud SQL 提供了一些预定义角色,可供您用来为主帐号提供更精细的权限。您授予主帐号的角色决定了主帐号可以执行的操作。主帐号可以是个人、群组或服务帐号。

如果您拥有相关权限,可向同一主帐号授予多个角色,还可随时更改授予主帐号的角色。

权限范围较广的角色拥有权限范围较窄的角色的所有权限。例如,Cloud SQL Editor 角色不但拥有 Cloud SQL Viewer 角色的所有权限,还添加了一些专有权限。同样,Cloud SQL Admin 角色不但拥有 Cloud SQL Editor 角色的所有权限,还添加了一些专有权限。

基本角色(Owner、Editor、Viewer)提供对整个 Google Cloud 的权限。Cloud SQL 专有角色仅提供 Cloud SQL 权限,但以下 Google Cloud 权限除外,因为这些是 Google Cloud 常规使用所需的权限:

  • resourcemanager.projects.get
  • resourcemanager.projects.list
  • serviceusage.quotas.get
  • serviceusage.services.get
  • serviceusage.services.use

下表列出了适用于 Cloud SQL 的预定义角色及其所含 Cloud SQL 权限:

角色
名称
说明
Cloud SQL 权限
roles/owner
Owner(旧版角色)
对所有 Google Cloud 资源拥有完整访问权限和控制权;管理用户访问权限。

cloudsql.*
roles/editor
Editor(旧版角色)
对所有 Google Cloud 和 Cloud SQL 资源拥有读写权限(拥有完全控制权,但不能修改权限)

除以下权限以外的所有 cloudsql 权限
cloudsql.*.getIamPolicy
cloudsql.*.setIamPolicy
roles/viewer
Viewer(旧版角色)
对所有 Google Cloud 资源(包括 Cloud SQL 资源)拥有只读权限。

cloudsql.*.export
cloudsql.*.get
cloudsql.*.list
roles/cloudsql.admin
Cloud SQL Admin
对所有 Cloud SQL 资源拥有完全控制权。

cloudsql.*
recommender.cloudsqlInstanceDiskUsageTrendInsights.*
recommender.cloudsqlInstanceOutOfDiskRecommendations.* recommender.cloudsqlInstanceDiskUsageTrendInsights.*
recommender.cloudsqlInstanceOutOfDiskRecommendations.* recommender.cloudsqlInstanceDiskUsageTrendInsights.*
recommender.cloudsqlInstanceOutOfDiskRecommendations.*
recommender.cloudsqlInstanceCpuUsageInsights.*
recommender.cloudsqlInstanceMemoryUsageInsights.*
recommender.cloudsqlOverprovisionedInstanceRecommendations.*
recommender.cloudsqlInstanceActivityInsights.*
recommender.cloudsqlIdleInstanceRecommendations.*
roles/cloudsql.editor
Cloud SQL Editor
管理 Cloud SQL 资源。 不能查看或修改权限,也不能修改用户或 sslCert。不能导入数据或从备份恢复实例,也不能克隆、删除或升级实例。不能启动或停止副本。不能删除数据库、副本或备份。

cloudsql.instances.addServerCa
cloudsql.instances.connect
cloudsql.instances.export
cloudsql.instances.failover
cloudsql.instances.get
cloudsql.instances.list
cloudsql.instances.listServerCas
cloudsql.instances.restart
cloudsql.instances.rotateServerCa
cloudsql.instances.truncateLog
cloudsql.instances.update
cloudsql.databases.create
cloudsql.databases.get
cloudsql.databases.list
cloudsql.databases.update
cloudsql.backupRuns.create
cloudsql.backupRuns.get
cloudsql.backupRuns.list
cloudsql.sslCerts.get
cloudsql.sslCerts.list
cloudsql.users.list
recommender.cloudsqlInstanceDiskUsageTrendInsights.get
recommender.cloudsqlInstanceDiskUsageTrendInsights.list
recommender.cloudsqlInstanceDiskUsageTrendInsights.update
recommender.cloudsqlInstanceOutOfDiskRecommendations.get
recommender.cloudsqlInstanceOutOfDiskRecommendations.list
recommender.cloudsqlInstanceOutOfDiskRecommendations.update
recommender.cloudsqlInstanceCpuUsageInsights.get
recommender.cloudsqlInstanceCpuUsageInsights.list
recommender.cloudsqlInstanceCpuUsageInsights.update
recommender.cloudsqlInstanceMemoryUsageInsights.get
recommender.cloudsqlInstanceMemoryUsageInsights.list
recommender.cloudsqlInstanceMemoryUsageInsights.update
recommender.cloudsqlOverprovisionedInstanceRecommendations.get
recommender.cloudsqlOverprovisionedInstanceRecommendations.list
recommender.cloudsqlOverprovisionedInstanceRecommendations.update
recommender.cloudsqlInstanceActivityInsights.get
recommender.cloudsqlInstanceActivityInsights.list
recommender.cloudsqlInstanceActivityInsights.update
recommender.cloudsqlIdleInstanceRecommendations.get
recommender.cloudsqlIdleInstanceRecommendations.list
recommender.cloudsqlIdleInstanceRecommendations.update
roles/cloudsql.viewer
Cloud SQL Viewer
对所有 Cloud SQL 资源拥有只读权限。

cloudsql.*.export
cloudsql.*.get
cloudsql.*.list
cloudsql.instances.listServerCa
recommender.cloudsqlInstanceOutOfDiskRecommendations.get
recommender.cloudsqlInstanceOutOfDiskRecommendations.list
recommender.cloudsqlInstanceDiskUsageTrendInsights.get
recommender.cloudsqlInstanceDiskUsageTrendInsights.list
recommender.cloudsqlInstanceCpuUsageInsights.get
recommender.cloudsqlInstanceCpuUsageInsights.list
recommender.cloudsqlInstanceMemoryUsageInsights.get
recommender.cloudsqlInstanceMemoryUsageInsights.list
recommender.cloudsqlOverprovisionedInstanceRecommendations.get
recommender.cloudsqlOverprovisionedInstanceRecommendations.list
recommender.cloudsqlInstanceActivityInsights.get
recommender.cloudsqlInstanceActivityInsights.list
recommender.cloudsqlIdleInstanceRecommendations.get
recommender.cloudsqlIdleInstanceRecommendations.list
roles/cloudsql.client
Cloud SQL Client
拥有从 App Engine 和 Cloud SQL Auth 代理连接到 Cloud SQL 实例的权限。使用 IP 地址访问实例时不需要此角色。

cloudsql.instances.connect
cloudsql.instances.get
roles/cloudsql.instanceUser
Cloud SQL Instance User
此角色可访问 Cloud SQL 实例。

cloudsql.instances.get
cloudsql.instances.login

自定义角色

如果预定义角色不能满足您的独特业务需求,您可以使用指定的权限定义自己的自定义角色。为此,IAM 提供了自定义角色

为 Cloud SQL 创建自定义角色时,如果要添加 cloudsql.instances.listcloudsql.instances.get,请务必同时添加这两项权限。否则,Cloud Console 将无法正常处理 Cloud SQL。

Cloud Console 中常见任务所需的权限

任务 所需其他权限
显示实例列表页面 cloudsql.instances.list
resourcemanager.projects.get
创建实例 cloudsql.instances.create
cloudsql.instances.get
cloudsql.instances.list
resourcemanager.projects.get
compute.machineTypes.list
compute.machineTypes.get
compute.projects.get roles/compute.viewer
使用 Cloud Shell 连接到实例 cloudsql.instances.get
cloudsql.instances.list
cloudsql.instances.update
resourcemanager.projects.get
创建用户 cloudsql.instances.get
cloudsql.instances.list
cloudsql.users.create
cloudsql.users.list
resourcemanager.projects.get
查看实例信息 cloudsql.instances.get
cloudsql.instances.list
cloudsql.users.list
monitoring.timeSeries.list
resourcemanager.projects.get

gcloud sql 命令所需的权限

命令 所需权限
gcloud sql backups create cloudsql.backupRuns.create
gcloud sql backups delete cloudsql.backupRuns.delete
gcloud sql backups describe cloudsql.backupRuns.get
gcloud sql backups list cloudsql.backupRuns.list
gcloud sql backups restore cloudsql.backupRuns.get
cloudsql.instances.restoreBackup
gcloud sql connect cloudsql.instances.get
cloudsql.instances.update
gcloud sql databases create cloudsql.databases.create
gcloud sql databases delete cloudsql.databases.delete
gcloud sql databases describe cloudsql.databases.get
gcloud sql databases list cloudsql.databases.list
gcloud sql databases patch cloudsql.databases.get
cloudsql.databases.update
gcloud sql export cloudsql.instances.export
cloudsql.instances.get
gcloud sql flags list
gcloud sql import cloudsql.instances.import
gcloud sql instances clone cloudsql.instances.clone
gcloud sql instances create cloudsql.instances.create
gcloud sql instances delete cloudsql.instances.delete
gcloud sql instances describe cloudsql.instances.get
gcloud sql instances failover cloudsql.instances.failover
gcloud sql instances import cloudsql.instances.import
gcloud sql instances list cloudsql.instances.list
gcloud sql instances patch cloudsql.instances.get
cloudsql.instances.update
gcloud sql instances promote-replica cloudsql.instances.promoteReplica
gcloud sql instances reset-ssl-config cloudsql.instances.resetSslConfig
gcloud sql instances restart cloudsql.instances.restart
gcloud sql instances restore-backup cloudsql.backupRuns.get
cloudsql.instances.restoreBackup
gcloud sql operations describe cloudsql.instances.get
gcloud sql operations list cloudsql.instances.get
gcloud sql operations wait cloudsql.instances.get
gcloud sql ssl client-certs create cloudsql.sslCerts.create
gcloud sql ssl client-certs delete cloudsql.sslCerts.delete
gcloud sql ssl client-certs describe cloudsql.sslCerts.list
gcloud sql ssl client-certs list cloudsql.sslCerts.list
gcloud sql tiers list
gcloud sql users create cloudsql.users.create
gcloud sql users delete cloudsql.users.delete
gcloud sql users list cloudsql.users.list
gcloud sql users set-password cloudsql.users.update

API 方法所需的权限

下表列出了调用方在调用 Cloud SQL Admin API 中的每种方法或通过使用该 API 的 Google Cloud 工具(例如 Google Cloud Console 或 gcloud 命令行工具)执行任务时必须具备的权限。

所有权限都会应用于项目。您不能基于实例或其他较低级别的对象应用不同的权限。

方法 所需权限
backupRuns.delete cloudsql.backupRuns.delete
backupRuns.get cloudsql.backupRuns.get
backupRuns.insert cloudsql.backupRuns.create
backupRuns.list cloudsql.backupRuns.list
databases.delete cloudsql.databases.delete
databases.get cloudsql.databases.get
databases.insert cloudsql.databases.create
databases.list cloudsql.databases.list
databases.patch cloudsql.databases.updatecloudsql.databases.get
databases.update cloudsql.databases.update
flags.list
instances.clone cloudsql.instances.clone
instances.delete cloudsql.instances.delete
instances.export cloudsql.instances.export
instances.failover cloudsql.instances.failover
instances.get cloudsql.instances.get
instances.import cloudsql.instances.import
instances.insert cloudsql.instances.create
instances.list cloudsql.instances.list
instances.patch cloudsql.instances.getcloudsql.instances.update
instances.promoteReplica cloudsql.instances.promoteReplica
instances.resetSslConfig cloudsql.instances.resetSslConfig
instances.restart cloudsql.instances.restart
instances.restoreBackup cloudsql.backupRuns.getcloudsql.instances.restoreBackup
instances.startReplica cloudsql.instances.startReplica
instances.stopReplica cloudsql.instances.stopReplica
instances.truncateLog cloudsql.instances.truncateLog
instances.update cloudsql.instances.update
operations.get cloudsql.instances.get
operations.list cloudsql.instances.get
sslCerts.delete cloudsql.sslCerts.delete
sslCerts.get cloudsql.sslCerts.get
sslCerts.insert cloudsql.sslCerts.create
sslCerts.list cloudsql.sslCerts.list
users.delete cloudsql.users.delete
users.insert cloudsql.users.create
users.list cloudsql.users.list
users.update cloudsql.users.update

管理 Cloud SQL for PostgreSQL IAM

您可以使用 Google Cloud Console、API 的 IAM 方法或 Cloud SDK 来获取和设置 IAM 政策及角色。如需了解详情,请参阅授予、更改和撤消访问权限

IAM Conditions

通过 IAM Conditions,您可以为 Google Cloud 资源(包括 Cloud SQL 实例)定义和强制执行基于特性的条件访问权限控制。如需详细了解 IAM Conditions,请参阅 IAM Conditions 概览页面。

在 Cloud SQL 中,您可以根据以下特性实施条件 IAM 访问:

  • 日期/时间特性:用于设置对 Cloud SQL 资源的临时(很快就会过期)、预定或限时访问权限。例如,您可以在指定日期之前允许用户访问数据库实例。您可以在资源层次结构的任何级层使用日期/时间特性。如需了解详情,请参阅配置临时访问权限

  • 资源特性:用于根据资源名称、资源类型或资源服务特性配置条件访问权限。在 Cloud SQL 中,您可以使用数据库实例的特性来配置条件访问权限。如需了解详情,请参阅配置基于资源的访问权限

用例包括:

  • 允许用户连接到特定实例。
  • 允许用户删除开发和测试实例,但不允许删除生产实例。
  • 允许用户在特定日期或特定时间执行管理操作。

允许用户连接到特定实例

假设您希望允许服务帐号拥有仅连接到一个特定 Cloud SQL 实例的权限。您可以在 IAM 政策绑定中添加 IAM 条件,以向该用户授予 Cloud SQL 角色的权限。

默认情况下,预定义的 Cloud SQL Client 角色 (roles/cloudsql.client) 包含 cloudsql.instances.connect 权限,它授权其主帐号连接到项目中的所有 Cloud SQL 实例。通过在政策绑定中引入 IAM 条件,您可以仅向已命名的实例授予权限。

控制台

此示例展示了如何修改现有项目的 IAM 绑定,以向服务帐号授予特定实例的 Cloud SQL Client 角色。

此示例使用以下变量:

  • PROJECT_ID:您的 Google Cloud 项目。
  • INSTANCE_ID:您要授予访问权限的实例的名称。

  1. 在 Google Cloud Console 中,转到 IAM 页面。

    IAM

  2. 点击添加
  3. 新主帐号输入框中,输入服务帐号电子邮件。
  4. 点击角色下拉列表,然后选择 Cloud SQL Client 角色。
  5. 点击添加条件
  6. 输入标题和说明。
  7. 选择条件编辑器标签页。
  8. 条件构建器部分:
    • 对于条件类型 - 资源 - 类型,选择 sqladmin.googleapis.com/Instance
    • 对于条件类型 - 资源 - 名称,输入 projects/PROJECT_ID/instances/INSTANCE_ID
    • 对于条件类型 - 资源 - 服务,请选择 sqladmin.googleapis.com
  9. 点击保存以保存条件。
  10. 点击保存以保存政策。

gcloud

此示例展示了如何修改该项目的现有 IAM 政策绑定,以便为特定服务帐号授予 Cloud SQL Client 角色,但仅限于特定实例。

此示例使用以下变量:

  • PROJECT_ID:您的 Google Cloud 项目。
  • INSTANCE_ID:您要授予访问权限的实例的名称。
  • SERVICE_ACCOUNT_EMAIL:您要修改其访问权限的服务帐号的完整电子邮件地址。

  1. 获取现有 IAM 政策绑定并将其输出到文件 bindings.json 中:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. 将以下条件角色绑定添加到 bindings.json 文件中:
    {
      "role": "roles/cloudsql.client",
      "members": [
        "serviceAccount:SERVICE_ACCOUNT_EMAIL"
      ],
      "condition": {
        "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
          && resource.type == 'sqladmin.googleapis.com/Instance'"
      }
    }
    
  4. 使用新的 bindings.json 文件更新 IAM 政策。
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

后续步骤