Conditions Cloud IAM pour les règles de transfert

Les conditions Cloud IAM (Cloud Identity and Access Management) vous permettent de définir des stratégies Cloud IAM avec des autorisations conditionnelles. Les conditions sont spécifiées dans les liaisons de rôles de la stratégie Cloud IAM d'une ressource. Si une condition existe, le rôle n'est accordé que lorsque l'expression de condition renvoie true. Chaque expression de condition est un ensemble d'instructions logiques vous permettant de spécifier un ou plusieurs attributs. Pour en savoir plus, consultez la documentation de référence sur les attributs des conditions Cloud IAM.

Lorsqu'elles sont utilisées avec Cloud Load Balancing, les conditions Cloud IAM vous permettent d'attribuer de manière conditionnelle des rôles prédéfinis (tels qu'administrateur de l'équilibrage de charge ou administrateur réseau) ou des rôles personnalisés, de sorte que seuls certains types d'équilibreurs de charge puissent être créés.

Les conditions Cloud IAM acceptent une expression de condition pour vérifier le schéma d'équilibrage de charge d'une règle de transfert. Par exemple, vous pouvez accorder de manière conditionnelle à un membre Cloud IAM la possibilité de créer des équilibreurs de charge internes, mais pas externes. Si ce membre Cloud IAM tente de créer une règle de transfert pour un équilibreur de charge externe, Google Cloud refuse l'action et renvoie une erreur semblable à ce qui suit :

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'

Utiliser des conditions Cloud IAM sur des équilibreurs de charge Google Cloud

Le schéma d'équilibrage de charge d'une règle de transfert détermine le ou les types d'équilibreur de charge qui peuvent utiliser celle-ci. En d'autres termes, le schéma d'équilibrage de charge correspond au type d'équilibreur de charge, comme indiqué dans le tableau suivant.

Schéma d'équilibrage de charge Description
EXTERNAL Équilibrage de charge HTTP(S) externe
Équilibrage de charge proxy SSL et proxy TCP externe
Équilibrage de charge réseau TCP/UDP externe
INTERNAL Équilibrage de charge TCP/UDP interne
INTERNAL_MANAGED Équilibrage de charge HTTP(S) interne
INTERNAL_SELF_MANAGED Traffic Director

Vous devez spécifier le champ loadBalancingScheme lorsque vous créez l'équilibreur de charge. En cochant la case loadBalancingScheme dans une condition Cloud IAM, vous pouvez accorder aux membres l'autorisation de créer certains types d'équilibreurs de charge.

Spécifier des conditions Cloud IAM

Vous pouvez définir des liaisons de rôle conditionnelles à l'aide de la méthode setIamPolicy, que vous utilisez pour configurer toute autre liaison de rôle. Pour définir une liaison de rôle avec une condition sur un projet, vous pouvez utiliser l'API REST, l'outil de ligne de commande gcloud ou la page "Cloud IAM" dans Cloud Console.

Pour en savoir plus, consultez la page Gérer des stratégies conditionnelles.

Exemples d'expressions de condition pour l'équilibrage de charge

L'expression de condition suivante, qui peut être utilisée dans une stratégie IAM, n'autorise une requête API que si l'une des conditions suivantes est remplie :

  • La requête n'implique pas la création d'une règle de transfert.
  • La requête consiste à créer une règle de transfert comportant l'un des schémas internes.
!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
)

Cette stratégie entraîne l'affichage d'un message d'erreur d'autorisation si un membre tente de créer une règle de transfert avec le schéma d'équilibrage de charge EXTERNAL, car le schéma d'équilibrage de charge EXTERNAL est omis.

Exemple de stratégie

Cet exemple de stratégie Cloud IAM pour un projet accorde au membre Cloud IAM jane@example.com le rôle prédéfini d'administrateur de l'équilibrage de charge, à l'exclusion de l'autorisation de créer des équilibreurs de charge externes (car le schéma d'équilibrage de charge EXTERNAL est omis). jane@example.com peut créer des équilibreurs de charge internes, et peut gérer, modifier et supprimer tous les équilibreurs de charge.

{
  "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'])
             )
          "
      }
    }
  ]
}

Accorder des autorisations de compte de service GKE pour des types spécifiques de règles de transfert

Les conditions Cloud IAM peuvent également vous permettre de limiter l'accès au compte de service GKE afin de ne créer que des types spécifiques de règles de transfert.

L'exemple JSON suivant illustre une stratégie Cloud IAM complète permettant d'accorder au compte de service GKE (service-<project-ID>@container-engine-robot.iam.gserviceaccount.com) le rôle d'agent de service Kubernetes Engine. Ce rôle permet au compte de service de créer, de modifier et de supprimer des composants d'équilibreur de charge, à l'exception des règles de transfert externes.

Grâce à cette autorisation conditionnelle, le compte de service GKE ne peut créer que de nouvelles règles de transfert internes, mais peut gérer toutes les règles de transfert existantes.

{
  "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()
          "
      }
    }
  ]
}

En l'absence d'autres autorisations, toute tentative de création d'un service GKE de type LoadBalancer, sans annotation pour un équilibreur de charge TCP/UDP interne, génère un message d'erreur semblable à ce qui suit :

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

En outre, en l'absence d'autres autorisations, la tentative de création d'un objet Ingress à l'aide du contrôleur d'entrée Cloud Load Balancing génère un message d'erreur semblable, car le contrôleur d'entrée Cloud Load Balancing doit créer un équilibreur de charge HTTP(S) externe.

Dans les exemples ci-dessus, les messages d'erreur GKE sont disponibles à l'aide des commandes kubectl describe et kubectl get events -w.

Étapes suivantes