Configurer une extension d'autorisation

Les extensions de service permettent aux équilibreurs de charge d'application d'envoyer des appels à des services de backend pour insérer un traitement personnalisé dans le chemin de traitement. Les extensions d'autorisation s'exécutent dans le chemin de traitement des requêtes lorsque l'équilibreur de charge reçoit des en-têtes de requête et après que le mappage d'URL a choisi le service de backend. Cette page explique comment configurer des extensions d'autorisation pour utiliser un moteur d'autorisation personnalisé défini dans une règle d'autorisation.

Pour obtenir une présentation des extensions d'équilibreur de charge d'application, consultez la page Présentation des extensions Cloud Load Balancing.

Introduction

Cloud Load Balancing vous permet de configurer des règles d'autorisation qui appliquent le contrôle des accès au trafic entrant dans les équilibreurs de charge. Parfois, les décisions d'autorisation complexes ne peuvent pas être facilement exprimées à l'aide d'une règle d'autorisation.

Vous pouvez configurer des règles d'autorisation avec des extensions d'autorisation pour déléguer les décisions d'autorisation à des moteurs d'autorisation personnalisés. Dans le chemin d'accès aux données, les extensions d'autorisation sont exécutées après les extensions de routage, mais avant les extensions de trafic. Pour en savoir plus sur les règles d'autorisation, consultez la page Présentation des règles d'autorisation.

Pour chaque requête d'autorisation, le proxy transfère les en-têtes de requête à l'extension. En fonction de la réponse du fournisseur, le proxy transfère ou rejette la requête.

Dans la version preview, pour les équilibreurs de charge d'application externes régionaux et les équilibreurs de charge d'application internes régionaux, vous pouvez configurer des extensions d'autorisation séparément pour les règles d'autorisation des requêtes et les règles d'autorisation du contenu. Les extensions basées sur des règles d'autorisation des requêtes sont configurées pour s'exécuter avant celles basées sur des règles d'autorisation du contenu.

Pour en savoir plus sur les limites liées aux extensions d'équilibreur de charge d'application, consultez la page Quotas et limites.

Configurer une extension d'autorisation de base

L'exemple suivant montre comment configurer une extension d'autorisation, my-authz-ext, avec une règle d'autorisation pour déléguer les décisions d'autorisation pour un équilibreur de charge d'application externe global.

gcloud

  1. Créez les ressources requises comme décrit dans Configurer un service de backend d'appel.

    Pour cet exercice, créez un équilibreur de charge d'application externe global. Nommez le service authz-service et la règle de transfert fr1.

  2. Configurez l'extension d'autorisation.

    1. Définissez l'extension dans un fichier YAML qui l'associe au service de backend, authz-service. Utilisez les exemples de valeurs fournis.

      cat >authz-extension.yaml <<EOF
          name: my-authz-ext
          authority: ext11.com
          loadBalancingScheme: EXTERNAL_MANAGED
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/authz-service
          forwardHeaders:
            - Authorization
          failOpen: false
          timeout: "0.1s"
          forwardAttributes:
          - request.mcp_param
          - connection.client_cert_leaf
      EOF
      

      Remplacez PROJECT_ID par l' ID du projet.

      Pour en savoir plus sur les champs du fichier YAML, consultez la section ExtensionChain dans la documentation de l'API. Pour en savoir plus sur les attributs compatibles, consultez la section Attributs compatibles.

    2. Importez l'extension d'autorisation. Utilisez la gcloud service-extensions authz-extensions import commande avec les exemples de valeurs suivants.

      gcloud service-extensions authz-extensions import my-authz-ext \
          --source=authz-extension.yaml \
          --location=global
      

      Si vous souhaitez définir le protocole sur ext_authz, utilisez plutôt la gcloud beta service-extensions authz-extensions import commande.

  3. Configurez une règle d'autorisation avec l'extension.

    1. Définissez une règle d'autorisation qui associe l'extension my-authz-ext à la règle de transfert fr1. Utilisez les exemples de valeurs fournis. L'action CUSTOM indique qu'une extension est utilisée.

      cat >authz-policy.yaml <<EOF
          name: my-authz-policy
          target:
            loadBalancingScheme: EXTERNAL_MANAGED
            resources:
              - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/fr1"
          action: CUSTOM
          customProvider:
            authzExtension:
              resources:
                - "projects/PROJECT_ID/locations/global/authzExtensions/my-authz-ext"
      EOF
      
    2. Importez la règle d'autorisation dans le projet. Utilisez la gcloud network-security authz-policies import commande avec les exemples de valeurs suivants.

      gcloud network-security authz-policies import my-authz-policy \
          --source=authz-policy.yaml \
          --location=global
      

