Ressourcenbasierten Zugriff konfigurieren

In diesem Thema wird beschrieben, wie Sie den Zugriff auf bestimmte Ressourcen mithilfe von bedingten Rollenbindungen in Ihren "allow"-Richtlinien verwalten. Mit Ressourcenattributen in einem Bedingungsausdruck können Sie einen untergeordneten Bereich der Rollenbindung anhand vom Ressourcennamen, Ressourcentyp und/oder Google Cloud-Dienst zuweisen.

Vorbereitung

  • Lesen Sie die Übersicht über IAM-Bedingungen (Identity and Access Management), um die Grundlagen von bedingten IAM-Rollenbindungen zu verstehen.
  • Sehen Sie sich die Ressourcenattribute an, die in einem Bedingungsausdruck verwendet werden können.
  • Das Attribut "Ressourcenname" kann den Zugriff auf diese Google Cloud-Dienste steuern:
    • Apigee
    • Application Integration
    • Sicherung und Notfallwiederherstellung
    • BigQuery
    • BigQuery Reservation API
    • Bigtable
    • Binärautorisierung
    • Cloud Deploy
    • Cloud Key Management Service
    • Cloud Logging
    • Cloud SQL
    • Cloud Storage
    • Compute Engine
    • Dataform
    • Google Kubernetes Engine
    • Integration Connectors
    • Pub/Sub Lite
    • Secret Manager
    • Spanner

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Verwalten bedingter Rollenbindungen benötigen:

  • Zum Verwalten des Zugriffs auf Projekte: Project IAM Admin (roles/resourcemanager.projectIamAdmin) für das Projekt
  • Zum Verwalten des Zugriffs auf Ordner: Folder Admin (roles/resourcemanager.folderAdmin) für den Ordner
  • Zum Verwalten des Zugriffs auf Projekte, Ordner und Organisationen: Organization Admin (roles/resourcemanager.organizationAdmin) für die Organisation
  • Zum Verwalten des Zugriffs auf fast alle Google Cloud-Ressourcen: Security Admin (roles/iam.securityAdmin) für das Projekt, den Ordner oder die Organisation, für die Sie den Zugriff verwalten möchten

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierten Rollen enthalten die Berechtigungen, die zum Verwalten von bedingten Rollenbindungen erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Verwalten bedingter Rollenbindungen erforderlich:

  • Zum Verwalten des Zugriffs auf Projekte:
    • resourcemanager.projects.getIamPolicy für das Projekt
    • resourcemanager.projects.setIamPolicy für das Projekt
  • Zum Verwalten des Zugriffs auf Ordner:
    • resourcemanager.folders.getIamPolicy für den Ordner
    • resourcemanager.folders.setIamPolicy für den Ordner
  • Zum Verwalten des Zugriffs auf Organisationen:
    • resourcemanager.organizations.getIamPolicy für die Organisation
    • resourcemanager.organizations.setIamPolicy für die Organisation

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Zugriff auf eine Gruppe von Ressourcen anhand von Ressourcennamenspräfixen gewähren

Mit einer bedingten Rollenbindung können Sie Hauptkonten Zugriff auf Ressourcen zuweisen, deren Ressourcennamen einem Präfix entsprechen, beispielsweise Compute Engine VM-Instanzen, deren Namen mit einem bestimmten String beginnen. Das Präfix für Ressourcennamen wird normalerweise zum Gruppieren von Ressourcen verwendet, die für bestimmte Funktionen vorgesehen sind oder bestimmte Attribute haben.

Betrachten Sie das folgende Beispiel: Das Softwareunternehmen Beispiel GmbH führt Arbeitslasten auf bestimmten VM-Instanzen aus, die möglicherweise mit vertraulichen Gesundheitsdaten arbeiten. Andere nicht vertrauliche Arbeitslasten müssen in demselben Projekt ausgeführt werden. Beispiel GmbH möchte sicherstellen, dass seine Entwickler eingeschränkten Zugriff auf VM-Instanzen haben, die mit vertraulichen Daten arbeiten. Damit sie dieses Ziel erreichen, werden datensensible VM-Instanzen mit dem Präfix sensitiveAccess und andere VM-Instanzen mit dem Präfix devAccess benannt. Anschließend wird mit bedingten Rollenbindungen sichergestellt, dass die Entwickler mit normalen devAccess-VM-Instanzen produktiv bleiben können, ohne ihnen Zugriff auf sensitiveAccess-VM-Instanzen zuzuweisen.

