員工身分聯盟驗證

本頁說明如何設定及使用 Cloud SQL 的員工身分聯盟 (也稱為第三方 IAM 驗證)。員工身分聯盟可讓您使用現有的身分識別提供者 (IdP),例如 Microsoft Active Directory 或 Okta,存取 Cloud SQL 執行個體,不必使用 Google 帳戶。

使用員工身分聯盟的主要優點包括:

  • 減少管理負擔:不必驗證網域,也不必將身分同步處理至 Cloud Identity。
  • 提升安全性:透過現有的企業 IdP 集中管理資料庫存取權。
  • 輕鬆擴充:適合需要管理複雜身分的大型機構。

如需員工身分聯盟的詳細說明,請參閱「員工身分聯盟總覽」。

運作方式

員工身分聯盟可讓使用者透過外部身分驗證 Google Cloud 。以 Cloud SQL 來說,這表示來自員工集區的主體可以連線至 MySQL 適用的 Cloud SQL 執行個體。

Cloud SQL 支援透過CLOUD_IAM_WORKFORCE_IDENTITY使用者類型使用員工身分聯盟。如要授予存取權,Cloud SQL 會在登入期間驗證您的員工憑證和專案層級 IAM 權限。

事前準備

設定員工身分聯盟資料庫驗證前,請確認符合下列必要條件:

角色和權限

如要取得設定及使用員工身分聯盟驗證所需的權限,請要求管理員授予您組織的下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

設定員工身分聯盟驗證

以下各節說明如何設定執行個體,以使用員工身分聯盟驗證。

在執行個體上啟用 IAM 驗證

如要啟用 IAM 驗證,請將 cloudsql_iam_authentication 旗標設為 on

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

    前往 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 = "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 Instances」頁面。

    前往 Cloud SQL 執行個體

  2. 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
  3. 在 SQL 導覽選單中選取「使用者」
  4. 按一下「新增使用者帳戶」,「Add a user account to instance 」(在執行個體中新增使用者帳戶)INSTANCE_NAME 窗格隨即開啟。
  5. 選取「員工身分聯盟」
  6. 在「Workforce user」(員工使用者) 欄位中,輸入要新增的使用者 ID。
  7. 按一下「新增」。

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 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「IAM」頁面

  2. 點選「授予存取權」。
  3. 在「New principals」(新增主體) 欄位中,執行下列其中一個步驟:

    • 如要授予個別主體的存取權,請以 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 執行個體使用者」
  5. 選用:如要使用 Cloud SQL 驗證 Proxy 或 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:包含執行個體的專案 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:包含執行個體的專案 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 驗證 Proxy 連線至執行個體。

使用 gcloud CLI

您必須先使用員工身分驗證,才能產生登入權杖。

  1. 如要使用員工身分聯盟進行驗證,請使用 gcloud auth login 指令並加上 --cred-file 標記:

    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 驗證 Proxy

使用 --auto-iam-authn 旗標啟動 Proxy:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn

如要進一步瞭解 Proxy,請參閱「關於 Cloud SQL Auth Proxy」。

規定與限制

  • 集區中的使用者 ID 重複:Cloud SQL 無法區分不同員工集區或身分提供者中,具有相同使用者 ID 的主體。如果您使用多個工作人員集區或供應商,請務必使用 IAM 政策,確保您不會將 roles/cloudsql.instanceUser 登入權限授予來自不同集區或供應商的重複主體名稱。這樣可防止其他集區或供應商以相同的使用者 ID 進行未經授權的存取。
  • 登入配額:每個執行個體每分鐘有 12,000 次登入配額,包括成功和失敗的登入嘗試。超過配額時,暫時無法登入。建議您避免頻繁登入,並使用授權網路限制登入。

後續步驟