O blog da AWS

Novo: usando o Amazon EC2 Instance Connect para acesso SSH às suas instâncias do EC2

Por Chris Munns

 

Este post é uma cortesia de Saloni Sonpal – Senior Product Manager – Amazon EC2

Hoje, AWS está apresentando o Amazon EC2 Instance Connect, uma nova forma de controlar o acesso SSH em suas instância usando o AWS Identity and Access Management (IAM).

Sobre o Amazon EC2 Instance Connect

Embora as ferramentas de infraestrutura como código (IaC), como Chef e Puppet, tenham se tornado comuns no setor para configurar servidores, ocasionalmente você deve acessar suas instâncias para ajustar, consultar logs do sistema ou depurar problemas de aplicativos. A ferramenta mais comum para se conectar a servidores Linux é o Secure Shell (SSH). Foi criado em 1995 e agora é instalado por padrão em quase todas as distribuições Linux.

Ao conectar-se a hosts via SSH, os pares de chaves SSH costumam ser usados para autorizar usuários individualmente. Como resultado, as organizações precisam armazenar, compartilhar, gerenciar o acesso e manter essas chaves SSH.

Algumas organizações também mantêm bastion hosts, que ajudam a limitar o acesso à rede em hosts pelo uso de um único ponto de salto. Eles fornecem registro e impedem o acesso SSH não autorizado adicionando uma camada adicional de ofuscação de rede. No entanto, a execução de bastion hosts vem com desafios. Você mantém as chaves de usuário instaladas, manipula a rotação e garante que o bastion host esteja sempre disponível e, mais importante, protegido.

Amazon EC2 Instance Connect simplifica muitos desses problemas e fornece os seguintes benefícios para ajudar a melhorar sua postura de segurança:

  • Controle de acesso centralizado – Você obtém controle de acesso centralizado para suas instâncias do EC2 por usuário e por instância. As políticas e entidades IAM eliminam a necessidade de compartilhar e gerenciar chaves SSH.
  • Chaves de curta duração – as chaves SSH não são persistidas na instância, mas são efêmeras por natureza. Eles são acessíveis apenas por uma instância no momento em que um usuário autorizado se conecta, facilitando a concessão ou revogação do acesso em tempo real. Isso também permite que você se afaste das chaves de longa duração. Em vez disso, você gera chaves SSH únicas sempre que um usuário autorizado se conecta, eliminando a necessidade de rastrear e manter as chaves.
  • Auditabilidade – As conexões do usuário por meio do EC2 Instance Connect são registradas no AWS CloudTrail, fornecendo a visibilidade necessária para auditar facilmente as solicitações de conexão e manter a conformidade.
  • Acesso onipresente – EC2 Instance Connect funciona perfeitamente com seu cliente SSH existente. Você também pode se conectar às suas instâncias a partir de um novo cliente SSH baseado em navegador no console do EC2, fornecendo uma experiência consistente sem precisar alterar seus fluxos de trabalho ou ferramentas.

Como funciona o EC2 Instance Connect

Quando o recurso EC2 Instance Connect é ativado em uma instância, o daemon SSH (sshd) nessa instância é configurado com um script AuthorizedKeysCommand personalizado. Este script atualiza AuthorizedKeysCommand para ler as chaves públicas SSH dos metadados da instância durante o processo de autenticação SSH e conecta você à instância.

As chaves públicas SSH estão disponíveis apenas para uso único por 60 segundos nos metadados da instância. Para se conectar à instância com sucesso, você deve se conectar usando SSH dentro desta janela de tempo. Como as chaves expiram, não há necessidade de rastrear ou gerenciar essas chaves diretamente, como você fazia anteriormente.

Configurando uma instância EC2 para EC2 Instance Connect

Para começar a usar o EC2 Instance Connect, primeiro configure suas instâncias existentes. Atualmente, o EC2 Instance Connect suporta Amazon Linux 2 e Ubuntu. Instale os pacotes RPM ou Debian, respectivamente, para habilitar o recurso. As novas instâncias do Amazon Linux 2 têm o recurso EC2 Instance Connect ativado por padrão, para que você possa se conectar a essas instâncias recém-lançadas imediatamente usando SSH sem nenhuma configuração adicional.

