使用 IAM 条件

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

简介

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

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

用例包括:

  • 允许用户连接到特定实例。

  • 允许用户创建具有特定前缀或后缀(例如“test”)的实例。

  • 限制为测试实例备份操作的权限

  • 允许用户删除开发和测试实例,但不允许删除生产实例。

  • 允许用户在特定日期或特定时间执行管理操作。

允许用户连接到特定实例

假设您希望允许用户或服务帐号仅连接到一个特定 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 文件中:
    {
      "bindings": [
        {
          "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'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
    
  4. 使用新的 bindings.json 文件更新 IAM 政策。
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

Terraform

如需允许用户连接到特定实例,请使用 Terraform google_iam_policy 数据资源google_project_iam_policy Terraform 资源

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'google_sql_database_instance.default.id' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

限制为测试实例备份操作的权限

假设您已配置服务拓扑,使所有测试实例的前缀均为 test(例如 test-instance-1),所有生产实例的前缀均为 prod(例如 prod-instance-1)。

您可以限制用户或服务帐号为测试实例备份操作的权限。该权限限制涉及禁止为测试实例备份 CREATEGETLISTDELETE 操作。

控制台

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

    转到 IAM

  2. 点击主帐号标签页。
  3. 找到您要限制其权限的用户电子邮件地址或服务帐号(主帐号)。
  4. 点击主帐号右侧的修改主帐号图标。此图标显示为一个铅笔图案。
  5. 修改权限对话框中,点击添加其他角色
  6. 在随后出现的对话框的过滤条件字段中,输入 Cloud SQL Admin。然后,选择显示的 Cloud SQL Admin 角色。

    此时修改权限对话框处于活动状态,并且 Cloud SQL Admin 角色现已显示在对话框中。

  7. Cloud SQL Admin 角色右侧,点击添加条件链接。
  8. 修改条件对话框中,提供以下信息:
    1. 标题字段中,输入要添加的条件的名称,以限制为测试实例备份操作的权限。例如,您可以输入 Limit access to backup operations
    2. 点击条件编辑器标签页,然后添加以下条件:

      resource.type == "sqladmin.googleapis.com/BackupRun" &&
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. 点击保存
  10. 修改权限对话框中,点击保存

gcloud

此示例使用以下变量:

  • PROJECT_ID:您的 Google Cloud 项目。
  • USER_EMAIL:用户的电子邮件地址。
  • SERVICE_ACCOUNT_EMAIL:您要限制其权限的服务帐号的完整电子邮件地址。

  1. 限制电子邮件地址为 USER_EMAIL 的用户的 cloudsql.admin 角色的范围。

    该角色的范围会被限定为资源名称以 projects/PROJECT_ID/instances/test 开头的资源。

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. OR

  3. 限制使用 SERVICE_ACCOUNT_EMAIL 服务帐号登录的用户的 cloudsql.admin 角色的范围。

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

允许用户删除测试实例,但不允许删除生产实例

假设您要允许服务帐号删除测试实例,但不允许删除生产实例。为此,您可以使用标记,并为服务帐号添加以下两个政策绑定:

  • 您授予 Cloud SQL Editor 角色的资源及其后代的 Cloud SQL Editor 角色。如果在项目上授予此角色,则此角色将应用于项目中的所有实例。Cloud SQL Editor 角色不包含 cloudsql.instances.delete 权限。
  • 具有 test 标记的实例的 Cloud SQL Admin 角色。

控制台

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

    转到 IAM

  2. 点击添加
  3. 新成员字段中,输入服务帐号电子邮件地址。
  4. 点击角色下拉列表,然后选择 Cloud SQL Editor 角色。不再为此角色添加任何内容。
  5. 点击保存以保存条件。
  6. 点击同一帐号的角色菜单,然后选择 Cloud Cloud SQL Admin 角色。
  7. 点击添加条件
  8. 输入标题和说明。
  9. 选择条件编辑器标签页。
  10. 条件构建器部分:
    • 对于条件类型 - 资源 - 类型,选择 sqladmin.googleapis.com/Instance
    • 对于条件类型 - 资源 - 名称,请输入条件的名称。
    • 对于条件类型 - 资源 - 服务,请选择 sqladmin.googleapis.com
    • 对于条件类型 - 资源 - 标记,请输入标记键命名空间名称。对于此示例,运算符matches,值为 815471563813/env/test
  11. 点击保存以保存条件。
  12. 点击保存以保存政策。

gcloud

此示例使用以下变量:

  • PROJECT_ID:您的 Google Cloud 项目。
  • INSTANCE_ID:您的 Cloud SQL 实例。
  • REGION:您的 Cloud SQL 实例所在的区域。
  • ORGANIZATION_ID:将成为此标记键的父级资源的组织的 ID,例如:12345678901。如需了解如何获取组织 ID,请参阅创建和管理组织
  • SERVICE_ACCOUNT_EMAIL:您要修改其访问权限的服务帐号的完整电子邮件地址。

  1. 创建一个名为“env”的标记键,标记值为“prod”和“test”。如需了解详情,请参阅创建和定义新标记
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. 将值为“test”的“env”标记附加到测试环境 Cloud SQL 实例。如需了解详情,请参阅 Cloud SQL 标记页面。
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. 获取现有 IAM 政策绑定并将其输出到文件 bindings.json 中:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. 将以下条件绑定添加到 bindings.json 文件中:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
    
  6. 使用新的 bindings.json 文件更新 IAM 政策绑定。
    gcloud projects set-iam-policy PROJECT_ID bindings.json