Übersicht über IAM Conditions

Auf dieser Seite wird das Feature Conditions von Identity and Access Management (IAM) erläutert. Mit diesem Feature können Sie eine bedingte, attributbasierte Zugriffssteuerung für Google Cloud-Ressourcen definieren und erzwingen.

IAM Conditions bietet die Möglichkeit, den Ressourcenzugriff für Identitäten (Mitglieder) an konfigurierte Bedingungen zu knüpfen. Damit kann beispielsweise Nutzern vorübergehender Zugriff bei einem Produktionsproblem gewährt oder der Ressourcenzugriff auf Mitarbeiter beschränkt werden, die Anfragen von Ihrem Firmenbüro senden.

Die Bedingungen werden in den Rollenbindungen der IAM-Richtlinie einer Ressource festgelegt. Wenn eine Bedingung vorliegt, wird die Zugriffsanfrage nur dann erfüllt, wenn der Bedingungsausdruck true ergibt. Jeder Bedingungsausdruck ist ein Satz logischer Anweisungen, in denen Sie ein oder mehrere zu prüfende Attribute angeben können.

IAM-Richtlinien mit Bedingungen

IAM-Richtlinien umfassen eine oder mehrere Rollenbindungen mit folgender Struktur:

"bindings": [
  {
    "role": ...
    "members": ...
    "condition": ...
  },
  ...
]

Das Objekt condition ist optional, und jede Rollenbindung kann maximal eine Bedingung enthalten. Wenn eine Rollenbindung kein condition-Objekt hat, haben die Mitglieder in dieser Rollenbindung immer die angegebene Rolle für die Ressource.

Das Objekt condition hat die folgende Struktur:

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

Für die Bedingung ist die Angabe von title erforderlich, die Angabe von description dagegen optional. Sowohl der Titel als auch die Beschreibung sind reine Informationsfelder, die die Ermittlung und das inhaltliche Verständnis der Bedingung unterstützen sollen.

expression ist ein Pflichtfeld. Es definiert einen attributbasierten logischen Ausdruck mithilfe einer Teilmenge von Common Expression Language (CEL). CEL wird im folgenden Abschnitt ausführlich erläutert. Die Bedingung expression kann mehrere Anweisungen enthalten, in denen jeweils ein Attribut verwendet wird. Die Anweisungen werden mithilfe logischer Operatoren gemäß der CEL-Sprachspezifikation kombiniert.

Informationen zum Hinzufügen, Ändern und Entfernen von bedingten Rollenbindungen finden Sie unter Bedingte Richtlinien verwalten.

CEL für Bedingungen

Mit Common Expression Language bzw. CEL können Sie Ausdrücke in IAM Conditions angeben, und zwar speziell attributbasierte logische Ausdrücke. Weitere Informationen finden Sie in der CEL-Spezifikation und der zugehörigen Sprachdefinition.

In IAM Conditions wird eine Teilmenge von CEL verwendet, um auf Grundlage von Attributdaten boolesche Autorisierungsentscheidungen zu treffen. Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die mithilfe von logischen Operatoren (&&, || oder !) verbunden sind. Jede Anweisung drückt eine attributbasierte Steuerungsregel aus, die für die Rollenbindung gilt und letztlich bestimmt, ob die Autorisierung zulässig ist.

Im Folgenden werden die wichtigsten CEL-Features für Bedingungen dargestellt:

  • Variablen: In Conditions werden mit Variablen bestimmte Attribute ausgedrückt, z. B. request.time (vom Typ "Timestamp") oder resource.name (vom Typ "String"). Diese Variablen werden zur Laufzeit anhand des Kontextes mit Werten gefüllt.
  • Operatoren: Jeder Datentyp, wie z. B. "Timestamp" oder "String", unterstützt eine Reihe von Operatoren, die zum Erstellen logischer Ausdrücke verwendet werden können. Meist werden Operatoren verwendet, um den Wert einer Variablen mit einem Literalwert wie resource.service == "compute.googleapis.com" zu vergleichen. Wenn der Eingabewert von resource.service in diesem Beispiel compute.googleapis.com ist, wird der Ausdruck als true ausgewertet.
  • Funktionen: Eine Funktion ist ein "zusammengesetzter" Operator für Datentypen, die komplexere Operationen unterstützen. In Bedingungsausdrücken gibt es vordefinierte Funktionen, die in Verbindung mit bestimmten Datentypen genutzt werden können. Beispiel: In request.path.startsWith("/finance") wird eine Funktion für den Abgleich von Stringpräfixen verwendet. Sie ergibt true, wenn der Wert von request.path ein übereinstimmendes Präfix wie z. B. "/finance" enthält.
  • Logische Operatoren: Conditions unterstützt drei logische Operatoren, mit denen komplexe logische Ausdrücke aus einfachen Ausdrucksanweisungen erstellt werden können: &&, || und !. Diese logischen Operatoren ermöglichen die Verwendung mehrerer Eingabevariablen in einem Bedingungsausdruck. Beispiel: In request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com" werden zwei einfache Anweisungen verknüpft, die beide erfüllt sein müssen, damit die Auswertung insgesamt true ergibt.

