Zugriffssteuerung konfigurieren

Auf dieser Seite werden Berechtigungen zur Zugriffssteuerung auf Container Registry beschrieben.

Nachdem Sie die Berechtigungen konfiguriert haben, können Sie die Authentifizierung für Docker-Clients konfigurieren, die Sie zum Übertragen von Images per Push und Pull verwenden.

Allgemeine Zugriffsanforderungen

Alle Nutzer, Dienstkonten und andere Identitäten, die mit Container Registry interagieren, müssen die entsprechenden IAM-Berechtigungen (Identity and Access Management) für Cloud Storage-Speicher haben.

Für das von Compute Engine-VMs verwendete Dienstkonto, einschließlich VMs in Google Kubernetes Engine-Clustern, basiert der Zugriff sowohl auf IAM-Berechtigungen als auch auf Zugriffsbereichen.

Berechtigungen für das Container Registry-Dienstkonto

Der Container Registry-Dienst-Agent ist ein von Google verwaltetes Dienstkonto, das bei der Interaktion mit Google Cloud-Diensten im Namen von Container Registry agiert.

Diesem Dienstkonto wird die Rolle "Container Registry-Dienst-Agent" in Projekten gewährt, in denen die Container Registry API nach dem 5. Oktober 2020 aktiviert wurde, um das Sicherheitsprinzip der geringsten Berechtigung zu erzwingen. Diese Rolle hat die folgenden Berechtigungen:

  • Themen veröffentlichen: pubsub.topics.publish
  • Storage-Objekt-ACLs lesen: storage.objects.getIamPolicy
  • Storage-Objektdaten und -Objektmetadaten lesen: storage.objects.get
  • Storage-Objekte in einem Bucket auflisten und Objektmetadaten lesen: storage.objects.list

Bisher wurde dem Container Registry-Dienstkonto die Rolle Bearbeiter zugewiesen. Da die Bearbeiterrolle Berechtigungen zum Erstellen und Löschen der meisten Ressourcen in einem Projekt gewährt, empfehlen wir, die Berechtigungen einzuschränken, wenn Ihr Container Registry-Dienstkonto diese Rolle hat.

Führen Sie den folgenden Befehl aus, um die aktuellen Berechtigungen Ihres Container Registry-Dienstkontos zu prüfen:

gcloud projects get-iam-policy PROJECT-ID  \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com"

Dabei gilt:

  • PROJECT-ID ist die Google Cloud-Projekt-ID.
  • PROJECT-NUMBER ist die Google Cloud-Projektnummer.

Sie können die Projekt-ID und Projektnummer in der Google Cloud Console oder mit den folgenden Befehlen ermitteln:

PROJECT=$(gcloud config get-value project)
echo $PROJECT && gcloud projects list --filter="$PROJECT" --format="value(PROJECT_NUMBER)"

So erteilen Sie die Rolle "Container Registry-Dienst-Agent" und widerrufen die Rolle "Bearbeiter":

  1. Weisen Sie die Rolle "Container Registry-Dienst-Agent" mit dem folgenden Befehl zu:

    gcloud projects add-iam-policy-binding PROJECT-ID \
    --member=serviceAccount:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com --role=roles/containerregistry.ServiceAgent
    
  2. Entziehen Sie die Bearbeiterrolle mit dem folgenden Befehl:

    gcloud projects remove-iam-policy-binding PROJECT-ID \
    --member=serviceAccount:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com --role=roles/editor
    

IAM-Berechtigungen

IAM-Berechtigungen bestimmen, wer auf eine Ressource zugreifen kann. Alle Nutzer, Dienstkonten und andere Identitäten, die mit Container Registry interagieren, müssen die entsprechenden Cloud Storage-Berechtigungen haben.

Google Cloud verwendet standardmäßig Standarddienstkonten für die Interaktion mit Ressourcen innerhalb desselben Projekts. Beispielsweise kann das Cloud Build-Dienstkonto sowohl Images übertragen als auch abrufen, wenn sich Container Registry im selben Projekt befindet.

