IAM 條件可讓您針對Google Cloud 資源 (包括 Cloud SQL 執行個體) 定義及強制執行條件式、以屬性為基礎的存取權控管。如要進一步瞭解 IAM 條件,請參閱「IAM 條件總覽」頁面。
簡介
在 Cloud SQL 中,您可以根據下列屬性強制執行條件式存取權:
- 日期/時間屬性:用於設定 Cloud SQL 資源的暫時 (有效期)、排程或限時存取權。舉例來說,您可以允許使用者在指定日期前存取資料庫執行個體。您可以在資源階層結構的任何層級使用日期/時間屬性。詳情請參閱「 設定臨時存取權」。
- 資源屬性:用於根據標記、資源名稱、資源類型或資源服務屬性設定條件式存取權。在 Cloud SQL 中,您可以使用資料庫執行個體的屬性設定條件存取權。舉例來說,您可以允許使用者只存取標記為特定標記的執行個體。詳情請參閱「 設定資源存取權」。
用途包括:
允許使用者連線至特定執行個體。
允許使用者使用特定前置字元或後置字元建立執行個體 (例如「test」)。
限制測試執行個體的備份作業存取權
允許使用者刪除開發和測試執行個體,但不允許刪除實際工作環境執行個體。
允許使用者在特定日期或時間執行管理作業。
允許使用者連線至特定執行個體
假設您希望使用者或服務帳戶僅具備連線至特定 Cloud SQL 執行個體的權限。您可以在 IAM 政策繫結中加入 IAM 條件,為該帳戶授予 Cloud SQL 角色的權限。
根據預設,包含 cloudsql.instances.connect
權限的預先定義 Cloud SQL 用戶端角色 (roles/cloudsql.client
) 會授權其成員連線至專案中的所有 Cloud SQL 執行個體。您可以在政策繫結中導入 IAM 限制條件,只將權限授予指定的執行個體。
控制台
本範例說明如何修改專案的現有 IAM 繫結,為服務帳戶授予特定執行個體的 Cloud SQL 用戶端角色。
本範例使用下列變數:
- PROJECT_ID:您的 Google Cloud 專案。
- INSTANCE_ID:您要授予存取權的執行個體名稱。
-
前往 Google Cloud 控制台的「IAM」頁面。
- 按一下「新增」。
- 在「新增成員」輸入框中,輸入服務帳戶的電子郵件地址。
- 按一下「角色」下拉式清單,然後選取「Cloud SQL 用戶端」角色。
- 按一下「新增條件」。
- 輸入標題和說明。
- 選取「條件編輯器」分頁標籤。
- 在「條件建構工具」部分:
- 在「條件類型 - 資源 - 名稱」中輸入
projects/PROJECT_ID/instances/INSTANCE_ID
- 確認已選取「AND」條件式。
- 在「Condition type - Resource - Service」(條件類型 - 資源 - 服務) 部分,選取
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
檔案更新身分與存取權管理政策。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 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
刪除變更
如要刪除變更,請按照下列步驟操作:
- 如要停用防刪除功能,請在 Terraform 設定檔中將
deletion_protection
引數設為false
。deletion_protection = "false"
- 執行下列指令,並在提示中輸入
yes
,即可套用更新的 Terraform 設定:terraform apply
-
如要移除先前透過 Terraform 設定套用的資源,請執行下列指令,並在提示中輸入
yes
:terraform destroy
限制測試執行個體的備份作業存取權
假設服務的拓撲已設定好,所有測試例項的前置字串為 test
(例如 test-instance-1
),所有正式版例項的前置字串為 prod
(例如 prod-instance-1
)。
您可以限制使用者或服務帳戶對測試執行個體的備份作業存取權。限制存取權包括限制 CREATE
、GET
、LIST
或 DELETE
作業,以備份測試執行個體。
控制台
-
前往 Google Cloud 控制台的「IAM」頁面。
- 按一下「PRINCIPALS」分頁標籤。
- 找出要限制存取權的使用者電子郵件地址或服務帳戶 (主要使用者)。
- 按一下主體右側的「編輯主體」圖示。這個圖示看起來像鉛筆。
- 在「Edit permissions」(編輯權限) 對話方塊中,按一下「ADD ANOTHER ROLE」(新增其他角色)。
在後續對話方塊的「Filter」欄位中輸入
Cloud SQL Admin
。然後選取隨即顯示的「Cloud SQL Admin」角色。「Edit permissions」對話方塊已啟用,且「Cloud SQL Admin」角色現在會顯示在對話方塊中。
- 按一下「Cloud SQL 管理員」角色右側的「新增限制條件」連結。
- 在「Edit condition」對話方塊中提供以下資訊:
- 在「Title」欄位中,輸入要新增的條件名稱,以便限制對測試執行個體備份作業的存取權。例如,您可以輸入
Limit access to backup operations
。 按一下「CONDITION EDITOR」分頁標籤,然後新增下列條件:
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 控制台的「IAM」頁面。
- 按一下「新增」。
- 在「新增成員」欄位中輸入服務帳戶的電子郵件地址。
- 按一下「角色」下拉式清單,然後選取「Cloud SQL 編輯者」角色。請勿為這個角色新增任何內容。
- 按一下「儲存」,儲存條件。
- 按一下同一個帳戶的「角色」選單,然後選取「Cloud SQL 管理員」角色。
- 按一下「新增條件」。
- 輸入標題和說明。
- 選取「條件編輯器」分頁標籤。
- 在「條件建構工具」部分:
- 在「Condition type - Resource - Name」 中,輸入條件的名稱。
- 在「Condition type - Resource - Service」(條件類型 - 資源 - 服務) 部分,選取
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 標記頁面。
- 取得現有的身分與存取權管理政策繫結,並輸出至
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