Weitere Informationen zu unterstützten Variablen, Operatoren und Funktionen finden Sie in der Attributreferenz.

Bedingungsattribute

Bedingungsattribute basieren entweder auf der angeforderten Ressource (z. B. ihrem Typ oder Namen) oder auf Details der Anfrage (z. B. dem Zeitstempel, der Ursprungs-IP-Adresse oder der Ziel-IP-Adresse der Compute Engine-VM-Zielinstanz. Beispiele für Ausdrücke mit diesen Attributen finden Sie weiter unten.

Ressourcenattribute

Mit Ressourcenattributen können Sie Bedingungen erstellen, die die Ressource in der Zugriffsanfrage auswerten, einschließlich des Ressourcentyps, des Ressourcennamens und des verwendeten Google Cloud-Dienstes.

Eine vollständige Liste der Ressourcenattribute finden Sie in der Referenz zu Ressourcenattributen.

Informationen zum Konfigurieren des ressourcenbasierten Zugriffs mit Ressourcenattributen erhalten Sie unter Ressourcenbasierten Zugriff konfigurieren.

Beispielausdrücke

So gewähren Sie Zugriff auf Compute Engine-VM-Instanzen, aber auf keinen anderen Ressourcentyp:

resource.type == "compute.googleapis.com/Instance"

So gewähren Sie Zugriff auf Cloud Storage-Ressourcen, aber auf keine Ressourcen anderer Dienste:

resource.service == "storage.googleapis.com"

So gewähren Sie Zugriff nur auf Ressourcen, deren Namen mit einem angegebenen Präfixstring beginnen:

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")

Anfrageattribute

Mit Anfrageattributen können Sie Bedingungen erstellen, mit denen Details der Anfrage ausgewertet werden, z. B. Datum/Uhrzeit, den erwarteten URL-Host/-Pfad (für IAP), Ziel-IP-Adresse und -port (für IAP-TCP-Tunneling) oder die Zugriffsebene.

Beispielausdrücke mit Datum/Uhrzeit

So gewähren Sie vorübergehenden Zugriff bis zu einem bestimmten Ablaufdatum bzw. einer bestimmten Ablaufzeit:

request.time < timestamp("2021-01-01T00:00:00Z")

So gewähren Sie Zugriff nur zu bestimmten Arbeitszeiten anhand der Zeitzone von Berlin:

request.time.getHours("Europe/Berlin") >= 9 &&
request.time.getHours("Europe/Berlin") <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
request.time.getDayOfWeek("Europe/Berlin") <= 5

So gewähren Sie Zugriff nur für einen bestimmten Monat und ein bestimmtes Jahr anhand der Zeitzone von Berlin:

request.time.getFullYear("Europe/Berlin") == 2020
request.time.getMonth("Europe/Berlin") < 6

Für die Angabe eines Zeitstempels ist das RFC 3339-Format erforderlich. Zur Festlegung einer Zeitzone verwenden Sie die Kennungen der IANA-Zeitzonendatenbank.

Weitere Informationen zu Ausdrücken mit Datum/Uhrzeit finden Sie in der CEL-Spezifikation.

Informationen zum Konfigurieren des vorübergehenden Zugriffs mithilfe von Datum/Uhrzeit-Ausdrücken finden Sie unter Temporären Zugriff konfigurieren.

Beispielausdrücke mit URL-Host/-Pfad (für IAP)

So gewähren Sie Zugriff nur für bestimmte Subdomains oder URL-Pfade in der Anfrage:

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

Beispielausdrücke mit Ziel-IP-Adresse/-port (für IAP-TCP-Tunneling)

So ermöglichen Sie Zugriff auf eine bestimmte Ziel-IP oder einen bestimmten Zielport in der Anfrage:

destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23

Beispielausdruck mit Zugriffsebene (nur für IAP)

Damit wird der Zugriff nur gewährt, wenn die Anfrage einer von der Organisation definierten Zugriffsebene entspricht. Im folgenden Beispiel wurde von der Organisation eine Zugriffsebene (CorpNet) definiert, die den Zugriff auf den IP-Adressbereich beschränkt, in dem Traffic in ein Unternehmensnetzwerk eingeht bzw. ausgeht:

"accessPolicies/199923665455/accessLevels/CorpNet" in
request.auth.access_levels

Zugriffsebenen werden von Ihrer Organisation definiert. Sie werden anhand von Attributen der Anfrage zugewiesen, z. B. Ursprungs-IP-Adresse, Geräteattribute oder Tageszeit. Weitere Informationen zu Zugriffsebenen finden Sie in der Dokumentation zu Access Context Manager.

Beispielausdrücke mit Angaben zur Weiterleitungsregel

Damit gewähren Sie einem Mitglied Zugriff, wenn die Anfrage entweder keine Weiterleitungsregel oder eine Weiterleitungsregel für einen internen Google Cloud-Load-Balancer enthält:

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ]))
)

