使用 IAM 数据库身份验证管理用户

本页面介绍如何将使用 IAM 数据库身份验证的用户或服务账号添加到数据库,以及如何管理这些用户和服务账号。如需详细了解 IAM 集成,请参阅 IAM 身份验证

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. 确保您的 Google Cloud 项目已启用结算功能

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Enable the Cloud Key Management Service API.

    Enable the API

  11. 确保您的用户账号具有 Cloud SQL Admin 角色。

    转到 IAM 页面

  12. 在 Cloud SQL 实例上启用 IAM 数据库身份验证
  13. 对于包含用户需要访问的数据库的每个项目,请确保向需要该权限的用户授予 IAM 访问权限。请参阅授予、更改和撤消对资源的访问权限
  14. 确保您已为需要访问项目中的数据库的每个服务添加了服务账号
  15. 如果您使用的是 IAM 群组身份验证,请确保您已创建需要项目中数据库的访问权限的 Cloud Identity 群组。

将 IAM 用户或服务账号添加到数据库实例

对于您要有权访问数据库实例的每位 IAM 用户,您都必须为其创建一个新的数据库用户。数据库用户名必须是 IAM 用户的电子邮件地址,例如 test-user@example.com

使用 REST 命令时,用户名必须使用英文引号,因为它包含特殊字符(@.)。

服务账号使用 service-account-name@project-id.iam.gserviceaccount.com 格式。

如需添加 IAM 用户或服务账号,您需要添加新的数据库用户并选择 IAM 作为身份验证方法:

控制台

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

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 从 SQL 导航菜单中选择用户
  4. 点击添加用户账号。系统会打开将用户账号添加到实例 instance_name 标签页。
  5. 点击 Cloud IAM 单选按钮。
  6. 主账号字段中添加要添加的用户或服务账号的电子邮件地址。
  7. 点击添加。该用户现在位于用户列表中。
  8. 如果未将用户分配给 Cloud SQL Instance User 角色,则用户名左侧会显示一个 三角形 图标。

    如需向用户授予登录权限,请点击该图标,然后选择添加 IAM 角色。图标不会再出现。该用户现在是该角色的成员。

gcloud

创建用户账号

使用电子邮件地址(如 test-user@example.com)来标识用户。

请替换以下内容:

  • USERNAME:用户的电子邮件地址。
  • INSTANCE_NAME:您要向用户授予访问权限的实例的名称。
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

创建服务账号

替换以下内容:

  • SERVICE_ACCT:服务账号的电子邮件地址。
  • INSTANCE_NAME:您要向服务账号授予访问权限的实例的名称。
gcloud sql users create SERVICE_ACCT \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

Terraform

如需在启用了 IAM 数据库身份验证的实例上添加 IAM 用户和服务账号,请使用 Terraform 资源