Configurer des extensions d'autorisation en fonction de profils

Vous pouvez configurer des extensions d'autorisation séparément pour les règles d'autorisation des requêtes et les règles d'autorisation du contenu.

Pour une règle d'autorisation des requêtes

L'exemple suivant montre comment configurer une extension d'autorisation qui applique une règle d'autorisation des requêtes à une règle de transfert dans us-west1. La règle exige que le trafic passe l'authentification TLS mutuelle à partir d'un principal spécifique avant d'être autorisé à atteindre la destination, example.com/mcp.

gcloud

  1. Configurez un service de backend d'appel nommé lb-request-authz-service dans us-west1 avec une règle de transfert nommée fr2.

    Pour le service, configurez un équilibreur de charge d'application externe régional avec des backends de groupes d'instances de VM.

  2. Configurez l'extension d'autorisation.

    1. Définissez l'extension dans un fichier YAML qui l'associe au service de backend, lb-request-authz-service. Utilisez les exemples de valeurs fournis.

      cat >lb-request-authz-extension.yaml <<EOF
      name: my-lb-request-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-request-service
      forwardHeaders:
        - Authorization
      failOpen: false
      timeout: "0.1s"
      wireFormat: EXT_AUTHZ_GRPC
      EOF
      

      Remplacez PROJECT_ID par l' ID du projet.

      L'extension doit se trouver dans la même région que votre service de backend.

      Par défaut, tous les appels de Service Extensions utilisent le protocole Envoy External Processing ou ext_proc. Dans le cas des appels d'autorisation, le protocole External Authorization ou ext_authz est également compatible avec la version preview. Lorsque l'option wireFormat est définie sur EXT_AUTHZ_GRPC, l'appel utilise le protocole ext_authz. Si l'option n'est pas spécifiée, l'appel utilise le protocole ext_proc.

      Pour les règles d'autorisation des requêtes, la valeur wireFormat peut être EXT_AUTHZ_GRPC afin que l'appel utilise le protocole ext_authz, bien que le protocole ext_proc soit également compatible.

      Par défaut, failOpen est défini sur false. Si l'extension expire ou échoue, le traitement des requêtes s'arrête. Cette option par défaut est préférable lorsque la sécurité ou l'intégrité est prioritaire par rapport à la disponibilité.

    2. Importez l'extension d'autorisation. Utilisez la gcloud beta service-extensions authz-extensions import commande avec les exemples de valeurs suivants.

      gcloud beta service-extensions authz-extensions import my-lb-request-authz-ext \
          --source=lb-request-authz-extension.yaml \
          --location=us-west1
      
  3. Dans le même projet, configurez une règle d'autorisation avec l'extension.

    Pour toute requête adressée à example.com/mcp, la règle exige une authentification TLS mutuelle à partir d'un principal spécifique et délègue ensuite la décision d'autorisation à l'extension d'autorisation, my-lb-authz-request-ext.

    1. Définissez une règle d'autorisation qui associe l'extension my-lb-request-authz-ext à la règle de transfert fr2. Utilisez les exemples de valeurs fournis.

      cat >lb-request-authz-policy.yaml <<EOF
      name: my-lb-request-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr2"
      policyProfile: REQUEST_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/mcp"
        from:
          sources:
          - principals:
            - principal_selector: CLIENT_CERT_DNS_NAME_SANS
              principal:
                exact: "spiffe://p.global.123.workload.id.goog/ns/ns1/sa/hellomcp"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-request-authz-ext"
      EOF
      

      Pour les règles d'autorisation des requêtes, la valeur de policyProfile doit être REQUEST_AUTHZ. Cette valeur indique que le fournisseur de règles personnalisé agit sur les requêtes pour autoriser ou refuser le trafic.

      L'action CUSTOM indique qu'une extension est associée au proxy.

      Pour en savoir plus sur une ressource de règle d'autorisation, consultez la authzPolicy documentation de référence.

    2. Importez la règle d'autorisation dans le projet. Utilisez la gcloud beta network-security authz-policies import commande avec les exemples de valeurs suivants.

      gcloud beta network-security authz-policies import my-lb-request-authz-policy \
          --source=lb-request-authz-policy.yaml \
          --location=us-west1
      

