Übersicht über IAM Conditions

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

IAM Conditions bietet die Möglichkeit, Zugriff auf Hauptkonten nur dann zu gewähren, wenn die angegebenen Bedingungen erfüllt sind. Beispiel: Sie können Nutzern vorübergehend Zugriff gewähren, damit sie ein Produktionsproblem beheben können, oder den Zugriff nur Mitarbeitern gewähren, die Anfragen von Ihrem Firmenbüro senden.

Die Bedingungen werden in den Rollenbindungen der Zulassungsrichtlinie einer Ressource festgelegt. Ist eine Bedingung vorhanden, wird die Zugriffsanfrage nur erfüllt, wenn der Bedingungsausdruck true ergibt. Jeder Bedingungsausdruck ist ein Satz logischer Anweisungen, die ein oder mehrere zu prüfende Attribute angeben.

Zulassungsrichtlinien mit Bedingungen

Zulassungsrichtlinien enthalten 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 Hauptkonten in dieser Rollenbindung immer die angegebene Rolle für die Ressource.

Nur einige Ressourcentypen akzeptieren Bedingungen in Rollenbindungen. Sie können jedoch bedingten Zugriff auf andere Ressourcentypen gewähren, indem Sie Rollen auf Organisations- oder Projektebene zuweisen.

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). Der Bedingungsausdruck kann mehrere Anweisungen enthalten, wobei jede Anweisung ein Attribut auswertet. Anweisungen werden mit logischen 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 der CEL verwendet, um auf Grundlage von Attributdaten boolesche Autorisierungsentscheidungen zu treffen. Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch bis zu zwölf logische Operatoren (&&, || oder !) verbunden sind. Jede Anweisung drückt eine attributbasierte Steuerungsregel aus, die für die Rollenbindung gilt, und bestimmt letztlich, ob der Zugriff zulässig ist.

IAM Conditions verwendet folgende CEL-Features:

  • 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 auf der angeforderten Ressource (z. B. Typ oder Name) oder den Details der Anfrage, z. B. dem Zeitstempel, der Ursprungs-IP-Adresse oder der Ziel-IP-Adresse.

Ressourcenattribute

Sie können Ressourcenattribute verwenden, um Bedingungen zu schreiben, die die Ressource in der Zugriffsanfrage auswerten. Folgende Attribute können ausgewertet werden:

  • Der Ressourcentyp
  • Der Ressourcenname
  • Der verwendete Google Cloud-Dienst
  • Die an die Ressource angehängten Tags

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 auf Cloud Storage-Objekte in einem bestimmten Bucket:

resource.type == "storage.googleapis.com/Object" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets/")

Gewähren Sie Zugriff auf Google Cloud-Ressourcen mit dem Tag env: prod:

resource.matchTag('123456789012/env', 'prod')

Anfrageattribute

Sie können Anfrageattribute nutzen, um Bedingungen zu schreiben, die Details zu der Anfrage auswerten, wie z. B.:

  • Die Zugriffsebene
  • Datum und Uhrzeit
  • Die Ziel-IP-Adresse und den Zielport (für IAP-TCP-Tunneling)
  • Den erwarteten URL-Host/-Pfad für IAP

Beispielausdruck mit Zugriffsebene (nur für IAP)

Im folgenden Beispiel definiert die Organisation eine Zugriffsebene CorpNet, die den Zugriff auf den IP-Adressbereich beschränkt, in dem Traffic in ein Unternehmensnetzwerk ein- bzw. austritt. Der Zugriff ist nur zulässig, wenn die Anfrage die Kriterien der Zugriffsebene CorpNet erfüllt:

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

Ihre Organisation definiert Zugriffsebenen basierend auf Attributen der Anfrage, z. B. Quell-IP-Adresse, Geräteattribute, Uhrzeit und weiteren. Weitere Informationen finden Sie in der Dokumentation zu Access Context Manager.

Beispiel für API-Attributausdruck

Erlauben Sie einem Nutzer, nur die Rolle des Rechnungskontoadministrators (roles/billing.admin) zuzuweisen und zu widerrufen:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
                 .hasOnly(['roles/billing.admin'])

Weitere Informationen zur Verwendung von API-Attributen zur Beschränkung der Rollenzuweisung finden Sie unter Einschränkungen für die Zuweisung von Rollen festlegen.

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 Ziel-IP-Adresse/-port (für IAP-TCP-Tunneling)

So gewähren Sie den Zugriff auf eine interne Ziel-IP-Adresse oder -Portnummer:

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

Beispielausdrücke mit Angaben zur Weiterleitungsregel

Damit gewähren Sie einem Hauptkonto 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'
  ])
)

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")

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")

Nächste Schritte