IAM Conditions 可讓您針對Google Cloud 資源 (包括 Cloud SQL 執行個體),定義及強制執行條件式、以屬性為基礎的存取權控管。如要進一步瞭解 IAM 條件,請參閱「IAM 條件總覽」頁面。
簡介
在 Cloud SQL 中,您可以根據下列屬性強制執行條件式存取:
- 日期/時間屬性:可用來為 Cloud SQL 資源設定暫時 (有效期)、已排定或限時等各類存取。舉例來說,您可以允許使用者存取資料庫執行個體,直到指定日期為止。您可以在資源階層的任何層級使用日期/時間屬性。詳情請參閱「 設定臨時存取權」。
- 資源屬性:用於根據標記、資源名稱、資源類型或資源服務屬性,設定條件式存取權。在 Cloud SQL 中,您可以使用資料庫執行個體的屬性設定條件式存取權。舉例來說,您可以只允許使用者存取具有特定標記的執行個體。詳情請參閱「 設定以資源為準的存取權」。
用途包括:
允許使用者連線至特定執行個體。
允許使用者建立具有特定前置字元或後置字元的執行個體 (例如「test」)。
限制測試執行個體的備份作業存取權
允許使用者刪除開發和測試例項,但無法刪除正式版例項。
允許使用者在特定日期或時間執行管理作業。
允許使用者連線至特定執行個體
假設您想讓使用者或服務帳戶僅有權連線至特定 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 控制台的「IAM」頁面。
- 按一下「新增」。
- 在「New Members」(新增成員) 輸入方塊中,輸入服務帳戶電子郵件地址。
- 按一下「角色」下拉式清單,然後選取「Cloud SQL 用戶端」角色。
- 按一下「新增條件」。
- 輸入標題和說明。
- 選取「條件編輯器」分頁標籤。
- 在「條件建構工具」部分中:
- 在「Condition type - Resource - Name」(條件類型 - 資源 - 名稱) 部分輸入
projects/PROJECT_ID/instances/INSTANCE_ID
- 確認已選取「AND」條件。
- 在「Condition type - Resource - Service」(條件類型 - 資源 - 服務) 部分,選取
sqladmin.googleapis.com
。
- 在「Condition type - Resource - Name」(條件類型 - 資源 - 名稱) 部分輸入
- 按一下「儲存」儲存條件。
- 按一下「儲存」以儲存政策。
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 控制台中,前往 UI 中的資源,確認 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 控制台的「IAM」頁面。
- 按一下「主體」分頁標籤。
- 找出要限制存取權的使用者電子郵件地址或服務帳戶 (主體)。
- 按一下主體右側的「編輯主體」圖示。這個圖示看起來像鉛筆。
- 在「編輯權限」對話方塊中,按一下「新增其他角色」。
在後續對話方塊的「Filter」(篩選條件) 欄位中輸入
Cloud SQL Admin
。然後選取顯示的「Cloud SQL 管理員」角色。「編輯權限」對話方塊會隨即啟用,且「Cloud SQL 管理員」角色會顯示在對話方塊中。
- 在「Cloud SQL Admin」角色右側,按一下「Add 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 控制台的「IAM」頁面。
- 按一下「新增」。
- 在「新增成員」欄位中,輸入服務帳戶電子郵件地址。
- 按一下「角色」下拉式清單,然後選取「Cloud SQL 編輯者」角色。這個角色不需要新增任何項目。
- 按一下「儲存」儲存條件。
- 點選相同帳戶的「角色」選單,然後選取「Cloud 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
- 將 `env` 標記附加至測試環境 Cloud SQL 執行個體,並將值設為 `test`。詳情請參閱 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