Back-end MTLS avec la Passerelle d’application pour conteneurs – API de passerelle

Ce document permet de configurer un exemple d’application qui utilise la ressource suivante depuis l’API Gateway. Les étapes sont fournies pour :

  • Créez une ressource de passerelle avec un écouteur HTTPS.
  • Créez une ressource HTTPRoute qui fait référence à un service principal.
  • Créez une ressource BackendTLSPolicy qui a un client et un certificat d’autorité de certification pour le service principal référencé dans HTTPRoute.

Background

Mutual Transport Layer Security (MTLS) est un processus qui s’appuie sur des certificats pour chiffrer les communications et identifier les clients vers un service. Cela permet aux charges de travail back-end d’augmenter davantage sa posture de sécurité en faisant confiance uniquement aux connexions à partir d’appareils authentifiés.

Voir la figure suivante :

A diagram showing the Application Gateway for Containers backend MTLS process.

Prérequis

  1. Si vous suivez la stratégie de déploiement BYO, veillez à configurer vos ressources de Passerelle d’application pour conteneurs et votre contrôleur ALB.

  2. Si vous suivez la stratégie de déploiement managé ALB, provisionnez votre contrôleur ALB et les ressources de Passerelle d’application pour conteneurs avec la ressource personnalisée ApplicationLoadBalancer.

  3. Déployez un exemple d’application HTTP :

    Appliquez le fichier deployment.yaml suivant sur votre cluster pour créer un exemple d’application web et déployer des exemples de secrets afin de montrer l’authentification mutuelle de back-end (mTLS).

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/end-to-end-ssl-with-backend-mtls/deployment.yaml
    

    Cette commande crée les éléments suivants sur votre cluster :

    • Un espace de noms nommé test-infra
    • Un service appelé mtls-app dans l’espace de noms test-infra
    • Un déploiement appelé mtls-app dans l’espace de noms test-infra
    • Un ConfigMap appelé mtls-app-nginx-cm dans l’espace de noms test-infra
    • Quatre secrets appelés backend.com, frontend.com, gateway-client-cert et ca.bundle dans l’espace de noms test-infra

Déployer les ressources d’API de passerelle requises

Créer une passerelle

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: https-listener
    port: 443
    protocol: HTTPS
    allowedRoutes:
      namespaces:
        from: Same
    tls:
      mode: Terminate
      certificateRefs:
      - kind : Secret
        group: ""
        name: frontend.com
EOF

Remarque

Lorsque le contrôleur ALB crée les ressources Passerelle d’application pour conteneurs dans ARM, il utilise la convention de dénomination suivante pour une ressource front-end : fe-<8 caractères générés aléatoirement>

Si vous souhaitez modifier le nom du front-end créé dans Azure, il peut être préférable de suivre la stratégie de déploiement BYO.

Une fois la ressource de passerelle créée, vérifiez que l’état est valide, que l’écouteur est programmé et qu’une adresse est affectée à la passerelle.

kubectl get gateway gateway-01 -n test-infra -o yaml

Exemple de sortie de la création réussie de la passerelle :

status:
  addresses:
  - type: IPAddress
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Une fois la passerelle créée, créez une ressource HTTPRoute.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: mtls-app
      port: 443
EOF

Une fois la ressource HTTPRoute créée, vérifiez que l’itinéraire est accepté et que la ressource Passerelle d’application pour conteneurs est programmée.

kubectl get httproute https-route -n test-infra -o yaml

Vérifiez que l’état de la ressource de Passerelle d’application pour conteneurs a été correctement mis à jour.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Créer une backendTLSPolicy

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: BackendTLSPolicy
metadata:
  name: mtls-app-tls-policy
  namespace: test-infra
spec:
  targetRef:
    group: ""
    kind: Service
    name: mtls-app
    namespace: test-infra
  default:
    sni: backend.com
    ports:
    - port: 443
    clientCertificateRef:
      name: gateway-client-cert
      group: ""
      kind: Secret
    verify:
      caCertificateRef:
        name: ca.bundle
        group: ""
        kind: Secret
      subjectAltName: backend.com
EOF

Une fois l’objet BackendTLSPolicy créé, consultez l’état de l’objet pour vérifier que la stratégie est valide :

kubectl get backendtlspolicy -n test-infra mtls-app-tls-policy -o yaml

Exemple de sortie de la création d’un objet BackendTLSPolicy valide :

status:
  conditions:
  - lastTransitionTime: "2023-06-29T16:54:42Z"
    message: Valid BackendTLSPolicy
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted

Tester l’accès à l’application

Nous sommes maintenant prêts à envoyer du trafic vers notre exemple d’application, via le FQDN attribué au front-end. Utilisez la commande suivante pour obtenir le nom de domaine complet :

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Le curling de ce nom de domaine complet doit retourner des réponses du back-end tel qu’il est configuré sur HTTPRoute.

curl --insecure https://$fqdn/

Félicitations, vous avez installé le contrôleur ALB, déployé une application principale et routé le trafic vers l’application via l’Ingress on Application Gateway pour conteneurs.