使用 IAM 控管存取權

本頁說明如何使用權限控管 Container Registry 的存取權。

設定權限後,即可為用於推送及提取映像檔的 Docker 用戶端設定驗證

如果您使用 Artifact Analysis 處理容器中繼資料 (例如映像檔中發現的安全漏洞),請參閱 Artifact Analysis 說明文件,瞭解如何授予檢視或管理中繼資料的存取權。

事前準備

確認您有權管理使用者。您必須具備下列任一角色的權限:

  • 專案 IAM 管理員 (roles/resourcemanager.projectIamAdmin)
  • 安全管理員 (roles/iam.securityAdmin)

除了授予這些角色,您也可以使用具備相同權限的自訂角色預先定義的角色

權限與角色

與 Container Registry 互動的所有使用者、服務帳戶和其他身分,都必須具備 Cloud Storage 的適當 Identity and Access Management (IAM) 權限。

  • Google Cloud 通常會存取 Container Registry 的服務,會設定為具備相同專案中登錄檔的預設權限。Google Cloud 如果預設權限不符合需求,請設定適當的權限。
  • 如果是其他身分,則必須設定必要權限。

您可以使用 Cloud Storage 權限控管 Container Registry 主機的存取權。下表列出具有 Container Registry 所需權限的Cloud Storage 角色

使用 Google Cloud 控制台檢視 Container Registry 映像檔時,需要一些額外權限,請參閱「使用 Cloud 控制台所需的常用權限」。

必要存取權 角色 授予權限的位置
從現有登錄檔提取映像檔 (唯讀) Storage 物件檢視者 (roles/storage.objectViewer) 授予登錄檔儲存空間 bucket 的角色。
將映像檔推送 (寫入) 至專案中的現有登錄主機,並從該主機提取 (讀取) 映像檔 Storage 舊版值區寫入者 (roles/storage.legacyBucketWriter) 授予登錄檔儲存 bucket 的角色。這項權限僅適用於 bucket 層級,無法在專案層級授予。
將登錄主機新增至 Google Cloud 專案,並建立相關聯的儲存空間 bucket。 Storage 管理員 (roles/storage.admin) 在專案層級授予角色

推送映像檔需要物件讀取和寫入權限,以及 storage.buckets.get 權限。Storage 舊版值區寫入者角色包含單一 Cloud Storage 角色中的必要權限,但不會授予儲存空間值區和物件的完整控制權。

Storage 管理員角色可授予儲存空間值區和物件的完整控制權。 如果在專案層級授予這項權限,主體就能存取專案中的所有儲存空間值區,包括 Container Registry 未使用的值區。請仔細考慮哪些主體需要這個角色。

  • 根據預設,Cloud Build 服務帳戶在「Storage 管理員」角色中具有權限。因此,這個服務帳戶可以透過第一次推送,將登錄檔新增至父項專案,並將映像檔推送至父項專案中的現有登錄檔。
  • 如果您使用 Docker 或其他工具建立映像檔並推送至登錄檔,建議您使用具備較寬鬆「Storage 管理員」角色的帳戶,將登錄檔新增至專案,然後將「Storage 舊版值區寫入者」或「Storage 物件檢視者」角色授予需要推送或提取映像檔的其他帳戶。

如要進一步瞭解 Cloud Storage 角色和權限,請參閱 Cloud Storage 說明文件

授予 IAM 權限

Container Registry 使用 Cloud Storage 值區做為容器映像檔的基礎儲存空間。您可以為登錄檔的值區授予權限,控管映像檔的存取權。

首次將映像檔推送至主機名稱時,系統會將登錄主機及其儲存空間值區新增至專案。舉例來說,首次推送至 gcr.io/my-project 時,會將 gcr.io 登錄主機新增至專案 (專案 IDmy-project),並為登錄檔建立儲存空間值區。值區名稱的格式如下:

  • artifacts.PROJECT-ID.appspot.com 儲存在主機上的圖片 gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com 適用於儲存在其他登錄主機上的映像檔

如要順利執行首次映像檔推送作業,執行推送作業的帳戶必須具有儲存空間管理員角色的權限。

將映像檔推送至登錄主機後,請在登錄儲存空間值區上授予權限,控管登錄中的映像檔存取權:

  • Storage 舊版值區寫入者,可推送及提取資料
  • Storage 物件檢視者 (僅限提取)

