As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Autenticação simplificada de aplicações com TLS mútua no Amazon ECS usando o Application Load Balancer
Olawale Olaleye e Shamanth Devagari, Amazon Web Services
Resumo
Este padrão ajuda você a simplificar a autenticação das suas aplicações e aliviar as atividades de segurança com TLS mútua no Amazon Elastic Container Service (Amazon ECS) usando o Application Load Balancer (ALB). Com o ALB, você pode autenticar certificados de cliente X.509 do. Autoridade de Certificação Privada da AWS Essa combinação poderosa ajuda a obter uma comunicação segura entre seus serviços, reduzindo a necessidade de mecanismos complexos de autenticação em suas aplicações. Além disso, o padrão usa o Amazon Elastic Container Registry (Amazon ECR) para armazenar imagens de contêiner.
O exemplo deste padrão usa imagens do Docker de uma galeria pública para criar inicialmente as workloads de amostra. Posteriormente, novas imagens do Docker são criadas para serem armazenadas no Amazon ECR. Para a fonte, considere um sistema baseado em Git GitHub, como, ou Bitbucket GitLab, ou use o Amazon Simple Storage Service Amazon S3 (Amazon S3). Para criar as imagens do Docker, considere usar AWS CodeBuild para as imagens subsequentes.
Pré-requisitos e limitações
Pré-requisitos
Um ativo Conta da AWS com acesso para implantar AWS CloudFormation pilhas. Verifique se você tem permissões de usuário ou função AWS Identity and Access Management (IAM) para implantar CloudFormation.
AWS Command Line Interface (AWS CLI) instalado. Configure suas AWS credenciais em sua máquina local ou em seu ambiente usando AWS CLI ou definindo as variáveis de ambiente no
~/.aws/credentialsarquivo.OpenSSL instalado
. Docker instalado
. Familiaridade com o Serviços da AWS descrito em Ferramentas.
Conhecimento em Docker e NGINX.
Limitações
A TLS mútua para o Application Load Balancer é compatível somente com certificados de cliente X.509v3. Não há suporte para certificados de cliente X.509v1.
O CloudFormation modelo fornecido no repositório de código desse padrão não inclui o provisionamento de um CodeBuild projeto como parte da pilha.
Alguns Serviços da AWS não estão disponíveis em todos Regiões da AWS. Para conferir a disponibilidade de uma região, consulte AWS Services by Region
. Para endpoints específicos, consulte Service endpoints and quotas e clique no link correspondente ao serviço desejado.
Versões do produto
Docker, versão 27.3.1 ou versões posteriores
AWS CLI versão 2.14.5 ou posterior
Arquitetura
O diagrama a seguir mostra os componentes da arquitetura desse padrão.

