员工身份联合身份验证

本页面介绍了如何使用 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 权限。

准备工作

在配置员工身份联合数据库身份验证之前,请确保满足以下前提条件:

角色与权限

如需获得配置和使用员工身份联合身份验证所需的权限,请让您的管理员为您授予组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。

配置员工身份联合身份验证

以下部分介绍了如何配置实例以使用 Workforce Identity Federation 身份验证。

在实例上启用 IAM 身份验证

如需启用 IAM 身份验证,请将 cloudsql_iam_authentication标志设置为on。

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 点击修改 。
  4. 展开自定义实例 部分。
  5. 展开连接 部分。
  6. 在安全性 下,选中 Enable Cloud SQL IAM authentication 复选框。
  7. 点击保存 。

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。

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 从 SQL 导航菜单中选择用户。
  4. 点击添加用户账号 。系统会打开向实例 INSTANCE_NAME 添加用户账号** 窗格。
  5. 选择 Workforce Identity Federation 。
  6. 在 员工用户 字段中,输入要添加的用户的用户 ID。
  7. 点击 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 角色。

控制台

  1. 在 Google Cloud 控制台中,打开服务账号页面。

    进入 IAM

  2. 点击授予访问权限 。
  3. 在新的主账号 字段中,执行以下操作之一:

    • 如需向单个主账号授予访问权限,请输入员工 身份作为 principal:

      principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID

    • 如需向整个池授予访问权限,请输入员工池作为 principalSet:

      principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*

  4. 在角色 列表中,选择 Cloud SQL > Cloud SQL Instance User。
  5. 可选:如果您要使用 Cloud SQL Auth 代理或 Cloud SQL 语言连接器进行连接,请点击 Add another role (添加其他角色),然后选择 Cloud SQL > Cloud SQL Client 。
  6. 点击保存 。

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

您必须先使用员工身份进行身份验证,然后才能生成登录令牌。

  1. 如需使用员工身份联合进行身份验证,请使用带有 --cred-file标志的 gcloud auth login命令:

    gcloud auth login --cred-file=CONFIGURATION_FILE
    

    将 CONFIGURATION_FILE 替换为为员工身份提供方生成的配置文件的路径。

  2. 如需使用生成的令牌进行连接,请运行以下命令:

    bash export MYSQL_PWD=$(gcloud sql generate-login-token) mysql --host=INSTANCE_IP --user=USER_ID \ --database=DB_NAME --ssl-mode=REQUIRED

    替换以下内容:

  3. INSTANCE_IP:Cloud SQL 实例的 IP 地址。

  4. USER_ID:员工用户的用户 ID,例如 cruz@example.com。

  5. 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 次,其中包括成功的登录尝试和失败的登录尝试。 超出配额后,登录会暂时不可用。我们建议您不要频繁登录,并使用已获授权 的网络限制登录。

后续步骤