使用 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 控制台中,转到 IAM 页面。

    转到 IAM

  2. 点击添加
  3. 新成员输入框中,输入服务账号电子邮件。
  4. 点击角色下拉列表,然后选择 Cloud SQL Client 角色。
  5. 点击添加条件
  6. 输入标题和说明。
  7. 选择条件编辑器标签页。
  8. 条件构建器部分:
    • 对于条件类型 - 资源 - 名称,输入 projects/PROJECT_ID/instances/INSTANCE_ID
    • 确保已选择 AND 条件。
    • 对于条件类型 - 资源 - 服务,请选择 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.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "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 == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

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

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

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

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

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

控制台

  1. 在 Google Cloud 控制台中,转到 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 控制台中,转到 IAM 页面。

    转到 IAM

  2. 点击添加
  3. 新成员字段中,输入服务账号电子邮件地址。
  4. 点击角色下拉列表,然后选择 Cloud SQL Editor 角色。不再为此角色添加任何内容。
  5. 点击保存以保存条件。
  6. 点击同一账号的角色菜单,然后选择 Cloud Cloud SQL Admin 角色。
  7. 点击添加条件
  8. 输入标题和说明。
  9. 选择条件编辑器标签页。
  10. 条件构建器部分:
    • 对于条件类型 - 资源 - 名称,请输入条件的名称。
    • 对于条件类型 - 资源 - 服务,请选择 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