In folgenden Fällen müssen Sie Berechtigungen selbst konfigurieren oder ändern:

  • Sie verwenden ein Dienstkonto in einem Projekt, um in einem anderen Projekt auf Container Registry zuzugreifen.
  • Sie verwenden ein Standarddienstkonto mit Lesezugriff auf den Speicher, möchten jedoch Images sowohl per Pull als auch per Push übertragen.
  • Sie verwenden ein benutzerdefiniertes Dienstkonto für die Interaktion mit Container Registry.

Zugriffsbereiche für VMs und Cluster

Bei Compute Engine-VM-Dienstkonten, einschließlich VMs in GKE-Clustern, basiert der Zugriff auf den Speicher sowohl auf IAM-Berechtigungen als auch auf dem konfigurierten Speicherzugriffsbereich.

Das Compute Engine-Standarddienstkonto ist so konfiguriert, dass Images im selben Projekt wie die VM abgerufen werden. Wenn Sie eine VM oder einen GKE-Cluster benötigen, um Images abzurufen oder mit Container Registry in einem anderen Projekt zu interagieren, lesen Sie Container Registry mit Google Cloud verwenden.

IAM-Berechtigungen konfigurieren

Container Registry verwendet Cloud Storage-Buckets als zugrunde liegenden Speicher für Container-Images. Sie steuern den Zugriff auf Ihre Images, indem Sie einem Nutzer, einer Gruppe, einem Dienstkonto oder einer anderen Identität die entsprechenden Cloud Storage-Berechtigungen gewähren.

Cloud Storage-Berechtigungen auf Projektebene gelten für alle Speicher-Buckets im Projekt, nicht nur für die von Container Registry verwendeten Buckets. Weisen Sie Berechtigungen für den von der Registry verwendeten Storage-Bucket zu, um spezifische Berechtigungen für Container Registry zu konfigurieren. Container Registry ignoriert Berechtigungen, die für einzelne Objekte im Storage-Bucket festgelegt wurden.

Obwohl Sie auch die Rollen Owner, Editor und Viewer auf Projektebene verwenden können, um Zugriff zu gewähren, können Sie mit den Cloud Storage-Rollen das Sicherheitsprinzip der geringsten Berechtigung anwenden, damit Nutzer und Dienstkonten nur die Berechtigungen haben, die tatsächlich erforderlich sind.

Google Cloud-Produkte und -Anwendungen, die mit Google Cloud interagieren, verwenden Dienstkonten für die Interaktion mit Container Registry. Für den Zugriff auf Dienstkonten gilt Folgendes:

  • Standardmäßig sind Dienstkonten für einige gängige Einbindungen mit Zugriff auf Container Registry innerhalb desselben Projekts konfiguriert. Beispielsweise kann das Cloud Build-Dienstkonto standardmäßig Images in dasselbe Projekt übertragen und abrufen.
  • Wenn das Dienstkonto in einem anderen Projekt auf Container Registry zugreifen muss, müssen Sie die erforderlichen Berechtigungen im Projekt mit Container Registry gewähren.
  • Für VM-Instanzen, einschließlich derer in Google Kubernetes Engine-Clustern, müssen die richtigen Speicherzugriffsbereiche konfiguriert sein, um Images hoch- oder herunterladen zu können. Standardmäßig können VMs Images abrufen, wenn sich Container Registry im selben Projekt befindet.

Berechtigungen und Rollen

In der folgenden Tabelle werden die Berechtigungen und Rollen beschrieben, die für Container Registry-Aktionen erforderlich sind.

Weitere Informationen zu Cloud Storage-Rollen und -Berechtigungen finden Sie in der Dokumentation zu Cloud Storage.

Aktion Berechtigungen Rolle Rollentitel
Push (Lesen und Schreiben)

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 Storage-Administrator
Pull (nur Lesen)

storage.objects.get

storage.objects.list

roles/storage.objectViewer Storage-Objekt-Betrachter

IAM-Berechtigungen gewähren

