アクセス制御の構成

このページでは、Container Registry で使用可能なアクセス制御オプションと、Container Registry で暗号鍵を使用する方法について説明します。

Container Registry は、コンテナ イメージを提供するためのバックエンドとして Cloud Storage バケットを使用します。Container Registry イメージにアクセスできるユーザーを制御するには、Cloud Storage バケットに対する権限を調整します。

Cloud Storage でアクセス制御を管理するには、Cloud Console または gsutil コマンドライン ツールを使用します。詳しくは、gsutil iam ドキュメントをご覧ください。

権限とロール

次の表に、Container Registry の操作に必要な権限と役割を示します。

Google Cloud プロジェクト全体ではなく個々のストレージ バケットに役割を付与する場合は、まず対象のホストの場所にある Container Registry にイメージを push して、基盤となるストレージ バケットが存在していることを確認します。

アクション 権限 役割 役割のタイトル
push(読み書き)

storage.buckets.create

storage.buckets.delete

storage.buckets.get

storage.buckets.list

storage.buckets.update

storage.objects.create

storage.objects.delete

storage.objects.get

storage.objects.list

storage.objects.update

roles/storage.admin ストレージ管理者
pull(読み取り専用)

storage.objects.get

storage.objects.list

roles/storage.objectViewer ストレージ オブジェクト閲覧者

ストレージ バケットで均一なバケットレベルのアクセスを有効にする場合は、すべての Container Registry ユーザーとサービス アカウントに上記の役割を明示的に設定する必要があります。この場合、所有者と編集者の役割だけでは、必要な権限が付与されないことがあります。

ユーザーと他のプロジェクトにレジストリへのアクセスを許可する

他のプロジェクトの特定のユーザー、または他のプロジェクトで実行されているコンテナ クラスタに、レジストリからのイメージの pull を許可するには、基盤となる Cloud Storage バケットに対する読み取り権限を付与する必要があります。

イメージをホストするバケットの [BUCKET_NAME] の形式は次のいずれかになります。

  • artifacts.[PROJECT-ID].appspot.comgcr.io ホスト内のレジストリに push されたイメージの場合。
  • [STORAGE-REGION].artifacts.[PROJECT-ID].appspot.com。ここで、

    • [PROJECT-ID] は、Google Cloud Console プロジェクト ID です。
    • [STORAGE-REGION] は、ストレージ バケットの場所です。
      • usus.gcr.io ホストのレジストリの場合
      • eueu.gcr.io ホストのレジストリの場合
      • asiaasia.gcr.io ホストのレジストリの場合

基盤となる Cloud Storage バケットに対する読み取り権限を付与するには、Google Cloud Console またはコマンドラインを使用します。