resource "google_sql_database_instance" "default" {
  name             = "mysql-db-auth-instance-name-test"
  region           = "us-west4"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql_iam_authentication"
      value = "on"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally
  # delete this instance by use of Terraform whereas
  # `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

# Specify the email address of the IAM user to add to the instance
# This resource does not create a new IAM user account; this account must
# already exist

resource "google_sql_user" "iam_user" {
  name     = "test-user@example.com"
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_USER"
}

# Create a new IAM service account

resource "google_service_account" "default" {
  account_id   = "cloud-sql-mysql-sa"
  display_name = "Cloud SQL for MySQL Service Account"
}

# Specify the email address of the IAM service account to add to the instance

resource "google_sql_user" "iam_service_account_user" {
  name     = google_service_account.default.email
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_SERVICE_ACCOUNT"
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST v1

创建用户账号

在使用任何请求数据之前,请先进行以下替换:

  • project-id:您的项目 ID
  • instance-id:您要向其添加用户的实例的 ID
  • username:用户的电子邮件地址
  • operation-id:操作的 ID

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

请求 JSON 正文:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 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"
}

创建服务账号

在使用任何请求数据之前,请先进行以下替换:

  • service-acct:您的服务账号电子邮件地址
  • project-id:您的项目 ID
  • instance-id:您要向其添加服务账号的实例的 ID
  • operation-id:操作的 ID

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

请求 JSON 正文:

{
    "name": "service-acct",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "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:用户的电子邮件地址
  • operation-id:操作的 ID

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

请求 JSON 正文:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 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"
}

创建服务账号

在使用任何请求数据之前,请先进行以下替换:

  • service-acct:您的服务账号电子邮件地址
  • project-id:您的项目 ID
  • instance-id:您要向其添加服务账号的实例的 ID
  • operation-id:操作的 ID

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

请求 JSON 正文:

{
    "name": "service-acct",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 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-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "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"
}

将群组添加到数据库

如需为实例配置 IAM 群组身份验证,请执行以下操作:

  1. 如果尚未创建 Cloud Identity 群组,请在管理 Cloud SQL 实例的项目中创建一个。如需了解详情,请参阅 Cloud Identity 概览

  2. 运行以下命令以将群组添加到 Cloud SQL 实例。

    控制台

    在预览版期间,您无法通过 Google Cloud 控制台将群组添加到实例。

    gcloud

    替换以下内容:

    • GROUP_EMAIL_ADDRESS:您要添加到实例的 Cloud Identity 群组的电子邮件地址。 例如,example-group@example.com
    • INSTANCE_NAME:您要在其中添加群组的实例的名称。

    运行以下命令:

       gcloud sql users create GROUP_EMAIL_ADDRESS \
         --instance=INSTANCE_NAME \
         --type=cloud_iam_group
       

    REST v1

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的项目 ID
    • INSTANCE_ID:您要向其添加 Cloud Identity 群组的实例的实例 ID
    • GROUP_EMAIL:群组的电子邮件地址
    • OPERATION_ID:操作的 ID

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

    请求 JSON 正文:

    {
      "name": "GROUP_EMAIL",
      "type": "CLOUD_IAM_GROUP"
      }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "example-group@example.com",
      "insertTime": "2023-12-07T22:44:16.656Z",
      "startTime": "2023-12-07T22:44:16.686Z",
      "endTime": "2023-12-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:您要向其添加 Cloud Identity 群组的实例的实例 ID
    • GROUP_EMAIL:Cloud Identity 群组的电子邮件地址
    • OPERATION_ID:操作的 ID

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

    请求 JSON 正文:

    {
      "name": "GROUP_EMAIL",
      "type": "CLOUD_IAM_GROUP"
      }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "example-group@example.com",
      "insertTime": "2023-12-07T22:44:16.656Z",
      "startTime": "2023-12-07T22:44:16.686Z",
      "endTime": "2023-12-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"
    }
    

将群组中的用户或服务账号添加到数据库实例

将 Cloud Identity 群组添加到实例不会自动将群组的成员作为用户添加到实例。成员首次登录实例时,系统会在实例上创建一个用户或服务账号。

如需了解详情,请参阅使用 IAM 数据库身份验证登录

管理实例上的群组中的用户或服务账号

您可以通过管理 Cloud Identity 群组的成员资格来控制对实例的访问权限。如需了解详情,请参阅 Cloud Identity 概览

用户可以是多个 Cloud Identity 群组的成员。如果用户属于实例上的多个 Cloud Identity 群组,则他们拥有来自每个群组的所有 IAM 权限和数据库权限。

对群组成员资格的更改(例如添加账号)大约需要 15 分钟才能完成。此时间是除了 IAM 更改所需的时间之外的时间。

更改传播后,用户或服务账号必须退出然后重新登录,以使更改生效。但是,授予或撤消 MySQL 中的群组的数据库权限会立即生效。例如,如果您撤消对某个表的访问权限,该 Cloud Identity 群组的成员会立即失去对该表的访问权限,而无需退出并重新登录。

当其他 Cloud Identity 群组添加到实例时,用户必须退出并重新登录,才能接收来自新群组的权限。

向用户、服务账号或群组添加 IAM 政策绑定

在给定项目 ID 和绑定的情况下,此过程将政策绑定添加到特定项目的 IAM 政策。绑定命令由成员、角色和可选条件组成。

数据库用户名必须是 IAM 用户的电子邮件地址,例如 test-user@example.com。它必须使用英文引号,因为它包含特殊字符(@.)。

控制台

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  2. 点击添加
  3. 新成员中,输入电子邮件地址。您可以将单个用户、服务账号或群组添加为成员,但每个项目必须至少有一个主账号作为成员。
  4. 角色中,导航到 Cloud SQL,然后选择 Cloud SQL Instance UserCloud SQL Client
  5. 对于个人用户和服务账号,请选择 Cloud SQL Client
  6. 点击保存

gcloud

运行带有 --role=roles/cloudsql.instanceUser 标志的 gcloud projects add-iam-policy-binding

