Sdílet prostřednictvím


Front-endová služba MTLS se službou Application Gateway pro kontejnery – rozhraní API brány

Tento dokument vám pomůže nastavit ukázkovou aplikaci, která používá následující prostředky z rozhraní API brány. K dispozici jsou následující kroky:

Pozadí

Mutual Transport Layer Security (MTLS) je proces, který spoléhá na certifikáty k šifrování komunikace a identifikaci klientů do služby. Díky tomu může služba Application Gateway pro kontejnery dále zvýšit stav zabezpečení tím, že důvěřuje jenom připojení z ověřených zařízení.

Podívejte se na následující obrázek:

Diagram znázorňující front-endový proces MTLS služby Application Gateway pro kontejnery

Platný tok klientského certifikátu zobrazuje klienta, který prezentuje certifikát front-endu služby Application Gateway for Containers. Služba Application Gateway pro kontejnery určuje, že certifikát je platný a proxy server požadavek na back-endový cíl. Odpověď se nakonec vrátí klientovi.

Tok odvolaného klientského certifikátu zobrazuje klienta, který prezentuje odvolaný certifikát front-endu služby Application Gateway for Containers. Služba Application Gateway pro kontejnery určuje, že certifikát není platný, a zabraňuje tomu, aby se požadavek nepřesílal na klienta. Klient obdrží chybný požadavek HTTP 400 a odpovídající důvod.

Požadavky

  1. Pokud sledujete strategii nasazení BYO, ujistěte se, že jste nastavili prostředky služby Application Gateway pro kontejnery a řadič ALB.

  2. Pokud sledujete strategii nasazení spravovaného albem, ujistěte se, že zřídíte kontroler ALB a zřídíte prostředky Application Gateway pro kontejnery prostřednictvím vlastního prostředku ApplicationLoadBalancer.

  3. Nasazení ukázkové aplikace HTTP:

    Pomocí následujícího souboru deployment.yaml v clusteru vytvořte ukázkovou webovou aplikaci a nasaďte ukázkové tajné kódy, které demonstrují vzájemné ověřování front-endu (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
    

    Tento příkaz vytvoří v clusteru následující:

    • Obor názvů s názvem test-infra
    • Jedna služba volaná echo v test-infra oboru názvů
    • Jedno nasazení volané echo v test-infra oboru názvů
    • Jeden tajný klíč volaný listener-tls-secret v test-infra oboru názvů

Generování certifikátů

V tomto příkladu vytvoříme kořenový certifikát a vydáme klientský certifikát z kořenového adresáře. Pokud už máte kořenový certifikát a klientský certifikát, můžete tyto kroky přeskočit.

Vygenerování privátního klíče pro kořenový certifikát

openssl genrsa -out root.key 2048

Vygenerování kořenového certifikátu

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"

Vygenerování privátního klíče pro klientský certifikát

openssl genrsa -out client.key 2048

Vytvoření žádosti o podepsání certifikátu pro klientský certifikát

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

Vygenerování klientského certifikátu podepsaného kořenovým certifikátem

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

Nasazení požadovaných prostředků rozhraní API brány

Vytvoření brány

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

Poznámka:

Když kontroler ALB vytvoří prostředky Application Gateway pro kontejnery v Azure Resource Manageru, použije pro front-endový prostředek následující zásady vytváření názvů: fe-<eight randomly generated characters>

Pokud chcete změnit název front-endového prostředku vytvořeného v Azure, zvažte použití vlastní strategie nasazení.

Po vytvoření prostředku brány se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.

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

Příklad výstupu úspěšného vytvoření brány:

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

Po vytvoření brány vytvořte prostředek 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: echo
      port: 80
EOF

Po vytvoření prostředku HTTPRoute se ujistěte, že je trasa přijata a naprogramuje se prostředek Služby Application Gateway pro kontejnery.

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

Ověřte, že se úspěšně aktualizoval stav prostředku služby Application Gateway for Containers.

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

Vytvořte tajný klíč Kubernetes pomocí kubectl, který obsahuje řetěz certifikátů s klientským certifikátem.

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

Vytvoř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

Po vytvoření objektu FrontendTLSPolicy zkontrolujte stav objektu a ujistěte se, že je zásada platná:

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

Příklad výstupu platného vytvoření objektu FrontendTLSPolicy:

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

Otestování přístupu k aplikaci

Teď jsme připraveni odeslat nějaký provoz do ukázkové aplikace prostřednictvím plně kvalifikovaného názvu domény přiřazeného front-endu. K získání plně kvalifikovaného názvu domény použijte následující příkaz:

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

Zakroužkování plně kvalifikovaného názvu domény front-endu bez klientského certifikátu

curl --insecure https://$fqdn/

Všimněte si, že je vyžadován certifikát s upozorněními na odpověď.

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

Curl plně kvalifikovaný název domény prezentující vygenerovaný klientský certifikát.

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

Všimněte si, že odpověď pochází z back-endové služby za službou Application Gateway pro kontejnery.

Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci, ověřili prostřednictvím klientského certifikátu a vrátili provoz z back-endové služby prostřednictvím služby Application Gateway for Containers.