Implementando TLS mútuo no Amazon API Gateway
Nesse artigo passaremos pelo processo de criação de chaves, implementação e consumo de TLS Mútuo em um AWS API Gateway.
Introdução
Um fluxo de autenticação utilizando mTLS (Mutual Transport Layer Security) visa que ambas as partes de uma conexão de rede se autentiquem de forma mutua, sendo assim servidor e cliente validam os certificados um do outro.
Nesse artigo crieremos par de chaves RSA, criaremos um certificado para nossa API no AWS ACM, criaremos um dominio customizado para nossa API, enfim, tentaremos cobrir os principais pontos da implementação desse fluxo de autenticação.
Pré-requisitos
Para que possamos começar com essa implementação, é necessário:
- Possuir um conhecimento básico de AWS S3 e AWS API Gateway
- Possuir uma API exposta no AWS API Gateway.
- Possuir um dominio na internet.
Criando um par de chaves RSA
Iniciaremos criando um par de chaves RSA, primeiro criamos nossa chave privada e um arquivo .csr (Certificate Signing Request) que contem as informações que estão contidas no nosso certificado.
openssl req -newkey rsa:2048 \
-nodes -keyout cliente1.key \
-out cliente1.csr
O usamos o comando abaixo para criar um arquivo .crt, que é o certificado assinado utilizando a chave privada:
openssl x509 -signkey cliente1.key \
-in cliente1.csr -req -days 365 \
-out cliente1.crt
Depois disso podemos copiar o certificado para um novo arquivo de Truststore:
cat cliente1.crt > truststore.pem
Uma vez criado arquivo de truststore, você já podemos criar um bucket s3 e realizar o upload desse arquivo para esse bucket, como é uma tarefa trivial, vou pular esses passos nesse artigo.
Criação de certificado no AWS ACM
Para que possamos criar habilitar o uso de um dominio customizado no API Gateway, precisamos antes criar um certificado no AWS ACM (Amazon Certificate Manager).
Para isso podemos criar o certificado pelo console da AWS seguindo os seguintes passos:
-
Acessar o serviço e clicar em “Request”
-
Solicitar um certificado público
-
Informar o dominio completo que será usado no certificado
-
O certificado pode ser validado utilizando DNS ou E-mail, selecione a opção desejada. Após a requisição ele aparecerá na lista com validação pendente.
-
Após a validação o certificado será gerado
Criação de um dominio personalizado para a API
Precisamos criar um nome de dominio customizado, para isso seguimos os seguintes passos:
-
Acessar recurso “Custom Domain Names” dentro do serviço API Gateway e selecionamos a opção “Create”.
- Preenchemos o dominio que usaremos na API (o mesmo que usamos no ACM). Também habilitamos o “Mutual TLS Authentication” passando o S3 URI da truststore que criamos e enviamos ao S3.
-
Na sessão “Endpoint Configuration” selecionamos o certificado que criamos no ACM
-
Após criado o custom domain name, podemos acessar as informações que utilizaremos para a configuração do DNS na aba “Endpoint Configuration”
- Podemos vincular a API que queremos proteger na Aba “API mappings” com botão “Configure API mappings”. Na nova página podemos clicar em “Add new mapping”: Temos um aviso de que o endpoint default da API está ativo, para que a API esteja de fato protegida é necessário desabilitar esse endpoint. Essa uma tarefa relativamente simples que não será coberta nesse artigo. Podemos concluir o processo de mapeamento do dominio.
Configurando registros em DNS para acesso a API
Como possuo um registro .com.br, vou realizar o cadastro do subdominio criado no registro.br. Caso seu dominio já esteja na custódia da AWS, você pode configurar diretamente no AWS Route 53. Vamos adicionar um registro do time “CNAME” vinculando o subdominio ao “API Gateway domain name” que podemos consultar no Custom Domain Name.
No meu caso a configuração ficou:
Teste do consumo da API
Após propagado o DNS, podemos utilizar o seguinte comando para tentar consumir a API:
curl https://mtls.alanlviana.com.br/pets
Resultado: Podemos observar que o resultado do comando foi uma falha ao tentar se conectar, o que é esperado, pois não utilizamos os certificados criados para consumo da API. Tentando novamente da forma correta:
curl https://mtls.alanlviana.com.br/pets --cert cliente1.crt --key cliente1.key
Obtemos sucesso e garantimos que somente quem possuir a chave privada pode consumir a API.
Espero que venha a ser útil para quem está implantando esse fluxo!
Gostou? Tem alguma sugestão ou dúvida? Deixa ai nos comentários!
Comments