Primeiro, configure uma instância existente. Nesse caso, configure uma instância do Amazon Linux 2 em execução em sua conta. Para conhecer as etapas do Ubuntu, consulte Configurar o EC2 Instance Connect.

  1. Conecte-se à instância usando SSH. A instância está executando uma versão relativamente recente do Amazon Linux 2:
    [ec2-user@ip-10-1-0-15 ~]$ uname -srv
    Linux 4.14.104-95.84.amzn2.x86_64 #1 SMP Fri Jun 21 12:40:53 UTC 2019
  2. Use o comando yum para instalar o pacote RPM ec2-instance-connect.
    $ sudo yum install ec2-instance-connect
    Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
    Resolving Dependencies
    --> Running transaction check
    ---> Package ec2-instance-connect.noarch 0:1.1-9.amzn2 will be installed
    --> Finished Dependency Resolution
    
    ........
    
    Installed:
      ec2-instance-connect.noarch 0:1.1-9.amzn2                                                                                                     
    
    Complete!

    Este RPM instala alguns scripts localmente e altera as configurações AuthorizedKeysCommand e AuthorizedKeysCommandUser em /etc/ssh/sshd_config. Se você estiver usando uma ferramenta de gerenciamento de configuração para gerenciar sua configuração sshd, instale o pacote e adicione as linhas conforme descrito na documentação.

Com o ec2-instance-connect instalado, você está pronto para configurar seus usuários e fazer com que eles se conectem às instâncias.

Configurar usuários do IAM

Primeiro, permita que um usuário do IAM possa enviar suas chaves SSH até o EC2 Instance Connect. Crie uma nova política do IAM para poder adicioná-la a qualquer outro usuário em sua organização.

  1. No console IAM, escolha PoliciesCreate Policy.
  2. Na página Create Policy, escolha JSON e coloque o seguinte documento JSON. Substituir $REGION e $ACCOUNTID com os seus próprios valores:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2-instance-connect:SendSSHPublicKey"
                ],
                "Resource": [
                    "arn:aws:ec2:$REGION:$ACCOUNTID:instance/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "ec2:osuser": "ec2-user"
                    }
                }
            }
        ]
    }

    Use ec2-user como o valor para ec2:osuser com Amazon Linux 2. Especifique isso para que os metadados sejam disponibilizados para o usuário SSH adequado. Para obter mais informações, consulte Ações, recursos e chaves de condição para Amazon EC2 Instance Connect Service.

  3. Escolha Review Policy.
  4. Na página Review Policy, nomeie a policy, adicione uma descrição, e escolha Create Policy.
  5. Na página Create Policy, anexe a policy criando um novo grupo (eu chamei o meu de “HostAdmins”).
  6. Na página Attach Policy, anexe a política que você acabou de criar e escolha Next Step.
  7. Escolha Create Group.
  8. Na página Groups, selecione seu grupo recém-criado e escolha Group ActionsAdd Users to Group.
  9. Selecione o usuário ou usuários para adicionar a este grupo e escolha Add Users.

Seus usuários agora podem usar o EC2 Instance Connect.

Conectando-se a uma instância usando o EC2 Instance Connect

Com sua instância configurada e os usuários definidos com a política adequada, conecte-se à sua instância com seu cliente SSH normal ou diretamente, usando o AWS Management Console.

Para oferecer uma experiência SSH perfeita, o EC2 Instance Connect agrupa essas etapas em uma ferramenta de linha de comando. Ele também oferece uma interface baseada em navegador no console, que cuida da geração e distribuição da chave SSH para você.

Para se conectar com seu cliente SSH

  1. Gere as novas chaves privada e pública mynew_key e mynew_key.pub, respectivamente:
    $ ssh-keygen -t rsa -f mynew_key 
  2. Use o seguinte comando da AWS CLI para autorizar o usuário e enviar a chave pública para a instância usando o comando send-ssh-public-key. Para oferecer suporte a isso, você precisa da versão mais recente da AWS CLI.
    $ aws ec2-instance-connect send-ssh-public-key --region us-east-1 --instance-id i-0989ec3292613a4f9 --availability-zone us-east-1f --instance-os-user ec2-user --ssh-public-key file://mynew_key.pub
    {
        "RequestId": "505f8675-710a-11e9-9263-4d440e7745c6", 
        "Success": true
    } 
  3. Após a autenticação, a chave pública é disponibilizada para a instância por meio dos metadados da instância por 60 segundos. Durante esse tempo, conecte-se à instância usando a chave privada associada:
    $ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com

Se, por algum motivo, você não se conectar nessa janela de 60 segundos, verá o seguinte erro:

$ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

Se o fizer, execute o comando send-ssh-public-key novamente para se conectar usando SSH.

Agora, conecte-se à sua instância no console.

