Compartilhar via


MTLS de front-end com Gateway de Aplicativos para contêineres – API de Gateway

Esse documento ajuda a configurar um aplicativo de exemplo que usa os recursos a seguir da API de Gateway. As etapas são fornecidas para:

  • Crie um recurso Gateway com um ouvinte HTTPS.
  • Crie um recurso HTTPRoute que faça referência a um serviço de back-end.
  • Crie um recurso FrontendTLSPolicy que tenha um certificado de Autoridade de Certificação.

Segundo plano

O protocolo MTLS é um processo que depende de certificados para criptografar as comunicações e identificar os clientes para um serviço. Isso permite que o Gateway de Aplicativos para contêineres aumente ainda mais sua postura de segurança confiando apenas em conexões de dispositivos autenticados.

Confira a seguinte figura:

Um diagrama mostrando o processo de MTLS de front-end do Gateway de Aplicativos para contêineres.

O fluxo de certificado do cliente válido mostra um cliente apresentando um certificado ao front-end do Gateway de Aplicativos para contêineres. O Gateway de Aplicativos para contêineres determina que o certificado é válido e faz proxy da solicitação para o destino de back-end. Por fim, a resposta é retornada ao cliente.

O fluxo de certificado do cliente revogado mostra um cliente apresentando um certificado revogado ao front-end do Gateway de Aplicativos para contêineres. O Gateway de Aplicativos para contêineres determina que o certificado não é válido e impede que a solicitação seja solicitada ao cliente. O cliente receberá um erro HTTP 400 (solicitação inválida) e um motivo correspondente.

Pré-requisitos

  1. Se estiver seguindo a estratégia de implantação BYO, verifique se você configurou os recursos do Gateway de Aplicativos para contêineres e o Controlador ALB.

  2. Se estiver seguindo a estratégia de implantação gerenciada do ALB, verifique se você provisionou o Controlador ALB e os recursos do Gateway de Aplicativos para contêineres por meio do recurso personalizado ApplicationLoadBalancer.

  3. Implantar um aplicativo HTTP de exemplo:

    Aplique o arquivo deployment.yaml a seguir no cluster para criar um aplicativo Web de exemplo e implantar segredos de exemplo para demonstrar a mTLS (autenticação mútua de front-end).

    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
    

    Esse comando cria o seguinte no cluster:

    • Um namespace chamado test-infra
    • Um serviço chamado echo no namespace test-infra
    • Uma implantação chamada echo no namespace test-infra
    • Um segredo chamado listener-tls-secret no namespace test-infra

Gerar um ou mais certificados

Para este exemplo, criaremos um certificado raiz e emitiremos um certificado do cliente da raiz. Se você já tem um certificado raiz e um certificado do cliente, poderá ignorar essas etapas.

Gerar uma chave privada para o certificado raiz

openssl genrsa -out root.key 2048

Gerar um certificado raiz

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"

Gerar uma chave privada para o certificado do cliente

openssl genrsa -out client.key 2048

Crie uma solicitação de assinatura de certificado para o certificado do cliente

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

Gerar um certificado do cliente assinado pelo certificado raiz

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

Implantar os recursos necessários da API do Gateway

Criar um 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

Observação

Quando o Controlador ALB cria os recursos do Gateway de Aplicativo para Contêineres no Azure Resource Manager, ele usa a seguinte convenção de nomenclatura para um recurso de front-end: fe-<eight randomly generated characters>.

Se você quiser alterar o nome do recurso de front-end criado no Azure, considere seguir a estratégia de implantação traga seu próprio.

Depois que o recurso de gateway for criado, verifique se o status é válido, se o ouvinte está Programado e se um endereço foi atribuído ao gateway.

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

Exemplo de saída da criação bem-sucedida do gateway:

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

Depois que o gateway for criado, crie um recurso 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

Depois que o recurso HTTPRoute for criado, verifique se a rota é mostrada como Aceita e se o recurso do Gateway de Aplicativos para contêineres indica que foi Programado.

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

Verifique se o status do recurso do Gateway de Aplicativos para contêineres foi atualizado com êxito.

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

Crie um segredo do Kubernetes usando kubectl que contém a cadeia de certificados para o certificado do cliente.

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

Criar um 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

Depois que o objeto FrontendTLSPolicy for criado, verifique o status no objeto para ver se a política é válida:

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

Exemplo de saída da criação válida de objeto FrontendTLSPolicy:

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

Testar o acesso ao aplicativo

Agora estamos prontos para enviar algum tráfego para nosso aplicativo de exemplo, por meio do FQDN atribuído ao front-end. Use o seguinte comando para obter o FQDN:

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

Curling do FQDN do seu front-end sem o certificado do cliente.

curl --insecure https://$fqdn/

Observe que a resposta alerta que um certificado é necessário.

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

Curl o FQDN que apresenta o certificado de cliente gerado.

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

Observe que a resposta é do serviço de back-end por trás do Gateway de Aplicativos para contêineres.

Parabéns, você instalou o Controlador ALB, implantou um aplicativo de back-end, autenticou por meio do certificado do cliente e retornou tráfego do serviço de back-end por meio do Gateway de Aplicativos para contêineres.