使用 Identity and Access Management (IAM) 授予角色,控管哪些使用者能存取及管理 Artifact Registry 中的資料。Artifact Registry 包含預先定義的角色,可協助簡化 CI/CD 管道設定。如需額外的存取控管,或是要將 Artifact Registry 與第三方工具整合,也可以設定自訂角色。
事前準備
- 啟用 Artifact Registry,包括啟用 API 和安裝 Google Cloud CLI。
- 如要套用存放區專屬權限,請為套件建立 Artifact Registry 存放區。
總覽
IAM 權限和角色會決定您能否在 Artifact Registry 存放區中建立、查看、編輯或刪除資料。
角色是一組權限。您無法直接授予主體權限,必須改為授予角色。授予角色之後 主體就會取得該角色具備的所有權限。您可以將多個角色授予同一個主體。
Cloud de Confiance 預設權限
根據預設,下列權限適用於與 Artifact Registry 位於同一專案的 Cloud de Confiance CI/CD 服務:
- Compute Engine 和支援的 Google Kubernetes Engine 版本會使用 Compute Engine 預設服務帳戶,該帳戶具備儲存空間的唯讀存取權。
如果所有服務都位於同一個 Cloud de Confiance by S3NS 專案中,且預設權限符合需求,則不需要設定權限。
如果符合下列情況,您必須為這些服務設定 Artifact Registry 權限:
- 您使用的 GKE 版本未內建從 Artifact Registry 提取映像檔的支援功能。如需設定操作說明,請參閱「GKE」一節。
- 您希望預設服務帳戶具備存放區的讀取和寫入權限。詳情請參閱下列資訊:
- 您為執行階段環境使用使用者提供的服務帳戶,而非預設服務帳戶。在具備 Artifact Registry 的專案中,授予服務帳戶必要角色。
第三方整合服務
如果是第三方用戶端,您必須同時設定權限和驗證。
一般來說,在 Cloud de Confiance 外部執行的應用程式會使用服務帳戶金鑰存取 Cloud de Confiance 資源。不過,服務帳戶金鑰是功能強大的憑證,如果管理不當就會帶來安全風險。
透過 Workload Identity Federation,您可以使用 Identity and Access Management 授予外部身分 IAM 角色,包括模擬服務帳戶的能力。這種做法可免除與服務帳戶金鑰相關的維護和安全負擔。
使用 Workload Identity Federation:
- 建立 Workload Identity Federation 集區。
- 建立 Workload Identity Federation 提供者。
- 授予工作負載身分集區適當的 Artifact Registry 角色,允許存取存放區。詳情請參閱「允許外部工作負載存取 Cloud de Confiance by S3NS 資源」。
- 如需長時間存取 Artifact Registry,請在憑證設定中將 OIDC 權杖到期時間設為較長的時間。
設定第三方用戶端,以便透過 Artifact Registry 進行驗證。
使用服務帳戶:
- 建立服務帳戶來代表應用程式執行動作,或是選擇用於 CI/CD 自動化的現有服務帳戶。
- 授予服務帳戶適當的 Artifact Registry 角色,提供存放區存取權。
設定第三方用戶端,以便透過 Artifact Registry 進行驗證。
角色和權限
每個 Artifact Registry API 方法都要求提出要求的主體具備使用資源的必要權限。如要將權限授予主體,請設定政策,為主體授予資源的預先定義角色。
您可以在 Cloud de Confiance by S3NS 專案或 Artifact Registry 存放區中授予角色。
預先定義的 Artifact Registry 角色
IAM 提供預先定義的角色,可授予特定 Cloud de Confiance 資源的存取權。
使用下列預先定義的存放區角色:| 角色 | 說明 |
|---|---|
| Artifact Registry 讀取者 ( roles/artifactregistry.reader) |
查看及取得構件,以及查看存放區中繼資料。 |
| Artifact Registry 寫入者 ( roles/artifactregistry.writer) |
讀取及寫入構件。 |
| Artifact Registry 存放區管理員 ( roles/artifactregistry.repoAdmin) |
讀取、寫入及刪除構件。 |
| Artifact Registry 管理員 ( roles/artifactregistry.admin) |
建立及管理存放區和構件。 |
gcloud iam roles describe 指令,查看每個角色的權限清單。
基本 IAM 角色
基本角色是權限極高的角色,在 IAM 推出前就已存在。請勿在正式環境中授予基本角色,但可以在開發或測試環境中授予。
盡可能使用存放區的預先定義的角色,確保使用者和服務帳戶只具備必要權限。
如要進一步瞭解基本角色,請參閱「IAM 基本與預先定義角色參考資料」。
正在授予角色
如果專案中的所有存放區都適用相同角色,請在專案層級授予角色。如果部分帳戶需要不同存取層級,請在存放區層級授予角色。
如果使用 gcloud 指令授予角色,您可以為主體指定單一角色繫結,也可以取得資源的許可政策、加以修改,然後設定修改後的許可政策,藉此大規模變更政策。詳情請參閱「以程式輔助方式授予或撤銷多個角色」。
授予專案層級角色
如果專案中的所有存放區都適用相同權限,請在專案層級授予角色。
如要將使用者或服務帳戶新增至專案,並授予 Artifact Registry 角色,請按照下列步驟操作:
控制台
在 Cloud de Confiance 控制台中,開啟「IAM」頁面。
按一下「選取專案」,選擇 Artifact Registry 執行的專案,然後按一下「開啟」。
按一下「新增」。
輸入電子郵件地址。您可以新增個人、服務帳戶或 Google 群組做為主體。
選取主體的角色。根據最小權限原則安全原則,請考慮授予存取必要 Artifact Registry 資源所需的最低權限。如要瞭解 Artifact Registry 預先定義的角色和權限,請參閱「Artifact Registry 預先定義的角色」。
按一下 [儲存]。
gcloud
-
在 Cloud de Confiance 控制台中啟用 Cloud Shell。
Cloud de Confiance 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
如要將角色授予單一主體,請執行下列指令:
gcloud projects add-iam-policy-binding PROJECT \ --member=PRINCIPAL \ --role=ROLE
其中
- PROJECT 是 Artifact Registry 執行的專案 ID。
PRINCIPAL 是您要新增繫結的主體。使用
user|group|serviceAccount:email或domain:domain格式。例如:
user:test-user@gmail.com、group:admins@example.com、serviceAccount:test123@example.domain.com或domain:example.domain.com。ROLE 是您要授予的角色。
詳情請參閱 add-iam-policy-binding 說明文件。
如要使用政策檔案授予角色,請參閱「以程式輔助方式授予或撤銷多個角色」
授予存放區專屬角色
如要讓使用者或服務帳戶對專案中的各個存放區擁有不同層級的存取權,請授予存放區層級角色。
控制台
如要授予特定存放區的存取權,請按照下列步驟操作:
在 Cloud de Confiance 控制台中開啟「Repositories」(存放區) 頁面。
選取適當的存放區。
如果未顯示資訊面板,請按一下選單列中的「顯示資訊面板」。
在「權限」分頁中,按一下「新增主體」。
輸入電子郵件地址。您可以新增個人、服務帳戶或 Google 群組做為主體。
選取主體的角色。根據最小權限原則安全原則,請考慮授予存取必要 Artifact Registry 資源所需的最低權限。如要瞭解 Artifact Registry 預先定義的角色和權限,請參閱「Artifact Registry 預先定義的角色」。
按一下 [儲存]。
gcloud
-
在 Cloud de Confiance 控制台中啟用 Cloud Shell。
Cloud de Confiance 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
您可以設定個別政策繫結的 IAM 組合,也可以使用政策檔案。
如要將角色授予單一主體,請執行下列指令:
gcloud artifacts repositories add-iam-policy-binding REPOSITORY \ --location=LOCATION \ --member=PRINCIPAL \ --role=ROLE
其中
- REPOSITORY 是存放區的 ID。
PRINCIPAL 是您要新增繫結的主體。使用
user|group|serviceAccount:email或domain:domain格式。例如:
user:test-user@gmail.com、group:admins@example.com、serviceAccount:test123@example.domain.com或domain:example.domain.com。ROLE 是您要授予的角色。
LOCATION 是存放區的區域位置。
舉例來說,如要為使用者
write@gmail.com新增角色roles/artifactregistry.writer的 IAM 政策繫結,並指定位置--u-france-east1的存放區my-repo,請執行下列指令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=u-france-east1 --member=user:write@gmail.com --role=roles/artifactregistry.writer
如要使用政策檔案授予角色,請按照「以程式輔助方式授予或撤銷多個角色」一文所述程序,搭配使用 gcloud artifacts repositories get-iam-policy 和 gcloud artifacts repositories set-iam-policy 指令。
Terraform
使用 google_artifact_registry_repository_iam 資源設定 IAM 政策。以下範例定義了資源名稱為 repo-account 的服務帳戶,並授予該帳戶對資源名稱為 my-repo 的存放區的讀取權限。
如果您是第一次在 Cloud de Confiance by S3NS使用 Terraform,請參閱 HashiCorp 網站上的「開始使用 - Cloud de Confiance by S3NS」頁面。
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo" {
provider = google-beta
location = "LOCATION"
repository_id = "REPOSITORY"
description = "DESCRIPTION"
format = "FORMAT"
}
resource "google_service_account" "repo-account" {
provider = google-beta
account_id = "ACCOUNT-ID"
display_name = "Repository Service Account"
}
resource "google_artifact_registry_repository_iam_member" "repo-iam" {
provider = google-beta
location = google_artifact_registry_repository.my-repo.location
repository = google_artifact_registry_repository.my-repo.name
role = "roles/artifactregistry.reader"
member = "serviceAccount:${google_service_account.repo-account.email}"
}
ACCOUNT-ID 是服務帳戶的 ID。這是服務帳戶電子郵件欄位中 @ 符號前的部分。
如需其他範例,請參閱 google_artifact_registry_repository_iam 資源的說明文件。
設定存放區的公開存取權
如要讓網際網路上的任何人都能存取構件,而不需驗證,請將構件儲存在公開存放區。
如要設定存放區的公開唯讀存取權,請將 Artifact Registry Reader 角色授予主體 allUsers。此外,我們也建議限制使用者要求配額,避免單一使用者耗盡專案的整體配額。
控制台
gcloud
-
在 Cloud de Confiance 控制台啟用 Cloud Shell。
Cloud de Confiance 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
執行下列指令:
gcloud artifacts repositories add-iam-policy-binding REPOSITORY \ --location=LOCATION --member=allUsers --role=ROLE
其中
REPOSITORY 是存放區的 ID。
ROLE 是您要授予的角色。 + LOCATION 是存放區的區域位置。
舉例來說,如要將
--u-france-east1位置的my-repo存放區設為公開,請執行下列指令:gcloud artifacts repositories add-iam-policy-binding my-repo \ --location=u-france-east1 --member=allUsers --role=roles/artifactregistry.reader
設定每位使用者對 Artifact Registry API 的要求上限,防止未經驗證的使用者濫用。如需操作說明,請參閱「設定用量上限」。
正在撤銷角色
如要撤銷存放區的存取權,請從授權主體清單中移除主體。
如要移除存放區的公開存取權,請移除 allUsers 主體。
控制台
如要撤銷權限,請按照下列步驟操作:
在 Cloud de Confiance 控制台中開啟「Repositories」(存放區) 頁面。
選取適當的存放區。
如果未顯示資訊面板,請按一下選單列中的「Show Info Panel」(顯示資訊面板)。
在「Permissions」(權限) 分頁中,展開適當的主體。如要將公開存放區設為私人,請展開
allUsers主體。按一下「移除主體」,撤銷存取權。
gcloud
-
在 Cloud de Confiance 控制台中啟用 Cloud Shell。
Cloud de Confiance 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
如要在專案層級撤銷角色,請執行下列指令:
gcloud projects remove-iam-policy-binding PROJECT \ --member=PRINCIPAL \ --role=ROLE
- PROJECT 是專案 ID。
PRINCIPAL 是您要移除繫結的主體。使用
user|group|serviceAccount:email或domain:domain格式。例如:
user:test-user@gmail.com、group:admins@example.com、serviceAccount:test123@example.domain.com或domain:example.domain.com。ROLE 是要撤銷的角色。
如要撤銷存放區的角色,請執行下列指令:
gcloud artifacts repositories remove-iam-policy-binding REPOSITORY --location=LOCATION \ --member=PRINCIPAL \ --role=ROLE
其中
- REPOSITORY 是存放區的 ID。
PRINCIPAL 是您要移除繫結的主體。使用
user|group|serviceAccount:email或domain:domain格式。例如:
user:test-user@gmail.com、group:admins@example.com、serviceAccount:test123@example.domain.com或domain:example.domain.com。如要撤銷存放區的公開存取權,請指定主體
allUsers。ROLE 是要撤銷的角色。
舉例來說,如要移除使用者
write@gmail.com的角色roles/artifactregistry.writer政策繫結,且該使用者在位置--u-france-east1有存放區my-repo,請執行下列指令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=u-france-east1 \ --member=user:write@gmail.com \ --role=roles/artifactregistry.writer
如要撤銷位置
--u-france-east1中my-repo的公開存取權,請執行下列指令:gcloud artifacts repositories remove-iam-policy-binding my-repo \ --location=u-france-east1 \ --member=allUsers \ --role=roles/artifactregistry.reader
使用標記授予條件式存取權
專案管理員可以為 Cloud de Confiance中的資源建立標記,並在 Resource Manager 中管理。將標記附加至 Artifact Registry 存放區後,管理員即可搭配 IAM 條件使用標記,授予存放區的條件式存取權。
您無法將標記附加至個別構件。
詳情請參閱下列說明文件:
與 Cloud de Confiance 服務整合
對於大多數 Cloud de Confiance 服務帳戶,設定登錄檔存取權時,只需要授予適當的 IAM 角色。
Cloud de Confiance by S3NS 服務的預設服務帳戶
Cloud de Confiance 服務 (例如 Google Kubernetes Engine) 會使用預設服務帳戶或服務代理,與同一專案中的資源互動。
如要設定或修改權限,請按照下列步驟操作:
- Cloud de Confiance by S3NS 服務與 Artifact Registry 位於不同專案。
- 預設權限不符合需求。
- 您使用使用者提供的服務帳戶與 Artifact Registry 互動,而非預設服務帳戶。
- 您的機構政策設定禁止自動將角色授予預設服務帳戶。
下列服務帳戶通常會存取 Artifact Registry。服務帳戶的電子郵件地址包含服務執行的專案 Cloud de Confiance 專案 ID 或專案編號。
| 服務 | 服務帳戶 | 電子郵件地址 |
|---|---|---|
| Compute Engine | Compute Engine 預設服務帳戶 | PROJECT-NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com |
| GKE |
Compute Engine 預設服務帳戶 節點的預設服務帳戶。 |
PROJECT-NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com |
視機構政策設定而定,預設服務帳戶可能會自動獲得專案的編輯者角色。強烈建議您
強制執行 iam.automaticIamGrantsForDefaultServiceAccounts 組織政策限制,停用自動授予角色的功能。如果組織是在 2024 年 5 月 3 日後建立,系統預設會強制執行這項限制。
停用此功能後,您必須決定要將哪些角色授予預設服務帳戶,然後自行授予這些角色。
如果預設服務帳戶已具備「編輯者」角色,建議您將「編輯者」角色替換為權限較少的角色。
授予 Compute Engine 執行個體存取權
存取存放區的 VM 執行個體必須同時設定 Artifact Registry 權限和儲存空間存取權範圍。
服務帳戶的存取層級取決於授予服務帳戶的 IAM 角色,而 VM 執行個體上的存取範圍則決定了透過執行個體上的 gcloud CLI 和用戶端程式庫發出要求時,使用的預設 OAuth 範圍。因此,使用應用程式預設憑證進行驗證時,存取範圍可能會進一步限制 API 方法的存取權。
Compute Engine 預設值如下:
- Compute Engine 預設服務帳戶是 VM 執行個體的身分。服務帳戶電子郵件地址的後置字元為「@」developer.s3ns-system.iam.gserviceaccount.com。
- 如果您尚未停用這項行為,預設服務帳戶會具備 IAM 基本編輯者角色。
- 使用預設服務帳戶建立的執行個體具有 Compute Engine 預設存取範圍,包括儲存空間的唯讀存取權。雖然編輯者角色通常會授予寫入權限,但
read-only儲存空間存取權範圍會限制執行個體服務帳戶,只能從相同專案中的任何存放區下載構件。
在下列情況下,您必須設定服務帳戶的存取權範圍:
- VM 服務帳戶需要存取其他專案中的存放區。
- VM 服務帳戶需要執行從存放區讀取構件以外的操作。這通常適用於 VM 上的第三方工具,這些工具需要推送映像檔或執行 Artifact Registry
gcloud指令。
如要設定角色和存取權範圍,請按照下列步驟操作:
在 VM 執行個體所在的專案中,取得 Compute Engine 預設服務帳戶的名稱。服務帳戶電子郵件地址的後置字元為 @developer.s3ns-system.iam.gserviceaccount.com。
在存放區所在的專案中授予權限,讓服務帳戶可以存取存放區。
使用 --scopes 選項設定存取權範圍。
停止 VM 執行個體。請參閱「停止執行個體」。
使用下列指令設定存取權範圍:
gcloud compute instances set-service-account INSTANCE --scopes=SCOPE將 SCOPE 替換為適當的值。
Docker 支援下列選項:
storage-ro- Grants read permission only for pulling images.storage-rw- 授予推送或提取映像檔的讀取及寫入權限。cloud-platform:查看及管理Cloud de Confiance 服務中的資料,包括中繼資料。
如為其他格式,則必須使用
cloud-platform範圍。
重新啟動 VM 執行個體。請參閱「啟動已停止的執行個體」。
授予 Google Kubernetes Engine 叢集的存取權
如果符合下列所有規定,GKE 叢集和節點集區就能提取容器,不需額外設定:
- GKE 與 Artifact Registry 位於相同專案
- 節點使用預設服務帳戶,即 Compute Engine 預設服務帳戶
- 節點是透過以下方式建立,具備儲存空間的讀取權限:
- 使用 Compute Engine 預設存取權範圍。
- 授予
cloud-platform存取權範圍,或其他包含儲存空間讀取權限的範圍。
- 您執行的 GKE 版本受到支援
如果 GKE 環境不符合這些規定,授權存取的指示會因您是使用 Compute Engine 預設服務帳戶,還是使用者提供的服務帳戶做為節點的身分而有所不同。
- 預設服務帳戶
下列設定規定適用於 Compute Engine 預設服務帳戶:
如果 GKE 與 Artifact Registry 位於不同專案,請授予服務帳戶必要權限。
如要推送映像檔、與容器以外格式的存放區互動,或從叢集執行
gcloud指令,您必須在建立叢集或節點集區時,為服務帳戶設定存取權範圍。如果使用的 GKE 版本不支援,請設定 imagePullSecrets。
- 使用者提供的服務帳戶
如要使用使用者提供的服務帳戶做為叢集的身分,請務必完成下列步驟:
授予服務帳戶必要權限,該帳戶應位於執行 Artifact Registry 的Cloud de Confiance 專案。
根據預設,使用使用者提供的服務帳戶建立叢集或節點集區時,系統會授予
cloud-platform存取權範圍。如果您搭配使用
--scopes旗標和 gcloud container clusters create 或 gcloud container node-pools create 指令,則必須加入適當的存取權範圍,才能與 Artifact Registry 搭配使用。
設定存取權範圍
存取權範圍是為 Compute Engine VM 指定授權的傳統方法。如要從 Artifact Registry 存放區提取映像檔,GKE 節點必須具備儲存空間唯讀存取範圍,或包含儲存空間讀取存取權的其他儲存空間存取範圍。
您只能在建立叢集或節點集區時設定存取權範圍。您無法變更現有節點的存取範圍。
- 如果您使用 Compute Engine 預設服務帳戶,GKE 會使用 Compute Engine 預設存取範圍建立節點,包括儲存空間的唯讀存取權。
- 如果您使用使用者提供的服務帳戶,GKE 會建立具有
cloud-platform範圍的節點,這是大多數Cloud de Confiance 服務所需的範圍。
如要在建立叢集時指定存取權範圍,請執行下列指令:
gcloud container clusters create NAME --scopes=SCOPES
如要在建立節點集區時指定存取權範圍,請執行下列指令:
gcloud container node-pools create NAME --scopes=SCOPES
替換下列值:
- NAME 是叢集或節點集區的名稱。
SCOPES 是以半形逗號分隔的清單,包含要授予的存取範圍。
如要存取 Docker 存放區,請使用下列其中一個範圍:
storage-ro:授予唯讀權限,可提取映像檔。storage-rw- 授予推送或提取映像檔的讀取及寫入權限。cloud-platform:查看及管理Cloud de Confiance 服務中的資料,包括中繼資料。如要存取其他存放區,請務必使用
cloud-platform範圍。
如需完整範圍清單,請參閱 gcloud container clusters create 或 gcloud container node-pools create 的說明文件。
如要進一步瞭解建立新叢集時可設定的範圍,請參閱 gcloud container clusters create 指令的說明文件。
設定 imagePullSecret
如要設定 imagePullSecret:
在具備 GKE 的專案中,找出 Compute Engine 預設服務帳戶。帳戶電子郵件地址的後置字元為 @developer.s3ns-system.iam.gserviceaccount.com。
在存放區所在的專案中,確認您已授予存放區權限。
在叢集所在的專案中,使用服務帳戶金鑰建立名為
imagePullSecret的密碼artifact-registry。kubectl create secret docker-registry artifact-registry \ --docker-server=https://LOCATION-docker.s3nsregistry.fr \ --docker-email=SERVICE-ACCOUNT-EMAIL \ --docker-username=_json_key \ --docker-password="$(cat KEY-FILE)"更改下列內容:
- LOCATION 是存放區的區域位置。
- SERVICE-ACCOUNT-EMAIL 是 Compute Engine 服務帳戶的電子郵件地址。
- KEY-FILE 是服務帳戶金鑰檔案的名稱。例如 `key.json`。
開啟預設服務帳戶:
kubectl edit serviceaccount default --namespace default
Kubernetes 叢集中的每個命名空間都有名為
default的預設服務帳戶。這個預設服務帳戶會用於提取容器映像檔。將新建立的
imagePullSecret密鑰新增至預設服務帳戶:imagePullSecrets: - name: artifact-registry您的服務帳戶現在應如下所示:
apiVersion: v1 kind: ServiceAccount metadata: name: default namespace: default ... secrets: - name: default-token-zd84v # The secret you created: imagePullSecrets: - name: artifact-registry
現在,在目前 default 命名空間中建立的任何新 Pod,都會定義 imagePullSecret 密鑰。
Artifact Registry 服務代理
Artifact Registry 服務代理程式是 Google 代管的服務帳戶,與服務互動時會代表 Artifact Registry 執行動作。 Cloud de Confiance by S3NS如要進一步瞭解帳戶和權限,請參閱「Artifact Registry 服務代理程式」。
後續步驟
設定權限後,請進一步瞭解如何處理構件。