Übersicht über IAM Conditions

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

Bedingungen und Richtlinientypen

Sie können Bedingungen an den folgenden Stellen verwenden:

  • Rollenbindungen für Zulassungsrichtlinien, einschließlich Rollenbindungen, die von Privileged Access Manager-Berechtigungenverwaltet werden
  • Ablehnungsrichtlinienregeln
  • Richtlinienbindungen für Principal Access Boundary-Richtlinien

In den folgenden Abschnitten wird beschrieben, wie Sie Bedingungen an den jeweiligen Stellen verwenden können, um die attributbasierte Zugriffssteuerung zu erzwingen.

Bedingungen in Zulassungsrichtlinien

Mit Bedingungen in Zulassungsrichtlinien können Sie festlegen, dass Hauptkonten nur Zugriff gewährt wird, 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 Unternehmensnetzwerk senden.

Die Bedingungen werden in den Rollenbindungen der Zulassungsrichtlinie einer Ressource festgelegt. Wenn eine Rollenbindung eine Bedingung hat, wird den Hauptkonten in der Rolle die Rolle nur zugewiesen, wenn der Bedingungsausdruck true ergibt.

Wenn Sie einer Rollenbindung eine Bedingung hinzufügen möchten, definieren Sie das Feld condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]
Wenn Sie Berechtigungen für Privileged Access Manager verwenden, können Sie den Rollen in dieser Berechtigung auch Bedingungen hinzufügen. Wenn ein Nutzer erfolgreich eine Berechtigung für diesen Anspruch anfordert, erhält er die Rolle mit der angegebenen Bedingung.

Weitere Informationen zu den Feldern in einer Bedingung finden Sie auf dieser Seite unter Bedingungsstruktur.

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.

Als Best Practice sollten Sie einer einzelnen Zulassungsrichtlinie nicht mehr als 100 bedingte Rollenbindungen hinzufügen. Wenn Sie eine größere Anzahl von bedingten Rollenbindungen verwenden, überschreiten Sie möglicherweise die Größenbeschränkung für Zulassungsrichtlinien.

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

Bedingungen in Ablehnungsrichtlinien

Sie können Bedingungen in Ablehnungsrichtlinien verwenden, um eine Ablehnungsregel nur anzuwenden, wenn eine bestimmte Bedingung erfüllt ist. Sie können beispielsweise eine Berechtigung nur dann verweigern, wenn die Ressource, auf die das Hauptkonto zuzugreifen versucht, als Teil der prod-Umgebung gekennzeichnet ist.

Die Bedingungen werden in den Ablehnungsregeln der Ablehnungsrichtlinien einer Ressource angegeben. Wenn die Bedingung true ergibt oder nicht ausgewertet werden kann, gilt die Ablehnungsregel und die Hauptkonten können die angegebenen Berechtigungen nicht verwenden. Wenn die Bedingung false ergibt, gilt die Ablehnungsregel nicht und die Hauptkonten können die angegebenen Berechtigungen verwenden, wenn sie sie haben.

Bedingungen in Ablehnungsrichtlinien haben dieselbe Struktur wie Bedingungen in Zulassungsrichtlinien. Sie erkennen jedoch nur Ressourcen-Tag-Funktionen.

Wenn Sie einer Ablehnungsregel eine Bedingung hinzufügen möchten, definieren Sie das Feld denialCondition:

"rules": [
  {
    "denyRule": {
      "deniedPrincipals": [
        "PRINCIPAL_1",
        "PRINCIPAL_2"
      ],
      "exceptionPrincipals": [
        "EXCEPTION_PRINCIPAL_1",
        "EXCEPTION_PRINCIPAL_2"
      ],
      "deniedPermissions": [
        "DENIED_PERMISSION_1",
        "DENIED_PERMISSION_2"
      ],
      "denialCondition": {
        "title": "TITLE",
        "description": "DESCRIPTION",
        "expression": "EXPRESSION"
      }
    }
  }
]

Weitere Informationen zu den Feldern in einer Bedingung finden Sie auf dieser Seite unter Bedingungsstruktur.

Informationen zum Erstellen und Verwalten von Ablehnungsrichtlinien finden Sie unter Zugriff verweigern.

Bedingungen in Bindungen für Principal Access Boundary-Richtlinien

Mit Bedingungen in Richtlinienbindungen für Principal Access Boundary-Richtlinien können Sie den Hauptkontosatz eingrenzen, auf den sich die Principal Access Boundary-Richtlinie bezieht. Sie können beispielsweise eine Richtlinie nur für Dienstkonten erzwingen oder super-admin@example.com von einer Richtlinie ausnehmen.

Die Bedingungen werden in jeder Richtlinienbindung angegeben. Wenn eine Richtlinienbindung eine Bedingung hat, wird die Richtlinie in der Richtlinienbindung nur erzwungen, wenn die Bedingung true ergibt.

Wenn Sie einer Richtlinienbindung eine Bedingung hinzufügen möchten, definieren Sie das Feld condition in der Richtlinienbindung:

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

Weitere Informationen zu den Feldern in einer Bedingung finden Sie auf dieser Seite unter Bedingungsstruktur.

Informationen zum Erstellen von Richtlinienbindungen für Principal Access Boundary-Richtlinien finden Sie unter Principal Access Boundary-Richtlinie auf einen Hauptkontosatz anwenden.

