將 Container Registry 中的 IAM 角色對應至 Artifact Registry

本文說明如何將 Container Registry 角色對應至 Artifact Registry 角色,並套用至 Artifact Registry 存放區。您可以使用自動遷移工具完成相同步驟。

Container Registry 和 Artifact Registry 使用不同的 Identity and Access Management (IAM) 角色,控管登錄檔中儲存的容器映像檔存取權。

為協助您從 Container Registry 遷移至 Artifact Registry,您可以執行 Google Cloud CLI 指令,該指令會:

  • 找出適用於 Cloud Storage 儲存空間值區的允許政策,該值區會儲存 Container Registry 的映像檔
  • 傳回具有類似 Artifact Registry 角色的政策,方便您授權現有的 Container Registry 使用者存取 Artifact Registry 存放區。

這項指令會使用 IAM 政策分析器分析 IAM 允許政策。

事前準備

  1. 建立 Artifact Registry 存放區。如果選擇手動遷移,請按照步驟手動遷移至 Artifact Registry 中的 gcr.io 存放區,或手動遷移至 pkg.dev 存放區

  2. Enable the Cloud Asset API.

    Enable the API

    您必須在要分析現有允許政策的專案中啟用 API。

  3. 安裝並初始化 gcloud CLI。如果是現有安裝項目,請使用下列指令更新至最新版本:

    gcloud components update
    

必要的角色

如要取得分析允許政策及授予 Artifact Registry 存放區存取權所需的權限,請管理員在您要分析權限的專案、資料夾或機構中,授予您下列 IAM 角色:

  • Cloud Asset Viewer (roles/cloudasset.viewer)
  • 如要分析含有自訂 IAM 角色的政策: 角色檢視者 (roles/iam.roleViewer)
  • 如要使用 Google Cloud CLI 分析政策,請按照下列步驟操作: 服務用量消費者 (roles/serviceusage.serviceUsageConsumer)
  • 如要授予 Artifact Registry 存放區的角色,請按照下列步驟操作: Artifact Registry 管理員

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色具備分析允許政策,以及授予 Artifact Registry 存放區存取權所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要分析允許政策及授予 Artifact Registry 存放區的存取權,您必須具備下列權限:

  • cloudasset.assets.analyzeIamPolicy
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.searchAllIamPolicies
  • 如要使用自訂 IAM 角色分析政策,請按照下列步驟操作: iam.roles.get
  • 如要使用 Google Cloud CLI 分析政策,請按照下列步驟操作: serviceusage.services.use
  • 如要授予 Artifact Registry 存放區的角色: artifactregistry.repositories.setIamPolicy

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

使用對應工具

對應工具會檢查指定 Container Registry 主機名稱 (例如 gcr.io) 的允許政策。

這項工具會檢查預先定義的 Cloud Storage 角色中的權限集,並將這些權限集對應至 Artifact Registry 角色。如要比較 Cloud Storage 權限與 Artifact Registry 角色,請參閱角色對應

如何使用角色對應工具:

  1. 執行對應工具:

    gcloud beta artifacts docker upgrade print-iam-policy HOSTNAME \
        --project=PROJECT_ID > POLICY_FILENAME
    

    替換下列值:

    • HOSTNAME 是您要工具分析的 Container Registry 主機名稱:

      • gcr.io
      • asia.gcr.io
      • eu.gcr.io
      • us.gcr.io
    • PROJECT_ID 是要分析的登錄主機所在 Google Cloud 專案 的 ID。

    • POLICY_FILE 是工具傳回的 YAML 格式政策檔案名稱。

    以下範例指令會分析專案 my-project 中的儲存空間值區,找出直接套用至值區或從上層機構 ID 101231231231 及其後代繼承的允許政策。gcr.io

    gcloud beta artifacts docker upgrade print-iam-policy gcr.io \
        --project=my-project > gcr-io-policy.yaml
    

    這個指令會根據儲存空間 bucket 的現有允許政策,以 YAML 格式傳回含有 Artifact Registry 角色繫結的政策檔案。如果儲存空間值區的父項專案位於機構中,政策檔案會包含在資料夾或機構層級獲准存取權的主體。

    舉例來說,下列範例包含 Artifact Registry 的角色繫結,適用於:

    • Cloud Build、Compute Engine 和 Container Registry 服務代理程式。服務代理會代表Google Cloud 服務執行動作。
    • 使用者帳戶 user@example.com
    • 使用者管理的服務帳戶 deploy@my-project.iam.gserviceaccount.com
    bindings:
    - members:
      - service-3213213213213@gcp-sa-cloudbuild.iam.gserviceaccount.com
      - user:user@example.com
      role: roles/artifactregistry.repoAdmin
    - members:
      - serviceAccount:deploy@my-project.iam.gserviceaccount.com
      - serviceAccount:service-1231231231231@@compute-system.iam.gserviceaccount.com
      - serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
      role: roles/artifactregistry.reader
    
  2. 從政策檔案中移除 Container Registry 服務代理程式的行,因為該服務帳戶不需要存取 Artifact Registry 存放區。服務代理電子郵件地址的後置字元為 containerregistry.iam.gserviceaccount.com

    在上一個步驟的範例政策中,包含 Container Registry 服務代理程式的行是:

    - serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
    
  3. 檢查其他角色繫結,確認是否合適。

    Artifact Registry 還有其他預先定義的角色,您可能想為部分主體指派這些角色。舉例來說,Artifact Registry 推送建立存放區管理員可讓主體在 Artifact Registry 中建立 gcr.io 存放區,但無法建立其他 Artifact Registry 存放區。

  4. 為政策檔案中缺少的任何主體新增角色繫結。

    傳回的政策檔案可能缺少下列主體:

    • 主體具有自訂角色,且這些自訂角色沒有工具用來對應角色的權限組合。
    • 如果您沒有權限查看父項資料夾或機構,系統會顯示在父項資料夾或機構中獲准存取權的主體。
  5. 將政策繫結套用至 Artifact Registry 存放區。

    gcloud artifacts repositories set-iam-policy REPOSITORY FILENAME \
        --project=PROJECT_ID \
        --location=LOCATION
    

    替換下列值:

    • REPOSITORY 是存放區的名稱。
    • POLICY_FILENAME 是要套用至存放區的政策檔案名稱。
    • PROJECT_ID 是專案 ID。
    • LOCATION 是存放區的區域或多區域位置

    以下是專案 my-project 的範例,會將 gcr-io-policy.yaml 檔案中的政策套用至 us 多區域中名為 gcr.io 的存放區:

    gcloud artifacts repositories set-iam-policy gcr.io gcr-io-policy.yaml \
        --project=my-project \
        --location=us
    

    如要將角色繫結套用至較高層級的資源,請編輯現有的專案、資料夾或機構政策,加入您要新增的繫結。

角色對應

下表列出應授予現有 Container Registry 使用者的預先定義 Artifact Registry 角色,具體取決於他們擁有的 Cloud Storage 權限。

角色必須具備的權限 Artifact Registry 角色
storage.objects.get
storage.objects.list
Artifact Registry 讀取者
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
Artifact Registry Writer
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.objects.delete
Artifact Registry 存放區管理員
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
storage.buckets.create
Artifact Registry 管理員