IAM-Bedingungen für Weiterleitungsregeln

Mit Identity and Access Management (IAM) Conditions können Sie IAM-Richtlinien mit bedingten Berechtigungen definieren. Sie geben Bedingungen in den Rollenbindungen der IAM-Richtlinie einer Ressource an. Wenn eine Bedingung vorhanden ist, wird die Rolle nur dann gewährt, wenn der Bedingungsausdruck true ergibt. Jeder Bedingungsausdruck ist ein Satz logischer Anweisungen, in denen Sie ein oder mehrere Attribute angeben können. Weitere Informationen finden Sie unter Attributreferenz für IAM Conditions.

Wenn Cloud IAM Conditions mit Cloud Load Balancing verwendet wird, können Sie darin vordefinierte Rollen (z. B. Load-Balancer-Administrator oder Netzwerkadministrator) oder benutzerdefinierte Rollen unter bestimmten Bedingungen zuweisen.

IAM Conditions unterstützt einen Bedingungsausdruck, mit dem das Load-Balancing-Schema einer Weiterleitungsregel geprüft werden kann. Sie können beispielsweise einem IAM-Hauptkonto die Möglichkeit geben, interne Load-Balancer zu erstellen, jedoch keine externen. Wenn ein Cloud IAM-Hauptkonto versucht, eine Weiterleitungsregel für einen externen Load-Balancer zu erstellen, lehnt Google Cloud die Aktion ab und gibt einen Fehler wie den folgenden zurück:

ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource:

 - Required 'compute.forwardingRules.create' permission for
 'projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME'

IAM Conditions für Google Cloud-Load-Balancer verwenden

Das Load-Balancing-Schema einer Weiterleitungsregel bestimmt, welcher Typ oder welche Typen von Load-Balancern die Weiterleitungsregel verwenden können. Mit anderen Worten, das Load-Balancing-Schema entspricht dem Typ des Load-Balancers, wie in der folgenden Tabelle dargestellt.

Load-Balancing-Schema Beschreibung
EXTERN Classic Application Load Balancer
Externer Proxy-Network Load Balancer
Externer Passthrough-Network Load Balancer
EXTERNAL_MANAGED Globaler externer Application Load Balancer
Regionaler externer Application Load Balancer
Globaler externer Proxy-Network Load Balancer
regionaler externer Proxy-Network Load Balancer
INTERN Interner Passthrough-Netzwerk-Load-Balancer
INTERNAL_MANAGED Regionaler interner Application Load Balancer
Regionsübergreifender interner Application Load Balancer
Regionaler interner Proxy-Network Load Balancer
Regionsübergreifender interner Proxy-Network Load Balancer
INTERNAL_SELF_MANAGED Traffic Director

Beim Erstellen des Load-Balancers geben Sie das Feld loadBalancingScheme an. Durch Auswahl des Felds loadBalancingScheme in einer IAM-Bedingung können Sie Hauptkonten die Möglichkeit geben, bestimmte Arten von Load-Balancern zu erstellen.

IAM Conditions angeben

Sie können bedingte Rollenbindungen mit derselben setIamPolicy-Methode festlegen, mit der Sie auch andere Rollenbindungen konfigurieren. Sie können eine Rollenbindung mit einer Bedingung für ein Projekt festlegen. Verwenden Sie dazu die REST API, das gcloud-Befehlszeilentool oder die IAM-Seite in der Google Cloud Console.

Weitere Informationen finden Sie unter Bedingte Richtlinien verwalten.

Beispiele für Bedingungsausdrücke für Load-Balancing

Der folgende Bedingungsausdruck, der in einer IAM-Richtlinie verwendet werden kann, lässt eine API-Anfrage nur zu, wenn eine der folgenden Bedingungen erfüllt ist:

  • Die Anfrage umfasst keine Erstellung einer Weiterleitungsregel.
  • Die Anforderung besteht darin, eine Weiterleitungsregel mit einem der internen Schemas zu erstellen.

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

Das Load-Balancing-Schema EXTERNAL wird ausgelassen. Wenn ein Hauptkonto versucht, eine Weiterleitungsregel mit dem Load-Balancing-Schema EXTERNAL zu erstellen, wird eine Berechtigungsfehlermeldung angezeigt.

Beispielrichtlinie

In diesem IAM-Richtlinienbeispiel für ein Projekt wird dem IAM-Hauptkonto jane@example.com die vordefinierte Rolle des Load-Balancer-Administrators zugewiesen, mit Ausnahme der Möglichkeit, externe Load-Balancer zu erstellen (da das Load-Balancer-Schema EXTERNAL ausgelassen wird). jane@example.com kann interne Load-Balancer erstellen und Load-Balancer verwalten, ändern und löschen.

{
  "bindings": [
    {
      "role": "roles/compute.loadBalancerAdmin",
      "members": ["user:jane@example.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB creation only permitted",
          "expression": "
             !compute.isForwardingRuleCreationOperation() || (
                compute.isForwardingRuleCreationOperation() &&
                compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
             )
          "
      }
    }
  ]
}

GKE-Dienstkontoberechtigungen für bestimmte Arten von Weiterleitungsregeln erteilen

Sie können mit IAM Conditions auch den Zugriff auf das GKE-Dienstkonto beschränken, um nur bestimmte Arten von Weiterleitungsregeln zu erstellen.

Dieses JSON-Beispiel zeigt eine vollständige IAM-Richtlinie, um dem GKE-Dienstkonto (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) die Rolle "Kubernetes Engine-Dienst-Agent" zuzuweisen. Diese Rolle ermöglicht dem Dienstkonto das Erstellen, Ändern und Löschen von Load-Balancer-Komponenten, mit Ausnahme von externen Weiterleitungsregeln.

Mit dieser bedingten Berechtigung kann das GKE-Dienstkonto nur neue interne Weiterleitungsregeln erstellen, aber alle vorhandenen Weiterleitungsregeln verwalten.

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB Creation Only Permitted",
          "expression": "(
                 compute.isForwardingRuleCreationOperation()
                      &&
                  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

Wenn andere Berechtigungen fehlen, wird beim Erstellen eines neuen GKE-Diensts vom Typ LoadBalancer ohne die Annotation für einen internen Passthrough-Netzwerk-Load-Balancer eine Fehlermeldung wie die folgende angezeigt:

Error creating load balancer (will retry): failed to ensure load balancer for
service default/SERVICE-NAME: failed to create forwarding rule for load balancer
(a01d427111c7011ea96e142010a80006(default/SERVICE-NAME)): googleapi: Error 403:
Required 'compute.forwardingRules.create' permission for
'projects/PROJECT_ID/regions/[region]/forwardingRules/FORWARDING_RULE_NAME',
forbidden

Ohne andere Berechtigungen verursacht der Versuch, ein neues Ingress-Objekt zu erstellen, eine ähnliche Fehlermeldung, da der Cloud Load Balancing-Ingress-Controller einen externen Application Load Balancer erstellen muss.

GKE-Fehlermeldungen sind mit den Befehlen kubectl describe und kubectl get events -w verfügbar.

Nächste Schritte