O diagrama mostra o seguinte fluxo de trabalho:
Crie um repositório Git e confirme o código da aplicação nele.
Crie uma autoridade de certificação (CA) privada em CA Privada da AWS.
Crie um CodeBuild projeto. O CodeBuildproject é acionado por alterações de confirmação e cria a imagem do Docker e publica a imagem criada no Amazon ECR.
Copie a cadeia de certificados e o corpo do certificado da CA e faça o upload do pacote de certificados no Amazon S3.
Crie um armazenamento confiável com o pacote da CA que você enviou para o Amazon S3. Associe o armazenamento confiável aos receptor da TLS mútua no Application Load Balancer (ALB).
Use a CA privada para emitir certificados de cliente para as workloads do contêiner. Crie também um certificado TLS privado usando o. CA Privada da AWS
Importe o certificado TLS privado para AWS Certificate Manager (ACM) e use-o com o ALB.
A workload do contêiner em
ServiceTwousa o certificado de cliente emitido para autenticar com o ALB ao se comunicar com a workload do contêiner emServiceOne.A workload do contêiner em
ServiceOneusa o certificado de cliente emitido para autenticar com o ALB ao se comunicar com a workload do contêiner emServiceTwo.
Automação e escala
Esse padrão pode ser totalmente automatizado usando CloudFormation AWS Cloud Development Kit (AWS CDK) , ou operações de API de um SDK para provisionar os AWS recursos.
Você pode usar AWS CodePipeline para implementar um pipeline de integração contínua e implantação contínua (CI/CD) usando CodeBuild para automatizar o processo de criação de imagens de contêineres e implantar novas versões nos serviços de cluster do Amazon ECS.
Ferramentas
Serviços da AWS
AWS Certificate Manager (ACM) ajuda você a criar, armazenar e renovar certificados e chaves SSL/TLS X.509 públicos e privados que protegem seus AWS sites e aplicativos.
AWS CloudFormationajuda você a configurar AWS recursos, provisioná-los de forma rápida e consistente e gerenciá-los durante todo o ciclo de vida em Contas da AWS e. Regiões da AWS
O AWS CodeBuild é um serviço de compilação totalmente gerenciado que permite compilar o código-fonte, realizar testes de unidade e produzir artefatos preparados para a implantação.
O Amazon Elastic Container Registry (Amazon ECR) é um serviço gerenciado de registro de imagens de contêineres seguro, escalável e confiável.
O Amazon Elastic Container Service (Amazon ECS) é um serviço de gerenciamento de contêineres altamente escalável e rápido para execução, interrupção e gerenciamento de contêineres em um cluster. Você pode executar suas tarefas e serviços em uma infraestrutura sem servidor gerenciada pela. AWS Fargate Como alternativa, para ter mais controle sobre sua infraestrutura, você pode executar suas tarefas e serviços em um cluster de instâncias do Amazon Elastic Compute Cloud (Amazon EC2) que você gerencia.
Com o Amazon ECS Exec, você pode interagir diretamente com contêineres sem precisar interagir primeiro com o sistema operacional do contêiner do host, abrir portas de entrada ou gerenciar chaves SSH. Você pode usar o ECS Exec para executar comandos ou obter um shell para um contêiner em execução em uma EC2 instância da Amazon ou em. AWS Fargate
O Elastic Load Balancing (ELB) distribui o tráfego de entrada de aplicativos ou de rede em vários destinos. Por exemplo, você pode distribuir o tráfego entre EC2 instâncias, contêineres e endereços IP da Amazon em uma ou mais zonas de disponibilidade. O ELB monitora a integridade dos destinos registrados e roteia o tráfego apenas para os destinos íntegros. O ELB escala seu balanceador de carga conforme o tráfego de entrada muda com o tempo. Ele pode ser dimensionado automaticamente para a maioria das workloads.
AWS Fargateajuda você a executar contêineres sem precisar gerenciar servidores ou EC2 instâncias da Amazon. O Fargate é compatível com o Amazon ECS e com o Amazon Elastic Kubernetes Service (Amazon EKS). Você pode executar suas tarefas e serviços do Amazon ECS com o tipo de inicialização do Fargate ou com um provedor de capacidade do Fargate. Para isso, empacote sua aplicação em contêineres, especifique os requisitos de CPU e de memória, defina as políticas do IAM e de rede e inicie a aplicação. Cada tarefa do Fargate tem seu próprio limite de isolamento e não compartilha o kernel subjacente, os recursos de CPU, os recursos de memória nem a interface de rede elástica com outra tarefa.
Autoridade de Certificação Privada da AWSpermite a criação de hierarquias de autoridade de certificação (CA) privada, incluindo raiz e subordinada CAs, sem os custos de investimento e manutenção da operação de uma CA local.
Outras ferramentas
O Docker
é um conjunto de produtos de plataforma como serviço (PaaS) que usam a virtualização no nível do sistema operacional para fornecer software em contêineres. GitHub
, GitLab , e o Bitbucket são alguns dos sistemas de controle de código-fonte baseados em Git comumente usados para acompanhar as alterações no código-fonte. O NGINX Open Source
é um balanceador de carga, cache de conteúdo e servidor web de código aberto. Este padrão o usa como um servidor web. O OpenSSL
é uma biblioteca de código aberto que fornece serviços usados pelas implementações do OpenSSL de TLS e CMS.
Repositório de código
O código desse padrão está disponível no repositório GitHub MTLS-with-Application-Load-Balancer-in-Amazon-ECS
Práticas recomendadas
Use o Amazon ECS Exec para executar comandos ou obter um shell para um contêiner em execução no Fargate. Também é possível usar o ECS Exec para ajudar a coletar informações de diagnóstico para depuração.
Use grupos de segurança e listas de controle de acesso à rede (ACLs) para controlar o tráfego de entrada e saída entre os serviços. As tarefas do Fargate recebem um endereço IP da sub-rede configurada em sua nuvem privada virtual (VPC).
Épicos
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Faça o download do código-fonte. | Para baixar o código-fonte desse padrão, bifurque ou clone o repositório GitHub MTLS-with-Application-Load-Balancer-in-Amazon-ECS | DevOps engenheiro |
Crie um repositório Git. | Para criar um repositório Git para conter o Dockerfile e os arquivos
| DevOps engenheiro |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Crie uma CA privada em CA Privada da AWS. | Para criar uma autoridade de certificação (CA) privada, execute os comandos a seguir no seu terminal. Substitua os valores no exemplo por seus próprios valores.
Para obter mais detalhes, consulte Criar uma CA privada CA Privada da AWS na AWS documentação. | DevOps engenheiro, AWS DevOps |
Crie e instale seu certificado CA privado. | Para criar e instalar um certificado para sua CA raiz privada, execute os comandos os seguintes no seu terminal:
| AWS DevOps, DevOps engenheiro |
Solicite um certificado gerenciado. | Para solicitar um certificado privado AWS Certificate Manager para uso com seu ALB privado, use o seguinte comando:
| DevOps engenheiro, AWS DevOps |
Use a CA privada para emitir um certificado de cliente. |
Esse comando retorna a CSR e a chave privada dos dois serviços.
Para obter mais informações, consulte Emitir certificados de entidades finais privadas na AWS documentação. | DevOps engenheiro, AWS DevOps |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Provisão Serviços da AWS com o CloudFormation modelo. | Para provisionar a nuvem privada virtual (VPC), o cluster Amazon ECS, os serviços do Amazon ECS, o Application Load Balancer e o Amazon Elastic Container Registry (Amazon ECR), use o modelo. CloudFormation | DevOps engenheiro |
Obtenha as variáveis. | Verifique se você tem um cluster do Amazon ECS com dois serviços em execução. Para recuperar os detalhes do recurso e armazená-los como variáveis, use os seguintes comandos:
| DevOps engenheiro |
Crie um CodeBuild projeto. | Para usar um CodeBuild projeto para criar as imagens do Docker para seus serviços do Amazon ECS, faça o seguinte:
Para obter mais detalhes, consulte Criar um projeto de compilação AWS CodeBuild na AWS documentação. | AWS DevOps, DevOps engenheiro |
Crie as imagens do Docker. | Você pode usar CodeBuild para realizar o processo de criação da imagem. CodeBuild precisa de permissões para interagir com o Amazon ECR e trabalhar com o Amazon S3. Como parte do processo, a imagem do Docker é criada e enviada para o registro do Amazon ECR. Para obter detalhes sobre o modelo e o código, consulte Informações adicionais. (Opcional) Para criar as imagens localmente para fins de teste, use o seguinte comando:
| DevOps engenheiro |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Faça o upload do certificado CA para o Amazon S3. | Para fazer o upload do certificado CA para o bucket do Amazon S3, use o seguinte exemplo de comando:
| AWS DevOps, DevOps engenheiro |
Crie o armazenamento confiável. | Para criar o armazenamento confiável, use o seguinte exemplo de comando:
| AWS DevOps, DevOps engenheiro |
Faça o upload dos certificados de cliente. | Para fazer upload dos certificados de cliente ao Amazon S3 para imagens do Docker, use o seguinte exemplo de comando:
| AWS DevOps, DevOps engenheiro |
Modifique o receptor. | Para habilitar a TLS mútua no ALB, modifique os receptores HTTPS usando os seguintes comandos:
Para obter mais informações, consulte Como configurar o TLS mútuo em um Application Load Balancer na documentação. AWS | AWS DevOps, DevOps engenheiro |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Atualize a definição de tarefa do Amazon ECS. | Para atualizar a definição da tarefa do Amazon ECS, modifique o parâmetro Para obter os valores dos respectivos serviços, atualize as definições de tarefas com o novo Uri de imagens do Docker que você criou nas etapas anteriores:
Para obter mais informações, consulte Atualização de uma definição de tarefa do Amazon ECS usando o console na AWS documentação. | AWS DevOps, DevOps engenheiro |
Atualize o serviço do Amazon ECS. | Atualize o serviço com a definição de tarefa mais recente. Essa definição de tarefa é o esquema para as imagens do Docker criadas recentemente e contém o certificado de cliente necessário para a autenticação de TLS mútua. Para atualizar o serviço, use o seguinte procedimento:
Repita as etapas para o outro serviço. | Administrador da AWS, AWS DevOps, DevOps engenheiro |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Copie o URL do aplicativo. | Use o console do Amazon ECS para visualizar a tarefa. Quando o status da tarefa for atualizado para Em execução, selecione a tarefa. Na seção Tarefa, copie o ID da tarefa. | Administrador da AWS, AWS DevOps |
Testar seu aplicativo | Para testar sua aplicação, use o ECS Exec para acessar as tarefas.
| Administrador da AWS, AWS DevOps |
Recursos relacionados
Documentação do Amazon ECS
Outros AWS recursos
Mais informações
Edição do Dockerfile
O código a seguir mostra os comandos que você edita no Dockerfile do serviço 1:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 1: Ok" > /usr/share/nginx/html/index.html ADD client_cert1.cert client_private-key1.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
O código a seguir mostra os comandos que você edita no Dockerfile do serviço 2:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 2: Ok" > /usr/share/nginx/html/index.html ADD client_cert2.cert client_private-key2.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
Se você estiver criando as imagens do Docker com CodeBuild, o buildspec arquivo usa o número da CodeBuild compilação para identificar de forma exclusiva as versões da imagem como um valor de tag. Você pode alterar o arquivo buildspec para atender às suas necessidades, conforme mostrado no seguinte código buildspec personalizado:
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: # change the S3 path depending on the service - aws s3 cp s3://$YOUR_S3_BUCKET_NAME/serviceone/ $CodeBuild_SRC_DIR/ --recursive - echo Build started on `date` - echo Building the Docker image... - docker build -t $ECR_REPOSITORY_URI:latest . - docker tag $ECR_REPOSITORY_URI:latest $ECR_REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $ECR_REPOSITORY_URI:latest - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... # for ECS deployment reference - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: - imagedefinitions.json