O blog da AWS

Como utilizar o AWS Secrets Manager para armazenar e rotacionar de forma segura suas chaves SSH

Por Maitreya Ranganat, Arquiteto de Soluções na AWS
e Assaf Namer

 

O AWS Secrets Manager oferece gerenciamento para todo o ciclo de vida de segredos dentro do seu ambiente. Neste post, Maitreya e Eu iremos mostrar como você pode utilizar o AWS Secrets Manager para arquivar, entregar e rotacionar suas chaves SSH utilizadas para comunicação entre clusters e nós computacionais. Rotacionar chaves SSH é uma boa prática de segurança, e algumas vezes requisito regulamentar. Tradicionalmente, rotacionar chaves SSH foi associada a diversos desafios. Por exemplo, sincronizar a rotação da chave entre todos os nós computacionais, habilitar log e auditoria detalhada, e gerenciar acessos de usuários para modificar segredos.

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:

Figura 1 – Arquitetura 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:

  1. 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 label AWSPENDING 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 para AWSCURRENT a nova versão do segredo e remover as chaves antigas dos nós auxiliares. Isto também definirá a staging label para AWSPREVIOUS 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.

  2. 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.
  3. 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.
  4. 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).

Select this image to open a link that starts building the CloudFormation stack

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.

  1. 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 tag WorkerServer1-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.

    Figure 2: Enter the CIDR of your machine or network

    Figura 2 – Colocar o CIDR do seu computador ou rede

    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”.

  2. 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.
  3. 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.Select this image to open a link that starts building the CloudFormation stack

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:

  1. Abra o AWS Secrets Manager console e selecione Store New Secret.
  2. Selecione Other type of secrets, então selecione a aba Plaintext.
  3. 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

  4. 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.
  5. 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.
  6. Adicione uma descrição, então selecione Next.

    Figura 4 – Adicione uma descrição

  7. 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.
  8. Selecione a lista Lambda rotation function e selecione RotateSSH. Esta é a função Lambda que foi criada através do template CloudFormation.
  9. 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.

  1. Faça login no nó principal via SSH, utilizando a chave EC2 que você especificou no template CloudFormation.
  2. 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:
            python copy_file.py ec2-user <private-ip-of-worker>

A figura 6 mostra o login no nó principal, e o comando copy_file.py para o nó auxiliar.

Figure 6: The <span style="font-family: courier">ssh</span> login to master node, and the <span style="font-family: courier">copy_file.py</span> command

Figura 6 – O login SSH no nó principal, e o comando copy_file.py

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.

    get_secret_value_response = client.get_secret_value(
    SecretId=secret_name)           

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.

    private_key_str = io.StringIO()
    # Write private key to a memory file
    private_key_str.write(private_key)
    
    # Create key object
    key = paramiko.RSAKey.from_private_key(private_key_str)
    
    # Open a channel and authenticate 
    trans = paramiko.Transport(ip, 22) 
    trans.start_client()
    trans.auth_publickey(user, key)
    del key        

Para demonstrar a rotação da chave SSH, você precisará ativar manualmente a função de rotação.

  1. Volte para o console do AWS Secrets Manager, selecione seu segredo /dev/ssh, e selecione Retrieve secret value para ver o keypair.
  2. Selecione Rotate secret Immediately. Na janela de pop-up, confirme selecionando Rotate.

    Figure 7: Set the "Secret value" and "Rotation configuration"

    Figura 7 – Obtenha o valor do segredo e rotacione o segredo

  3. Selecione Rotate novamente para completar a rotação da chave.
    Figure 8: Select "Rotate"

Figura 8 – Selecione Rotate

  • 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:
                    python copy_file.py ec2-user <private-ip-of-worker>

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:

  1. Abra o console do CloudTrail e selecione Event history.
  2. 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.
  3. 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), e RotationSucceeded, no histórico de eventos do CloudTrail. Estes logs de eventos auxiliam a auditar configurações de segredos, rotações e acessos a chave.

    Figure 9: The "Event history" window

    Figura 9 – A janela de históricos de evento do CloudTrail

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:

  1. Selecione a Stack com o nome RotateSSH a partir do console do CloudFormation.
  2. Selecione Actions, e então Delete Stack. Isto irá remover todos os recursos AWS criados por esta stack.
  3. Repita o mesmo processo descrito acima para a stack com o nome MasterWorkers.
  4. 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.

 

 

 

 

Revisores

Felipe Gonzales é Arquiteto de Soluções para Parceiros na AWS, apoiando parceiros do setor público em sua jornada para a nuvem AWS.  Com foco em segurança de perímetro e interesse em arquiteturas resilientes e IoT.

 

 

 

 

Marcelo Oliveira é Arquiteto de Soluções para Parceiros na AWS, apoiando parceiros do setor público em sua jornada para a nuvem AWS. Tem foco em projetos que envolvam arquiteturas distribuídas e escaláveis, além de grande interesse na área de infraestrutura, networking e segurança da informação.