通过 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:您要授予访问权限的实例的名称。
-
在 Google Cloud 控制台中,转到 IAM 页面。
- 点击添加。
- 在新成员输入框中,输入服务账号电子邮件。
- 点击角色下拉列表,然后选择 Cloud SQL Client 角色。
- 点击添加条件。
- 输入标题和说明。
- 选择条件编辑器标签页。
- 在条件构建器部分:
- 对于条件类型 - 资源 - 名称,输入
projects/PROJECT_ID/instances/INSTANCE_ID
。 - 确保选中 AND 条件。
- 对于条件类型 - 资源 - 服务,请选择
sqladmin.googleapis.com
。
- 对于条件类型 - 资源 - 名称,输入
- 点击保存以保存条件。
- 点击保存以保存政策。
gcloud
此示例展示了如何修改该项目的现有 IAM 政策绑定,以便为特定服务账号授予 Cloud SQL Client 角色,但仅限于特定实例。
此示例使用以下变量:
- PROJECT_ID:您的 Google Cloud 项目。
- INSTANCE_ID:您要授予访问权限的实例的名称。
- SERVICE_ACCOUNT_EMAIL:您要修改其访问权限的服务账号的完整电子邮件地址。
- 获取现有 IAM 政策绑定并将其输出到文件
bindings.json
中: - 将以下条件角色绑定添加到
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 }
- 使用新的
bindings.json
文件更新 IAM 政策。gcloud projects set-iam-policy PROJECT_ID bindings.json
gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
Terraform
如需允许用户连接到特定实例,请使用 Terraform google_iam_policy
数据资源和 google_project_iam_policy
Terraform 资源:
应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用删除防护,请在 Terraform 配置文件中将
deletion_protection
参数设置为false
。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes
,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
yes
,以移除之前使用 Terraform 配置应用的资源:terraform destroy
限制为测试实例备份操作的权限
假设您已配置服务拓扑,使所有测试实例的前缀均为 test
(例如 test-instance-1
),所有生产实例的前缀均为 prod
(例如 prod-instance-1
)。
您可以限制用户或服务账号为测试实例备份操作的权限。该权限限制涉及禁止为测试实例备份 CREATE
、GET
、LIST
或 DELETE
操作。
控制台
-
在 Google Cloud 控制台中,转到 IAM 页面。
- 点击主账号标签页。
- 找到您要限制其权限的用户电子邮件地址或服务账号(主账号)。
- 点击主账号右侧的修改主账号图标。此图标显示为一个铅笔图案。
- 在修改权限对话框中,点击添加其他角色。
在随后出现的对话框的过滤条件字段中,输入
Cloud SQL Admin
。然后,选择显示的 Cloud SQL Admin 角色。此时修改权限对话框处于活动状态,并且 Cloud SQL Admin 角色现已显示在对话框中。
- 在 Cloud SQL Admin 角色右侧,点击添加条件链接。
- 在修改条件对话框中,提供以下信息:
- 在标题字段中,输入要添加的条件的名称,以限制为测试实例备份操作的权限。例如,您可以输入
Limit access to backup operations
。 点击条件编辑器标签页,然后添加以下条件:
resource.type == "sqladmin.googleapis.com/BackupRun" && resource.name.startsWith("projects/PROJECT_ID/instances/test")
- 在标题字段中,输入要添加的条件的名称,以限制为测试实例备份操作的权限。例如,您可以输入
- 点击保存。
- 在修改权限对话框中,点击保存。
gcloud
此示例使用以下变量:
- PROJECT_ID:您的 Google Cloud 项目。
- USER_EMAIL:用户的电子邮件地址。
- SERVICE_ACCOUNT_EMAIL:您要限制其权限的服务账号的完整电子邮件地址。
-
限制电子邮件地址为 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"
-
限制使用 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"
OR
允许用户删除测试实例,但不允许删除生产实例
假设您要允许服务账号删除测试实例,但不允许删除生产实例。为此,您可以使用标记,并为服务账号添加以下两个政策绑定:
- 您授予 Cloud SQL Editor 角色的资源及其后代的 Cloud SQL Editor 角色。如果在项目上授予此角色,则此角色将应用于项目中的所有实例。Cloud SQL Editor 角色不包含
cloudsql.instances.delete
权限。 - 具有
test
标记的实例的 Cloud SQL Admin 角色。
控制台
-
在 Google Cloud 控制台中,转到 IAM 页面。
- 点击添加。
- 在新成员字段中,输入服务账号电子邮件地址。
- 点击角色下拉列表,然后选择 Cloud SQL Editor 角色。不再为此角色添加任何内容。
- 点击保存以保存条件。
- 点击同一账号的角色菜单,然后选择 Cloud Cloud SQL Admin 角色。
- 点击添加条件。
- 输入标题和说明。
- 选择条件编辑器标签页。
- 在条件构建器部分:
- 对于条件类型 - 资源 - 名称,请输入条件的名称。
- 对于条件类型 - 资源 - 服务,请选择
sqladmin.googleapis.com
。 - 对于条件类型 - 资源 - 标记,请输入标记键命名空间名称。对于此示例,运算符为
matches
,值为815471563813/env/test
。
- 点击保存以保存条件。
- 点击保存以保存政策。
gcloud
此示例使用以下变量:
- PROJECT_ID:您的 Google Cloud 项目。
- INSTANCE_ID:您的 Cloud SQL 实例。
- REGION:您的 Cloud SQL 实例所在的区域。
- ORGANIZATION_ID:将成为此标记键的父级资源的组织的 ID,例如:12345678901。如需了解如何获取组织 ID,请参阅创建和管理组织。
- SERVICE_ACCOUNT_EMAIL:您要修改其访问权限的服务账号的完整电子邮件地址。
- 创建一个名为“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
- 将值为“test”的“env”标记附加到测试环境 Cloud SQL 实例。如需了解详情,请参阅 Cloud SQL 标记页面。
- 获取现有 IAM 政策绑定并将其输出到文件
bindings.json
中:gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
- 将以下条件绑定添加到
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 }
- 使用新的
bindings.json
文件更新 IAM 政策绑定。gcloud projects set-iam-policy PROJECT_ID bindings.json
gcloud alpha resource-manager tags bindings create \ --tag-value=test \ --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \ --location=REGION