Gewähren Sie Berechtigungen für den von Container Registry verwendeten Storage-Bucket.

Berechtigungen gewähren

  1. Wenn der Container Registry-Hostspeicherort (gcr.io, asia.gcr.io, eu.gcr.io, us.gcr.io) noch nicht im Projekt vorhanden ist, muss ein Nutzer mit Inhaber-, Bearbeiter- oder Storage-Administrator-Berechtigung den Storage-Bucket durch Push-Übertragung des Images an den Host erstellen.
  2. Erteilen Sie im Projekt mit Container Registry die entsprechenden Berechtigungen für den Cloud Storage-Bucket, der vom Hostnamen verwendet wird.

    Der Bucket, in dem Ihre Images gespeichert sind, hat den Namen BUCKET-NAME im Format:

    • artifacts.PROJECT-ID.appspot.com für Images, die in eine Registry im Host gcr.io hochgeladen werden, oder
    • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com

    Dabei gilt:

    • PROJECT-ID ist Ihre Projekt-ID der Google Cloud Console.
    • STORAGE-REGION ist der Speicherort des Storage-Buckets:
      • us für Registries im Host us.gcr.io
      • eu für Registrys im Host eu.gcr.io
      • asia für Registrys im Host asia.gcr.io

    Sie können Berechtigungen für einen Bucket über die Google Cloud Console oder das gsutil-Befehlszeilentool erteilen.

    Console

    1. Rufen Sie die Cloud Storage-Seite in der Cloud Console auf.
    2. Klicken Sie auf den Link artifacts.PROJECT-ID.appspot.com oder STORAGE-REGION.artifacts.PROJECT-ID.appspot.com für den Bucket.

      Hier ist PROJECT-ID die Google Cloud-Projekt-ID des Projekts, das Container Registry hostet, und STORAGE-REGION ist die Mehrfachregion (asia, eu, oder us) der Registry, die das Image hostet.

    3. Wählen Sie den Tab Berechtigungen.

    4. Klicken Sie auf Mitglieder hinzufügen.

    5. Geben Sie in dem angezeigten Menü im Feld Mitglieder die E-Mail-Adressen der Nutzer ein, die Berechtigungen benötigen. Trennen Sie die Adressen durch Kommas. Die E-Mail-Adresse kann mit Folgendem verknüpft sein:

      • ein Google-Konto, z. B. someone@example.com
      • eine Google-Gruppe (z. B. my-developer-team@googlegroups.com)
      • ein IAM-Dienstkonto
      • dem Compute Engine-Standarddienstkonto eines anderen Projekts. Dieses Konto wird von Google Kubernetes Engine verwendet, um Container-Image-Cluster standardmäßig abzurufen. Es hat das Format PROJECT-NUMBER-compute@developer.gserviceaccount.com, wobei PROJECT-NUMBER die Google Cloud-Projektnummer des Projekts ist, das den Google Kubernetes Engine-Cluster ausführt.
    6. Wählen Sie im Drop-down-Menü Rolle auswählen die Kategorie Storage und dann die entsprechende Berechtigung aus.

      • Storage-Objekt-Betrachter, um nur Images herunterzuladen
      • Storage-Administrator, um Images zu übertragen und abzurufen
    7. Klicken Sie auf Add.

    gsutil

    1. Führen Sie den folgenden Befehl aus, um Buckets im Projekt aufzulisten:

      gsutil ls
      

      Die Antwort sieht in etwa so aus:

      gs://[BUCKET_NAME1]/
      gs://[BUCKET_NAME2]/
      gs://[BUCKET_NAME3]/ ...
      
    2. Führen Sie den folgenden Befehl in der Shell oder im Terminalfenster aus:

      gsutil iam ch TYPE:EMAIL-ADDRESS:ROLE gs://BUCKET_NAME
      

      Dabei gilt:

      • TYPE kann eines der Folgenden sein:
        • serviceAccount, wenn EMAIL-ADDRESS ein Dienstkonto angibt.
        • user, wenn die EMAIL-ADDRESS ein Google-Konto ist.
        • group, wenn EMAIL-ADDRESS eine Google-Gruppe ist.
      • EMAIL-ADDRESS kann eines der Folgenden sein:
        • ein Google-Konto, z. B. someone@example.com
        • eine Google-Gruppe (z. B. my-developer-team@googlegroups.com)
        • ein IAM-Dienstkonto
        • das Compute Engine-Standarddienstkonto eines anderen Projekts. Dieses Konto wird von Google Kubernetes Engine verwendet, um Container-Image-Cluster standardmäßig abzurufen. Es hat das Format PROJECT_NUMBER-compute@developer.gserviceaccount.com, wobei PROJECT_NUMBER die Google Cloud-Projektnummer des Projekts ist, das den Google Kubernetes Engine-Cluster ausführt.
      • ROLE ist die Cloud Storage-Rolle, die Sie zuweisen möchten.
        • objectViewer, um Images herunterzuladen
        • objectAdmin, um Images hoch- und herunterzuladen
      • BUCKET_NAME ist der Name des Cloud Storage-Buckets im Format artifacts.PROJECT-ID.appspot.com oder STORAGE-REGION.artifacts.PROJECT-ID.appspot.com

    Mit dem Befehl gsutil iam ch ändern Sie die IAM-Berechtigungen des Storage-Buckets, in dem die Registry gehostet wird. Wenn Sie einem Konto die Berechtigung objectViewer gewähren, kann das Konto Images aus der Registry herunterladen.

    Weitere Informationen zum Befehl finden Sie in der Dokumentation zu gsutil iam.

  3. Compute Engine und Google Kubernetes Engine sind mit Berechtigungen zum Herunterladen von Images standardmäßig aus Container Registry im selben Projekt konfiguriert. Weitere Informationen zu diesen Integrationen finden Sie unter Integration mit Google Cloud-Diensten.

