251 votes

Ajouter une paire de clés à une instance EC2 existante

On m'a donné AWS Accès à la console d'un compte avec 2 instances en cours d'exécution que je ne peux pas arrêter (en production). Je voudrais cependant obtenir un accès SSH à ces instances. Est-il possible de créer une nouvelle paire de clés et de l'appliquer aux instances pour que je puisse m'y connecter en SSH ? L'obtention de la paire de clés existante pem pour la paire de clés sous laquelle les instances ont été créées n'est actuellement pas une option.

Si ce n'est pas possible, y a-t-il un autre moyen d'accéder aux instances ?

0 votes

Avez-vous essayé la solution ici : stackoverflow.com/questions/1454629/ ? ssh-add devrait faire ce dont vous avez besoin.

0 votes

C'est bien d'apprendre la fonction ssh-add mais cela ne servira à rien car cet utilisateur a créé l'instance en utilisant la paire de clés qu'il a créée. Les instances auxquelles je fais référence ont été créées avec une autre paire de clés à laquelle je n'ai pas accès.

1 votes

Vous feriez mieux de poser cette question sur serverfault.com

179voto

Rodney Quillo Points 1968

Vous ne pouvez pas appliquer une paire de clés à une instance en cours d'exécution. Vous pouvez uniquement utiliser la nouvelle paire de clés pour lancer une nouvelle instance.

Pour la récupération, si c'est une AMI de démarrage EBS, vous pouvez l'arrêter, faire un instantané du volume. Créer un nouveau volume basé sur celui-ci. Et être capable de l'utiliser à nouveau pour démarrer l'ancienne instance, créer une nouvelle image, ou récupérer des données.

Bien que les données du stockage éphémère soient perdues.


En raison de la popularité de cette question et réponse, j'ai voulu capturer les informations dans le lien que Rodney a posté sur son commentaire.

Le mérite revient à Eric Hammond pour cette information .

Correction des fichiers sur le volume EBS racine d'une instance EC2

Vous pouvez examiner et modifier des fichiers sur le volume EBS racine d'une instance EC2 même si vous vous trouvez dans une situation considérée comme désastreuse, par exemple :

  • Vous avez perdu votre clé ssh ou oublié votre mot de passe
  • Vous avez fait une erreur en modifiant le fichier /etc/sudoers et vous ne pouvez plus obtenir l'accès Root avec sudo pour la corriger.
  • Votre instance en cours d'exécution est bloquée pour une raison quelconque et ne peut pas être contactée. contactée, et ne parvient pas à démarrer correctement
  • Vous devez récupérer des fichiers de l'instance mais vous ne pouvez pas y accéder.

Sur un ordinateur physique posé sur votre bureau, il vous suffirait de démarrer le système à l'aide d'un CD ou d'une clé USB, de monter le disque dur, de vérifier et de réparer les fichiers, puis de redémarrer l'ordinateur pour être de nouveau opérationnel.

Une instance EC2 distante, cependant, semble distante et inaccessible lorsque vous vous trouvez dans l'une de ces situations. Heureusement, AWS nous offre la puissance et la flexibilité nécessaires pour pouvoir récupérer un tel système, à condition d'utiliser des instances de démarrage EBS et non des instances de stockage.

L'approche sur EC2 est quelque peu similaire à la solution physique, mais nous allons déplacer et monter le "disque dur" défectueux (volume Root EBS) sur une instance différente, le réparer, puis le déplacer à nouveau.

Dans certaines situations, il peut être plus simple de démarrer une nouvelle instance EC2 et de jeter la mauvaise, mais si vous voulez vraiment réparer vos fichiers, voici l'approche qui a fonctionné pour beaucoup :

Configuration

Identifiez l'instance (A) et le volume d'origine qui contient le volume EBS racine cassé avec les fichiers que vous voulez visualiser et modifier.

instance_a=i-XXXXXXXX

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

Identifiez la deuxième instance EC2 (B) que vous utiliserez pour réparer les fichiers sur le volume EBS d'origine. Cette instance doit fonctionner dans la même zone de disponibilité que l'instance A afin que le volume EBS puisse lui être attaché. Si vous n'avez pas d'instance en cours d'exécution, démarrez-en une temporaire.

instance_b=i-YYYYYYYY