Console

  1. イメージを Container Registry に push し、基盤となるストレージ バケットが存在していることを確認します。
  2. Cloud Console の Cloud Storage ページにアクセスします。
  3. バケットの artifacts.[PROJECT-ID].appspot.com または [STORAGE-REGION].artifacts.[PROJECT-ID].appspot.com リンクをクリックします。[PROJECT-ID] は Container Registry をホストしているプロジェクトの Google Cloud プロジェクト ID であり、[STORAGE-REGION] は イメージをホストしているマルチリージョンasiaeu、または us)です。

  4. [権限] タブを選択します。

  5. [メンバーを追加] をクリックします。

  6. 表示されるメニューで、[メンバー] フィールドに、読み取り権限が必要なユーザーのメールアドレスをコンマで区切って入力します。このメールアドレスは、次のいずれかになります。

    • Google アカウント(例: someone@example.com
    • Cloud IAM サービス アカウント
    • 別のプロジェクトの Compute Engine デフォルト サービス アカウント。このアカウントは、Google Kubernetes Engine がコンテナ イメージ クラスタを pull する場合に使用するデフォルトのアカウントです。形式は [PROJECT_NUMBER]-compute@developer.gserviceaccount.com になります。ここで、[PROJECT-NUMBER] は Google Kubernetes Engine クラスタを実行しているプロジェクトの Google Cloud プロジェクト番号です。
  7. [役割を選択] プルダウン メニューの [ストレージ] カテゴリから [ストレージ オブジェクト閲覧者] を選択します。

  8. [追加] をクリックします。

この手順を行うと、ユーザーにバケット全体の読み取り権限が付与されます。

gsutil

  1. イメージを Container Registry に push し、基盤となるストレージ バケットが存在していることを確認します。
  2. シェルまたはターミナル ウィンドウで次のコマンドを実行します。

    gsutil iam ch [TYPE]:[EMAIL-ADDRESS]:objectViewer gs://[BUCKET_NAME]
        

    ここで

    • [TYPE] は、次のいずれかになります。
      • serviceAccount[EMAIL-ADDRESS] がサービス アカウントを指定している場合。
      • user[EMAIL-ADDRESS] が Google アカウントの場合。
    • [EMAIL-ADDRESS] は、以下のいずれかになります。
      • Google アカウント(例: someone@example.com
      • Cloud IAM サービス アカウント
      • 別のプロジェクトの Compute Engine デフォルト サービス アカウント。このアカウントは、Google Kubernetes Engine がコンテナ イメージ クラスタを pull する場合に使用するデフォルトのアカウントです。形式は [PROJECT_NUMBER]-compute@developer.gserviceaccount.com になります。ここで、[PROJECT-NUMBER] は Google Kubernetes Engine クラスタを実行しているプロジェクトの Google Cloud プロジェクト番号です。
    • [BUCKET_NAME] は、前述のとおり、イメージをホストする Cloud Storage バケットの名前です。

gsutil iam ch は、レジストリがホストされているストレージ バケットの IAM 権限を変更します。アカウントに objectViewer 権限を付与すると、レジストリからイメージを pull できるようになります。

サービス アカウントには、ストレージ アクセス スコープも構成する必要があります。

  • 読み取り専用権限を設定するには、次のコマンドを実行します。

    gcloud compute instances set-service-account INSTANCE --scopes=storage-ro
        
  • 読み取り / 書き込み権限を設定するには、次のコマンドを実行します。

    gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
        

詳細については、Google Cloud での Container Registry の使用をご覧ください。

イメージの一般公開

Container Registry は、ホストの場所の基盤となるストレージ バケットが公開アクセス可能であれば、公開アクセス可能です。プロジェクト内では、各ホストの場所のイメージがすべて公開されるか、すべて公開されないかのいずれかになります。プロジェクトのホスト内で、特定のイメージのみを公開することはできません。公開したい特定のイメージがある場合:

  • 公開用の別のホストの場所に保管するか、
  • 公開アクセス可能なイメージを保存するための新しいプロジェクトを作成する

コンテナ イメージを一般公開するには、次の手順でリポジトリの基盤となるストレージ バケットを一般公開します。

Console

  1. イメージを Container Registry に push し、基盤となるストレージ バケットが存在していることを確認します。

  2. Cloud Console で Container Registry ページを開きます。

    Container Registry ページを開く

  3. 左パネルの [設定] をクリックします。

  4. [設定] ページの [公開アクセス] で、公開設定を [一般公開] または [非公開] に切り替えます。この設定は、基盤となるストレージ バケットへのアクセスを制御します。

    ホストの公開設定が一般公開になっている場合、そのホストにある Google Cloud プロジェクトのすべてのイメージが一般公開されます。

gsutil

  1. イメージを Container Registry に push し、基盤となるストレージ バケットが存在していることを確認します。

  2. そのレジストリの Cloud Storage バケットの名前を確認します。そのためには、バケットを一覧表示します。

    gsutil ls
        

    Container Registry バケット URL は、gs://artifacts.[PROJECT-ID].appspot.com または gs://[STORAGE-REGION].artifacts.[PROJECT-ID].appspot.com の形式で一覧表示されます。ここで、

    • [PROJECT-ID] は、Google Cloud Console プロジェクト ID です。ドメインをスコープとするプロジェクトの場合、プロジェクト ID にドメイン名が含まれます。
    • [STORAGE-REGION] は、ストレージ バケットの場所です。
      • usus.gcr.io ホストのレジストリの場合
      • eueu.gcr.io ホストのレジストリの場合
      • asiaasia.gcr.io ホストのレジストリの場合
  3. 次のコマンドを実行して、Container Registry のストレージ バケットを一般公開します。このコマンドは、バケット内のすべてのイメージを一般公開します。

    gsutil iam ch allUsers:objectViewer gs://[BUCKET_NAME]
        

    ここで

    • gs://[BUCKET_NAME] は、Container Registry のバケット URL です。

一般公開されたイメージの pull

Container Registry が一般公開されている場合、誰でもそのイメージを pull できます。手順については、レジストリからイメージを pull するをご覧ください。

権限の取り消し

Console

  1. Cloud Console の Cloud Storage ページにアクセスします。
  2. バケットの artifacts.[PROJECT-ID].appspot.com または [STORAGE-REGION].artifacts.[PROJECT-ID].appspot.com リンクをクリックします。[PROJECT-ID] は Container Registry をホストしているプロジェクトの Google Cloud プロジェクト ID であり、[STORAGE-REGION] は イメージをホストしているマルチリージョンasiaeu、または us)です。

  3. [権限] タブを選択します。

  4. 削除するメンバーの横にあるごみ箱アイコンをクリックします。

gsutil

シェルまたはターミナル ウィンドウで次のコマンドを実行します。

gsutil iam ch -d [MEMBER] gs://[BUCKET_NAME]
    

ここで

  • [MEMBER] は、以下のいずれかになります。
    • user:[EMAIL_ADDRESS]。Google アカウントの場合
    • serviceAccount:[EMAIL_ADDRESS]。Cloud IAM サービス アカウントの場合
    • allUsers。公開アクセスを取り消す場合
  • [BUCKET_NAME] は目的のバケットの名前です。