Öffentlichen Zugriff auf Images konfigurieren

Container Registry ist öffentlich zugänglich, wenn der dem Hoststandort zugrunde liegende Storage-Bucket öffentlich zugänglich ist. Innerhalb eines Projekts sind alle Images an jedem Hoststandort entweder öffentlich oder nicht. Innerhalb des Hosts eines Projekts ist es nicht möglich, nur bestimmte Images öffentlich bereitzustellen. Wenn Sie bestimmte Images öffentlich zugänglich machen möchten:

  • legen Sie diese an einem eigenen Hoststandort ab, den Sie öffentlich freigeben, oder
  • erstellen Sie ein neues Projekt, das die öffentlich zugänglichen Images enthält.

So machen Sie den zugrunde liegenden Storage-Bucket öffentlich zugänglich, um Container-Images öffentlich bereitzustellen:

Console

  1. Prüfen Sie, ob ein Image per Push an Container Registry übertragen wurde und der zugrunde liegende Storage-Bucket vorhanden ist.

  2. Öffnen Sie in der Cloud Console die Seite Container Registry.

    Seite "Container Registry" öffnen

  3. Klicken Sie im linken Bereich auf Einstellungen.

  4. Ändern Sie die Sichtbarkeit unter Öffentlicher Zugriff auf der Seite Einstellungen zu Öffentlich oder Privat. Diese Einstellung steuert den Zugriff auf den zugrunde liegenden Storage-Bucket.

    Wenn der Host öffentlich sichtbar ist, sind alle Images in Ihrem Google Cloud-Projekt, die sich an diesem Hoststandort befinden, öffentlich zugänglich.