Sie können zwar den Zugriff auch nur mit dem Bedingungsattribut resource.name verwalten, aber die Attribute resource.type und resource.service sind ebenfalls gebräuchlich. Mit diesen zusätzlichen Attributen verringern Sie die Wahrscheinlichkeit, dass eine Bedingung den Zugriff auf verschiedene Ressourcentypen mit ähnlichen Namen beeinträchtigt. Im Beispiel in diesem Abschnitt wird der Zugriff mit den Attributen resource.name und resource.type gesteuert.

So weisen Sie Compute Engine-Laufwerken und -Instanzen in einem Projekt Zugriff anhand eines Namenspräfixes zu:

Console

  1. Öffnen Sie in der Google Cloud Console die Seite IAM.

    Zur Seite „IAM“

  2. Suchen Sie in der Liste der Hauptkonten das gewünschte Hauptkonto und klicken Sie auf die Schaltfläche .

  3. Suchen Sie im Bereich Berechtigungen bearbeiten die gewünschte Rolle, für die Sie eine Bedingung konfigurieren möchten. Klicken Sie dann unter IAM-Bedingung (optional) auf IAM-Bedingung hinzufügen.

  4. Geben Sie im Bereich Bedingung bearbeiten einen Titel und eine optionale Beschreibung für die Bedingung ein.

  5. Sie können einen Bedingungsausdruck entweder mit dem Builder für IAM-Bedingungen oder dem Bedingungseditor hinzufügen. Der Builder für IAM-Bedingungen bietet eine interaktive Oberfläche, in der Sie die gewünschte Bedingung, den Operator und andere Details zum Ausdruck auswählen können. Der Bedingungseditor bietet eine textbasierte Oberfläche zur manuellen Eingabe eines Ausdrucks mit der CEL-Syntax.

    Builder für IAM-Bedingungen:

    1. Klicken Sie auf das Drop-down-Menü Hinzufügen und dann auf Gruppierte Bedingungen.
    2. Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Typ aus.
    3. Wählen Sie aus dem Drop-down-Menü Operator den Wert ist aus.
    4. Wählen Sie im Drop-Down-Menü Ressourcentyp die Option compute.googleapis.com/Disk aus.
    5. Klicken Sie direkt unter der Bedingung, die Sie gerade eingegeben haben, auf die erste Schaltfläche Hinzufügen, um dem Ausdruck eine weitere Klausel hinzuzufügen.
    6. Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Name aus.
    7. Wählen Sie im Drop-down-Menü Operator die Option Beginnt mit aus.
    8. Geben Sie im Feld Wert den Ressourcennamen im entsprechenden Format, beispielsweise projects/project-123/zones/us-central1-a/disks/devAccess für ein Laufwerk ein, dessen Name mit devAccess beginnt.
    9. Klicken Sie links neben jeder Bedingung auf Und, damit beide Klauseln wahr sein müssen.
    10. Klicken Sie direkt über der Schaltfläche Speichern auf die Schaltfläche Hinzufügen, um weitere gruppierte Bedingungen hinzuzufügen.
    11. Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Typ aus.
    12. Wählen Sie aus dem Drop-down-Menü Operator den Wert ist aus.
    13. Wählen Sie im Drop-Down-Menü Ressourcentyp die Option compute.googleapis.com/Instance aus.
    14. Klicken Sie direkt unter der Bedingung, die Sie gerade eingegeben haben, auf die erste Schaltfläche Hinzufügen, um dem Ausdruck eine weitere Klausel hinzuzufügen.
    15. Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Name aus.
    16. Wählen Sie im Drop-down-Menü Operator die Option Beginnt mit aus.
    17. Geben Sie im Feld Wert den Ressourcennamen im richtigen Format ein, beispielsweise projects/project-123/zones/us-central1-a/instances/devAccess für eine Instanz, deren Name mit devAccess beginnt.
    18. Klicken Sie links neben jeder Bedingung auf Und, damit beide Klauseln wahr sein müssen.
    19. Klicken Sie direkt über der Schaltfläche Speichern auf die Schaltfläche Hinzufügen, um die dritte Gruppe von Bedingungen hinzuzufügen.
    20. Damit diese Bedingung tatsächlich keine Auswirkungen auf andere Ressourcen hat, fügen Sie auch diese Klauseln hinzu: Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Typ aus.
    21. Wählen Sie aus dem Drop-down-Menü Operator ist nicht aus.
    22. Wählen Sie im Drop-Down-Menü Ressourcentyp die Option compute.googleapis.com/Disk aus.
    23. Klicken Sie direkt unter der Bedingung, die Sie gerade eingegeben haben, auf die erste Schaltfläche Hinzufügen, um dem Ausdruck eine weitere Klausel hinzuzufügen.
    24. Wählen Sie im Drop-down-Menü Bedingungstyp die Option Ressource > Typ aus.
    25. Wählen Sie aus dem Drop-down-Menü Operator ist nicht aus.
    26. Wählen Sie im Drop-Down-Menü Ressourcentyp die Option compute.googleapis.com/Instance aus.
    27. Klicken Sie links neben jeder Bedingung auf Und, damit beide Klauseln wahr sein müssen.
    28. Wenn Sie fertig sind, sollte der Builder für IAM-Bedingungen in etwa so aussehen:

    29. Klicken Sie auf Speichern, um die Bedingung anzuwenden.

    30. Sobald der Bereich Bedingung bearbeiten geschlossen wurde, klicken Sie im Bereich Berechtigungen bearbeiten noch einmal auf Speichern, um die Zulassungsrichtlinie zu aktualisieren.

    Bedingungseditor:

    1. Klicken Sie auf den Tab Bedingungseditor und geben Sie diesen Ausdruck ein:

      (resource.type == "compute.googleapis.com/Disk" &&
      resource.name.startsWith("projects/project-123/regions/us-central1/disks/devAccess")) ||
      (resource.type == "compute.googleapis.com/Instance" &&
      resource.name.startsWith("projects/project-123/zones/us-central1-a/instances/devAccess")) ||
      (resource.type != "compute.googleapis.com/Disk" &&
      resource.type != "compute.googleapis.com/Instance")
    2. Nachdem Sie den Ausdruck eingegeben haben, können Sie optional die CEL-Syntax per Lint validieren. Klicken Sie dazu oberhalb des Textfelds oben rechts auf Linter ausführen.

    3. Klicken Sie auf Speichern, um die Bedingung anzuwenden.

    4. Sobald der Bereich Bedingung bearbeiten geschlossen wurde, klicken Sie im Bereich Berechtigungen bearbeiten noch einmal auf Speichern, um die Zulassungsrichtlinie zu aktualisieren.

