Klientdels-MTLS med Application Gateway för containrar – Gateway-API

Det här dokumentet hjälper dig att konfigurera ett exempelprogram som använder följande resurser från Gateway-API:et. Steg tillhandahålls för att:

Bakgrund

Mutual Transport Layer Security (MTLS) är en process som förlitar sig på certifikat för att kryptera kommunikation och identifiera klienter till en tjänst. Detta gör det möjligt för Application Gateway för containrar att ytterligare öka säkerhetsstatusen genom att endast lita på anslutningar från autentiserade enheter.

Se följande bild:

Ett diagram som visar Application Gateway for Containers-klientdelens MTLS-process.

Det giltiga klientcertifikatflödet visar en klient som presenterar ett certifikat på klientdelen av Application Gateway för containrar. Application Gateway för containrar fastställer att certifikatet är giltigt och skickar begäran till serverdelsmålet. Svaret returneras slutligen till klienten.

Det återkallade klientcertifikatflödet visar en klient som presenterar ett återkallat certifikat till klientdelen av Application Gateway för containrar. Application Gateway för containrar fastställer att certifikatet inte är giltigt och förhindrar att begäran skickas till klienten. Klienten får en FELAKTIG HTTP 400-begäran och motsvarande orsak.

Förutsättningar

  1. Om du följer BYO-distributionsstrategin kontrollerar du att du konfigurerar application gateway för containrar och ALB-styrenhet.

  2. Om du följer ALB-strategin för hanterad distribution ser du till att du etablerar ALB-styrenheten och etablerar Application Gateway för containrar-resurser via den anpassade resursen ApplicationLoadBalancer.

  3. Distribuera HTTP-exempelprogram:

    Använd följande deployment.yaml-fil i klustret för att skapa ett exempelwebbprogram och distribuera exempelhemligheter för att demonstrera ömsesidig klientdelsautentisering (mTLS).

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

    Det här kommandot skapar följande i klustret:

    • Ett namnområde med namnet test-infra
    • En tjänst som anropas echotest-infra i namnområdet
    • En distribution som anropas echo i test-infra namnområdet
    • En hemlighet som heter listener-tls-secret i test-infra namnområdet

Generera certifikat

I det här exemplet skapar vi ett rotcertifikat och utfärdar ett klientcertifikat från roten. Om du redan har ett rotcertifikat och ett klientcertifikat kan du hoppa över de här stegen.

Generera en privat nyckel för rotcertifikatet

openssl genrsa -out root.key 2048

Generera ett rotcertifikat

openssl req -x509 -new -nodes -key root.key -sha256 -days 1024 -out root.crt -subj "/C=US/ST=North Dakota/L=Fargo/O=Contoso/CN=contoso-root"

Generera en privat nyckel för klientcertifikatet

openssl genrsa -out client.key 2048

Skapa en begäran om certifikatsignering för klientcertifikatet

openssl req -new -key client.key -out client.csr -subj "/C=US/ST=North Dakota/L=Fargo/O=Contoso/CN=contoso-client"

Generera ett klientcertifikat signerat av rotcertifikatet

openssl x509 -req -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt -days 1024 -sha256

Distribuera de gateway-API-resurser som krävs

Skapa en gateway

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: mtls-listener
    port: 443
    protocol: HTTPS
    allowedRoutes:
      namespaces:
        from: Same
    tls:
      mode: Terminate
      certificateRefs:
      - kind : Secret
        group: ""
        name: listener-tls-secret
EOF

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i Azure Resource Manager använder den följande namngivningskonvention för en klientdelsresurs: fe-<eight randomly generated characters>.

Om du vill ändra namnet på den frontend-resurs som skapats i Azure kan du överväga att följa en egen distributionsstrategi.

När gatewayresursen har skapats kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.

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

Exempel på att gatewayen har skapats:

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

När gatewayen har skapats skapar du en HTTPRoute-resurs.

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: echo
      port: 80
EOF

När HTTPRoute-resursen har skapats kontrollerar du att vägen är Godkänd och att Application Gateway for Containers-resursen är programmerad.

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

Kontrollera att statusen för Application Gateway for Containers-resursen har uppdaterats.

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

Skapa en Kubernetes-hemlighet med kubectl som innehåller certifikatkedjan till klientcertifikatet.

kubectl create secret generic ca.bundle -n test-infra --from-file=ca.crt=root.crt

Skapa en FrontendTLSPolicy

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: FrontendTLSPolicy
metadata:
  name: mtls-policy
  namespace: test-infra
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: gateway-01
    namespace: test-infra
    sectionNames:
    - mtls-listener
  default:
    verify:
      caCertificateRef:
        name: ca.bundle
        group: ""
        kind: Secret
        namespace: test-infra
EOF

När frontendTLSPolicy-objektet har skapats kontrollerar du statusen för objektet för att säkerställa att principen är giltig:

kubectl get frontendtlspolicy mtls-policy -n test-infra -o yaml

Exempel på utdata från skapande av giltigt FrontendTLSPolicy-objekt:

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

Testa åtkomsten till programmet

Nu är vi redo att skicka trafik till vårt exempelprogram via det FQDN som tilldelats klientdelen. Använd följande kommando för att hämta FQDN:

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

Att köra en FQDN för din frontend utan klientcertifikatet.

curl --insecure https://$fqdn/

Observera att ett certifikat krävs för svarsaviseringar.

curl: (56) OpenSSL SSL_read: OpenSSL/1.1.1k: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0

Curla det FQDN som presenterar klientcertifikatet som genererats.

curl --cert client.crt --key client.key --insecure https://$fqdn/

Observera att svaret kommer från serverdelstjänsten bakom Application Gateway för containrar.

Grattis, du installerade ALB Controller, distribuerade ett serverdelsprogram, autentiserade via klientcertifikat och returnerade trafik från serverdelstjänsten via Application Gateway för containrar.