向用户账号添加政策绑定

替换以下内容:

  • PROJECT_ID:您要授权用户使用的项目的 ID。
  • USERNAME:用户的电子邮件地址。
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:USERNAME \
    --role=roles/cloudsql.instanceUser
  

使用 --role=roles/cloudsql.client 标志再次运行 gcloud projects add-iam-policy-binding

向服务账号添加政策绑定

替换以下内容:

  • PROJECT_ID:您要授权用户使用的项目的 ID。
  • SERVICE_ACCT:服务账号的电子邮件地址。
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCT \
    --role=roles/cloudsql.instanceUser
  

使用 --role=roles/cloudsql.client 标志再次运行 gcloud projects add-iam-policy-binding

向 Cloud Identity 群组添加政策绑定

替换以下内容:

  • PROJECT_ID:您要授权群组成员使用的项目的 ID。
  • GROUP_EMAIL_ADDRESS:群组的电子邮件地址。例如 example-group@example.com
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=group:GROUP_EMAIL_ADDRESS \
    --role=roles/cloudsql.instanceUser
   

所指定群组的所有成员都将获得 Cloud SQL Instance User 角色,并且可以登录此项目中的实例。

IAM 群组身份验证目前为预览版

Terraform

如需向 IAM 用户和服务账号添加所需的政策绑定,请使用 Terraform 资源

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

resource "google_project_iam_binding" "cloud_sql_client" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.client"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 通过运行以下命令并在提示符处输入 yes,移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST

通过修改 get-iam-policy 命令返回的 JSON 或 YAML 绑定政策,将 cloudsql.instanceUsercloudsql.client 角色授予两种类型的账号。请注意,此政策更改在设置更新后的政策后才会生效。

    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
                   "user:test-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
                   "group:example-group@example.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:test-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

向 IAM 用户授予数据库权限

默认情况下,将 IAM 用户添加到数据库实例时,该新用户不会对任何数据库授予权限。

要授予用户登录访问权限或其他权限,请使用 GRANT 语句。如需查看您可以向用户和服务账号授予的完整权限列表,请参阅 GRANT 参考页面。通过 mysql 命令行运行 GRANT。

