O blog da AWS
Como utilizar o AWS Secrets Manager para armazenar e rotacionar de forma segura suas chaves SSH
Entretanto, rotacionar chaves SSH em todos os nós computacionais precisa ser feito de uma forma bem coordenada, e falhas geralmente podem resultar em riscos de disponibilidade. Além disso, chaves SSH são pontos altamente sensíveis para segurança de credenciais, o que deve ser tratado com cuidado e controlado através de controles de acesso refinados, monitoramento detalhado, auditoria e logs. Estes são precisamente os tipos de desafios que o AWS Secrets Manager pode solucionar para você.
Neste post, mostraremos como proteger, rotacionar, e usar suas chaves SSH para comunicação inter-cluster. Você irá utilizar um template do AWS CloudFormation para provisionar um cluster e configurar o AWS Secrets Manager. Então demonstraremos a você como utilizar AWS Secrets Manager para entregar suas chaves SSH para o cluster e utilizar isso para sua gestão de operações, tais como: copiar um arquivo de forma segura entre nós computacionais. Por fim, utilizaremos o AWS Secrets Manager para rotacionar as chaves SSH utilizadas pelo cluster sem ocasionar em mudanças ou indisponibilidade. Neste post, nós iremos utilizar clusters computacionais, mas você pode utilizar AWS Secrets Manager para aplicar esta solução diretamente a outros casos que utilizam chave SSH.
Visão geral da solução
O diagrama a seguir representa uma visão geral da solução:
Neste exemplo de arquitetura criado pelo CloudFormation, contém um nó principal, três nós auxiliares, AWS Secrets Manager o qual utiliza a função de rotação de chaves via AWS Lambda function e AWS Systems Manager. A configuração do cluster está fora do escopo deste post; em nosso passo a passo, nós iremos focar na arquitetura de rotação de chaves SSH.
AWS Secrets Manager utiliza staging labels para identificar diferentes versões de um segredo durante a rotação. Staging Label é um texto no formato de string. Por exemplo, por padrão, AWSCURRENT
é colocado na versão corrente do segredo, enquanto AWSPENDING
será utilizado com novas versões do segredo antes dele ser verificado e entregue aos recursos correspondentes.
De acordo com o diagrama:
- O segredo é criado no AWS Secrets Manager. O segredo contém a chave SSH que o nó principal utilizará para se conectar nos outros nós do cluster. Após a rotação da chave SSH, o AWS Secrets Manager irá executar a função Lambda (nomeada 1.a no diagrama). A função Lambda irá executar quatro passos:
- b:
createSecret
– Criar um novo par de chaves SSH e armazenar a chave privada como uma nova versão do segredo. - c:
setSecret
– Adicionar uma staging labelAWSPENDING
a nova versão do segredo criado e copia a chave publica para os nós auxiliares utilizando o AWS System Manager Run Command.
A função Lambda também irá executar dois passos não descritos no diagrama
testSecret
– Verificar que a nova chave SSH foi entregue corretamente aos recursos executando um teste de conexão SSH.finishSecret
– Definir a staging label paraAWSCURRENT
a nova versão do segredo e remover as chaves antigas dos nós auxiliares. Isto também definirá a staging label paraAWSPREVIOUS
ao segredo antigo, permitindo assim seu administrador ter acesso a “última senha conhecida” caso alguma coisa não funciona corretamente.
Uma visão geral sobre a função Lambda para rotação de chaves SSH está disponível no guia do usuário do AWS Secrets Manager. Você tem controle total da função de rotação de chaves, deste modo você pode customizar de acordo com as suas necessidades. Note que nenhuma chave é instalada no nó principal. Ao invés disto, a função irá obter a chave privada através do AWS Secrets Manager somente quando for necessário para se comunicar de forma segura com os nós auxiliares. Desta forma a chave privada não é guardada no sistema do nó principal, mas sim em memória volátil (por boa prática, a variável da chave privada é sobrescrita depois de uma conexão efetuada com sucesso e removida antes do script existir); detalhes sobre manter valores de segredo em memória volátil será tratado mais adiante neste post.
- b:
- Quando o nó principal precisa se comunicar com qualquer um dos nós auxiliares, ele utiliza o AWS SDK (Python Boto3) para ler a chave privada SSH do AWS Secrets Manager (2.a) e utiliza a chave privada para estabelecer um túnel SSH com o nó auxiliar (2.b). O nó principal é autorizado a ler a chave privada a partir do AWS Secrets Manager por que existe uma regra no AWS Identity and Access Management (IAM) com uma politica que permite ele acessar o segredo, e esta regra está configurada para o nó principal. A respetiva chave pública foi entregue a cada um dos nós auxiliares durante o processo de rotação de chave explicado no passo anterior.
- Os segredos armazenados no AWS Secrets Manager são criptografados com o AWS Key Management System (KMS), e cada versão do segredo é criptografado com uma chave única de criptografia de dados. A chave SSH no cluster será rotacionada periodicamente de acordo com o intervalo configurado, o qual você irá configurar no AWS Secrets Manager console mais adiante neste post. Cada rotação de chave repete os processos descritos nos passos 1 e 2, resultando em uma nova versão do segredo. Cada nova versão será criptografada utilizando uma nova chave de dados KMS, que fornece uma camada extra de segurança.
- O AWS Systems Manager Run Command irá utilizar o Amazon Elastic Compute Cloud (EC2) tag RotateSSHKeys com um valor True para identificar os nós auxiliares. Note que para confiar em tags como controle de segurança você precisa ter um plano de governança claro e controle sobre quais usuários possuem permissão para alterar tags e valores de tags nas suas instâncias EC2.
Custo da solução
Hoje, esta solução aplicada na região de N. Viginia custará $0.0577 por hora por quatro instâncias EC2 t2.micro e NAT Gateway que compreendem ao cluster de exemplo. AWS Secrets Manager tem um período de 30-dias para teste gratuito, após este período um segredo custara $0.40 por mês e $0.05 por 10,000 chamadas de API. Não há custos adicionais para utilização do AWS Systems Manager.
Implementando a solução
Nesta sessão, você implementará um ambiente de testes que demonstra toda a solução. Após a implementação, você irá realizar o login no nó principal e realizará uma cópia de um arquivo para os nós auxiliares de forma segura. Finalmente, você utilizará AWS Secrets Manager para rotacionar e aplicar a nova chave SSH. O template CloudFormation e o código para rotacionar o segredo estão disponíveis no repositório GitHub da AWS.
Configure o ambiente de exemplo selecionando o AWS CloudFormation “Launch Stack” abaixo; por padrão, o ambiente será criado na região us-east-1 (N. Virginia).
O template cria uma Amazon Virtual Private Cloud (VPC), uma subnet privada e uma subnet pública, instância EC2 (nó principal e cluster de simulação), e a regra IAM e suas respectivas politicas necessárias para a instância EC2.
- Selecione seu EC2 keypair SSH e coloque seu range de IP desejado para seus recursos nos parâmetros. No campo “YourIPRange”, coloque o CIDR do seu computador ou rede apenas, isso vai garantir que apenas hosts da sua rede possam acessar o nó principal. Você pode deixar os outros parâmetros como default. Este template CloudFormation cria quatro instâncias t2.micro em uma nova VPC. Uma instância receberá a tag
MasterServer
e as demais instâncias receberão a tagWorkerServer1-3
.
Nota: O keypair SSH referenciado aqui será utilizado para conectar do seu computador local ao nó principal. Este keypair é diferente do que será utilizado pelo nó principal para se conectar aos nós auxiliares.
Importante: Para simplificar, o nó principal que será criado neste passo a passo será colocado em uma subnet publica, possibilitando que ele seja acesso pela CIDR que você especificou no passo 2. Entretanto, esta não é uma pratica recomendada de segurança. Siga o guia na documentação do Amazon EC2 VPN para configurar de forma segura seu cluster em uma subnet privada seguindo o principio de “profundidade de defesa”.
- Monitore o status dos recursos. Quando o status for
CREATE_COMPLETE
, o deployment estará completo. Selecione a aba Outputs para encontrar informações sobre os recursos que foram criados, e anote o DNS público do nó principal e um IP de um dos nós auxiliares. Você vai precisar destas informações nos próximos passos deste post. - Selecione o botão “Launch Stack” para realizar o deploy do template AWS CloudFormation que criará a função Lambda utilizada pelo AWS Secrets Manager, aceite os valores padrões para os parâmetros. Este template foi desenvolvido para ser reutilizado; ele pode ser aplicado a qualquer caso de uso de rotação de chave SSH.
Após isto, crie e configure um novo segredo a partir do console do AWS Secrets Manager para armazenar o keypair SSH de comunicação do cluster.
Configurando um segredo no AWS Secrets Manager
O template do CloudFormation não fez o deploy de um segredo, siga os passos a seguir para criar um segredo a partir do console e configurar a função de rotação de chave.
Para criar um novo segredo:
- Abra o AWS Secrets Manager console e selecione Store New Secret.
- Selecione Other type of secrets, então selecione a aba Plaintext.
- Como demonstrado na figura 3, coloque {} para criar um JSON vazio sem valores e propriedades. Este valor inicializado e populado com um keypair pela função Lambda de rotação de chaves.
Figura 3 – Crie um JSON vazio sem valores e propriedades
- Mantenha a chave de criptografia padrão e selecione Next. Nós manteremos a chave de criptografia padrão para simplificar o processo neste exemplo, entretanto como uma boa prática de segurança é recomendado utilizar um chave AWS KMS que você tenha criado.
- No Passo 2: Secret Name and description, nomeie o segredo como
/dev/ssh
. O caminho do segredo pode ser utilizado na politica IAM do segredo para restringir usuários e regras para um segredo ou um conjunto de segredos. Por exemplo, a politica IAM pode incluir/dev/*
ou/prod/*
para controlar acesso aos segredos no ambiente de desenvolvimento ou produção respectivamente. - Adicione uma descrição, então selecione Next.
Figura 4 – Adicione uma descrição
- No Passo 3: Configure automatic rotation, clique no botão Automatic rotation e habilite o intervalo de rotação a sua escolha, você pode selecionar com uma expressão ou através de uma lista.
- Selecione a lista Lambda rotation function e selecione RotateSSH. Esta é a função Lambda que foi criada através do template CloudFormation.
- Selecione Next, então revise as opções que você selecionou e clique em Store. Quando a configuração do novo segredo é gravada, a função Lambda de rotação é ativada imediatamente, preenchendo o valor do segredo.
Figura 5 – Configure a rotação
Testando a solução
Com a configuração do segredo concluída e as instâncias criadas e rodando, agora você irá copiar um arquivo a partir do nó principal para um dos nós auxiliares de forma segura, utilizando a chave SSH armazenada no AWS Secrets Manager para testar a solução.
- Faça login no nó principal via SSH, utilizando a chave EC2 que você especificou no template CloudFormation.
- Uma vez conectado, copie de forma segura um arquivo do nó principal para o nó auxiliar utilizando a função SCP (secure copy protocol) utilizando o comando abaixo. Substitua <ip-privado-no-auxiliar> com o IP do nó auxiliar que você anotou no passo 3:
A figura 6 mostra o login no nó principal, e o comando copy_file.py para o nó auxiliar.
Durante a execução, o script Python utilizará a API get_secret_value do AWS Secrets Manager para obter o segredo que contém a chave privada. Ele utilizará esta chave para estabelecer uma conexão segura com os nós auxiliares, sem a necessidade de arquivar a chave privada nó principal.
Você pode revisar o arquivo copy_file.py do nó principal no GitHub. Na função get_private_key(), você pode ler o valor do segredo, o que contém a chave privada.
Na função copy_file
, um túnel SSH seguro é criado para copiar um arquivo utilizando a chave privada que está na memória, utilizando Paramiko, uma implementação do SSHv2 para Python.
Para demonstrar a rotação da chave SSH, você precisará ativar manualmente a função de rotação.
- Volte para o console do AWS Secrets Manager, selecione seu segredo
/dev/ssh
, e selecione Retrieve secret value para ver o keypair. - Selecione Rotate secret Immediately. Na janela de pop-up, confirme selecionando Rotate.
- Selecione Rotate novamente para completar a rotação da chave.
- Selecione o botão Close para atualizar a página, e então selecione Retrieve Secret Value novamente.
- Uma vez que a rotação está completa, você pode inspecionar a nova chave através do console AWS Secrets Manager. Volte ao terminal e rode o mesmo comando python para copiar um arquivo utilizando SCP. Substitua o <ip-privado-no-auxiliar> com o IP do seu nó auxiliar:
O arquivo foi transferido com sucesso utilizando um novo keypair, sem a necessidade de atualizações.
Auditoria e Monitoramento
Você pode auditar e monitorar todas as chamas de API utilizadas para criar e rotacionar suas chaves no AWS Secrets Manager através do AWS CloudTrail. Para visualizar os eventos do CloudTrail, siga os passos a seguir:
- Abra o console do CloudTrail e selecione Event history.
- A partir das opções do campo Filter, selecione Event source, coloque secret no campo de filtro, e então selecione secretsmanager.amazonaws.com a partir da lista.
- A pós a busca, você pode revisar todos os eventos do AWS Secrets Manager, tais como
GetSecretValue
,PutSecretValue
,UpdateSecretVersionStage
(método responsável pelas staging labels aplicadas a cada versão de um segredo), eRotationSucceeded
, no histórico de eventos do CloudTrail. Estes logs de eventos auxiliam a auditar configurações de segredos, rotações e acessos a chave.
Além disto, AWS Secrets Manager pode trabalhar em conjunto com o CloudWatch para disparar alertas quando uma operação específica de administrador ocorrer em uma organização (Por exemplo, notificar a você quando ocorrer uma tentativa de remoção de um segredo).
Limpeza dos seus recursos via CloudFormation
Para remover todos os recursos criados via CloudFormation:
- Selecione a Stack com o nome RotateSSH a partir do console do CloudFormation.
- Selecione Actions, e então Delete Stack. Isto irá remover todos os recursos AWS criados por esta stack.
- Repita o mesmo processo descrito acima para a stack com o nome MasterWorkers.
- A partir do console do AWS Secrets Manager, remove o segredo /dev/ssh. Leia mais sobre o processo de remoção e restauração de segredos no guia do usuário do AWS Secrets Manager
Conclusão
Neste post, nós demonstramos como você pode utilizar o AWS Secrets Manager para armazenar, rotacionar e entregar uma chave SSH para garantir a comunicação segura entre nós computacionais. As chaves são armazenadas e criptografas de forma segura no AWS Secrets Manager, o qual também fará a rotação das chaves e o deploy das chaves públicas em todos os nós auxiliares para você. Através deste método, você não precisará fazer o deploy manual das suas chaves SSH em várias instâncias EC2 ou rotacionar as chaves de forma manual. As APIs utilizadas no AWS Secrets Manager são logadas no CloudTrail para auditoria e monitoramento. Esta solução para rotacionar chaves é uma solução Serverless, não requer que você possua servidores para manter a solução e pode ser escalada rapidamente.
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre os autores
Assaf Namer
Maitreya Ranganath é Arquiteto de Soluções focado em segurança. Gosta de ajudar os clientes a resolver desafios de segurança e compliance, arquiteturas escaláveis e otimização de custos na AWS.