Bedingungsstruktur

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.

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 logische Operatoren (&&, || oder !) verbunden sind.

Jede Anweisung drückt eine attributbasierte Steuerungsregel aus und bestimmt letztlich, ob die Rollenbindung, die Ablehnungsregel oder die Richtlinienbindung gilt.

Bedingungen in IAM Conditions verwenden die folgenden CEL-Funktionen:

  • 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 komplexer Operator für Datentypen, die komplexere Vorgänge 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.

Die Bedingungsattribute, die Sie in einem Bedingungsausdruck verwenden können, hängen vom Richtlinientyp ab, für den Sie Bedingungen schreiben. Eine vollständige Liste der Attributbedingungen und weitere Informationen zu den für die einzelnen Richtlinientypen unterstützten Attributen finden Sie in der Attributreferenz.

In den folgenden Abschnitten finden Sie Beispiele für einige der Attribute, die Sie in Bedingungen verwenden können.

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

Sie können jedes dieser Attribute in Rollenbindungen für Zulassungsrichtlinien verwenden. Außerdem können Sie das Attribut „Ressourcentags“ in Ablehnungsregeln für Ablehnungsrichtlinien verwenden.

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

Im Folgenden sehen Sie einen Bedingungsausdruck in einer Rollenbindung, der Zugriff auf Compute Engine-VM-Instanzen, aber auf keinen anderen Ressourcentyp ermöglicht:

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

In einer Rollenbindung ermöglicht der folgende Bedingungsausdruck den Zugriff auf Cloud Storage-Ressourcen, aber auf keine Ressourcen anderer Dienste:

resource.service == 'storage.googleapis.com'

Im folgenden Bedingungsausdruck in einer Rollenbindung wird der Zugriff nur auf Cloud Storage-Objekte in einem bestimmten Bucket gewährt:

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

In einer Ablehnungsregel wird mit dem folgenden Bedingungsausdruck der Zugriff aufGoogle Cloud -Ressourcen mit dem Tag env: prod verweigert:

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

Hauptkontoattribute

Mit den Hauptkontoattributen können Sie Bedingungen basierend auf dem Hauptkonto schreiben, das die Anfrage gestellt hat. Folgende Attribute können ausgewertet werden:

  • Der Typ des Hauptkontos in der Anfrage
  • Die Identität des Hauptkontos in der Anfrage

Sie können diese Attribute in Richtlinienbindungen für Principal Access Boundary-Richtlinien verwenden.

Weitere Informationen finden Sie in der Referenz zu Conditions-Attributen.

Beispielausdrücke

In einer Bindung für Principal Access Boundary-Richtlinie sorgt der folgende Bedingungsausdruck dafür, dass die Richtlinie in der Bindung nur für Dienstkonten erzwungen wird:

principal.type == 'iam.googleapis.com/ServiceAccount'

In einer Bindung für Principal Access Boundary-Richtlinie sorgt der folgende Bedingungsausdruck dafür, dass die Richtlinie in der Bindung nicht für super-admin@example.com erzwungen wird:

principal.subject != 'super-admin@example.com'

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 oder -Pfad für IAP

Sie können diese Attribute in Rollenbindungen für Zulassungsrichtlinien verwenden.

Beispielausdruck mit Zugriffsebene (nur für IAP)

Im folgenden Beispiel definiert Ihre Organisation eine Zugriffsebene CorpNet, die den Zugriff auf den IP-Adressbereich beschränkt, in dem Traffic in ein Unternehmensnetzwerk ein- bzw. austritt. Fügen Sie dann der Rollenbindung den folgenden Bedingungsausdruck hinzu, um den Zugriff nur zuzulassen, wenn die Anfrage die 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

In einer Rollenbindung für eine Rolle mit der Berechtigung iam.projects.setIamPolicy kann ein Nutzer mit dem folgenden Bedingungsausdruck nur die Rolle des Rechnungskontoadministrator (roles/billing.admin) für das Projekt zuweisen und 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

In einer Rollenbindung wird mit dem folgenden Bedingungsausdruck der Zugriff bis Mitternacht am 1. Januar 2021 gewährt:

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

In einer Rollenbindung wird mit dem folgenden Bedingungsausdruck der Zugriff nur zu bestimmten Arbeitszeiten gewährt, basierend auf der Zeitzone 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') <= '

In einer Rollenbindung wird mit dem folgenden Bedingungsausdruck der Zugriff nur für Juni 2020 gewährt, basierend auf 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 und -port (für IAP-TCP-Tunneling)

In einer Rollenbindung ermöglicht der folgende Bedingungsausdruck 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

Im Rahmen einer Rollenbindung ermöglicht der folgende Bedingungsausdruck den Zugriff für ein Hauptkonto, wenn die Anfrage keine Weiterleitungsregel erstellt oder wenn die Anfrage eine Weiterleitungsregel für einen internen Google Cloud Load-Balancer erstellt:

!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.

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

In einer Rollenbindung wird mit dem folgenden Bedingungsausdruck der Zugriff nur für bestimmte Subdomains oder URL-Pfade in der Anfrage gewährt:

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

Beispielausdruck mit verschiedenen Attributtypen

Im folgenden Bedingungsausdruck für eine Rollenbindung ist der Zugriff zulässig, wenn die Anfrage zu einem bestimmten Zeitpunkt gestellt wird und mit einem Präfix für den Ressourcennamen, mit der ausgewählten 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