替换以下内容:

  • USERNAME:对于用户账号,这是 IAM 用户的电子邮件地址,@ 和网域字符串均被截断。例如,如果 IAM 用户的电子邮件地址为 test-user@example.com,则用户名为 test-user。对于服务账号,这是不带 @project-id.iam.gserviceaccount.com 域名的服务账号的电子邮件地址。
  • DATABASE_NAME:托管表的数据库的名称。
  • TABLE_NAME:您要向用户授予访问权限的表的名称。
  • grant select on DATABASE_NAME.TABLE_NAME to "USERNAME";

    向群组授予数据库权限

    使用 IAM 群组身份验证时,您可以向 Cloud Identity 群组授予数据库权限,而不是向单个用户授予权限。默认情况下,当您将 Cloud Identity 群组添加到 Cloud SQL 实例时,Cloud Identity 群组没有权限。

    如需向 Cloud Identity 群组中的用户授予数据库权限,请使用 GRANT 语句。

    替换以下内容:

    • GROUP_NAME:Cloud Identity 群组电子邮件地址的第一部分。例如,使用电子邮件地址 example-group@example.com 时,Cloud Identity 群组名称为 example-group
    • HOSTNAME:电子邮件地址的第二部分表示 Cloud Identity 群组的主机名。例如,使用电子邮件地址 example-group@example.com 时,主机名为 example.com
    • DATABASE_NAME:托管表的数据库的名称。
    • TABLE_NAME:您要向 Cloud Identity 群组成员授予访问权限的表的名称。

    通过 mysql 命令行运行 GRANT。

    grant select on DATABASE_NAME.TABLE_NAME to "GROUP_NAME"@"HOSTNAME";

    您授予 Cloud Identity 群组的数据库权限会立即生效。

    如需详细了解如何授予权限,请参阅 MySQL 文档中的 GRANT 参考页面。

    查看群组、IAM 用户和服务账号

    如需查看已添加到实例的 Cloud Identity 群组,请运行以下命令。

    控制台

    在预览版期间,您无法通过 Google Cloud 控制台查看实例中的群组。

    gcloud

    INSTANCE_NAME 替换为包含您要查看的群组的实例名称。

      gcloud sql users list --instance=INSTANCE_NAME
      

    群组具有 CLOUD_IAM_GROUP 用户类型。

    输出还会列出 Cloud SQL 实例上的用户和服务账号。

    • 属于群组成员的用户账号具有 CLOUD_IAM_GROUP_USER 类型。
    • 属于群组成员的服务账号具有 CLOUD_IAM_GROUP_SERVICE_ACCOUNT 类型。
    • 属于单个 IAM 数据库身份验证用户账号的用户账号具有 CLOUD_IAM_USER 类型。
    • 属于单个 IAM 数据库身份验证服务账号的服务账号具有 CLOUD_IAM_SERVICE_ACCOUNT 类型。

    从数据库中移除 IAM 用户或服务账号

    要从数据库中移除用户或服务账号,请从实例中删除该账号:

    控制台

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

      转到“Cloud SQL 实例”

    2. 如需打开实例的概览页面,请点击实例名称。
    3. 从 SQL 导航菜单中选择用户
    4. 针对您要移除的用户,点击
    5. 选择移除。这样只会撤消对此实例的访问权限。

    gcloud

    撤消用户

    使用电子邮件地址(如 test-user@example.com)来标识用户。

    替换以下内容:

    • USERNAME:不带 @域名的电子邮件地址。
    • INSTANCE_NAME:您要从中移除用户的实例的名称。
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME

    删除服务账号

    替换以下内容:

    • SERVICE_ACCT:服务账号的电子邮件地址。
    • INSTANCE_NAME:您要从中移除用户的实例的名称。
    gcloud sql users delete SERVICE_ACCT \
    --instance=INSTANCE_NAME

    REST v1

    以下请求使用 users.delete 方法删除指定的用户账号。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的项目 ID
    • INSTANCE_ID:所需的实例 ID
    • USERNAME:用户或服务账号的电子邮件地址

    HTTP 方法和网址:

    DELETE https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 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:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    REST v1beta4

    以下请求使用 users.delete 方法删除指定的用户账号。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的项目 ID
    • INSTANCE_ID:所需的实例 ID
    • USERNAME:用户或服务账号的电子邮件地址

    HTTP 方法和网址:

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 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:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    删除 IAM 群组身份验证用户或服务账号

    您无法使用 gcloud CLI 删除通过 IAM 群组身份验证创建的用户或服务账号。Cloud SQL 会在用户账号或服务账号首次登录后自动创建这些账号。

    删除这些账号的唯一方法是使用具有超级用户权限的用户的 MySQL 客户端。

    如需生成用于删除用户账号或服务账号的查询,请参阅 MySQL 文档

    从实例中删除群组

    如果您从实例中删除 Cloud Identity 群组,则属于 Cloud Identity 群组的所有用户账号和服务账号都将失去授予 Cloud Identity 群组的任何数据库权限。 在从 Cloud Identity 群组中移除 IAM 登录权限之前,属于该群组的用户和服务账号仍可以登录。

    控制台

    在预览版期间,您无法通过 Google Cloud 控制台从实例中删除群组。

    gcloud

    如需从实例中删除 Cloud Identity 群组,请使用 gcloud sql users delete 命令。

    替换以下内容:

    • GROUP_NAME:Cloud Identity 群组电子邮件地址的第一部分。例如,使用电子邮件地址 example-group@example.com 时,Cloud Identity 群组名称为 example-group
    • HOSTNAME:电子邮件地址的第二部分表示 Cloud Identity 群组的主机名。例如,使用电子邮件地址 example-group@example.com 时,主机名为 example.com
    • INSTANCE_NAME:包含您要删除的 Cloud Identity 群组的 Cloud SQL 实例的名称。
    gcloud sql users delete GROUP_NAME \
       --host=HOSTNAME \
       --instance=INSTANCE_NAME

    从群组中移除 IAM 登录权限

    如果您撤消某个 Cloud Identity 群组的 cloudsql.instanceUser 角色,则该群组的所有成员都将无法登录项目中的任何 Cloud SQL 实例。用户账号或服务账号只有在属于仍具有登录权限的其他 Cloud Identity 群组的成员时才能登录实例。

    如需撤消 Cloud Identity 群组的角色,请参阅撤消单个角色

    从群组中移除用户

    您可以从 Cloud Identity 群组中移除用户。

    在通过 IAM 传播移除操作后,如果用户拥有适当的 IAM 权限,则或许仍然可以登录数据库。但是,重新登录后,用户将不再拥有属于其从中被移除的 Cloud Identity 群组的数据库权限。

    在审核日志中查看登录信息

    您可以启用审核日志以捕获对数据库的 IAM 登录。如果出现登录问题,您可以使用审核日志来诊断问题。

    配置后,您可以使用日志浏览器查看成功登录的数据访问审核日志

    对于 IAM 群组身份验证,审核日志会显示个人用户账号和服务账号的活动和登录。IAM 群组身份验证目前为预览版

    例如,日志可能包含类似如下所示的信息:

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    排查登录失败问题

    尝试登录失败时,出于安全考虑,MySQL 会返回最少的错误消息。例如:

    $MYSQL_PWD=`gcloud-access-token mysql` --enable-cleartext-plugin --ssl-ca=server-ca.pem
    --ssl-cert=client-cert.pem --ssl-key=client-key.pem   --host=ip_address --user=testuser
    Access denied for user 'testuser'@'...' (using password: NO)
    

    您可以查看 MySQL 错误日志以详细了解错误。如需了解详情,请参阅查看日志

    例如,对于前面的错误,以下日志条目说明了您可以执行来解决该问题的操作。

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    检查您收到的错误消息。如果消息未指明您使用的是“Cloud SQL IAM 用户身份验证”还是“Cloud SQL IAM 服务账号身份验证”,请验证用于登录的数据库用户类型是 CLOUD_IAM_USERCLOUD_IAM_SERVICE_ACCOUNT。对于 IAM 用户,验证数据库用户名是否为 IAM 用户的电子邮件地址(不包含 @ 和网域)。对于服务账号,验证它是否为服务账号的电子邮件地址(不带 @project-id.iam.gserviceaccount.com)。

    如果您使用的是 IAM 数据库身份验证,请查看错误消息的详细信息。您可以在数据库错误日志中找到错误消息。如果消息指明您发送用作密码的访问令牌 (OAuth 2.0) 无效,您可以使用 gcloud auth application-default print-access-token gcloud 命令查找令牌的详细信息,如下所示:

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo

    验证该令牌适用于预期的 IAM 用户或服务账号,并且未过期。

    如果详细信息指明缺少权限,请验证已使用预定义的 Cloud SQL Instance User 角色或实例项目的 IAM 政策中的自定义角色为 IAM 用户或服务账号授予了 cloudsql.instances.login 权限。如需其他帮助,请使用 IAM 政策问题排查工具

    如果由于 IAM 数据库身份验证不可用而导致登录失败,则用户可以使用默认的 MySQL 用户名和密码登录。这种登录方法仍可为用户提供整个数据库的访问权限。 验证连接是否为安全连接。

    排查使用 IAM 群组身份验证的用户账号的问题

    本部分列出了 IAM 群组身份验证的问题排查场景。

    无法将群组添加到数据库

    尝试向实例添加群组时,您可能会收到以下错误:

    (gcloud.sql.users.create) HTTPError 400: Invalid request: Provided CLOUD_IAM_GROUP: EMAIL, does not exist.
    

    请确保您提供的电子邮件地址是有效的群组。

    如果该群组尚不存在,请创建该群组。如需详细了解如何创建群组,请参阅 Cloud Identity 概览

    现有 IAM 用户或服务账号未继承授予其群组的数据库权限

    如果现有 IAM 用户账号或服务账号未继承其群组的正确数据库权限,请完成以下步骤:

    1. 在 Google Cloud 控制台中,转到 IAM 页面。

      进入 IAM

      验证该账号是否为添加到 Cloud SQL 实例的群组的成员。

    2. 列出实例上的用户账号和服务账号。

      gcloud sql users list --instance=INSTANCE_NAME

      在输出中,检查用户账号或服务账号是否列为 CLOUD_IAM_USERCLOUD_IAM_SERVICE_ACCOUNT

    3. 如果用户账号或服务账号列为 CLOUD_IAM_USERCLOUD_IAM_SERVICE_ACCOUNT,请从实例中移除该账号。您要移除的账号是一个单独的 IAM 账号,不会继承群组的数据库权限。

    4. 使用用户账号或服务账号重新登录该实例。

      再次登录该实例,请使用正确的账号类型 CLOUD_IAM_GROUP_USERCLOUD_IAM_GROUP_SERVICE_ACCOUNT 重新创建账号。

    后续步骤