Adicionar par de chaves à instância existente do EC2

240

Recebi acesso do AWS Console a uma conta com duas instâncias em execução que não consigo desligar (em produção). No entanto, gostaria de obter acesso SSH a essas instâncias, é possível criar um novo par de chaves e aplicá-lo às instâncias para que eu possa fazer o SSH? A obtenção do arquivo pem existente para o par de chaves em que as instâncias foram criadas atualmente não é uma opção.

Se isso não for possível, existe alguma outra maneira de entrar nas instâncias?

Chris Wagner
fonte
Você já tentou a solução aqui: stackoverflow.com/questions/1454629/… ? ssh-adddeve fazer o que você precisa.
Marc Bollinger
É bom aprender o recurso ssh-add, mas isso não ajuda, porque esse usuário realmente criou a instância usando o par de chaves que ele criou. As instâncias às quais me refiro foram criadas com outro par de chaves às quais não tenho acesso.
Chris Wagner
1
Talvez seja melhor você fazer esta pergunta em serverfault.com
Claude Vedovini
4
Você não pode aplicar um par de chaves a uma instância em execução.
Rodney Quillo

Respostas:

172

Você não pode aplicar um par de chaves a uma instância em execução. Você só pode usar o novo par de chaves para iniciar uma nova instância.

Para recuperação, se for uma AMI de inicialização do EBS, você pode interrompê-lo e fazer uma captura instantânea do volume. Crie um novo volume com base nele. E use-o novamente para iniciar a instância antiga, criar uma nova imagem ou recuperar dados.

Embora os dados no armazenamento efêmero sejam perdidos.


Devido à popularidade desta pergunta e resposta, eu queria capturar as informações no link que Rodney postou em seu comentário.

Crédito para Eric Hammond por esta informação .

Corrigindo arquivos no volume EBS raiz de uma instância do EC2

Você pode examinar e editar arquivos no volume raiz do EBS em uma instância do EC2, mesmo se estiver em uma situação desastrosa como:

  • Você perdeu sua chave ssh ou esqueceu sua senha
  • Você cometeu um erro ao editar o arquivo / etc / sudoers e não pode mais obter acesso root com o sudo para corrigi-lo
  • Sua instância de longa execução está travada por algum motivo, não pode ser contatada e falha ao inicializar corretamente
  • Você precisa recuperar arquivos da instância, mas não pode acessá-la

Em um computador físico à sua mesa, você pode simplesmente inicializar o sistema com um CD ou pendrive, montar o disco rígido, fazer o check-out e corrigir os arquivos e, em seguida, reiniciar o computador para voltar aos negócios.

Uma instância remota do EC2, no entanto, parece distante e inacessível quando você está em uma dessas situações. Felizmente, a AWS nos fornece o poder e a flexibilidade para recuperar um sistema como esse, desde que executemos instâncias de inicialização do EBS e não armazenemos a instância.

A abordagem no EC2 é um pouco semelhante à solução física, mas vamos mover e montar o “disco rígido” defeituoso (volume EBS raiz) em uma instância diferente, corrigi-lo e movê-lo de volta.

Em algumas situações, pode ser mais fácil simplesmente iniciar uma nova instância do EC2 e jogar fora a ruim, mas se você realmente deseja corrigir seus arquivos, aqui está a abordagem que funcionou para muitos:

Configuração

Identifique a instância original (A) e o volume que contém o volume EBS raiz quebrado com os arquivos que você deseja exibir e editar.

instance_a=i-XXXXXXXX

volume=$(ec2-describe-instances $instance_a |
  egrep '^BLOCKDEVICE./dev/sda1' | cut -f3)

Identifique a segunda instância do EC2 (B) que você usará para corrigir os arquivos no volume EBS original. Esta instância deve estar em execução na mesma zona de disponibilidade da instância A para que possa ter o volume EBS anexado a ela. Se você ainda não possui uma instância em execução, inicie uma temporária.

instance_b=i-YYYYYYYY

Interrompa a instância quebrada A (aguardando a parada completa), desanexe o volume EBS raiz da instância (aguardando a desanexação) e, em seguida, conecte o volume à instância B em um dispositivo não utilizado.

ec2-stop-instances $instance_a
ec2-detach-volume $volume
ec2-attach-volume --instance $instance_b --device /dev/sdj $volume

ssh na instância B e monte o volume para que você possa acessar seu sistema de arquivos.

ssh ...instance b...

sudo mkdir -p 000 /vol-a
sudo mount /dev/sdj /vol-a

Consertá-lo

Nesse ponto, todo o seu sistema de arquivos raiz da instância A está disponível para visualização e edição em / vol-a na instância B. Por exemplo, você pode:

  • Coloque as chaves ssh corretas em /vol-a/home/ubuntu/.ssh/authorized_keys
  • Edite e corrija / vol-a / etc / sudoers
  • Procure mensagens de erro em / vol-a / var / log / syslog
  • Copie arquivos importantes de / vol-a /…