您可以使用 Google Cloud console或 Google Cloud CLI 授予值區權限。

限制和規定

您只能在儲存空間值區層級授予 Container Registry 主機權限。

  • Container Registry 會忽略針對 Cloud Storage 值區中的個別物件所設定的權限。
  • 您無法授予登錄檔內存放區的權限。如果需要更精細的存取控管機制,Artifact Registry 提供存放區層級的存取控管,可能更符合您的需求。
  • 如果為任何 Container Registry 儲存空間值區啟用統一 bucket 層級存取權,您必須明確授予存取登錄檔的所有使用者和服務帳戶權限。在這種情況下,擁有者和編輯者角色可能不會自行授予所需的權限。

授予權限

  1. 如果專案中還沒有登錄主機,具有儲存空間管理員角色權限的帳戶必須將第一個映像檔推送到登錄。這會為登錄主機建立儲存空間 bucket。

    Cloud Build 擁有必要權限,可在同一專案中執行初始映像檔推送作業。如果您使用其他工具推送映像檔,請驗證 Google Cloud 您用來向 Container Registry 驗證身分的帳戶權限。

    如要進一步瞭解如何使用 Docker 推送初始映像檔,請參閱「新增登錄檔」。

  2. 在 Container Registry 專案中,授予登錄主機使用的 Cloud Storage bucket 適當權限。

    主控台

    1. 前往 Google Cloud 控制台的 Cloud Storage 頁面
    2. 按一下 bucket 的 artifacts.PROJECT-ID.appspot.com 連結或 STORAGE-REGION.artifacts.PROJECT-ID.appspot.com

      PROJECT-ID 替換為託管 Container Registry 的專案 ID Google Cloud,並將 STORAGE-REGION 替換為託管映像檔的多區域 (asiaeuus) 存放區。

    3. 選取 [Permission] (權限) 分頁標籤。

    4. 按一下「新增」

    5. 在「主體」欄位中,輸入需要存取權的帳戶電子郵件地址,並以半形逗號分隔。電子郵件地址可以是下列其中一種:

      • Google 帳戶 (例如 someone@example.com)
      • Google 群組 (例如 my-developer-team@googlegroups.com)
      • IAM 服務帳戶

        請參閱Google Cloud 服務清單,瞭解通常會存取登錄檔的服務,並找出相關聯服務帳戶的電子郵件地址。如果服務在 Container Registry 以外的專案中執行,請務必使用其他專案中服務帳戶的電子郵件地址。

    6. 從「Select a role」(請選擇角色) 下拉式選單中,選取「Cloud Storage」類別,然後選取適當的權限。

      • Storage 物件檢視者,僅用於提取映像檔
      • Storage 舊版值區寫入者,用於推送及提取映像檔
    7. 按一下「新增」

    gcloud

    1. 執行下列指令,列出專案中的 bucket:

      gcloud storage ls
      

      回應類似下列範例:

      gs://[BUCKET_NAME1]/
      gs://[BUCKET_NAME2]/
      gs://[BUCKET_NAME3]/ ...
      

      在傳回的值區清單中,找出登錄主機的值區。 儲存圖片的值區名稱 BUCKET-NAME 格式如下:

      • artifacts.PROJECT-ID.appspot.com 儲存在主機上的圖片 gcr.io
      • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com 適用於儲存在其他登錄主機上的映像檔

      地點

      • PROJECT-ID 是您的 Google Cloud 專案 ID
      • STORAGE-REGION 是儲存空間 bucket 的位置:
        • us,適用於 us.gcr.io 主機中的註冊資料庫
        • eu,適用於 eu.gcr.io 主機中的註冊資料庫
        • asia,適用於 asia.gcr.io 主機中的註冊資料庫
    2. 在您的殼層或終端機視窗中執行下列指令:

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
      --member=TYPE:EMAIL-ADDRESS \
      --role=ROLE
      

      地點

      • BUCKET_NAME 是 Cloud Storage 值區的名稱,格式為 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com
      • TYPE 可以是下列任一值:
        • 如果 EMAIL-ADDRESS 指定服務帳戶,則使用 serviceAccount
        • user,如果 EMAIL-ADDRESS 是 Google 帳戶。
        • group,如果 EMAIL-ADDRESS 是 Google 群組。
      • EMAIL-ADDRESS 可以是下列其中一項:

        • Google 帳戶 (例如 someone@example.com)
        • Google 群組 (例如 my-developer-team@googlegroups.com)
        • IAM 服務帳戶

          請參閱Google Cloud 服務清單,瞭解通常會存取登錄檔的服務,並找出相關聯服務帳戶的電子郵件地址。如果服務在 Container Registry 以外的專案中執行,請務必使用其他專案中服務帳戶的電子郵件地址。

      • ROLE 是您要授予的 Cloud Storage 角色。

        • objectViewer 提取圖片
        • legacyBucketWriter 推送及提取映像檔

    舉例來說,下列指令會授予服務帳戶 my-account@my-project.iam.gserviceaccount.com 在 bucket my-example-bucket 中推送及提取映像檔的權限:

    gcloud storage buckets add-iam-policy-binding gs://my-example-bucket \
      --member=serviceAccount:my-account@my-project.iam.gserviceaccount.com \
      --role=roles/storage.objectUser
    

    gcloud storage buckets add-iam-policy-binding 指令會變更託管註冊資料庫所在儲存空間值區的 IAM 權限。如需其他範例,請參閱 gcloud CLI 說明文件

  3. 如要為將映像檔推送至 Container Registry 的 Compute Engine VM 或 GKE 節點設定存取權,請參閱「設定 VM 和叢集」一文,瞭解其他設定步驟。

