Acesse um bastion host usando o Session Manager e o Amazon EC2 Instance Connect - Recomendações da AWS

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

Acesse um bastion host usando o Session Manager e o Amazon EC2 Instance Connect

Criado por Piotr Chotkowski (AWS) e Witold Kowalik (AWS)

Resumo

Um bastion host, às vezes chamado de jump box, é um servidor que fornece um único ponto de acesso de uma rede externa aos recursos localizados em uma rede privada. Um servidor exposto a uma rede pública externa, como a Internet, representa um potencial risco de segurança para acesso não autorizado. É importante proteger e controlar o acesso a esses servidores.

Esse padrão descreve como você pode usar o Session Manager e o Amazon EC2 Instance Connect para se conectar com segurança a um host bastion do Amazon Elastic Compute Cloud (Amazon EC2) implantado em seu. Conta da AWS O Gerenciador de Sessões é um recurso de AWS Systems Manager. Os benefícios desse padrão incluem:

  • O bastion host implantado não tem nenhuma porta de entrada aberta exposta à Internet pública. Isso reduz a superfície de ataque potencial.

  • Você não precisa armazenar e manter chaves Secure Shell (SSH) de longo prazo no seu Conta da AWS. Em vez disso, cada usuário gera um novo par de chaves SSH sempre que se conecta ao bastion host. AWS Identity and Access Management As políticas (IAM) anexadas às AWS credenciais do usuário controlam o acesso ao bastion host.

Público-alvo

Esse padrão é destinado a leitores com experiência com conhecimento básico da Amazon EC2, Amazon Virtual Private Cloud (Amazon VPC) e Hashicorp Terraform.

Pré-requisitos e limitações

Pré-requisitos

  • Um ativo Conta da AWS

  • AWS Command Line Interface (AWS CLI) versão 2, instalada e configurada

  • Plugin do Gerenciador de Sessões para o AWS CLI, instalado

  • CLI do Terraform, instalado

  • Armazenamento para o estado do Terraform, como um bucket do Amazon Simple Storage Service (Amazon S3) e uma tabela do Amazon DynamoDB que serve como backend remoto para armazenar o estado do Terraform. Para obter mais informações sobre o uso de back-ends remotos para o estado do Terraform, consulte Amazon S3 Backends (documentação do Terraform). Para uma amostra de código que configura o gerenciamento remoto do estado com um back-end do Amazon S3, consulte remote-state-s3-back-end (Terraform Registry). Observe os seguintes requisitos:

    • O bucket do Amazon S3 e a tabela do DynamoDB devem estar no mesmo lugar. Região da AWS

    • Ao criar a tabela do DynamoDB, a chave de partição deve ser LockID (com distinção entre maiúsculas e minúsculas) e o tipo de chave de partição deve ser String. Todas as outras configurações devem estar em seus valores predefinidos. Para obter mais informações, consulte Sobre chaves primárias e Criar uma tabela na documentação do DynamoDB.

  • Um SSH cliente, instalado

Limitações

  • Esse padrão serve como uma prova de conceito (PoC) ou como base para um maior desenvolvimento. Ele não deve ser usado na sua forma atual em ambientes de produção. Antes da implantação, ajuste o código de amostra no repositório para atender aos seus requisitos e ao seu caso de uso.

  • Esse padrão pressupõe que o bastion host de destino usa o Amazon Linux 2 como seu sistema operacional. Embora seja possível usar outras Amazon Machine Images (AMIs), outros sistemas operacionais estão fora do escopo desse padrão.

    nota

    O Amazon Linux 2 está chegando ao fim do suporte. Para obter mais informações, consulte o Amazon Linux 2 FAQs.

  • Nesse padrão, o bastion host está localizado em uma sub-rede privada sem um gateway NAT e um gateway da internet. Esse design isola a EC2 instância da Amazon da Internet pública. Você pode adicionar uma configuração de rede específica que permita a comunicação com a internet. Para obter mais informações, consulte Conectar sua VPC a outras redes na documentação do Amazon VPC. Da mesma forma, seguindo o princípio do privilégio mínimo, o host bastion não tem acesso a nenhum outro recurso em seu, a Conta da AWS menos que você conceda permissões explicitamente. Para obter mais informações, consulte Políticas baseadas em recurso na documentação do IAM.