Nota: Os uids nas duas instâncias podem não ser idênticos; portanto, tenha cuidado se estiver criando, editando ou copiando arquivos que pertencem a usuários não raiz. Por exemplo, seu usuário mysql na instância A pode ter o mesmo UID que o usuário postfix na instância B, o que pode causar problemas se você exibir arquivos com um nome e depois mover o volume de volta para A.

Embrulhar

Depois de terminar e ficar satisfeito com os arquivos em / vol-a, desmonte o sistema de arquivos (ainda na instância-B):

sudo umount /vol-a
sudo rmdir /vol-a

Agora, de volta ao seu sistema com ec2-api-tools, continue movendo o volume EBS de volta para o seu país na instância original A e inicie a instância novamente:

ec2-detach-volume $volume
ec2-attach-volume --instance $instance_a --device /dev/sda1 $volume
ec2-start-instances $instance_a

Felizmente, você resolveu o problema, a instância A aparece perfeitamente e você pode realizar o que originalmente se propôs a fazer. Caso contrário, talvez seja necessário continuar repetindo essas etapas até que funcione.

Nota: Se você tiver um endereço IP Elastic atribuído à instância A quando o interrompeu, precisará reassociá-lo depois de iniciá-lo novamente.

Lembrar! Se sua instância B foi temporariamente iniciada apenas para esse processo, não se esqueça de encerrá-la agora.

Rodney Quillo
fonte
você pode nos dizer um guia passo a passo para isso (ou apontar para ele). No meu caso, eu tenho uma instância em execução e preciso fazer login a partir de um local remoto, onde não tenho a chave privada.
Jus12
87

Embora você não possa adicionar um par de chaves diretamente a uma instância do EC2 em execução, você pode criar um usuário linux e criar um novo par de chaves para ele, e usá-lo como faria com o par de chaves do usuário original.