設定映像檔的公開存取權

如果主機位置的基礎儲存空間值區可公開存取,則代表 Container Registry 也可公開存取。在專案中,每個主機位置的所有映像檔必須都是公開映像檔或不公開映像檔。在專案的主機中,您無法只公開提供特定的映像檔。如要公開特定的映像檔,您可以採取下列其中一種方式:

  • 將這些映像檔謹慎保存在您開放公眾存取的個別主機位置
  • 建立新專案以存放可公開存取的映像檔。

如要公開提供容器映像檔,您可以按照下列步驟來開放基礎儲存空間值區,以供公眾存取:

  1. 確認已將映像檔推送至 Container Registry,這樣才會有基礎儲存空間值區。

  2. 找出該註冊資料庫的 Cloud Storage 值區名稱。如要進行此操作,請列出值區:

    gcloud storage ls
    

    您的 Container Registry bucket 網址會列為 gs://artifacts.PROJECT-ID.appspot.comgs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com,其中:

    • PROJECT-ID 是您的 Google Cloud 專案 ID網域範圍專案會將網域名稱當做專案 ID 的一部分。
    • STORAGE-REGION 是儲存空間 bucket 的位置:
      • us,適用於 us.gcr.io 主機中的註冊資料庫
      • eu,適用於 eu.gcr.io 主機中的註冊資料庫
      • asia,適用於 asia.gcr.io 主機中的註冊資料庫
  3. 執行下列指令,將 Container Registry 的儲存空間值區變更為可公開存取。這項指令會公開該值區中的所有映像檔以供公眾存取。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET-NAME \
        --member=allUsers --role=roles/storage.objectViewer
    

    其中:

    • gs://BUCKET-NAME 是 Container Registry 的 bucket URL

移除圖片的公開存取權

主控台

  1. 確認已將映像檔推送至 Container Registry,這樣才會有基礎儲存空間值區。

  2. 在 Google Cloud 控制台中開啟「Container Registry」頁面。

    開啟 Container Registry 頁面

  3. 在左側面板中,按一下 [Settings] (設定)

  4. 在「Settings」(設定) 頁面的「Public access」(公開存取權) 底下,將瀏覽權限切換成「Private」(不公開)。這項設定可控管基礎儲存空間值區的存取權。