Versões do produto

  • AWS CLI versão 2

  • Terraform versão 1.3.9

Arquitetura

Pilha de tecnologias de destino

  • Uma VPC com uma única sub-rede privada.

  • Os seguintes endpoints da VPC de interface:

    • amazonaws.<region>.ssm— O endpoint do AWS Systems Manager serviço.

    • amazonaws.<region>.ec2messages: o Systems Manager usa esse endpoint para fazer chamadas do SSM Agent para o serviço do Systems Manager.

    • amazonaws.<region>.ssmmessages— O Session Manager usa esse endpoint para se conectar à sua EC2 instância Amazon por meio de um canal de dados seguro.

  • Uma EC2 instância t3.nano da Amazon executando o Amazon Linux 2

  • Perfil do IAM de perfil de instância

  • Grupos de segurança da Amazon VPC e regras de grupos de segurança para os endpoints e a instância da Amazon EC2

Arquitetura de destino

Diagrama de arquitetura do uso do Session Manager para acessar um bastion host.

O diagrama mostra o seguinte processo:

  1. O usuário assume um perfil do IAM que tem permissões para fazer o seguinte:

    • Autentique, autorize e conecte-se à instância da Amazon EC2

    • Iniciar a sessão com o Session Manager

  2. O usuário inicia uma sessão SSH por meio do Session Manager.

  3. O Session Manager autentica o usuário, verifica as permissões nas políticas do IAM associadas, verifica as configurações e envia uma mensagem ao SSM Agent para abrir uma conexão bidirecional.

  4. O usuário envia a chave pública SSH para o Bastion Host por meio de metadados da Amazon. EC2 Isso deve ser feito antes de cada conexão. A chave pública SSH permanece disponível por 60 segundos.

  5. O bastion host se comunica com os endpoints VPC da interface para Systems Manager e Amazon. EC2

  6. O usuário acessa o bastion host por meio do Session Manager usando um canal de comunicação bidirecional criptografado TLS 1.2.

Automação e escala

As opções a seguir estão disponíveis para automatizar a implantação ou escalar essa arquitetura:

  • Você pode implantar a arquitetura por meio de um pipeline de integração contínua e entrega contínua (CI/CD).

  • Você pode modificar o código para alterar o tipo de instância do bastion host.

  • Você pode modificar o código para implantar vários bastion hosts. No arquivo bastion-host/main.tf, no bloco de recursos aws_instance, adicione o meta-argumento count. Para obter mais informações, consulte a documentação do Terraform.

Ferramentas

Serviços da AWS

  • AWS Command Line Interface (AWS CLI) é uma ferramenta de código aberto que ajuda você a interagir Serviços da AWS por meio de comandos em seu shell de linha de comando.

  • O Amazon Elastic Compute Cloud (Amazon EC2) fornece capacidade de computação escalável no. Nuvem AWS Você poderá iniciar quantos servidores virtuais precisar e escalá-los na vertical rapidamente.

  • AWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.

  • O AWS Systems Manager ajuda você a gerenciar suas aplicações e infraestrutura em execução na Nuvem AWS. Ele simplifica o gerenciamento de aplicativos e recursos, reduz o tempo para detectar e resolver problemas operacionais e ajuda você a gerenciar seus AWS recursos com segurança em grande escala. Esse padrão usa o Session Manager, um atributo do Systems Manager.

  • A Amazon Virtual Private Cloud (Amazon VPC) ajuda você a lançar AWS recursos em uma rede virtual que você definiu. Essa rede virtual é semelhante a uma rede tradicional que você operaria no próprio datacenter, com os benefícios de usar a infraestrutura escalável da AWS.

Outras ferramentas

  • HashiCorp O Terraform é uma ferramenta de infraestrutura como código (IaC) que ajuda você a usar o código para provisionar e gerenciar a infraestrutura e os recursos da nuvem. Esse padrão usa o Terraform CLI.

Repositório de código

O código desse padrão está disponível no GitHub Access a bastion host usando o Session Manager e o repositório Amazon EC2 Instance Connect.

