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, sodass nur bestimmte Arten von Load-Balancern erstellt werden können.

IAM Conditions unterstützt einen Bedingungsausdruck, mit dem das Load-Balancing-Schema einer Weiterleitungsregel geprüft werden kann. Sie können beispielsweise einem IAM-Mitglied die Möglichkeit geben, interne Load-Balancer zu erstellen, jedoch keine externen. Wenn dieses IAM-Mitglied 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 Externes HTTP(S)-Load-Balancing
Externes SSL-Proxy-Load-Balancing und externes TCP-Proxy-Load-Balancing
Externes TCP/UDP-Netzwerk-Load-Balancing
INTERN Internes TCP/UDP-Load-Balancing
INTERNAL_MANAGED Internes HTTP(S)-Load-Balancing
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 Mitgliedern 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. Zur Festlegung einer Rollenbindung mit einer Bedingung für ein Projekt können Sie die REST API, das gcloud-Befehlszeilentool gcloud oder die IAM-Seite in der Cloud Console verwenden.

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'])
)

Durch diese Richtlinie wird eine Fehlermeldung angezeigt, wenn ein Mitglied eine Weiterleitungsregel mit dem Load-Balancing-Schema EXTERNAL erstellen möchte, da das Load-Balancing-Schema EXTERNAL ausgelassen wird.

Beispielrichtlinie

In diesem IAM-Richtlinienbeispiel für ein Projekt wird dem IAM-Mitglied 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 TCP/UDP-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

Darüber hinaus führt das Fehlen anderer Berechtigungen beim Erstellen eines neuen Ingress-Objekts mithilfe des Cloud Load Balancing-Ingress-Controllers zu einer ähnlichen Fehlermeldung, da der Cloud Load Balancing-Ingress-Controller einen externen HTTP(S)-Load-Balancer erstellen muss.

In den obigen Beispielen sind GKE-Fehlermeldungen verfügbar, wenn die Befehle kubectl describe und kubectl get events -w verwendet werden.

Nächste Schritte