gsutil

  1. Prüfen Sie, ob ein Image per Push an Container Registry übertragen wurde und der zugrunde liegende Storage-Bucket vorhanden ist.

  2. Suchen Sie den Namen des Cloud Storage-Buckets für diese Registry. Listen Sie dazu die Buckets auf:

    gsutil ls
    

    Die URL des Container Registry-Buckets wird als gs://artifacts.PROJECT-ID.appspot.com oder gs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com aufgeführt. Dabei gilt:

    • PROJECT-ID ist Ihre Projekt-ID der Google Cloud Console. Auf eine Domain beschränkte Projekte enthalten den Domainnamen in der Projekt-ID.
    • STORAGE-REGION ist der Speicherort des Storage-Buckets:
      • us für Registries im Host us.gcr.io
      • eu für Registrys im Host eu.gcr.io
      • asia für Registrys im Host asia.gcr.io
  3. Machen Sie den Storage-Bucket von Container Registry mit dem folgenden Befehl öffentlich zugänglich. Dadurch werden alle Images in der Registry öffentlich zugänglich.

    gsutil iam ch allUsers:objectViewer gs://BUCKET-NAME
    

    Dabei gilt:

    • gs://BUCKET-NAME ist die URL des Container Registry-Buckets.

Wenn Container Registry öffentlich zugänglich ist, kann jeder Images daraus herunterladen. Eine Anleitung finden Sie unter Images aus einer Registry herunterladen.

Berechtigungen aufheben

Führen Sie die folgenden Schritte aus, um IAM-Berechtigungen aufzuheben.

Console

  1. Rufen Sie die Cloud Storage-Seite in der Cloud Console auf.
  2. Klicken Sie auf den Link artifacts.PROJECT-ID.appspot.com oder STORAGE-REGION.artifacts.PROJECT-ID.appspot.com für den Bucket. Hier ist PROJECT-ID die Google Cloud-Projekt-ID des Projekts, das Container Registry hostet, und STORAGE-REGION ist die Mehrfachregion (asia, eu, oder us) der Registry, in der das Image gehostet wird.

  3. Wählen Sie den Tab Berechtigungen.

  4. Klicken Sie auf das Papierkorbsymbol neben jedem Mitglied, das Sie entfernen möchten.

gsutil

Führen Sie den folgenden Befehl in der Shell oder im Terminalfenster aus:

gsutil iam ch -d MEMBER gs://BUCKET-NAME

Dabei gilt:

  • MEMBER kann eines der Folgenden sein:
    • user:EMAIL-ADDRESS für ein Google-Konto
    • serviceAccount:EMAIL-ADDRESS für ein IAM-Dienstkonto
    • group:EMAIL-ADDRESS für eine Google-Gruppe
    • allUsers für den Widerruf des öffentlichen Zugriffs
  • BUCKET-NAME ist der Name des jeweiligen Buckets.

Einbindung in Google Cloud-Dienste

Standardmäßig sind Dienstkonten für einige gängige Integrationen für den Zugriff zum Herunterladen oder den Zugriff zum Hoch- und Herunterladen innerhalb desselben Projekts konfiguriert. Der Zugriff basiert auf IAM-Berechtigungen und Sie müssen nur dann Berechtigungen konfigurieren, wenn das Dienstkonto in einem anderen Projekt eine Verbindung zu Container Registry herstellt.

Für das Dienstkonto, das mit Compute Engine-VM-Instanzen verknüpft ist, einschließlich VMs in GKE-Clustern, gelten zusätzliche Anforderungen. Der VM-Zugriff auf den Speicher basiert auf den erteilten IAM-Berechtigungen und Speicherzugriffsbereichen.

  • IAM-Berechtigungen bestimmen, wer auf eine Ressource zugreifen kann.
  • Mit Zugriffsbereichen werden die standardmäßigen OAuth-Bereiche für Anfragen festgelegt, die auf der VM-Instanz über das gcloud-Tool und Clientbibliotheken erfolgen. Dies hat zur Folge, dass mit Zugriffsbereichen bei der Authentifizierung mit Standardanmeldedaten für Anwendungen der Zugriff auf API-Methoden weiter eingeschränkt werden kann.
    • Zum Herunterladen eines privaten Images muss das VM-Dienstkonto die Berechtigung read für den Storage-Bucket des Images haben.
    • Zum Hochladen privater Images muss das VM-Dienstkonto die Berechtigung read-write, cloud-platform oder full-control für den Storage-Bucket des Images haben.

