Backend MTLS mit Application Gateway für Container – Gateway-API
Diese Anleitung hilft beim Einrichten einer Beispielanwendung, die die folgenden Ressourcen aus der Gateway-API verwendet. Es sind Schritte vorgesehen:
- Erstellen einer Gateway-Ressource mit einem HTTPS-Listener.
- Erstellen Sie eine HTTPRoute Ressource, die auf einen Back-End-Dienst verweist.
- Erstellen Sie eine Back-EndTLSPolicy- Ressource, die über ein Client- und Zertifizierungsstellenzertifikat für den Back-End-Dienst verfügt, auf den in der HTTPRoute verwiesen wird.
Hintergrund
Mutual Transport Layer Security (MTLS) ist ein zertifikatbasierter Prozess, um die Kommunikation zu verschlüsseln und Clients für einen Dienst zu identifizieren. Dadurch können Back-End-Workloads ihren Sicherheitsstatus weiter erhöhen, da nur Verbindungen von authentifizierten Geräten vertrauenswürdig sind.
Dies wird in der folgenden Abbildung veranschaulicht:
Voraussetzungen
Wenn Sie der BYO-Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie Ihre Ressourcen für Application Gateway für Container und den ALB-Controller eingerichtet haben.
Wenn Sie der ALB-verwalteten Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie den ALB-Controller und die Ressourcen für Application Gateway für Container über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitstellen.
Bereitstellen einer Beispiel-HTTP-Anwendung:
Wenden Sie die folgende Datei „deployment.yaml“ auf Ihrem Cluster an, um eine Beispielwebanwendung zu erstellen und Beispielschlüssel bereitzustellen, um die gegenseitige Back-End-Authentifizierung (MTLS) zu veranschaulichen.
kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/https-scenario/end-to-end-ssl-with-backend-mtls/deployment.yaml
Mit diesem Befehl wird Folgendes in Ihrem Cluster erstellt:
- Ein Namespace namens
test-infra
- Ein Dienst, der im Namespace
mtls-app
alstest-infra
bezeichnet wird - Eine Bereitstellung, die im Namespace
mtls-app
alstest-infra
bezeichnet wird - Eine Konfigurationszuordnung, die im Namespace
mtls-app-nginx-cm
alstest-infra
bezeichnet wird - Vier geheime Schlüssel mit dem Namen
backend.com
,frontend.com
,gateway-client-cert
undca.bundle
imtest-infra
-Namespace
- Ein Namespace namens
Bereitstellen der erforderlichen Gateway-API-Ressourcen
Erstellen eines Gateways
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
Hinweis
Wenn der ALB-Controller die Application Gateway für Container-Ressourcen in ARM erstellt, verwendet er die folgende Benennungskonvention für eine Frontend-Ressource: „fe-<8 zufällig generierte Zeichen>“.
Wenn Sie den Namen des in Azure erstellten Frontends ändern möchten, sollten Sie die BYO-Bereitstellungsstrategie (Bring Your Own) befolgen.
Nachdem die Gatewayressource erstellt wurde, stellen Sie sicher, dass der Status gültig ist, dass der Listener programmiert ist und dem Gateway eine Adresse zugewiesen wird.
kubectl get gateway gateway-01 -n test-infra -o yaml
Beispielausgabe einer erfolgreichen Gatewayerstellung:
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
Nachdem das Gateway erstellt wurde, erstellen Sie eine HTTPRoute-Ressource.
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
Nachdem die HTTPRoute-Ressource erstellt wurde, stellen Sie sicher, dass die Route Akzeptiert ist und die Ressource „Application Gateway für Container“ programmiert ist.
kubectl get httproute https-route -n test-infra -o yaml
Überprüfen Sie, ob der Status der Ressource „Application Gateway for Containers“ erfolgreich aktualisiert wurde.
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
Erstellen einer 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
Nachdem das BackendTLSPolicy-Objekt erstellt wurde, überprüfen Sie den Status des Objekts, um sicherzustellen, dass die Richtlinie gültig ist:
kubectl get backendtlspolicy -n test-infra mtls-app-tls-policy -o yaml
Beispielausgabe einer gültigen BackendTLSPolicy-Objekterstellung:
status:
conditions:
- lastTransitionTime: "2023-06-29T16:54:42Z"
message: Valid BackendTLSPolicy
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
Testen des Zugriffs auf die Anwendung
Jetzt können Sie über den FQDN, der dem Front-End zugewiesen ist, einigen Datenverkehr an die Beispielanwendung senden. Verwenden Sie den folgenden Befehl, um den FQDN abzurufen:
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Beim Curling dieses FQDN sollten Antworten aus dem Back-End entsprechend der konfigurierten HTTPRoute zurückgegeben werden.
curl --insecure https://$fqdn/
Herzlichen Glückwunsch, Sie haben ALB Controller installiert, eine Back-End-Anwendung bereitgestellt und den Datenverkehr über den Eingang des Anwendungsgateways für Container an die Anwendung weitergeleitet.