Container Registry から Artifact Registry に IAM ロールをマッピングする

Container Registry と Artifact Registry は、異なる Identity and Access Management ロールを使用して、レジストリに保存されているコンテナ イメージへのアクセスを制御します。

Container Registry から Artifact Registry に移行するには、次の Google Cloud CLI コマンドを実行します。

  • Container Registry のイメージを格納する Cloud Storage ストレージ バケットに適用される許可ポリシーを特定します。
  • 既存の Container Registry ユーザーに Artifact Registry リポジトリへのアクセス権を付与できるように、同様の Artifact Registry ロールを持つポリシーを返します。

このコマンドは、IAM Policy Analyzer を使用して IAM 許可ポリシーを分析します。

準備

  1. Cloud Asset API を有効にします。

    API を有効にする

    既存の許可ポリシーを分析するプロジェクトまたは組織で API を有効にする必要があります。

  2. gcloud CLI をインストールして初期化します。既存のインストールの場合は、次のコマンドを使用して最新バージョンに更新します。

    gcloud components update
    

必要なロール

許可ポリシーを分析して Artifact Registry リポジトリへのアクセス権を付与するために必要な権限を取得するには、アクセス許可を分析するプロジェクト、フォルダ、または組織に対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

これらの事前定義ロールには、許可ポリシーを分析し、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 内の gcr.io のストレージ バケットを分析し、バケットに直接適用される許可ポリシー、または親組織 ID 101231231231 とその子孫から継承される許可ポリシーについて調べます。

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

    このコマンドは、ストレージ バケットの既存の許可ポリシーに基づいて、Artifact Registry のロール バインディングを含む YAML ファイルを YAML 形式で返します。ストレージ バケットの親プロジェクトが組織にある場合、ポリシー ファイルには、フォルダレベルまたは組織レベルでアクセス権を付与されたプリンシパルが含まれます。

    たとえば、次のサンプルには、次の 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. このサービス アカウントは Artifact Registry リポジトリにアクセスする必要がないため、ポリシー ファイルから Container Registry サービス エージェントの行を削除します。サービス エージェントのメールアドレスの接尾辞は containerregistry.iam.gserviceaccount.com です。

    前の手順のポリシーの例では、Container Registry サービス エージェントを含む行は次のようになります。

    - serviceAccount:service-1231231231231@containerregistry.iam.gserviceaccount.com
    
  3. 他のロール バインディングを調べて、適切であることを確認します。

    Artifact Registry には、一部のプリンシパルで考慮する必要がある追加の事前定義ロールがあります。たとえば、Artifact Registry の Create-on-push リポジトリ管理者は、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
    

    上位レベルのリソースにロール バインディングを適用する場合は、追加するバインディングを使用して既存のプロジェクト、フォルダ、または組織のポリシーを編集します。

ロールのマッピング

次の表に、Cloud Storage の権限に応じて、既存の Container Registry ユーザーに付与する必要がある Artifact Registry のロールを示します。

ロールで必要な権限 Artifact Registry のロール
storage.objects.get
storage.objects.list
Artifact Registry 読み取り
storage.buckets.get
storage.objects.get
storage.objects.list
storage.objects.create
Artifact Registry 書き込み
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 管理者