Práticas recomendadas

  • Recomendamos o uso de ferramentas automatizadas de verificação de código para melhorar a segurança e a qualidade do código. Esse padrão foi verificado usando o Checkov, uma ferramenta estática de análise de código para IaC. No mínimo, recomendamos que você execute verificações básicas de validação e formatação usando os comandos terraform validate e terraform fmt -check -recursive do Terraform.

  • É uma boa prática adicionar testes automatizados para IaC. Para obter mais informações sobre as diferentes abordagens para testar o código do Terraform, consulte Testando o HashiCorp Terraform (postagem no blog do Terraform).

  • Durante a implantação, o Terraform usa a EC2 instância substitutiva da Amazon sempre que uma nova versão do Amazon Linux 2 AMI é detectada. Isso implanta a nova versão do sistema operacional, incluindo patches e atualizações. Se a programação de implantação não for frequente, isso pode representar um risco de segurança porque a instância não tem os patches mais recentes. É importante atualizar e aplicar patches de segurança com frequência às EC2 instâncias implantadas da Amazon. Para obter mais informações, consulte Gerenciamento de atualizações na Amazon EC2.

  • Como esse padrão é uma prova de conceito, ele usa políticas AWS gerenciadas, comoAmazonSSMManagedInstanceCore. AWS as políticas gerenciadas abrangem casos de uso comuns, mas não concedem permissões de privilégios mínimos. Conforme necessário para seu caso de uso, recomendamos que você crie políticas personalizadas que concedam permissões de privilégio mínimo para os recursos implantados nessa arquitetura. Para obter mais informações, consulte Comece a usar políticas AWS gerenciadas e adote as permissões de privilégios mínimos.

  • Use uma senha para proteger o acesso às chaves SSH e armazenar as chaves em um local seguro.

  • Configure o registro em log e o monitoramento do bastion host. O registro em log e o monitoramento são partes importantes da manutenção de sistemas, tanto do ponto de vista operacional quanto de segurança. Há várias maneiras de monitorar conexões e atividades em seu bastion host. Para obter mais informações, consulte os tópicos a seguir na documentação do Systems Manager.

Épicos

TarefaDescriçãoHabilidades necessárias

Clone o repositório de códigos.

  1. Em uma interface da linha de comando, altere seu diretório de trabalho para o local em que você deseja armazenar os arquivos de amostra.

  2. Insira o comando da a seguir.

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps engenheiro, Desenvolvedor

Iniciar o diretório de trabalho do Terraform.

Essa etapa é necessária somente para a primeira implantação. Se você estiver reimplantando o padrão, pule para a próxima etapa.

No diretório raiz do repositório clonado, insira o seguinte comando, onde:

  • $S3_STATE_BUCKETé o nome do bucket Amazon S3 que contém o estado do Terraform

  • $PATH_TO_STATE_FILE é a chave para o arquivo de estado do Terraform, como infra/bastion-host/tetfstate

  • $AWS_REGIONé a região em que o bucket do Amazon S3 é implantado

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
nota

Como alternativa, você pode abrir o arquivo config.tf e, na terraform seção, fornecer manualmente esses valores.

DevOps engenheiro, desenvolvedor, Terraform

Implantar os recursos

  1. No diretório raiz do repositório clonado, insira o seguinte comando:

    terraform apply -var-file="dev.tfvars"
  2. Revise a lista de todas as alterações que serão aplicadas à sua Conta da AWS e confirme a implantação.

  3. Espere até que todos os recursos sejam implantados.

DevOps engenheiro, desenvolvedor, Terraform
TarefaDescriçãoHabilidades necessárias

Configure a conexão do SSH.

Atualize o arquivo de configuração do SSH para permitir conexões do SSH através do Session Manager. Para obter instruções, consulte Permitir conexões do SSH para o Session Manager. Isso permite que usuários autorizados insiram um comando proxy que inicia uma sessão do Session Manager e transfere todos os dados por meio de uma conexão bidirecional.

DevOps engenheiro

Gerar as chaves SSH.

Insira o seguinte comando para gerar um par de chaves SSH privadas e públicas locais. Use esse par de chaves para se conectar ao bastion host.

ssh-keygen -t rsa -f my_key
DevOps engenheiro, Desenvolvedor
TarefaDescriçãoHabilidades necessárias