gcloud storage

  1. 找出該註冊資料庫的 Cloud Storage 值區名稱。如要進行此操作,請列出值區:

    gcloud storage ls
    

    您的 Container Registry bucket 網址會列為 gs://artifacts.PROJECT-ID.appspot.comgs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com,其中:

    • PROJECT-ID 是您的 Google Cloud 主控台專案 ID網域範圍專案會將網域名稱當做專案 ID 的一部分。
    • STORAGE-REGION 是儲存空間 bucket 的位置:
      • us,適用於 us.gcr.io 主機中的註冊資料庫
      • eu,適用於 eu.gcr.io 主機中的註冊資料庫
      • asia,適用於 asia.gcr.io 主機中的註冊資料庫
  2. 如要移除儲存空間 bucket 的公開存取權,請在殼層或終端機視窗中執行下列指令:

    gcloud storage bucket remove-iam-policy-binding gs://BUCKET-NAME \
      --member=allUsers --role=roles/storage.objectViewer
    

其中:

  • BUCKET-NAME 是所需值區的名稱

撤銷權限

請按照下列步驟撤銷 IAM 權限。

主控台

  1. 前往 Google Cloud 控制台的 Cloud Storage 頁面
  2. 按一下 bucket 的 artifacts.PROJECT-ID.appspot.comSTORAGE-REGION.artifacts.PROJECT-ID.appspot.com 連結。其中,PROJECT-ID 是託管 Container Registry 的Google Cloud 專案 IDSTORAGE-REGION 則是託管映像檔的多區域 (asiaeuus)。

  3. 選取 [Permission] (權限) 分頁標籤。

  4. 針對您要移除的任何主體,按一下旁邊的垃圾桶圖示。

gcloud

在您的殼層或終端機視窗中執行下列指令:

gcloud storage bucket remove-iam-policy-binding gs://BUCKET-NAME \
    --member=PRINCIPAL --all

其中:

  • BUCKET-NAME 是所需值區的名稱
  • PRINCIPAL 可以是下列任一值:
    • Google 帳戶的user:EMAIL-ADDRESS
    • serviceAccount:EMAIL-ADDRESS 身分與存取權管理服務帳戶
    • group:EMAIL-ADDRESS
    • allUsers,適用於撤銷公開存取權

與 Google Cloud 服務整合

對於大多數 Google Cloud 服務帳戶,設定登錄檔的存取權時,只需要授予適當的 IAM 權限。

Google Cloud 服務的預設權限

Google Cloud Cloud Build 或 Google Kubernetes Engine 等服務會使用預設服務帳戶服務代理程式,與同一專案中的資源互動。

如有下列情況,您必須自行設定或修改權限:

  • Google Cloud 服務與 Container Registry 位於不同專案。
  • 預設權限不符合需求。舉例來說,預設的 Compute Engine 服務帳戶具備相同專案中儲存空間的唯讀存取權。如要將映像檔從 VM 推送至登錄檔,您必須修改 VM 服務帳戶的權限,或使用具備儲存空間寫入權限的帳戶向登錄檔進行驗證。
  • 您使用自訂服務帳戶與 Container Registry 互動

下列服務帳戶通常會存取 Container Registry。服務帳戶的電子郵件地址包含服務執行的專案 Google Cloud 專案 ID 或專案編號

服務 服務帳戶 電子郵件地址 權限
App Engine 彈性環境 App Engine 預設服務帳戶 PROJECT-ID@appspot.gserviceaccount.com 編輯者角色,可讀取及寫入儲存空間
Compute Engine Compute Engine 預設服務帳戶 PROJECT-NUMBER-compute@developer.gserviceaccount.com 編輯者角色,但僅限儲存空間的唯讀存取權
Cloud Build Cloud Build 服務帳戶 PROJECT-NUMBER@cloudbuild.gserviceaccount.com 預設權限包括建立儲存空間值區,以及儲存空間的讀取和寫入權限。
Cloud Run Compute Engine 預設服務帳戶
修訂版本的預設執行階段服務帳戶。
PROJECT-NUMBER-compute@developer.gserviceaccount.com 編輯者角色,但僅限儲存空間的唯讀存取權
GKE Compute Engine 預設服務帳戶
節點的預設服務帳戶。
PROJECT-NUMBER-compute@developer.gserviceaccount.com 編輯者角色,但僅限儲存空間的唯讀存取權

設定 VM 和叢集來推送映像檔

Compute Engine 和任何使用 Compute Engine 的服務,預設身分都是 Compute Engine 預設服務帳戶。 Google Cloud