gcloud

Zulassungsrichtlinien werden mit dem Muster Read-Modify-Write festgelegt.

Rufen Sie mit dem Befehl gcloud projects get-iam-policy die aktuelle "allow"-Richtlinie für das Projekt ab. Im folgenden Beispiel wird die JSON-Version der "allow"-Richtlinie in einen Pfad auf dem Laufwerk heruntergeladen.

Befehl:

gcloud projects get-iam-policy project-id --format=json > filepath

Das JSON-Format der "allow"-Richtlinie wird heruntergeladen:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 1
}

Fügen Sie den folgenden hervorgehobenen Bedingungsausdruck hinzu, um die "allow"-Richtlinie mit einer Ressourcennamen-Präfixbedingung zu konfigurieren. Die gcloud CLI aktualisiert die Version automatisch:

{
  "bindings": [
    {
      "members": [
        "user:project-owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin",
      "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

Legen Sie als Nächstes die neue "allow"-Richtlinie fest, indem Sie den Befehl gcloud projects set-iam-policy ausführen:

gcloud projects set-iam-policy project-id filepath

Die neue bedingte Rollenbindung weist devs@example.com-Berechtigungen so zu:

  • Alle Laufwerks- und Instanzberechtigungen werden nur zugewiesen, wenn der Ressourcenname mit devAccess beginnt

  • Alle anderen Berechtigungen in der Rolle Instanzadministrator werden für alle anderen Ressourcentypen zugewiesen

REST

Verwenden Sie das Muster read-modify-write, um Zugriff auf bestimmte Ressourcen zu gewähren.

Lesen Sie zuerst die "allow"-Richtlinie für das Projekt:

Die Methode projects.getIamPolicy der Resource Manager API ruft die Zulassungsrichtlinie eines Projekts ab.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: Ihre Google Cloud-Projekt-ID. Projekt-IDs sind alphanumerische Strings, wie my-project.
  • POLICY_VERSION: Die Richtlinienversion, die zurückgegeben werden soll. Anfragen sollten die neueste Richtlinienversion angeben. Diese ist Richtlinienversion 3. Weitere Informationen finden Sie unter Richtlinienversion beim Abrufen einer Richtlinie festlegen.

HTTP-Methode und URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

JSON-Text anfordern:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "members": [
        "group:devs@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ]
}

Ändern Sie anschließend die "allow"-Richtlinie, um den Zugriff auf bestimmte Ressourcen zu ermöglichen. Setzen Sie dabei das Feld version auf den Wert 3:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/compute.instanceAdmin",
      "members": [
        "group:devs@example.com"
      ],
      "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ]
}

Schreiben Sie anschließend die aktualisierte Zulassungsrichtlinie:

Die Methode projects.setIamPolicy der Resource Manager API legt die Zulassungsrichtlinie in der Anfrage als neue Zulassungsrichtlinie des Projekts fest.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: Ihre Google Cloud-Projekt-ID. Projekt-IDs sind alphanumerische Strings, wie my-project.

HTTP-Methode und URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

JSON-Text anfordern:

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:project-owner@example.com"
        ]
      },
      {
        "role": "roles/compute.instanceAdmin",
        "members": [
          "group:devs@example.com"
        ],
        "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
        }
      }
    ]
  }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Die Antwort enthält die aktualisierte Zulassungsrichtlinie:


