本页面介绍了如何使用 Cloud SQL 配置和使用员工身份联合(也称为第三方 IAM 身份验证)。 借助员工身份联合,您可以使用现有的身份提供方 (IdP), 例如 Microsoft Active Directory 或 Okta,访问 Cloud SQL 实例 而无需使用 Google Account。
使用员工身份联合的主要优势包括:
- 减少开销:无需验证网域或将身份同步到 Cloud Identity。
- 增强安全性:通过 现有的企业 IdP 集中管理数据库访问权限。
- 易于扩缩:适用于具有复杂身份 管理需求的大型组织。
如需详细了解员工身份联合,请参阅 员工身份联合概览。
工作原理
借助员工身份联合,用户可以使用 外部身份向 Google Cloud 进行身份验证。对于 Cloud SQL,这意味着员工池中的主账号可以连接到 Cloud SQL for MySQL 实例。
Cloud SQL 通过 CLOUD_IAM_WORKFORCE_IDENTITY 用户类型支持员工身份联合。如需授予访问权限,Cloud SQL 会在登录期间验证您的员工凭据和项目级 IAM 权限。
准备工作
在配置员工身份联合数据库身份验证之前,请确保满足以下前提条件:
- 安装最新的 gcloud CLI。
- 在您的 Google Cloud 组织中配置员工身份联合 池和提供方。
- 为您的 工作负载设置服务帐号模拟。
- 确保您的 Cloud SQL 实例运行的是 MySQL 8.0 或更高版本。
角色与权限
如需获得配置和使用员工身份联合身份验证所需的权限,请让您的管理员为您授予组织的以下 IAM 角色:
-
管理实例:
Cloud SQL Admin (
roles/cloudsql.admin) -
连接到实例:
Cloud SQL Instance User (
roles/cloudsql.instanceUser) -
使用 Cloud SQL Auth 代理连接到实例:
Cloud SQL Client (
roles/cloudsql.client) -
管理 IAM 政策:
Project IAM Admin (
roles/resourcemanager.projectIamAdmin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。
配置员工身份联合身份验证
以下部分介绍了如何配置实例以使用 Workforce Identity Federation 身份验证。
在实例上启用 IAM 身份验证
如需启用 IAM 身份验证,请将
cloudsql_iam_authentication标志设置为on。
控制台
-
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 点击修改 。
- 展开自定义实例 部分。
- 展开连接 部分。
- 在安全性 下,选中 Enable Cloud SQL IAM authentication 复选框。
- 点击保存 。
gcloud
使用以下命令启用 IAM 身份验证:
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_iam_authentication=on
将 INSTANCE_NAME 替换为实例的名称。
Terraform
将 database_flags 块添加到您的
google_sql_database_instance 资源:
resource "google_sql_database_instance" "instance" { name = "INSTANCE_NAME" database_version = "MYSQL_8_0" region = "REGION" settings { tier = "db-f1-micro" database_flags { name = "cloudsql_iam_authentication" value = "on" } } }
替换以下内容:
INSTANCE_NAME:实例的名称。REGION:实例 所在的区域。
REST v1
在使用任何请求数据之前, 请进行以下替换:
- PROJECT_ID:项目 ID
- LOCATION_ID:位置 ID
- INSTANCE_ID:所需的实例 ID
- REGION:所需区域
- DATABASE_VERSION:数据库版本的枚举字符串。
例如
MYSQL_8_0 - PASSWORD:根用户的密码
- MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:
db-custom-[CPUS]-[MEMORY_MBS]
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances
请求 JSON 正文:
{
"name": "INSTANCE_ID",
"region": "REGION",
"databaseVersion": "DATABASE_VERSION",
"rootPassword": "PASSWORD",
"settings": {
"tier": "MACHINE_TYPE",
"backupConfiguration": {
"enabled": true
}
"databaseFlags":
[
{
"name": "cloudsql_iam_authentication",
"value": "on"
}
]
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-01T19:13:21.834Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
在使用任何请求数据之前, 请进行以下替换:
- PROJECT_ID:项目 ID
- LOCATION_ID:位置 ID
- INSTANCE_ID:所需的实例 ID
- REGION:所需区域
- DATABASE_VERSION:数据库版本的枚举字符串。
例如
MYSQL_8_0 - PASSWORD:根用户的密码
- MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:
db-custom-[CPUS]-[MEMORY_MBS]
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances
请求 JSON 正文:
{
"name": "INSTANCE_ID",
"region": "REGION",
"databaseVersion": "DATABASE_VERSION",
"rootPassword": "PASSWORD",
"settings": {
"tier": "MACHINE_TYPE",
"backupConfiguration": {
"enabled": true
}
"databaseFlags":
[
{
"name": "cloudsql_iam_authentication",
"value": "on"
}
]
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-01T19:13:21.834Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
将员工身份用户添加到实例
使用 CLOUD_IAM_WORKFORCE_IDENTITY 类型将外部主账号添加到您的实例。
确保您使用的用户 ID 与员工身份提供方提供的
特性映射
值一致。通常,此值配置为电子邮件地址,例如 cruz@example.com。
控制台
-
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 从 SQL 导航菜单中选择用户。
- 点击添加用户账号 。系统会打开向实例 INSTANCE_NAME 添加用户账号** 窗格。
- 选择 Workforce Identity Federation 。
- 在 员工用户 字段中,输入要添加的用户的用户 ID。
- 点击 Add (添加)。
gcloud
运行以下命令以创建用户:
gcloud sql users create USER_ID \ --instance=INSTANCE_NAME \ --type=CLOUD_IAM_WORKFORCE_IDENTITY
替换以下内容:
USER_ID:您要添加的用户的电子邮件地址,例如cruz@example.com。INSTANCE_NAME:实例的名称。
Terraform
使用 google_sql_user 资源定义员工身份用户:
resource "google_sql_user" "workforce_user" { name = "USER_ID" # e.g., "cruz@example.com" instance = "INSTANCE_NAME" type = "CLOUD_IAM_WORKFORCE_IDENTITY" }
替换以下内容:
USER_ID:您要添加的用户的用户 ID,例如cruz@example.com。INSTANCE_NAME:实例的名称。
REST v1
创建用户账号
在使用任何请求数据之前, 请进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:您要向其添加用户的实例的 ID
- USERNAME:用户的电子邮件地址
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users
请求 JSON 正文:
{
"name": "USERNAME",
"type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "DONE",
"user": "user@example.com",
"insertTime": "2020-02-07T22:44:16.656Z",
"startTime": "2020-02-07T22:44:16.686Z",
"endTime": "2020-02-07T22:44:20.437Z",
"operationType": "CREATE_USER",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
创建用户账号
在使用任何请求数据之前, 请进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:您要向其添加用户的实例的 ID
- USERNAME:用户的电子邮件地址
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users
请求 JSON 正文:
{
"name": "USERNAME",
"type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "DONE",
"user": "user@example.com",
"insertTime": "2020-02-07T22:44:16.656Z",
"startTime": "2020-02-07T22:44:16.686Z",
"endTime": "2020-02-07T22:44:20.437Z",
"operationType": "CREATE_USER",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
授予实例用户角色
向员工身份主账号或整个池授予
roles/cloudsql.instanceUser
角色。
控制台
-
在 Google Cloud 控制台中,打开服务账号页面。
- 点击授予访问权限 。
在新的主账号 字段中,执行以下操作之一:
如需向单个主账号授予访问权限,请输入员工 身份作为
principal:principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID如需向整个池授予访问权限,请输入员工池作为
principalSet:principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*
- 在角色 列表中,选择 Cloud SQL > Cloud SQL Instance User。
- 可选:如果您要使用 Cloud SQL Auth 代理或 Cloud SQL 语言连接器进行连接,请点击 Add another role (添加其他角色),然后选择 Cloud SQL > Cloud SQL Client 。
- 点击保存 。
gcloud
如需向单个用户授予访问权限,请使用 gcloud projects
add-iam-policy-binding 命令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" \ --role="roles/cloudsql.instanceUser"
替换以下内容:
USER_ID:您要添加的用户的用户 ID,例如cruz@example.com。POOL_ID:员工池的 ID。PROJECT_ID:包含实例的项目的标识符。
如需向整个员工池授予访问权限,请使用 gcloud projects
add-iam-policy-binding 命令,并使用 principalSet
成员格式:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*" \ --role="roles/cloudsql.instanceUser"
Terraform
使用 google_project_iam_member 资源向员工主账号授予角色
:
resource "google_project_iam_member" "workforce_user_iam" { project = "PROJECT_ID" role = "roles/cloudsql.instanceUser" member = "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" }
替换以下内容:
USER_ID:您要添加的用户的用户 ID,例如cruz@example.com。POOL_ID:员工池的 ID。PROJECT_ID:包含实例的项目的标识符。
REST
如需使用 API 授予 IAM 政策,请使用 getIamPolicy 方法检索项目的
IAM 政策。
然后,将新绑定附加到政策,最后使用更新后的
政策,通过 setIamPolicy 方法应用。
以下是将附加到您的 IAM 政策的绑定载荷示例:
{ "bindings": [ { "role": "roles/cloudsql.instanceUser", "members": [ "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" ] } ] }
替换以下内容:
USER_ID:您要添加的用户的用户 ID,例如cruz@example.com。POOL_ID:员工池的 ID。
授予数据库权限
您可以在创建员工身份用户时指定要授予的数据库角色,也可以在数据库内手动授予数据库权限。
例如,如需手动授予权限,请执行以下操作:
GRANT SELECT ON TABLE_NAME TO "USER_ID";
替换以下内容:
TABLE_NAME:数据库表的名称。USER_ID:员工身份数据库用户的用户 ID,例如cruz@example.com。
连接到实例
您现在可以使用 gcloud CLI 或 Cloud SQL Auth 代理连接到您的实例。
使用 gcloud CLI
您必须先使用员工身份进行身份验证,然后才能生成登录令牌。
如需使用员工身份联合进行身份验证,请使用带有
--cred-file标志的gcloud auth login命令:gcloud auth login --cred-file=CONFIGURATION_FILE将
CONFIGURATION_FILE替换为为员工身份提供方生成的配置文件的路径。如需使用生成的令牌进行连接,请运行以下命令:
bash export MYSQL_PWD=$(gcloud sql generate-login-token) mysql --host=INSTANCE_IP --user=USER_ID \ --database=DB_NAME --ssl-mode=REQUIRED替换以下内容:
INSTANCE_IP:Cloud SQL 实例的 IP 地址。USER_ID:员工用户的用户 ID,例如cruz@example.com。DB_NAME:您要连接的数据库的名称。
使用 Cloud SQL Auth 代理
使用
--auto-iam-authn 标志启动代理:
./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn
如需详细了解代理,请参阅 Cloud SQL Auth 代理简介。
限制和局限
- 跨池重复的用户 ID:Cloud SQL 无法区分
不同员工池或
身份提供方中具有相同用户 ID 的正文。如果您使用多个员工池或提供方,则必须使用 IAM 政策,以确保您不会向来自不同池或提供方的重复正文名称授予
roles/cloudsql.instanceUser登录权限。这样可以防止来自具有相同用户 ID 的其他池或提供方的未经授权的访问。 - 登录配额:每个 实例每分钟的登录配额为 12,000 次,其中包括成功的登录尝试和失败的登录尝试。 超出配额后,登录会暂时不可用。我们建议您不要频繁登录,并使用已获授权 的网络限制登录。
后续步骤
- 详细了解 员工身份联合。
- 了解如何配置实例以使用 IAM 数据库 身份验证。
- 了解如何使用 IAM 数据库身份验证管理用户。
- 了解如何使用 IAM 数据库 身份验证登录。