Weitere Informationen zu Load-Balancing-Schemas finden Sie unter IAM Conditions für Google Cloud-Load-Balancer verwenden.

Beispielausdruck mit verschiedenen Attributtypen

Im folgenden Beispiel ist der Zugriff zulässig, wenn die Anfrage zu einem bestimmten Zeitpunkt gesendet wird und mit einem Präfix für den Ressourcennamen, mit der gewünschten Zugriffsebene und mit einem bestimmten Ressourcentyp übereinstimmt:

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
request.time < timestamp("2018-08-03T16:05:00-07:00") &&
((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
 (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
  "accessPolicies/34569256/accessLevels/CorpNet" in request.auth.access_levels)) ||
 resource.type != "compute.googleapis.com/Instance")

Ressourcen, die bedingte Rollenbindungen akzeptieren

Für die folgenden Arten von Google Cloud-Ressourcen können Sie Bedingungen zu IAM-Richtlinien hinzufügen:

Google Cloud-Dienst Ressourcentypen
Cloud Storage Buckets1
Compute Engine
  • Globale Back-End-Dienste
  • Regionale Back-End-Dienste
  • Firewalls
  • Images
  • Instanzvorlagen
  • Instanzen
  • Regionale nichtflüchtige Speicher
  • Zonale nichtflüchtige Speicher
  • Snapshots
Identity-Aware Proxy (IAP)
  • Tunnel
  • Tunnelinstanzen
  • Tunnelzonen
  • Alle Webdienste
  • Individuelle Webdienste
  • Webdiensttypen
  • Webdienstversionen
Cloud Key Management Service (Cloud KMS)
  • Kryptografische Schlüssel
  • Versionen kryptografischer Schlüssel
  • Schlüsselbunde
Resource Manager
  • Organisationen
  • Projekte
Secret Manager
  • Secrets
  • Secret-Versionen
1. Sie können das Attribut resource.name in einer Bedingung verwenden, um auf Objekte in Cloud Storage-Buckets zu verweisen. Sie müssen die Bedingung aber zur IAM-Richtlinie für eine übergeordnete Ressource hinzufügen, z. B. für den Bucket oder das Projekt.

Für andere Ressourcentypen sind in IAM-Richtlinien keine Bedingungen zulässig. Sie können aber bedingte Rollenbindungen auf Organisations- oder Projektebene hinzufügen. Andere Ressourcen übernehmen dann diese Rollenbindungen über die Ressourcenhierarchie.

Weitere Informationen dazu, welche Attribute sich auf welche Ressourcentypen auswirken, finden Sie in der Attributreferenz.

Bekannte Einschränkungen

Für IAM Conditions gelten die folgenden Einschränkungen:

  • Wie in den Details zu den unterstützten Diensten auf dieser Seite erläutert, können Sie nur für ausgewählte Google Cloud-Dienste Bedingungen zu Rollenbindungen hinzufügen. Außerdem sind die meisten Bedingungsattribute nur mit einer begrenzten Anzahl von Diensten kompatibel.
  • Einfache Rollen (roles/owner, roles/editor, roles/viewer) werden nicht unterstützt. Wenn Sie eine Bedingung in einer Rollenbindung festlegen, in der eine einfache Rolle verwendet wird, schlägt der Vorgang setIamPolicy fehl.
  • Die Werte allUsers und allAuthenticatedUsers sind Mitgliedstypen, die in einer bedingten Rollenbindung nicht unterstützt werden. Wenn Sie einen dieser Mitgliedstypen angeben, schlägt der Vorgang setIamPolicy fehl.
  • Wir empfehlen für jede Richtlinie die Verwendung von maximal 100 bedingten Rollenbindungen. Für eine einzelne Richtlinie gilt eine beschränkte Speichergröße. Richtlinien mit vielen bedingten Rollenbindungen können die Größenbeschränkung überschreiten und werden dann abgelehnt.
  • Wir empfehlen, für ein Mitglied und eine Rolle (unterschiedliche Bedingungen) nur wenige bedingte Rollenbindungen festzulegen. Sie können pro Rolle und pro Mitglied aber bis zu 20 Rollenbindungen angeben. Wenn Sie mehr angeben, schlägt der Vorgang setIamPolicy fehl.
  • Sie können in einem Bedingungsausdruck maximal zwölf logische Operatoren verwenden. Wenn Sie mehr angeben, schlägt der Vorgang setIamPolicy fehl.

Weitere Informationen