IAM 條件可讓您為Google Cloud 資源 (包括 Cloud SQL 執行個體) 定義及強制執行條件式、以屬性為基礎的存取控管機制。如要進一步瞭解 IAM 條件,請參閱「IAM 條件總覽」頁面。
簡介
在 Cloud SQL 中,您可以根據下列屬性強制執行條件式存取:
- 日期/時間屬性:用於設定 Cloud SQL 資源的暫時 (有效期)、排定或限時存取權。例如,您可以允許使用者在指定日期前存取資料庫執行個體。您可以在資源階層的任何層級使用日期/時間屬性。詳情請參閱「設定臨時存取權」。
- 資源屬性:用於根據標記、資源名稱、資源類型或資源服務屬性設定條件式存取權。在 Cloud SQL 中,您可以使用資料庫執行個體的屬性設定條件式存取權。舉例來說,您可以允許使用者僅存取具有特定標記的執行個體。詳情請參閱「設定資源型存取權」。
用途包括:
允許使用者連線至特定執行個體。
允許使用者建立具有特定前置字元或後置字元的執行個體 (例如「test」)。
限制測試執行個體的備份作業存取權
允許使用者刪除開發和測試執行個體,但不得刪除正式環境執行個體。
允許使用者在特定日期或時間執行管理作業。
限制
IAM 條件不支援 Cloud SQL Admin API 中 users 資源 (cloudsql.users.* 權限) 或 databases 資源 (cloudsql.databases.* 權限) 的作業。在 Cloud SQL 中,資源條件僅支援 sqladmin.googleapis.com/Instance 和 sqladmin.googleapis.com/BackupRun 資源類型。您無法使用 IAM 條件限制使用者管理作業 (User API) 或資料庫管理作業 (Database API) 的存取權。
允許使用者連線至特定執行個體
假設您想讓使用者或服務帳戶僅具備連線至特定 Cloud SQL 執行個體的權限,您可以在 IAM 政策繫結中加入 IAM 條件,授予該帳戶 Cloud SQL 角色的權限。
根據預設,預先定義的 Cloud SQL 用戶端角色 (roles/cloudsql.client) 包含 cloudsql.instances.connect 權限,可授權成員連線至專案中的所有 Cloud SQL 執行個體。只要在政策繫結中加入 IAM 條件,即可僅授予指定執行個體的權限。
控制台
這個範例說明如何修改專案現有的 IAM 繫結,為服務帳戶授予特定執行個體的 Cloud SQL 用戶端角色。
這個範例使用下列變數:
- PROJECT_ID:您的 Google Cloud 專案。
- INSTANCE_ID::要授予 存取權的執行個體名稱。
-
前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
- 按一下「新增」。
- 在「新增成員」輸入方塊中,輸入服務帳戶電子郵件。
- 按一下「Role」(角色) 下拉式選單,然後選取「Cloud SQL Client」(Cloud SQL 用戶端) 角色。
- 按一下「新增條件」。
- 輸入標題和說明。
- 選取「條件編輯器」分頁標籤。
- 在「條件建構工具」部分:
- 在「條件類型 - 資源 - 名稱」部分,輸入
projects/PROJECT_ID/instances/INSTANCE_ID - 確認已選取「AND」條件。
- 在「條件類型 - 資源 - 服務」部分,選取「
sqladmin.googleapis.com」。
- 在「條件類型 - 資源 - 名稱」部分,輸入
- 按一下「儲存」儲存條件。
- 按一下「儲存」即可儲存政策。
gcloud
這個範例說明如何修改專案現有的 IAM 政策繫結,將 Cloud SQL 用戶端角色授予特定服務帳戶,但僅限於特定執行個體。
這個範例使用下列變數:
- PROJECT_ID:您的 Google Cloud 專案。
- INSTANCE_ID:要授予 存取權的執行個體名稱。
- SERVICE_ACCOUNT_EMAIL:要修改存取權的服務帳戶完整電子郵件地址。
- 取得現有的 IAM 政策繫結,並將其輸出至
bindings.json檔案: - 在
bindings.json檔案中新增下列條件式角色繫結:{ "bindings": [ { "role": "roles/cloudsql.client", "members": [ "serviceAccount:SERVICE_ACCOUNT_EMAIL" ], "condition": { "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID' && resource.service == 'sqladmin.googleapis.com'" } } ], "etag": "BwWKmjvelug=", "version": 3 }
- 使用新的
bindings.json檔案更新 IAM 政策。gcloud projects set-iam-policy PROJECT_ID bindings.json
gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
Terraform
如要允許使用者連線至特定執行個體,請使用 Terraform google_iam_policy 資料資源和 google_project_iam_policy Terraform 資源。
套用變更
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案。
這項指令在每個專案中只需執行一次,且可在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確的值,環境變數就會遭到覆寫。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為「根模組」)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須有
.tf副檔名,例如main.tf。在本教學課程中,這個檔案稱為main.tf。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在進行教學課程,可以複製每個章節或步驟中的程式碼範例。
將程式碼範例複製到新建立的
main.tf。您也可以從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。
- 請查看並修改範例參數,以便套用至您的環境。
- 儲存變更。
-
初始化 Terraform。每個目錄只需執行一次這項操作。
terraform init
如要使用最新版 Google 供應商,請視需要加入
-upgrade選項:terraform init -upgrade
套用變更
-
查看設定,確認 Terraform 要建立或更新的資源符合預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes,套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台的使用者介面中,前往資源頁面,確認 Terraform 已建立或更新資源。
刪除變更
如要刪除變更,請按照下列步驟操作:
- 如要停用防刪除功能,請在 Terraform 設定檔中將
deletion_protection引數設為false。deletion_protection = "false"
- 執行下列指令,並在提示中輸入
yes,套用更新後的 Terraform 設定:terraform apply
-
執行下列指令,並在提示中輸入
yes,移除先前使用 Terraform 設定套用的資源:terraform destroy
限制測試執行個體的備份作業存取權
假設服務的拓撲設定為所有測試執行個體都有 test 前置字元 (例如 test-instance-1),而所有正式環境執行個體都有 prod 前置字元 (例如 prod-instance-1)。
您可以限制使用者或服務帳戶對測試執行個體的備份作業存取權。限制存取權包括限制 CREATE、GET、LIST 或 DELETE 作業,以備份測試執行個體。
控制台
-
前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
- 按一下「主體」分頁標籤。
- 找出要限制存取權的使用者電子郵件地址或服務帳戶 (主體)。
- 按一下主體右側的「Edit principal」(編輯主體) 圖示。這個圖示看起來像鉛筆。
- 在「編輯權限」對話方塊中,按一下「新增其他角色」。
在後續對話方塊的「Filter」(篩選器) 欄位中,輸入
Cloud SQL Admin。然後選取顯示的「Cloud SQL 管理員」角色。「Edit permissions」(編輯權限) 對話方塊會啟用,且「Cloud SQL Admin」(Cloud SQL 管理員) 角色現在會顯示在對話方塊中。
- 按一下「Cloud SQL 管理員」角色右側的「新增條件」連結。
- 在「Edit condition」(編輯條件) 對話方塊中,提供下列資訊:
- 在「Title」(標題) 欄位中,輸入要新增的條件名稱,限制測試執行個體的備份作業存取權。例如,您可以輸入
Limit access to backup operations。 按一下「條件編輯器」分頁標籤,然後新增下列條件:
resource.type == "sqladmin.googleapis.com/BackupRun" && resource.name.startsWith("projects/PROJECT_ID/instances/test")
名稱。
- 在「Title」(標題) 欄位中,輸入要新增的條件名稱,限制測試執行個體的備份作業存取權。例如,您可以輸入
- 按一下 [儲存]。
- 在「編輯權限」對話方塊中,按一下「儲存」。
gcloud
這個範例使用下列變數:
- PROJECT_ID:您的 Google Cloud 專案。
- USER_EMAIL:使用者的電子郵件地址。
- SERVICE_ACCOUNT_EMAIL:要限制存取權的服務帳戶完整電子郵件地址。
-
限制電子郵件地址為 USER_EMAIL 的使用者
cloudsql.admin角色範圍。角色範圍僅限於資源名稱開頭為
projects/PROJECT_ID/instances/test的資源。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \ --role=roles/cloudsql.admin \ --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
-
限制使用 SERVICE_ACCOUNT_EMAIL 服務帳戶登入的使用者
cloudsql.admin角色範圍。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \ --role=roles/cloudsql.admin \ --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
或
允許使用者刪除測試執行個體,但不得刪除正式環境執行個體
假設您想允許服務帳戶刪除測試執行個體,但不允許刪除正式環境執行個體。方法是使用標記,並為服務帳戶新增下列兩項政策繫結:
- 在您授予角色的資源及其子項中,具備 Cloud SQL 編輯者角色。如果授予專案,則角色會套用至專案中的所有執行個體。Cloud SQL 編輯者角色不含
cloudsql.instances.delete權限。 - 具備
test標記的執行個體 Cloud SQL 管理員角色。
控制台
-
前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
- 按一下「新增」。
- 在「新增成員」欄位中,輸入服務帳戶電子郵件地址。
- 按一下「Role」(角色) 下拉式選單,然後選取「Cloud SQL Editor」(Cloud SQL 編輯者) 角色。請勿為這個角色新增其他內容。
- 按一下「儲存」儲存條件。
- 按一下同一個帳戶的「Role」(角色) 選單,然後選取「Cloud SQL Admin」(Cloud SQL 管理員) 角色。
- 按一下「新增條件」。
- 輸入標題和說明。
- 選取「條件編輯器」分頁標籤。
- 在「條件建構工具」部分:
- 在「條件類型 - 資源 - 名稱」部分,輸入條件名稱。
- 在「條件類型 - 資源 - 服務」部分,選取「
sqladmin.googleapis.com」。 - 在「Condition type - Resource - Tag」(條件類型 - 資源 - 標記) 部分,輸入標記索引鍵命名空間名稱。在本例中,「運算子」為
matches,值為815471563813/env/test。
- 按一下「儲存」儲存條件。
- 按一下「儲存」即可儲存政策。
gcloud
這個範例使用下列變數:
- PROJECT_ID:您的 Google Cloud 專案。
- INSTANCE_ID:Cloud SQL 執行個體。
- REGION:Cloud SQL 執行個體所在的區域。
- ORGANIZATION_ID:這個標記鍵的父項資源所屬機構 ID,例如 12345678901。如要瞭解如何取得組織 ID,請參閱「建立及管理組織」。
- SERVICE_ACCOUNT_EMAIL:要修改存取權的服務帳戶完整電子郵件地址。
- 建立名為 `env` 的標記鍵,並設定標記值 `prod` 和 `test`。詳情請參閱「建立及定義新標記」。
gcloud alpha resource-manager tags keys create env \ --parent=organizations/ORGANIZATION_ID gcloud alpha resource-manager tags values create prod \ --parent=env gcloud alpha resource-manager tags values create test \ --parent=env
- 將值為 `test` 的 `env` 標記附加至測試環境 Cloud SQL 執行個體。詳情請參閱「Cloud SQL 標記」頁面。
- 取得現有的 IAM 政策繫結,並輸出至
bindings.json檔案:gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
- 將下列條件繫結新增至
bindings.json檔案:{ "bindings": [ { "role": "roles/cloudsql.editor", "members": [ "serviceAccount:SERVICE_ACCOUNT_EMAIL" ] }, { "role": "roles/cloudsql.admin", "members": [ "serviceAccount:SERVICE_ACCOUNT_EMAIL" ], "condition": { "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')" } } ], "etag": "BwWKmjvelug=" "version": 3 }
- 使用新的
bindings.json檔案更新 IAM 政策繫結。gcloud projects set-iam-policy PROJECT_ID bindings.json
gcloud alpha resource-manager tags bindings create \ --tag-value=test \ --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \ --location=REGION