本頁說明如何設定及使用 Cloud SQL 的員工身分聯盟 (也稱為第三方 IAM 驗證)。員工身分聯盟可讓您使用現有的身分識別提供者 (IdP),例如 Microsoft Active Directory 或 Okta,存取 Cloud SQL 執行個體,不必使用 Google 帳戶。
使用員工身分聯盟的主要優點包括:
- 減少管理負擔:不必驗證網域,也不必將身分同步處理至 Cloud Identity。
- 提升安全性:透過現有的企業 IdP 集中管理資料庫存取權。
- 輕鬆擴充:適合需要管理複雜身分的大型機構。
如需員工身分聯盟的詳細說明,請參閱「員工身分聯盟總覽」。
運作方式
員工身分聯盟可讓使用者透過外部身分驗證 Google Cloud 。在 Cloud SQL 中,這表示來自工作站集區的主體可以連線至 PostgreSQL 適用的 Cloud SQL 執行個體。
Cloud SQL 支援透過CLOUD_IAM_WORKFORCE_IDENTITY使用者類型使用員工身分聯盟。如要授予存取權,Cloud SQL 會在登入期間驗證您的員工憑證和專案層級 IAM 權限。
事前準備
設定員工身分聯盟資料庫驗證前,請確認符合下列必要條件:
- 安裝最新版 gcloud CLI。
- 在 Google Cloud 貴機構中設定員工身分聯盟集區和提供者。
- 為工作負載設定服務帳戶模擬。
- 確認 Cloud SQL 執行個體執行的是 PostgreSQL 13 以上版本。
角色和權限
如要取得設定及使用員工身分聯盟驗證所需的權限,請要求管理員授予您組織的下列 IAM 角色:
-
管理執行個體:
Cloud SQL 管理員 (
roles/cloudsql.admin) -
連線至執行個體:
Cloud SQL 執行個體使用者 (
roles/cloudsql.instanceUser) -
使用 Cloud SQL 驗證 Proxy 連線至執行個體:
Cloud SQL 用戶端 (
roles/cloudsql.client) -
管理 IAM 政策:
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定員工身分聯盟驗證
以下各節說明如何設定執行個體,以使用員工身分聯盟驗證。
在執行個體上啟用 IAM 驗證
如要啟用 IAM 驗證,請將 cloudsql.iam_authentication 旗標設為 on。
控制台
-
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 [編輯]。
- 展開「自訂執行個體」部分。
- 展開「連線」專區。
- 在「安全性」下方,勾選「啟用 Cloud SQL IAM 驗證」核取方塊。
- 按一下 [儲存]。
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。
控制台
-
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 在 SQL 導覽選單中選取「使用者」。
- 按一下「新增使用者帳戶」,「Add a user account to instance 」(在執行個體中新增使用者帳戶)INSTANCE_NAME 窗格隨即開啟。
- 選取「員工身分聯盟」。
- 在「Workforce user」(員工使用者) 欄位中,輸入要新增的使用者 ID。
- 按一下「新增」。
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 角色指派給工作團隊身分主體或整個集區。
控制台
-
前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
- 點選「授予存取權」。
在「New principals」(新增主體) 欄位中,執行下列其中一個步驟:
如要授予個別主體的存取權,請以
principal形式輸入工作團隊身分:principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID如要授予整個集區的存取權,請輸入工作團隊集區,如下所示:
principalSetprincipalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*
- 在「角色」清單中,依序選取「Cloud SQL」 >「Cloud SQL 執行個體使用者」。
- 選用:如要使用 Cloud SQL 驗證 Proxy 或 Cloud SQL 語言連接器連線,請按一下「新增其他角色」,然後依序選取「Cloud SQL」 >「Cloud SQL Client」。
- 按一下 [儲存]。
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
您必須先使用員工身分驗證,才能產生登入權杖。
如要使用員工身分聯盟進行驗證,請使用
gcloud auth login指令並加上--cred-file標記:gcloud auth login --cred-file=CONFIGURATION_FILE將
CONFIGURATION_FILE替換為為工作團隊身分識別提供者產生的設定檔路徑。如要使用產生的權杖連線,請執行下列指令:
bash export PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"更改下列內容:
INSTANCE_IP:Cloud SQL 執行個體的 IP 位址。USER_ID:員工使用者的使用者 ID,例如cruz@example.com。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 次登入配額,包括成功和失敗的登入嘗試。超過配額時,暫時無法登入。建議您避免頻繁登入,並使用授權網路限制登入。
後續步驟
- 進一步瞭解員工身分聯盟。
- 瞭解如何為 IAM 資料庫驗證設定執行個體。
- 瞭解如何透過 IAM 資料庫驗證管理使用者。
- 瞭解如何使用 IAM 資料庫驗證功能登入。