使用 IAM 條件

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

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

    前往「IAM」頁面

  2. 按一下「新增」
  3. 在「New Members」(新增成員) 輸入方塊中,輸入服務帳戶電子郵件地址。
  4. 按一下「角色」下拉式清單,然後選取「Cloud SQL 用戶端」角色。
  5. 按一下「新增條件」
  6. 輸入標題和說明。
  7. 選取「條件編輯器」分頁標籤。
  8. 在「條件建構工具」部分中:
    • 在「Condition type - Resource - Name」(條件類型 - 資源 - 名稱) 部分輸入 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 檔案更新 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 控制台中,前往 UI 中的資源,確認 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)。

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

控制台

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

    前往「IAM」頁面

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

    「編輯權限」對話方塊會隨即啟用,且「Cloud SQL 管理員」角色會顯示在對話方塊中。

  7. 在「Cloud SQL Admin」角色右側,按一下「Add condition」連結。
  8. 在「編輯條件」對話方塊中,提供下列資訊:
    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. 限制以 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 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. 將 `env` 標記附加至測試環境 Cloud SQL 執行個體,並將值設為 `test`。詳情請參閱 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