IAM 權限和存取範圍都會影響 VM 讀取及寫入儲存空間的能力。

  • IAM 權限決定資源的存取權。
  • 存取權範圍會根據 VM 執行個體上透過 gcloud CLI 和用戶端程式庫發出的要求,定義預設的 OAuth 範圍。因此,透過應用程式預設憑證進行驗證時,存取權範圍可能會進一步限制 API 方法的存取。
    • 如要提取私人映像檔,VM 服務帳戶必須具備映像檔儲存空間值區的read權限。
    • 如要推送私人映像檔,VM 服務帳戶必須具備映像檔儲存空間值區的 read-writecloud-platformfull-control 存取權範圍。

Compute Engine 預設服務帳戶預設具備「編輯者」角色,包括建立及更新多數Google Cloud 服務資源的權限。不過,無論是預設服務帳戶或與 VM 建立關聯的自訂服務帳戶,儲存空間值區的預設存取範圍都是唯讀。這表示根據預設,VM 無法推送映像檔。

如果您只打算將映像檔部署至 Compute Engine 和 GKE 等環境,則不需要修改存取範圍。如要在這些環境中執行應用程式,並將映像檔推送至登錄檔,請務必進行額外設定。

如要進行下列設定,必須變更 IAM 權限或存取範圍設定。

從 VM 或叢集推送映像檔
如要推送映像檔,VM 執行個體服務帳戶必須具備 storage-rw 範圍,而非 storage-ro
VM 和 Container Registry 位於不同專案
您必須授予服務帳戶 IAM 權限,才能存取 Container Registry 使用的儲存空間 bucket。
在 VM 上執行 gcloud 指令
服務帳戶必須具備 cloud-platform 範圍。這個範圍會授予推送及提取映像檔的權限,以及執行 gcloud 指令的權限。

設定範圍的步驟請參閱下列各節。

設定 VM 的範圍

如要在建立 VM 時設定存取範圍,請使用 --scopes 選項。

gcloud compute instances create INSTANCE --scopes=SCOPE

地點

  • INSTANCE 是 VM 執行個體名稱。
  • SCOPE 是要為 VM 服務帳戶設定的範圍:
    • 提取圖片:storage-ro
    • 提取及推送映像檔:storage-rw
    • 提取及推送映像檔、執行 gcloud 指令:cloud-platform

如要變更現有 VM 執行個體的範圍,請按照下列步驟操作:

使用 --scopes 選項設定存取權範圍。

  1. 停止 VM 執行個體。請參閱停止執行個體一文。

  2. 使用下列指令變更存取範圍。

    gcloud compute instances set-service-account INSTANCE --scopes=SCOPE
    

    地點

    • INSTANCE 是 VM 執行個體名稱。
    • SCOPE 是要為 VM 服務帳戶設定的範圍:
      • 提取圖片:storage-ro
      • 提取及推送映像檔:storage-rw
      • 提取及推送映像檔、執行 gcloud 指令:cloud-platform
  3. 重新啟動 VM 執行個體。請參閱啟動已停止的執行個體

如要為 VM 使用自訂服務帳戶,而非預設服務帳戶,您可以在建立 VM修改 VM 設定時,指定要使用的服務帳戶和存取權範圍。

設定 Google Kubernetes Engine 叢集的範圍

根據預設,新建的 GKE 叢集會具備 Cloud Storage 值區的唯讀權限。

如要在建立 Google Kubernetes Engine 叢集時設定 read-write 儲存空間範圍,請使用 --scopes 選項。 舉例來說,下列指令會建立具備 bigquerystorage-rwcompute-ro 範圍的叢集:

gcloud container clusters create example-cluster \
--scopes=bigquery,storage-rw,compute-ro

如要進一步瞭解您在新建叢集時可以設定的範圍,請參閱 gcloud container clusters create 指令的說明文件。

Container Registry 服務帳戶

與 Google Cloud 服務互動時,Container Registry 服務代理會代表 Container Registry 執行動作。如果您在 2020 年 10 月 5 日後啟用 Container Registry API,服務代理程式會具備最低必要權限組合。服務代理程式先前具有「編輯者」角色。如要進一步瞭解服務代理程式及如何修改其權限,請參閱「Container Registry 服務帳戶」。

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶,親自體驗實際使用 Container Registry 的成效。新客戶可以獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。

免費試用 Container Registry