Standardmäßig verfügt das Compute Engine-Standarddienstkonto über die Berechtigung "Bearbeiter" für Ressourcen im selben Projekt und den Speicherzugriffsbereich read-only. Der Bereich read-only beschränkt eine VM auf das Herunterladen von Images. Das Standarddienstkonto hat das Suffix @developer.gserviceaccount.com.

Bei den folgenden Konfigurationen müssen Sie die Standardkonfiguration für Berechtigungen oder Bereiche ändern.

Images von einer VM oder einem Cluster herunterladen
Wenn Sie Images per Push übertragen möchten, muss das Dienstkonto der VM-Instanz den Bereich storage-rw anstelle von storage-ro haben.
Die VM und die Container Registry befinden sich in separaten Projekten
Sie müssen dem Dienstkonto IAM Berechtigungen zum Zugriff auf den von Container Registry verwendeten Storage-Bucket erteilen.
gcloud-Befehle auf VMs ausführen
Das Dienstkonto muss den Bereich cloud-platform haben. Dieser Bereich gewährt Berechtigungen zum Hoch- und Herunterladen von Images sowie zum Ausführen von gcloud-Befehlen.

Die Schritte zum Konfigurieren von Berechtigungen und Bereichen finden Sie in den folgenden Abschnitten.

IAM-Berechtigungen für VMs konfigurieren

Standardmäßig können Compute Engine-VMs nur auf Speicher in demselben Projekt zugreifen. Wenn Ihre VM in einem anderen Projekt auf Container Registry zugreifen muss, müssen Sie dem VM-Dienstkonto Berechtigungen erteilen.

  1. Rufen Sie im Projekt mit Ihrer VM-Instanz den Namen des Compute Engine-Standarddienstkontos oder des Dienstkontos ab, das Sie der VM-Instanz zugeordnet haben. Das Standarddienstkonto hat das Suffix @developer.gserviceaccount.com.

  2. Gewähren Sie Berechtigungen im Projekt mit der Container Registry, damit das Dienstkonto auf die Container Registry zugreifen kann.

Bereiche für VMs konfigurieren

Verwenden Sie die Option --scopes, um beim Erstellen einer VM Zugriffsbereiche festzulegen.

gcloud compute instances create INSTANCE --scopes=SCOPE

Dabei gilt:

  • INSTANCE ist der Name der VM-Instanz.
  • SCOPE ist der Bereich, den Sie für das VM-Dienstkonto konfigurieren möchten:
    • Images abrufen: storage-ro
    • Images per Pull und Push übertragen: storage-rw
    • Images hoch- und herunterladen und gcloud-Befehle ausführen: cloud-platform

So ändern Sie Bereiche für eine vorhandene VM-Instanz:

Legen Sie den Zugriffsbereich mit der Option --scopes fest.

  1. Stoppen Sie die VM-Instanz. Siehe Instanz beenden.

  2. Ändern Sie den Zugriffsbereich mit dem folgenden Befehl.

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

    Dabei gilt:

    • INSTANCE ist der Name der VM-Instanz.
    • SCOPE ist der Bereich, den Sie für das VM-Dienstkonto konfigurieren möchten:
      • Images abrufen: storage-ro
      • Images per Pull und Push übertragen: storage-rw
      • Images hoch- und herunterladen und gcloud-Befehle ausführen: cloud-platform
  3. Starten Sie die VM-Instanz neu. Siehe Beendete Instanz starten.

Bereiche für Google Kubernetes Engine-Cluster konfigurieren

Standardmäßig werden neue GKE-Cluster mit Leseberechtigungen für Cloud Storage-Buckets erstellt.

Wenn Sie beim Erstellen eines Google Kubernetes Engine-Clusters den read-write-Speicherbereich festlegen möchten, verwenden Sie die Option --scopes. Der folgende Befehl erstellt beispielsweise einen Cluster mit den Bereichen bigquery, storage-rw und compute-ro:

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

Weitere Informationen zu Bereichen, die Sie beim Erstellen eines neuen Clusters festlegen können, finden Sie in der Dokumentation zum Befehl gcloud container clusters create.