Arrêtez l'instance A en panne (en attendant qu'elle s'arrête complètement), détachez le volume Root EBS de l'instance (en attendant qu'il soit détaché), puis attachez le volume à l'instance B sur un périphérique inutilisé.

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

ssh à l'instance B et montez le volume afin de pouvoir accéder à son système de fichiers.

ssh ...instance b...

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

Réparez-le

À ce stade, l'ensemble de votre système de fichiers racine de l'instance A est disponible pour être visualisé et édité sous /vol-a sur l'instance B. Par exemple, vous pourriez vouloir.. :

  • Mettez les clés ssh correctes dans /vol-a/home/ubuntu/.ssh/authorized_keys
  • Modifier et corriger /vol-a/etc/sudoers
  • Rechercher les messages d'erreur dans /vol-a/var/log/syslog
  • Copier les fichiers importants de /vol-a/

Note : Les uids sur les deux instances peuvent ne pas être identiques, donc faites attention si vous créez, éditez ou copiez des fichiers qui appartiennent à des utilisateurs non-Root. Par exemple, votre utilisateur mysql sur l'instance A peut avoir le même UID que votre utilisateur postfix sur l'instance B, ce qui pourrait causer des problèmes si vous chownez des fichiers avec un nom et que vous déplacez ensuite le volume vers A.

Récapitulation

Une fois que vous avez terminé et que vous êtes satisfait des fichiers sous /vol-a, démontez le système de fichiers (toujours sur l'instance-B) :

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

Maintenant, de retour sur votre système avec ec2-api-tools, continuez à déplacer le volume EBS vers son emplacement sur l'instance A originale et redémarrez l'instance :

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

Avec un peu de chance, vous avez résolu le problème, l'instance A s'affiche correctement et vous pouvez accomplir ce que vous aviez prévu à l'origine. Si ce n'est pas le cas, vous devrez peut-être continuer à répéter ces étapes jusqu'à ce que le problème soit résolu.

Remarque : Si une adresse IP Elastic était attribuée à l'instance A lorsque vous l'avez arrêtée, vous devrez la réassocier après l'avoir redémarrée.

Rappelez-vous ! Si votre instance B a été temporairement lancée juste pour ce processus, n'oubliez pas de la terminer maintenant.

0 votes

Pouvez-vous nous indiquer un guide étape par étape pour cela (ou pointer vers celui-ci). Dans mon cas, j'ai une instance existante en cours d'exécution et je dois m'y connecter à partir d'un emplacement distant, où je ne dispose pas de la clé privée.

93voto

Eye Points 1329

Bien que vous ne puissiez pas ajouter directement une paire de clés à une instance EC2 en cours d'exécution, vous pouvez créer un utilisateur linux et lui créer une nouvelle paire de clés, puis l'utiliser comme vous le feriez avec la paire de clés de l'utilisateur original.

Dans votre cas, vous pouvez demander au propriétaire de l'instance (qui l'a créée) de faire ce qui suit. Ainsi, le propriétaire de l'instance n'a pas à partager ses propres clés avec vous, mais vous serez toujours en mesure de vous connecter à ces instances. Ces étapes ont été initialement publiées par Utkarsh Sengar (aka. @zengr ) à http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/ . Je n'ai fait que quelques petits changements.

  1. Etape 1 : se connecter par défaut avec l'utilisateur "ubuntu". :

    $ ssh -i my_orig_key.pem ubuntu@111.111.11.111
  2. Etape 2 : créer un nouvel utilisateur, nous appellerons notre nouvel utilisateur "john". :

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

    Définir le mot de passe pour "john" par :

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

    Ajouter "john" à la liste des sudoers par :

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

    et ajoutez ce qui suit à la fin du fichier :

    john   ALL = (ALL)    ALL

    Très bien ! Nous avons créé notre nouvel utilisateur, maintenant vous devez générer le fichier clé qui sera nécessaire pour se connecter, comme nous avons mon_orin_key.pem à l'étape 1.

    Maintenant, quittez et retournez à ubuntu, hors de Root.

    [root@ip-11-111-111-111 ubuntu]# exit
    [ubuntu@ip-11-111-111-111 ~]$
  3. Étape 3 : création des clés publiques et privées :

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

    Saisissez le mot de passe que vous avez créé pour "john" à l'étape 2. Créez ensuite une paire de clés. N'oubliez pas que la phrase de passe pour la paire de clés doit comporter au moins 4 caractères.

    [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

    Dans l'étape ci-dessus, john est l'utilisateur que nous avons créé et ubuntu est le groupe d'utilisateurs par défaut.

    [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh/authorized_keys
  4. Etape 4 : maintenant, il vous suffit de télécharger la clé appelée "john". . J'utilise scp pour télécharger/uploader des fichiers depuis EC2, voici comment vous pouvez le faire.

    Vous devrez toujours copier le fichier en utilisant ubuntu utilisateur, puisque vous n'avez que la clé pour ce nom d'utilisateur. Vous devrez donc déplacer la clé dans le dossier ubuntu et lui donner un chmod de 777.

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

    Maintenant venez au terminal de la machine locale, où vous avez le fichier my_orig_key.pem et faites ceci :

    $ cd ~/.ssh
    $ scp -i my_orig_key.pem ubuntu@111.111.11.111:/home/ubuntu/john john

    La commande ci-dessus copiera la clé "john" dans le répertoire de travail actuel de votre machine locale. Une fois que vous avez copié la clé sur votre machine locale, vous devez supprimer "/home/ubuntu/john", puisqu'il s'agit d'une clé privée.

    Maintenant, sur votre machine locale, chmod john à 600.

    $ chmod 600 john
  5. Étape 5 : il est temps de tester votre clé :

    $ ssh -i john john@111.111.11.111

Ainsi, de cette manière, vous pouvez configurer plusieurs utilisateurs pour utiliser une seule instance EC2 !

5 votes

C'est utile, mais comme étape finale, ne devriez-vous pas également supprimer la clé privée de la machine distante ? De cette façon, les autres personnes ayant accès à l'instance ne peuvent pas la copier et utiliser votre clé pour se connecter.

0 votes

Cela fonctionne pour moi. Mais comment puis-je naviguer vers l'utilisateur ubuntu à partir d'ici puisque les fichiers sur lesquels je vais travailler sont dans le répertoire de l'utilisateur ubuntu. Cela me mènera au groupe d'utilisateurs john. Ubuntu 14.04.4 LTS

0 votes

Ça n'a pas marché pour moi. Il a donné des autorisations invalides. J'ai dû créer une paire de clés à partir de la console ec2, puis ça a commencé à fonctionner.

13voto

Dan Points 186

Sur votre machine locale, exécutez la commande :

ssh-keygen -t rsa -C "SomeAlias"

Après l'exécution de cette commande, un fichier se terminant par *.pub sera généré. Copiez le contenu de ce fichier.

Sur la machine Amazon, éditez ~/.ssh/authorized_keys et collez le contenu du fichier *.pub (et supprimez d'abord tout contenu existant).

Vous pouvez ensuite utiliser SSH en utilisant l'autre fichier qui a été généré par la commande ssh-keygen (la clé privée).

0 votes

Donc, comme @Dan l'a mentionné, il est possible de changer l'accès à votre instance en éditant ce fichier, mais vous ne pourrez jamais changer la paire de clés associée à l'instance au niveau des méta-données. N'oubliez pas d'ajouter le nom du fichier .pem à la fin de votre PublicKey, par exemple : ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair

7voto

Mauvis Ledford Points 12424

Cela m'est arrivé plus tôt (je n'avais pas accès à une instance EC2 créée par quelqu'un d'autre mais j'avais accès à la console web AWS) et j'ai publié la réponse sur mon blog : http://readystate4.com/2013/04/09/aws-gaining-ssh-access-to-an-ec2-instance-you-lost-access-to/

En gros, vous pouvez détacher le disque EBS, le fixer à un EC2 auquel vous avez accès. Ajoutez votre clé publique SSH à ~ec2-user/.ssh/authorized_keys sur ce lecteur joint. Puis remettez-le sur l'ancienne instance EC2. Vous trouverez dans le lien les étapes à suivre pour utiliser Amazon AMI.

Il n'est pas nécessaire de faire des snapshots ou de créer une nouvelle instance clonée.

4voto

karser Points 51

Vous pouvez simplement ajouter une nouvelle clé à l'instance par la commande suivante :

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

Vous pouvez configurer domain_alias dans ~/.ssh config

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X