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 :
Prérequis
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.
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.
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 nomstest-infra
- Un déploiement appelé
mtls-app
dans l’espace de nomstest-infra
- Un ConfigMap appelé
mtls-app-nginx-cm
dans l’espace de nomstest-infra
- Quatre secrets appelés
backend.com
,frontend.com
,gateway-client-cert
etca.bundle
dans l’espace de nomstest-infra
- Un espace de noms nommé
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.