员工身份联合身份验证

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

后续步骤