No seu caso, você pode solicitar ao proprietário da instância (quem a criou) que faça o seguinte. Portanto, o proprietário da instância não precisa compartilhar suas próprias chaves com você, mas você ainda poderá fazer o ssh nessas instâncias. Essas etapas foram originalmente publicadas por Utkarsh Sengar (também conhecido como @zengr ) em http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/ . Fiz apenas algumas pequenas alterações.

  1. Etapa 1: faça o login por usuário "ubuntu" padrão :

    $ ssh -i my_orig_key.pem [email protected]
    
  2. Etapa 2: crie um novo usuário, chamaremos nosso novo usuário de "john" :

    [ubuntu@ip-11-111-111-111 ~]$ sudo adduser john
    

    Defina a senha para "john":

    [ubuntu@ip-11-111-111-111 ~]$ sudo su -
    [root@ip-11-111-111-111 ubuntu]# passwd john
    

    Adicione "john" à lista de sudoer por:

    [root@ip-11-111-111-111 ubuntu]# visudo
    

    .. e adicione o seguinte ao final do arquivo:

    john   ALL = (ALL)    ALL
    

    Tudo bem! Nós criamos nosso novo usuário, agora você precisa gerar o arquivo de chave que será necessário para efetuar login, como temos my_orin_key.pem na Etapa 1.

    Agora, saia e volte ao ubuntu, fora da raiz.

    [root@ip-11-111-111-111 ubuntu]# exit
    [ubuntu@ip-11-111-111-111 ~]$
    
  3. Etapa 3: criando as chaves públicas e privadas :

    [ubuntu@ip-11-111-111-111 ~]$ su john
    

    Digite a senha que você criou para "john" na Etapa 2. Em seguida, crie um par de chaves. Lembre-se de que a senha para o par de chaves deve ter pelo menos 4 caracteres.

    [john@ip-11-111-111-111 ubuntu]$ cd /home/john/
    [john@ip-11-111-111-111 ~]$ ssh-keygen -b 1024 -f john -t dsa
    [john@ip-11-111-111-111 ~]$ mkdir .ssh
    [john@ip-11-111-111-111 ~]$ chmod 700 .ssh
    [john@ip-11-111-111-111 ~]$ cat john.pub > .ssh/authorized_keys
    [john@ip-11-111-111-111 ~]$ chmod 600 .ssh/authorized_keys
    [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh
    

    Na etapa acima, john é o usuário que criamos e o ubuntu é o grupo de usuários padrão.

    [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh/authorized_keys
    
  4. Passo 4: agora você só precisa baixar a chave chamada "john" . Eu uso o scp para baixar / fazer upload de arquivos do EC2, aqui está como você pode fazê-lo.

    Você ainda precisará copiar o arquivo usando o usuário ubuntu , pois você só tem a chave para esse nome de usuário. Então, você precisará mover a chave para a pasta ubuntu e chmod para 777.

    [john@ip-11-111-111-111 ~]$ sudo cp john /home/ubuntu/
    [john@ip-11-111-111-111 ~]$ sudo chmod 777 /home/ubuntu/john
    

    Agora vá ao terminal da máquina local, onde você tem o arquivo my_orig_key.pem e faça o seguinte:

    $ cd ~/.ssh
    $ scp -i my_orig_key.pem [email protected]:/home/ubuntu/john john
    

    O comando acima copiará a chave "john" para o diretório de trabalho atual em sua máquina local. Depois de copiar a chave para sua máquina local, você deve excluir "/ home / ubuntu / john", pois é uma chave privada.

    Agora, um da sua máquina local chmod john para 600.

    $ chmod 600 john
    
  5. Etapa 5: hora de testar sua chave :

    $ ssh -i john [email protected]
    

Portanto, dessa maneira, você pode configurar vários usuários para usar uma instância do EC2 !!

Olho
fonte
4
Isso é útil, mas, como etapa final, você também não deve excluir a chave privada da máquina remota? Dessa forma, outras pessoas com acesso à instância também não pode copiá-lo e usar sua chave para entrar.
culix
Isso funciona para mim. Mas como navego para o usuário do ubuntu a partir daqui, já que os arquivos nos quais trabalharei estão no diretório do usuário do ubuntu. Isso me levará ao grupo de usuários john. Ubuntu 14.04.4 LTS
olyjosh
Isso não funcionou para mim. Deu permissões inválidas. Eu tive que criar um par de chaves do console ec2, em seguida, ele começou a trabalhar
dark knight
11

Na sua máquina local, execute o comando:

ssh-keygen -t rsa -C "SomeAlias"

Após a execução desse comando, um arquivo que termina em * .pub será gerado. Copie o conteúdo desse arquivo.

Na máquina Amazon, edite ~ / .ssh / allowed_keys e cole o conteúdo do arquivo * .pub (e remova primeiro qualquer conteúdo existente).

Em seguida, você pode SSH usando o outro arquivo que foi gerado a partir do comando ssh-keygen (a chave privada).

Dan
fonte
Assim como o @Dan mencionou, é possível alterar o acesso à sua instância editando este arquivo, mas você nunca poderá alterar o par de chaves associado à instância em um nível de metadados. Não esqueça de adicionar o nome do arquivo .pem no final do seu publicKey, ex:ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair
Ricardo Mutti
7

Isso aconteceu comigo mais cedo (não tinha acesso a uma instância do EC2 que alguém criou, mas tinha acesso ao console da web da AWS) e escrevi a resposta em blog: http://readystate4.com/2013/04/09/aws-gaining- ssh-acesso-a-uma-ec2-instância-você-perdeu-acesso-a /

Basicamente, você pode desconectar a unidade EBS, conectá-la a um EC2 ao qual você tem acesso. Adicione sua chave pub SSH a ~ec2-user/.ssh/authorized_keysesta unidade conectada. Em seguida, coloque-o novamente na antiga instância do EC2. passo a passo no link usando o Amazon AMI.

Não há necessidade de fazer instantâneos ou criar uma nova instância clonada.

Mauvis Ledford
fonte
6

No meu caso, usei esta documentação para associar um par de chaves à minha instância do Elastic Beanstalk

Importante

Você deve criar um par de chaves do Amazon EC2 e configurar suas instâncias do Amazon EC2 aprovadas pelo Elastic Beanstalk para usar o par de chaves do Amazon EC2 antes de poder acessar suas instâncias do Amazon EC2 aprovadas pelo Elastic Beanstalk. Você pode configurar seus pares de chaves do Amazon EC2 usando o AWS Management Console. Para obter instruções sobre como criar um par de chaves para o Amazon EC2, consulte o Guia de introdução do Amazon Elastic Compute Cloud.

Configurando instâncias do servidor Amazon EC2 com Elastic Beanstalk

Kamal Essajidi
fonte
1
Obrigado, @ kamal-essajidi! Para outras pessoas que usam EB: depois de ter um par de chaves, você pode adicioná-lo ao Elastic Beanstalk em Configuração> Instâncias> Par de chaves EC2.
Scott
4

Você pode adicionar uma nova chave à instância usando o seguinte comando:

ssh-copy-id -i ~/.ssh/id_rsa.pub domain_alias

Você pode configurar domain_alias em ~ / .ssh config

host domain_alias
  User ubuntu
  Hostname domain.com
  IdentityFile ~/.ssh/ec2.pem
Karser
fonte
4

Não achei uma maneira fácil de adicionar um novo par de chaves pelo console, mas você pode fazer isso manualmente.

Basta colocar ssh na sua caixa do EC2 com o par de chaves existente. Depois edite as teclas ~ / .ssh / allowed_keys e adicione a nova chave em uma nova linha. Saia e ssh através da nova máquina. Sucesso!

ninja123
fonte
3

Para ambientes Elasticbeanstalk, você pode aplicar um par de valores-chave a uma instância em execução como esta:

  • Crie um par de valores-chave em EC2 -> Pares de chaves (na guia REDE E SEGURANÇA)
  • Vá para Elasticbeanstalk e clique no seu aplicativo
  • Vá para a página de configuração e modifique as configurações de segurança
  • Escolha seu par de chaves EC2 e clique em Aplicar
  • Clique em confirmar para confirmar a atualização. Ele encerrará o ambiente e aplicará o valor da chave ao seu ambiente.
Kerem
fonte
1

Você pode realmente adicionar um par de chaves na página de configuração do beanstalk elástico. Ele reinicia sua instância para você e tudo funciona.

Vishwas Vaishnav
fonte