员工身份联合身份验证

本页面介绍了如何将员工身份联合(也称为第三方 IAM 身份验证)与 Cloud SQL 搭配使用并进行配置。借助员工身份联合,您可以使用现有的身份提供方 (IdP)(例如 Microsoft Active Directory 或 Okta)访问 Cloud SQL 实例,而无需 Google 账号。

使用员工身份联合的主要优势包括:

  • 减少开销:无需验证网域或将身份信息同步到 Cloud Identity。
  • 增强的安全性:通过现有的企业 IdP 集中管理数据库访问权限。
  • 易于扩展:适合有复杂身份管理需求的大型组织。

如需详细了解员工身份联合,请参阅员工身份联合概览

工作原理

借助员工身份联合,用户可以使用外部身份向 Google Cloud 进行身份验证。对于 Cloud SQL,这意味着工作负载池中的正文可以连接到 Cloud SQL for PostgreSQL 实例。

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. 安全性下,选中启用 Cloud SQL IAM 身份验证复选框。
  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 = "POSTGRES_15"
  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:数据库版本的枚举字符串。 例如 POSTGRES_12
  • 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:数据库版本的枚举字符串。 例如 POSTGRES_12
  • 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. 选择员工身份联合
  6. 劳动力用户字段中,输入要添加的用户的用户 ID。
  7. 点击 Add(添加)。

gcloud

运行以下命令以创建用户:

gcloud sql users create USER_ID \
    --instance=INSTANCE_NAME \
    --type=CLOUD_IAM_WORKFORCE_IDENTITY
  

替换以下内容:

  • USER_ID:您要添加的用户的用户 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 语言连接器进行连接,请点击添加其他角色,然后选择 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 PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"

    替换以下内容:

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

后续步骤