Obtenha o ID da instância.

  1. Para se conectar ao host bastion implantado, você precisa do ID da instância da Amazon EC2 . Faça um dos seguintes procedimentos para localizar o ID:

    • Abra o EC2 console da Amazon. No painel de navegação, escolha Instâncias. Localize a instância do bastion host.

    • No AWS CLI, insira o seguinte comando.

      aws ec2 describe-instances

      Para filtrar os resultados, digite o comando a seguir, onde $BASTION_HOST_TAG é a tag que você atribuiu ao bastion host. O valor padrão desta etiqueta é sandbox-dev-bastion-host.

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. Copie o ID da EC2 instância da Amazon. Você usará esse ID posteriormente.

AWS geral

Enviar a chave pública SSH.

nota

Nesta seção, você carrega a chave pública para os metadados da instância do bastion host. Depois que a chave for carregada, você terá 60 segundos para iniciar uma conexão com o bastion host. Após 60 segundos, a chave pública é removida. Para obter mais informações, consulte a seção Solução de problemas desse padrão. Conclua as próximas etapas rapidamente para evitar que a chave seja removida antes de se conectar ao bastion host.

  1. Envie a chave SSH para o Bastion Host usando o Amazon Instance EC2 Connect. Digite o comando a seguir, em que:

    • $INSTANCE_IDé o ID da EC2 instância da Amazon

    • $PUBLIC_KEY_FILE é o caminho para seu arquivo de chave pública, como my_key.pub

      Importante

      Certifique-se de usar a chave pública e não a chave privada.

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. Espere até receber uma mensagem indicando que a chave foi carregada com sucesso. Avance para a próxima etapa imediatamente.

AWS geral

Conecte-se ao bastion host.

  1. Insira o comando a seguir para se conectar ao bastion host por meio do Session Manager, onde:

    • $PRIVATE_KEY_FILE é o caminho para sua chave privada, como my_key

    • $INSTANCE_IDé o ID da EC2 instância da Amazon

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. Confirme a conexão inserindo yes. Isso abre uma conexão SSH usando o Session Manager.

nota

Existem outras opções para abrir uma conexão SSH com o host bastion. Para obter mais informações, consulte Abordagens alternativas para estabelecer uma conexão SSH com o bastion host na seção Informações adicionais desse padrão.

AWS geral
TarefaDescriçãoHabilidades necessárias

Remova os recursos implantados.

  1. Para remover todos os recursos implantados, execute o comando a seguir a partir do diretório raiz do repositório clonado.

    terraform destroy -var-file="dev.tfvars"
  2. Confirme a remoção dos recursos.

DevOps engenheiro, desenvolvedor, Terraform

Solução de problemas

ProblemaSolução

erro TargetNotConnected ao tentar se conectar ao bastion host

  1. Reinicie o bastion host de acordo com as instruções em Reinicie sua instância na documentação da Amazon. EC2

  2. Depois que a instância for reinicializada com sucesso, reenvie a chave pública para o bastion host e tente a conexão novamente.

erro Permission denied ao tentar se conectar ao bastion host

Depois que a chave for carregada aos bastion host, você terá 60 segundos para iniciar a conexão. Depois de 60 segundos, a chave é removida automaticamente e você não pode usá-la para se conectar à instância. Se isso ocorrer, você poderá repetir a etapa para reenviar a chave para a instância.

Recursos relacionados

AWS documentação

Outros recursos

Mais informações

Abordagens alternativas para estabelecer uma conexão SSH com o bastion host

Encaminhamento de portas

Você pode usar a opção -D 8888 para abrir uma conexão SSH com encaminhamento dinâmico de portas. Para obter mais informações, consulte as instruções em explainshell.com. Veja a seguir um exemplo de um comando para abrir uma conexão SSH usando o encaminhamento de porta.

ssh -i $PRIVATE_KEY_FILE -D 8888 ec2-user@$INSTANCE_ID

Esse tipo de conexão abre um proxy SOCKS que pode encaminhar o tráfego do seu navegador local por meio do bastion host. Se você estiver usando Linux ou macOS, insira man ssh para ver todas as opções. Isso exibe o manual de referência do SSH.

Usando o script fornecido

Em vez de executar manualmente as etapas descritas em Conecte-se ao bastion host usando o Session Manager na seção Épicos, você pode usar o script connect.sh incluído no repositório de código. Esse script gera o par de chaves SSH, envia a chave pública para a EC2 instância da Amazon e inicia uma conexão com o host bastion. Ao executar o script, você passa a tag e o nome da chave como argumentos. Veja a seguir um exemplo do comando para executar o script.

./connect.sh sandbox-dev-bastion-host my_key