Pour une règle d'autorisation du contenu

L'exemple suivant montre comment configurer une extension d'autorisation qui applique une règle d'autorisation du contenu à une règle de transfert dans us-west1. La règle exige qu'un service de nettoyage de contenu effectue une inspection approfondie des charges utiles de votre application pour autoriser ou refuser les requêtes, ou pour modifier les requêtes et les réponses, selon les besoins.

gcloud

  1. Configurez un service de backend d'appel nommé lb-content-authz-service dans us-west1 avec une règle de transfert nommée fr3.

    Pour le service, configurez un équilibreur de charge d'application externe régional avec des backends de groupes d'instances de VM.

    Configurez le serveur d'extension avec le ext_proc protocole en FULL_DUPLEX_STREAMED mode de traitement du corps et en acceptant tous les événements.

  2. Configurez l'extension d'autorisation.

    1. Définissez l'extension dans un fichier YAML qui l'associe au service de backend, lb-content-authz-service. Utilisez les exemples de valeurs fournis.

      cat >lb-content-authz-extension.yaml <<EOF
      name: my-lb-content-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-sdp-service
      failOpen: false
      timeout: "0.1s"
      EOF
      

      Pour les règles d'autorisation du contenu, la valeur de policyProfile doit être CONTENT_AUTHZ.

      Pour les règles CONTENT_AUTHZ, la valeur wireFormat n'a pas besoin d'être définie explicitement comme EXT_PROC_GRPC. Par défaut, l'appel utilise le protocole ext_proc.

    2. Importez l'extension d'autorisation. Utilisez la gcloud beta service-extensions authz-extensions import commande avec les exemples de valeurs suivants.

      gcloud beta service-extensions authz-extensions import my-lb-content-authz-ext \
          --source=lb-content-authz-extension.yaml \
          --location=us-west1
      
  3. Configurez une règle d'autorisation avec l'extension.

    1. Définissez une règle d'autorisation qui associe l'extension my-lb-content-authz-ext à la règle de transfert fr3. Utilisez les exemples de valeurs fournis.

      cat >lb-content-authz-policy.yaml <<EOF
      name: lb-content-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr3"
      policyProfile: CONTENT_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/sensitive-stuff"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-authz-content-ext"
      EOF
      

      La valeur de policyProfile doit être CONTENT_AUTHZ.

    2. Importez la règle d'autorisation dans le projet. Utilisez la gcloud beta network-security authz-policies import commande avec les exemples de valeurs suivants.

      gcloud beta network-security authz-policies import my-lb-content-authz-policy \
          --source=lb-content-authz-policy.yaml \
          --location=us-west1
      

Limites des extensions d'autorisation

Voici quelques limites des extensions d'autorisation :

  • Une règle d'autorisation ne peut comporter qu'une seule extension d'autorisation.
  • Une règle de transfert peut être utilisée avec plusieurs règles d'autorisation, dont une seule peut être une règle d'autorisation personnalisée.

Pour connaître les limites applicables à toutes les extensions, consultez la section Limites des extensions.

Étape suivante