Werte aus Ressourcennamen extrahieren

Die vorherigen Beispiele zeigen boolesche Vergleiche zwischen dem Ressourcennamen oder dem Anfang des Ressourcennamens und einem anderen Wert. In einigen Fällen müssen Sie jedoch einen Wert mit einem bestimmten Teil des Ressourcennamens vergleichen, der nicht am Anfang des Namens steht.

Sie können die extract()-Funktion verwenden und eine Extraktionsvorlage angeben, um den relevanten Teil des Ressourcennamens als String zu extrahieren. Bei Bedarf können Sie den extrahierten String in einen anderen Typ konvertieren, beispielsweise in einen Zeitstempel. Nachdem Sie einen Wert aus dem Ressourcennamen extrahiert haben, können Sie diesen mit anderen Werten vergleichen.

Die folgenden Beispiele zeigen Bedingungsausdrücke, die die Funktion extract() verwenden. Weitere Informationen zur Funktion extract() finden Sie in der Referenz zu Attributen für IAM Conditions.

Beispiel: Übereinstimmende Bestellungen der letzten 30 Tage finden

Angenommen, Sie speichern Auftragsinformationen in mehreren Cloud Storage-Buckets und die Objekte in jedem Bucket sind nach Datum organisiert. Ein typischer Objektname könnte in etwa so aussehen:

projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/order_date=2019-11-03/aef87g87ae0876

Sie möchten dem Hauptkonto den Zugriff auf eine beliebige Bestellung der letzten 30 Tage gewähren. Die folgende Bedingung entspricht den Cloud Storage-Objekten für diese Bestellungen. Sie verwendet die Funktionen duration() und date(), um 30 Tage (2.592.000 Sekunden) von der Anfragezeit abzuziehen und diesen Zeitstempel mit dem Bestelldatum zu vergleichen:

resource.type == 'storage.googleapis.com/Object' &&
  request.time - duration('2592000s') < date(resource.name.extract('/order_date={date_str}/'))

Weitere Informationen zu den Funktionen date() und duration() finden Sie in der Referenz zu Datums- und Uhrzeitattributen.

Beispiel: Übereinstimmende Compute Engine-VMs an einem beliebigen Standort finden

Angenommen, Sie möchten einem Hauptkonto für jede Compute Engine-VM, deren Name mit dev- beginnt, unabhängig vom Standort der VM eine Rolle auf Projektebene zuweisen. Außerdem soll das Hauptkonto diese Rolle für alle anderen Ressourcentypen verwenden können.

Der Ressourcenname für eine VM hat ein ähnliches Format wie projects/project-id/zones/zone-id/instances/instance-name. Die folgende Bedingung wird für VMs mit einem Instanznamen, der mit dem String dev- beginnt, und für Ressourcen, die keine VMs sind, als true ausgewertet:

