Udostępnij za pomocą


Usługa MTLS frontonu z usługą Application Gateway dla kontenerów — interfejs API bramy

Ten dokument ułatwia skonfigurowanie przykładowej aplikacji korzystającej z następujących zasobów z interfejsu API bramy. Dostępne są następujące kroki:

Tło

Mutual Transport Layer Security (MTLS) to proces oparty na certyfikatach szyfrowania komunikacji i identyfikowania klientów w usłudze. Dzięki temu usługa Application Gateway dla kontenerów może dodatkowo zwiększyć poziom zabezpieczeń, ufając tylko połączeniom z uwierzytelnionymi urządzeniami.

Zobacz następującą ilustrację:

Diagram przedstawiający proces usługi Application Gateway for Containers frontonu usługi MTLS.

Prawidłowy przepływ certyfikatu klienta przedstawia klienta, który przedstawia certyfikat frontonowi usługi Application Gateway for Containers. Usługa Application Gateway dla kontenerów określa, że certyfikat jest prawidłowy, a serwer proxy żądań do obiektu docelowego zaplecza. Odpowiedź jest ostatecznie zwracana do klienta.

Przepływ odwołanego certyfikatu klienta przedstawia klienta przedstawiającego odwołany certyfikat na fronton usługi Application Gateway for Containers. Usługa Application Gateway dla kontenerów określa, że certyfikat jest nieprawidłowy i uniemożliwia wysłanie żądania do klienta. Klient otrzyma nieprawidłowe żądanie HTTP 400 i odpowiedni powód.

Wymagania wstępne

  1. Jeśli wykonasz strategię wdrażania byo, upewnij się, że skonfigurowaliśmy usługę Application Gateway dla zasobów kontenerów i kontroler usługi ALB.

  2. Jeśli wykonasz strategię wdrażania zarządzanego przez usługę ALB, upewnij się, że aprowizujesz kontroler usługi ALB i aprowizujesz zasoby usługi Application Gateway for Containers za pośrednictwem zasobu niestandardowego ApplicationLoadBalancer.

  3. Wdróż przykładową aplikację HTTP:

    Zastosuj następujący plik deployment.yaml w klastrze, aby utworzyć przykładową aplikację internetową i wdrożyć przykładowe wpisy tajne w celu zademonstrowania wzajemnego uwierzytelniania frontonu (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
    

    To polecenie tworzy następujące polecenie w klastrze:

    • Przestrzeń nazw o nazwie test-infra
    • Jedna usługa wywoływana echotest-infra w przestrzeni nazw
    • Jedno wdrożenie o nazwie echo w test-infra przestrzeni nazw
    • Jeden wpis tajny wywoływany listener-tls-secrettest-infra w przestrzeni nazw

Generowanie certyfikatów

W tym przykładzie utworzymy certyfikat główny i wystawimy certyfikat klienta z katalogu głównego. Jeśli masz już certyfikat główny i certyfikat klienta, możesz pominąć te kroki.

Generowanie klucza prywatnego dla certyfikatu głównego

openssl genrsa -out root.key 2048

Generowanie certyfikatu głównego

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"

Generowanie klucza prywatnego dla certyfikatu klienta

openssl genrsa -out client.key 2048

Tworzenie żądania podpisania certyfikatu dla certyfikatu klienta

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

Generowanie certyfikatu klienta podpisanego przez certyfikat główny

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

Wdrażanie wymaganych zasobów interfejsu API bramy

Tworzenie bramy

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

Uwaga

Gdy kontroler usługi ALB tworzy zasoby usługi Application Gateway for Containers w usłudze Azure Resource Manager, używa następującej konwencji nazewnictwa dla zasobu frontonu: fe-<eight randomly generated characters>.

Jeśli chcesz zmienić nazwę zasobu frontonu utworzonego na platformie Azure, rozważ zastosowanie strategii wdrażania bring-your-own.

Po utworzeniu zasobu bramy upewnij się, że stan jest prawidłowy, odbiornik jest zaprogramowany, a adres jest przypisany do bramy.

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

Przykładowe dane wyjściowe pomyślnego utworzenia bramy:

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 utworzeniu bramy utwórz zasób 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 utworzeniu zasobu usługi HTTPRoute upewnij się, że trasa jest zaakceptowana , a zasób Application Gateway for Containers jest zaprogramowany.

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

Sprawdź, czy stan zasobu usługi Application Gateway for Containers został pomyślnie zaktualizowany.

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

Utwórz wpis tajny kubernetes przy użyciu narzędzia kubectl zawierającego łańcuch certyfikatów do certyfikatu klienta.

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

Tworzenie elementu 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 utworzeniu obiektu FrontendTLSPolicy sprawdź stan obiektu, aby upewnić się, że zasady są prawidłowe:

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

Przykładowe dane wyjściowe prawidłowego tworzenia obiektu FrontendTLSPolicy:

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

Testowanie dostępu do aplikacji

Teraz możemy wysłać jakiś ruch do naszej przykładowej aplikacji za pośrednictwem nazwy FQDN przypisanej do frontonu. Użyj następującego polecenia, aby uzyskać nazwę FQDN:

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

Zwijanie nazwy FQDN frontonu bez certyfikatu klienta.

curl --insecure https://$fqdn/

Zwróć uwagę, że alerty odpowiedzi są wymagane przez certyfikat.

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

Curl nazwy FQDN przedstawiającej wygenerowany certyfikat klienta.

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

Zwróć uwagę, że odpowiedź pochodzi z usługi zaplecza za usługą Application Gateway for Containers.

Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza, uwierzytelniono się za pośrednictwem certyfikatu klienta i zwrócono ruch z usługi zaplecza za pośrednictwem usługi Application Gateway for Containers.