Conditions IAM pour les règles de transfert

Les conditions de gestion de l'authentification et des accès (IAM) vous permettent de définir des stratégies IAM avec des autorisations conditionnelles. Les conditions sont spécifiées dans les liaisons de rôles de la stratégie 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 pour les conditions IAM.

Lorsqu'elles sont utilisées avec Cloud Load Balancing, les conditions IAM vous permettent d'attribuer de manière conditionnelle des rôles prédéfinis (par exemple, administrateur de l'équilibrage de charge ou administrateur réseau) ou des rôles personnalisés.

Les conditions 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 compte principal Cloud IAM la possibilité de créer des équilibreurs de charge internes, mais pas externes. Si ce compte principal 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 IAM sur les é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 Équilibreur de charge d'application classique
Équilibreur de charge réseau proxy classique
Équilibreur de charge réseau passthrough externe
EXTERNAL_MANAGED Équilibreur de charge d'application externe global
Équilibreur de charge d'application externe régional
Équilibreur de charge réseau proxy externe global
Équilibreur de charge réseau proxy externe régional
INTERNAL Équilibreur de charge réseau passthrough interne
INTERNAL_MANAGED Équilibreur de charge d'application interne régional
Équilibreur de charge d'application interne interrégional
Équilibreur de charge réseau proxy interne régional
Équilibreur de charge réseau proxy interne interrégional
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 comptes principaux l'autorisation de créer certains types d'équilibreurs de charge.

Spécifier des conditions 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 la console Google Cloud.

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

Le schéma d'équilibrage de charge EXTERNAL est omis. Si un compte principal tente de créer une règle de transfert avec le schéma d'équilibrage de charge EXTERNAL, un message d'erreur d'autorisation s'affiche.

Exemple de règle

Cet exemple de stratégie IAM pour un projet accorde au compte principal 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

Vous pouvez également utiliser des conditions IAM pour 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 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 réseau passthrough 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, sans autre autorisation, toute tentative de création d'un objet Ingress génère un message d'erreur similaire, car le contrôleur d'entrée Cloud Load Balancing doit créer un équilibreur de charge d'application externe.

Les messages d'erreur GKE sont disponibles à l'aide des commandes kubectl describe et kubectl get events -w.

Étape suivante