Backend MTLS con Application Gateway para contenedores - API de puerta de enlace

Este documento ayuda a configurar una aplicación de ejemplo que usa los siguientes recursos de la API de puerta de enlace. Se proporcionan pasos para:

  • Crear un recurso de puerta de enlace con un agente de escucha HTTPS.
  • Cree un recurso HTTPRoute que haga referencia a un servicio back-end.
  • Cree un recurso BackendTLSPolicy que tenga un certificado de cliente y CA para el servicio back-end al que se hace referencia en HTTPRoute.

Fondo

Seguridad de la capa de transporte mutua (MTLS) es un proceso que se basa en certificados para cifrar las comunicaciones e identificar a los clientes en un servicio. Esto permite que las cargas de trabajo de back-end aumenten aún más su posición de seguridad al confiar solo en conexiones desde dispositivos autenticados.

Consulte la siguiente figura:

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

Requisitos previos

  1. Si sigue la estrategia de implementación BYO, asegúrese de configurar los recursos de puerta de enlace de aplicaciones para contenedores y el controlador de ALB.

  2. Si sigue la estrategia de implementación administrada de ALB, asegúrese de aprovisionar su controlador de ALB y los recursos de Puerta de enlace de aplicaciones para contenedores mediante el recurso personalizado ApplicationLoadBalancer.

  3. Despliegue la aplicación HTTP de ejemplo:

    Aplique el siguiente archivo deployment.yaml en su clúster para crear una aplicación web de muestra y desplegar secretos de muestra para demostrar la autenticación mutua backend (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
    

    Este comando crea lo siguiente en el clúster:

    • Un espacio de nombres denominado test-infra
    • Un servicio llamado mtls-app en el espacio de nombres test-infra
    • Una implementación llamada mtls-app en el espacio de nombres test-infra
    • Un mapa de configuración llamado mtls-app-nginx-cm en el espacio de nombres test-infra
    • Cuatro secretos llamados backend.com, frontend.com, gateway-client-cert y ca.bundle en el espacio de nombres test-infra

Implementación de los recursos necesarios de la API de puerta de enlace

Crear una puerta de enlace

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

Nota:

Cuando el controlador de ALB cree los recursos de Puerta de enlace de aplicaciones para contenedores en ARM, usará las siguientes convenciones de nomenclatura para un recurso de frontend: fe-<8 caracteres generados aleatoriamente>

Si desea cambiar el nombre del frontend creado en Azure, considere la posibilidad de seguir la estrategia Traiga su propia implementación.

Una vez creado el recurso de puerta de enlace, asegúrese de que el estado sea válido, de que el cliente de escucha se haya programado y de que se haya asignado una dirección a la puerta de enlace.

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

Salida de ejemplo de la creación correcta de la puerta de enlace:

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

Una vez creada la pasarela, cree un recurso 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

Una vez creado el recurso HTTPRoute, asegúrese de que la ruta se haya aceptado y de que el recurso de Puerta de enlace de aplicaciones para contenedores se haya programado.

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

Compruebe que el estado del recurso Application Gateway for Containers se actualiza correctamente.

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

Creación de un 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

Una vez creado el objeto BackendTLSPolicy, compruebe su estado para asegurarse de que la política es válida:

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

Ejemplo de salida de la creación de un objeto BackendTLSPolicy válido:

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

Prueba de acceso a la aplicación

Ahora, estamos listos para enviar tráfico a nuestra aplicación de ejemplo mediante el FQDN asignado al frontend. Utilice el siguiente comando para obtener el FQDN:

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

La consulta de este FQDN debería devolver respuestas del backend tal y como está configurado en HTTPRoute.

curl --insecure https://$fqdn/

Enhorabuena, ha instalado el controlador de ALB, ha implementado una aplicación de back-end y enrutado el tráfico a la aplicación a través de la entrada en una puerta de enlace de aplicaciones para contenedores.