resource.type != 'compute.googleapis.com/Instance' ||
  resource.name.extract('/instances/{name}').startsWith('dev-')

Der Text in geschweiften Klammern gibt den Teil des Ressourcennamens an, der zum Vergleich extrahiert wird. In diesem Beispiel extrahiert die Extraktionsvorlage alle Zeichen nach dem ersten Vorkommen des Strings /instances/.

Wichtige Nutzungshinweise für ressourcenbasierte Bedingungen

Beim Hinzufügen einer ressourcenbasierten Bedingung ist es wichtig zu berücksichtigen, wie sich die Bedingung auf die Berechtigungen des Hauptkontos auswirkt.

Benutzerdefinierte Rollen

Betrachten Sie das folgende Beispiel mit benutzerdefinierten Rollen. Ein Administrator möchte eine benutzerdefinierte Rolle erstellen, die Zugriff zum Erstellen von VM-Instanzen gewährt. Der Nutzer kann jedoch nur VM-Instanzen in einem Projekt mit einem Ressourcennamen, der mit dem Namenspräfix staging beginnt, unter Verwendung der Laufwerke mit dem gleichen Namenspräfix erstellen.

Achten Sie daher darauf, dass die zugewiesene Rolle die erforderlichen Berechtigungen zum Erstellen einer VM-Instanz enthält, d. h. Berechtigungen für Laufwerks- und Instanzressourcentypen. Prüfen Sie dann, ob der Bedingungsausdruck den Ressourcennamen sowohl für Laufwerke als auch für Instanzen überprüft. Über diese beiden Typen hinaus werden keine anderen Berechtigungen in der Rolle gewährt.

Der folgende Bedingungsausdruck führt zu unerwartetem Verhalten. Berechtigungen für den Betrieb auf Compute Engine-VMs werden blockiert:

resource.type == 'compute.googleapis.com/Disk' &&
 resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')

Der folgende Bedingungsausdruck enthält sowohl Laufwerke als auch Instanzen und verwaltet den Zugriff basierend auf dem Ressourcennamen für diese beiden Typen:

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging'))

Der folgende Bedingungsausdruck umfasst sowohl Laufwerke als auch Instanzen und verwaltet den Zugriff basierend auf dem Ressourcennamen für diese beiden Typen. Bei allen anderen Ressourcentypen gewährt der Bedingungsausdruck die Rolle unabhängig vom Ressourcennamen:

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')

Nur für übergeordnete Ressourcen geltende Berechtigungen

In der Google Cloud-Ressourcenhierarchie dienen einige der Berechtigungen in einer Rolle, die eine untergeordnete Ressource betreffen, dazu, nur auf der übergeordneten Ebene erzwungen zu werden. Damit Nutzer beispielsweise kryptografische Schlüssel für Cloud KMS auflisten können, muss ihnen die Berechtigung cloudkms.cryptokeys.list für den Schlüsselbund gewährt werden, der die kryptografischen Schlüssel enthält, nicht für die Schlüssel selbst. Solche Berechtigungen werden als Berechtigungen für übergeordnete Ressourcen bezeichnet und gelten nur für list-Vorgänge.

Der Bedingungsausdruck muss die Attribute resource.service und resource.type entsprechend dem übergeordneten Ressourcentyp der Zielressourcen festlegen, um bei der Verwendung von Bedingungen den Zugriff auf *.*.list-Berechtigungen ordnungsgemäß zu gewähren.

Betrachten Sie hierzu folgende Beispiele. Im obigen Compute Engine-Beispiel verhindert der folgende Ausdruck den Zugriff auf compute.disks.list- und compute.instances.list-Berechtigungen, da die Ressource, für die diese Berechtigungen aktiviert sind, einen resource.type-Attributwert von cloudresourcemanager.googleapis.com/Project haben.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess'))

Es ist üblich, dass diese list-Berechtigungen gemeinsam mit anderen Berechtigungen für reguläre Vorgänge auf der Ressource gewährt werden. In diesem Fall können Sie entweder den Gültigkeitsbereich nur für den Typ cloudresourcemanager.googleapis.com/Project erweitern oder den Umfang auf alle anderen Berechtigungen erweitern, die nicht vom Typ "Instanz" oder "Laufwerk" sind.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
 resource.type == 'cloudresourcemanager.googleapis.com/Project'

oder

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')