使用 IAM 條件

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:您要授予存取權的執行個體名稱。

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

    前往「IAM」頁面

  2. 按一下「新增」。
  3. 在「新增成員」輸入框中,輸入服務帳戶的電子郵件地址。
  4. 按一下「角色」下拉式清單,然後選取「Cloud SQL 用戶端」角色。
  5. 按一下「新增條件」
  6. 輸入標題和說明。
  7. 選取「條件編輯器」分頁標籤。
  8. 在「條件建構工具」部分:
    • 在「條件類型 - 資源 - 名稱」中輸入 projects/PROJECT_ID/instances/INSTANCE_ID
    • 確認已選取「AND」條件式。
    • 在「Condition type - Resource - Service」(條件類型 - 資源 - 服務) 部分,選取 sqladmin.googleapis.com
  9. 按一下「儲存」,儲存條件。
  10. 按一下「儲存」,儲存政策。

gcloud

本範例說明如何修改專案的現有 IAM 政策繫結,為特定服務帳戶授予 Cloud SQL 用戶端角色,但僅限於特定執行個體。

本範例使用下列變數:

  • PROJECT_ID:您的 Google Cloud 專案。
  • INSTANCE_ID:您要授予存取權的執行個體名稱。
  • SERVICE_ACCOUNT_EMAIL:您要修改存取權的服務帳戶完整電子郵件地址。

  1. 取得現有的 IAM 政策繫結,並將其輸出至 bindings.json 檔案:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
  3. 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
    }
  4. 使用新的 bindings.json 檔案更新身分與存取權管理政策。
    gcloud projects set-iam-policy PROJECT_ID bindings.json

Terraform

如要允許使用者連線至特定執行個體,請使用 Terraform google_iam_policy 資料資源google_project_iam_policy Terraform 資源

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

套用變更

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含 .tf 副檔名,例如 main.tf。在本教學課程中,檔案稱為 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。

    將範例程式碼複製到新建立的 main.tf 中。

    您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 查看並修改要套用至環境的範例參數。
  4. 儲存變更。
  5. 初始化 Terraform。這項操作只需對每個目錄執行一次。
    terraform init

    如要使用最新版的 Google 供應器,請視需要加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 檢查設定,並確認 Terraform 要建立或更新的資源是否符合您的預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,即可套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

刪除變更

如要刪除變更,請按照下列步驟操作:

  1. 如要停用防刪除功能,請在 Terraform 設定檔中將 deletion_protection 引數設為 false
    deletion_protection =  "false"
  2. 執行下列指令,並在提示中輸入 yes,即可套用更新的 Terraform 設定:
    terraform apply
  1. 如要移除先前透過 Terraform 設定套用的資源,請執行下列指令,並在提示中輸入 yes

    terraform destroy

限制測試執行個體的備份作業存取權

假設服務的拓撲已設定好,所有測試例項的前置字串為 test (例如 test-instance-1),所有正式版例項的前置字串為 prod (例如 prod-instance-1)。

您可以限制使用者或服務帳戶對測試執行個體的備份作業存取權。限制存取權包括限制 CREATEGETLISTDELETE 作業,以備份測試執行個體。

控制台

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

    前往「IAM」頁面

  2. 按一下「PRINCIPALS」分頁標籤。
  3. 找出要限制存取權的使用者電子郵件地址或服務帳戶 (主要使用者)。
  4. 按一下主體右側的「編輯主體」圖示。這個圖示看起來像鉛筆。
  5. 在「Edit permissions」(編輯權限) 對話方塊中,按一下「ADD ANOTHER ROLE」(新增其他角色)
  6. 在後續對話方塊的「Filter」欄位中輸入 Cloud SQL Admin。然後選取隨即顯示的「Cloud SQL Admin」角色。

    「Edit permissions」對話方塊已啟用,且「Cloud SQL Admin」角色現在會顯示在對話方塊中。

  7. 按一下「Cloud SQL 管理員」角色右側的「新增限制條件」連結。
  8. 在「Edit condition」對話方塊中提供以下資訊:
    1. 在「Title」欄位中,輸入要新增的條件名稱,以便限制對測試執行個體備份作業的存取權。例如,您可以輸入 Limit access to backup operations
    2. 按一下「CONDITION EDITOR」分頁標籤,然後新增下列條件:

      resource.type == "sqladmin.googleapis.com/BackupRun" && 
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. 按一下 [儲存]
  10. 在「編輯權限」對話方塊中,按一下「儲存」

gcloud

本範例使用下列變數:

  • PROJECT_ID:您的 Google Cloud 專案。
  • USER_EMAIL:使用者的電子郵件地址。
  • SERVICE_ACCOUNT_EMAIL:您要限制存取權的服務帳戶完整電子郵件地址。

  1. 針對電子郵件地址為 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"
        
  2. 針對以 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 管理員角色。

控制台

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

    前往「IAM」頁面

  2. 按一下「新增」。
  3. 在「新增成員」欄位中輸入服務帳戶的電子郵件地址。
  4. 按一下「角色」下拉式清單,然後選取「Cloud SQL 編輯者」角色。請勿為這個角色新增任何內容。
  5. 按一下「儲存」,儲存條件。
  6. 按一下同一個帳戶的「角色」選單,然後選取「Cloud SQL 管理員」角色。
  7. 按一下「新增條件」
  8. 輸入標題和說明。
  9. 選取「條件編輯器」分頁標籤。
  10. 在「條件建構工具」部分:
    • 在「Condition type - Resource - Name」 中,輸入條件的名稱。
    • 在「Condition type - Resource - Service」(條件類型 - 資源 - 服務) 部分,選取 sqladmin.googleapis.com
    • 在「Condition type - Resource - Tag」中,輸入標記鍵命名空間名稱。在本例中,運算子matches,而值為 815471563813/env/test
  11. 按一下「儲存」,儲存條件。
  12. 按一下「儲存」,儲存政策。

gcloud

本範例使用下列變數:

  • PROJECT_ID:您的 Google Cloud 專案。
  • INSTANCE_ID:您的 Cloud SQL 執行個體。
  • REGION:Cloud SQL 執行個體所在的地區。
  • ORGANIZATION_ID:機構 ID,做為此標記鍵的父項資源;例如:12345678901。如要瞭解如何取得機構 ID,請參閱「建立及管理機構」。
  • SERVICE_ACCOUNT_EMAIL:您要修改存取權的服務帳戶完整電子郵件地址。

  1. 建立名為 `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
        
  2. 將值為 `test` 的 `env` 標記附加至測試環境 Cloud SQL 執行個體。詳情請參閱 Cloud SQL 標記頁面。
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. 取得現有的身分與存取權管理政策繫結,並輸出至 bindings.json 檔案:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
  5. 將下列條件式繫結新增至 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
    }
  6. 使用新的 bindings.json 檔案更新 IAM 政策繫結。
    gcloud projects set-iam-policy PROJECT_ID bindings.json