Para se conectar a partir do console do Amazon EC2

  1. Abra o Amazon EC2 console.
  2. No painel de navegação esquerdo, escolha Instâncias e selecione a instância à qual se conectar.
  3. Escolha Connect.
  4. Na página Connect To Your Instance, Escolha EC2 Instance Connect (browser-based SSH connection), Connect.

A janela do terminal a seguir é aberta e agora você está conectado por meio de SSH à sua instância.

Auditoria com CloudTrail

Para cada tentativa de conexão, você também pode visualizar os detalhes do evento. Isso inclui o ID da instância de destino, o nome de usuário do sistema operacional e a chave pública, todos usados para fazer a conexão SSH que corresponde às chamadas de API SendSSHPublicKey no CloudTrail.

No console do CloudTrail, procure SendSSHPublicKey.

Se EC2 Instance Connect foi usado recentemente, você deve ver os registros de seus usuários chamando esta operação de API para enviar sua chave SSH para o host de destino. A visualização dos detalhes do evento mostra a instância e outras informações valiosas que você pode querer usar para auditoria.

No exemplo a seguir, veja o JSON de um evento CloudTrail que mostra o comando SendSSHPublicKey em uso:

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "User",
        "principalId": "1234567890",
        "arn": "arn:aws:iam:: 1234567890:$USER",
        "accountId": "1234567890",
        "accessKeyId": "ABCDEFGHIJK3RFIONTQQ",
        "userName": "$ACCOUNT_NAME",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "true",
                "creationDate": "2019-05-07T18:35:18Z"
            }
        }
    },
    "eventTime": "2019-06-21T13:58:32Z",
    "eventSource": "ec2-instance-connect.amazonaws.com",
    "eventName": "SendSSHPublicKey",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "34.204.194.237",
    "userAgent": "aws-cli/1.15.61 Python/2.7.16 Linux/4.14.77-70.59.amzn1.x86_64 botocore/1.10.60",
    "requestParameters": {
        "instanceId": "i-0989ec3292613a4f9",
        "osUser": "ec2-user",
        "SSHKey": {
            "publicKey": "ssh-rsa <removed>\\n"
        }
    },
    "responseElements": null,
    "requestID": "df1a5fa5-710a-11e9-9a13-cba345085725",
    "eventID": "070c0ca9-5878-4af9-8eca-6be4158359c4",
    "eventType": "AwsApiCall",
    "recipientAccountId": "1234567890"
}

Se você configurou sua conta da AWS para coletar eventos do CloudTrail em um bucket S3, pode fazer download e auditar as informações programaticamente. Para obter mais informações, consulte Obter e visualizar seus arquivos CloudTrail de log.

Conclusão

O EC2 Instance Connect oferece uma alternativa para estratégias complicadas de gerenciamento de chaves SSH e inclui os benefícios do uso de auditabilidade integrada com o CloudTrail. Ao integrar com o IAM e os metadados da instância do EC2 disponíveis em todas as instâncias do EC2, você obtém uma maneira segura de distribuir chaves de curta duração e controlar o acesso pela política do IAM.

Existem alguns recursos adicionais em andamento para o EC2 Instance Connect. No futuro, a AWS espera lançar a autorização baseada em tags, que permite usar tags de recursos na condição de uma política para controlar o acesso. A AWS também planeja habilitar o EC2 Instance Connect por padrão em distribuições populares do Linux, além do Amazon Linux 2.

EO EC2 Instance Connect já está disponível sem custo adicional no leste dos EUA (Ohio e N. Virginia), oeste dos EUA (N. Califórnia e Oregon), Ásia-Pacífico (Mumbai, Seul, Cingapura, Sydney e Tóquio), Canadá (Central ), UE (Frankfurt, Irlanda, Londres e Paris) e América do Sul (São Paulo) Regiões da AWS.

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre o autor

Chris Munns

 

 

 

 

Tradutor

Lucas Leme Lopes é Arquiteto de Infraestrutura Cloud e atua no atendimento de clientes do setor público. Trabalha com soluções de Cloud há mais de 7 anos com o propósito de ajudar clientes a resolverem demandas através de tecnologia.

 

 

 

 

Revisor

Rubens Macegossa Dias é Arquiteto de Infraestrutura Cloud na AWS e atua no time de Public Sector apoiando clientes em sua jornada para a nuvem. Possui mais de 17 anos de experiencia na área de T.I. onde atuou em multinacionais nos setores Alimentício, Industrial e de Tecnologia