使用 IAM 條件

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

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「IAM」頁面

  2. 按一下「新增」。
  3. 在「新增成員」輸入方塊中,輸入服務帳戶電子郵件。
  4. 按一下「Role」(角色) 下拉式選單,然後選取「Cloud SQL Client」(Cloud SQL 用戶端) 角色。
  5. 按一下「新增條件」。
  6. 輸入標題和說明。
  7. 選取「條件編輯器」分頁標籤。
  8. 在「條件建構工具」部分:
    • 在「條件類型 - 資源 - 名稱」部分,輸入 projects/PROJECT_ID/instances/INSTANCE_ID
    • 確認已選取「AND」條件。
    • 在「條件類型 - 資源 - 服務」部分,選取「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 檔案更新 IAM 政策。
    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 控制台的使用者介面中,前往資源頁面,確認 Terraform 已建立或更新資源。

刪除變更

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

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

    terraform destroy

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

假設服務的拓撲設定為所有測試執行個體都有 test 前置字元 (例如 test-instance-1),而所有正式環境執行個體都有 prod 前置字元 (例如 prod-instance-1)。

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

控制台

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「IAM」頁面

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

    「Edit permissions」(編輯權限) 對話方塊會啟用,且「Cloud SQL Admin」(Cloud SQL 管理員) 角色現在會顯示在對話方塊中。

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

      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. 或

  3. 限制使用 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 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「IAM」頁面

  2. 按一下「新增」。
  3. 在「新增成員」欄位中,輸入服務帳戶電子郵件地址。
  4. 按一下「Role」(角色) 下拉式選單,然後選取「Cloud SQL Editor」(Cloud SQL 編輯者) 角色。請勿為這個角色新增其他內容。
  5. 按一下「儲存」儲存條件。
  6. 按一下同一個帳戶的「Role」(角色) 選單,然後選取「Cloud SQL Admin」(Cloud SQL 管理員) 角色。
  7. 按一下「新增條件」。
  8. 輸入標題和說明。
  9. 選取「條件編輯器」分頁標籤。
  10. 在「條件建構工具」部分:
    • 在「條件類型 - 資源 - 名稱」部分,輸入條件名稱。
    • 在「條件類型 - 資源 - 服務」部分,選取「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. 取得現有的 IAM 政策繫結,並輸出至 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