Ajouter Keypair à une instance EC2 existante

240

J'ai eu accès à la console AWS à 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 afin que je puisse SSH dans? L'obtention du fichier pem existant 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?

Chris Wagner
la source
Avez-vous essayé la solution ici: stackoverflow.com/questions/1454629/… ? ssh-adddevrait faire ce dont vous avez besoin.
Marc Bollinger
C'est bien d'apprendre la fonction ssh-add mais cela n'aidera pas car cet utilisateur a réellement 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.
Chris Wagner
1
Peut-être que vous feriez mieux de poser cette question sur serverfault.com
Claude Vedovini
4
Vous ne pouvez pas appliquer une paire de clés à une instance en cours d'exécution.
Rodney Quillo

Réponses:

172

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

Pour la récupération, s'il s'agit d'une AMI de démarrage EBS, vous pouvez l'arrêter, faire un instantané du volume. Créez un nouveau volume en fonction de celui-ci. Et pouvoir la réutiliser 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, je voulais capturer les informations dans le lien que Rodney a posté sur son commentaire.

Nous remercions Eric Hammond pour ces informations .

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

Vous pouvez examiner et modifier des fichiers sur le volume EBS racine sur une instance EC2 même si vous vous trouvez dans ce que vous considérez comme une situation désastreuse comme:

  • 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 accéder à root avec sudo pour le corriger
  • Votre instance longue durée est bloquée pour une raison quelconque, ne peut pas être contactée et ne démarre pas correctement
  • Vous devez récupérer des fichiers hors de l'instance mais ne pouvez pas y accéder

Sur un ordinateur physique assis à votre bureau, vous pouvez simplement démarrer le système avec un CD ou une clé USB, monter le disque dur, extraire et réparer les fichiers, puis redémarrer l'ordinateur pour reprendre le travail.

Cependant, une instance EC2 distante semble distante et inaccessible lorsque vous êtes dans l'une de ces situations. Heureusement, AWS nous offre la puissance et la flexibilité nécessaires pour pouvoir récupérer un système comme celui-ci, à condition que nous exécutions des instances de démarrage EBS et non un magasin d'instances.

L'approche sur EC2 est quelque peu similaire à la solution physique, mais nous allons déplacer et monter le «disque dur» défectueux (volume EBS racine) sur une autre instance, le réparer, puis le reculer.

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:

Installer

Identifiez l'instance (A) et le volume d'origine contenant le volume EBS racine rompu avec les fichiers que vous souhaitez afficher 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 corriger les fichiers sur le volume EBS d'origine. Cette instance doit être exécutée dans la même zone de disponibilité que l'instance A afin qu'elle puisse être associée au volume EBS. Si aucune instance n'est déjà en cours d'exécution, démarrez-en une temporaire.

instance_b=i-YYYYYYYY

Arrêtez l'instance cassée A (en attendant qu'elle s'arrête complètement), détachez le volume EBS racine 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 pour l'instance B et montez le volume afin que vous puissiez accéder à son système de fichiers.

ssh ...instance b...

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

Répare le

À ce stade, l'intégralité de votre système de fichiers racine de l'instance A est disponible pour l'affichage et la modification sous / vol-a sur l'instance B. Par exemple, vous pouvez:

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

Remarque: les UID des deux instances peuvent ne pas être identiques, alors faites attention si vous créez, modifiez ou copiez des fichiers appartenant à 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 montrez des fichiers avec un nom, puis ramenez le volume sur A.

Emballer

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 de déplacer le volume EBS vers son emplacement d'origine sur l'instance A d'origine et redémarrez l'instance:

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

J'espère que vous avez résolu le problème, l'instance A se présente très bien et vous pouvez accomplir ce que vous aviez initialement prévu de faire. Si ce n'est pas le cas, vous devrez peut-être continuer à répéter ces étapes jusqu'à ce qu'il fonctionne.

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

Rappelles toi! Si votre instance B a été temporairement démarrée juste pour ce processus, n'oubliez pas de la terminer maintenant.

Rodney Quillo
la source
pouvez-vous nous dire un guide étape par étape pour cela (ou pointer vers lui). Dans mon cas, j'ai une instance en cours d'exécution et je dois me connecter à partir d'un emplacement distant, où je n'ai pas la clé privée.
Jus12
87

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 créer une nouvelle paire de clés pour lui, puis l'utiliser comme vous le feriez avec la paire de clés de l'utilisateur d'origine.

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

  1. Étape 1: connectez-vous par défaut à l'utilisateur "ubuntu" :

    $ ssh -i my_orig_key.pem [email protected]
    
  2. Étape 2: créez un nouvel utilisateur, nous appellerons notre nouvel utilisateur «john» :

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

    Définissez le mot de passe pour «john» en:

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

    Ajoutez «john» à la liste sudoer en:

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

    .. et ajoutez ce qui suit à la fin du fichier:

    john   ALL = (ALL)    ALL
    

    Bien! Nous avons créé notre nouvel utilisateur, vous devez maintenant générer le fichier de clé qui sera nécessaire pour vous connecter, comme nous avons my_orin_key.pem à l'étape 1.

    Maintenant, quittez et revenez à ubuntu, hors de la racine.

    [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 secrète pour la paire de clés doit contenir 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. Étape 4: il vous suffit maintenant de télécharger la clé appelée «john» . J'utilise scp pour télécharger / télécharger des fichiers depuis EC2, voici comment vous pouvez le faire.

    Vous devrez toujours copier le fichier à l'aide de l' utilisateur ubuntu , car vous ne disposez que de la clé pour ce nom d'utilisateur. Ainsi, vous devrez déplacer la clé vers le dossier ubuntu et la modifier en 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 procédez comme suit:

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

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

    Maintenant, une de votre machine locale chmod john à 600.

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

    $ ssh -i john [email protected]
    

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

Œil
la source
4
Ceci est utile, mais comme étape finale ne devez-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 également la copier et utiliser votre clé pour se connecter.
culix
Cela fonctionne pour moi. Mais comment puis-je naviguer vers l'utilisateur ubuntu à partir d'ici puisque les fichiers sur lesquels je travaillerai se trouvent dans le répertoire utilisateur ubuntu. Cela m'amènera au groupe d'utilisateurs john. Ubuntu 14.04.4 LTS
olyjosh
Ç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 cela a commencé à fonctionner
chevalier noir
11

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, modifiez ~ / .ssh / authorized_keys et collez le contenu du fichier * .pub (et supprimez d'abord tout contenu existant).

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

Dan
la source
Ainsi, comme @Dan l'a mentionné, il est possible de modifier l'accès à votre instance en modifiant ce fichier, mais vous ne pourrez jamais modifier la paire de clés associée à l'instance au niveau des métadonnées. N'oubliez pas d'ajouter le nom du fichier .pem à la fin de votre clé publique, par exemple:ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair
Ricardo Mutti
7

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 blogué la réponse: http://readystate4.com/2013/04/09/aws-gaining- ssh-access-to-an-ec2-instance-you-lost-access-to /

Fondamentalement, vous pouvez détacher le lecteur EBS, le connecter à un EC2 auquel vous avez accès. Ajoutez votre clé de publication SSH ~ec2-user/.ssh/authorized_keyssur ce lecteur connecté. Ensuite, remettez-le sur l'ancienne instance EC2. étape par étape dans le lien à l'aide d'Amazon AMI.

Pas besoin de faire des instantanés ou de créer une nouvelle instance clonée.

Mauvis Ledford
la source
6

Dans mon cas, j'ai utilisé cette documentation pour associer une paire de clés à mon instance d'Elastic Beanstalk

Important

Vous devez créer une paire de clés Amazon EC2 et configurer vos instances Amazon EC2 provisionnées par Elastic Beanstalk pour utiliser la paire de clés Amazon EC2 avant de pouvoir accéder à vos instances Amazon EC2 provisionnées par Elastic Beanstalk. Vous pouvez configurer vos paires de clés Amazon EC2 à l'aide d'AWS Management Console. Pour obtenir des instructions sur la création d'une paire de clés pour Amazon EC2, consultez le Guide de démarrage d'Amazon Elastic Compute Cloud.

Configuration des instances de serveur Amazon EC2 avec Elastic Beanstalk

Kamal Essajidi
la source
1
Merci, @ kamal-essajidi! Pour les autres utilisateurs d'EB: une fois que vous avez une paire de clés, vous pouvez l'ajouter à votre Elastic Beanstalk dans Configuration> Instances> Paire de clés EC2.
Scott
4

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 la configuration ~ / .ssh

host domain_alias
  User ubuntu
  Hostname domain.com
  IdentityFile ~/.ssh/ec2.pem
karser
la source
4

Je n'ai pas trouvé de moyen facile d'ajouter une nouvelle paire de clés via la console, mais vous pouvez le faire manuellement.

Connectez-vous simplement à votre boîtier EC2 avec la paire de clés existante. Modifiez ensuite les ~ / .ssh / authorized_keys et ajoutez la nouvelle clé sur une nouvelle ligne. Quittez et ssh via la nouvelle machine. Succès!

ninja123
la source
3

Une fois qu'une instance a été démarrée, il n'y a aucun moyen de modifier la paire de clés associée à l'instance au niveau des métadonnées, mais vous pouvez changer la clé ssh que vous utilisez pour vous connecter à l'instance .

stackoverflow.com/questions/7881469/change-key-pair-for-ec2-instance

YetAnotherMatt
la source
3

Pour les environnements Elasticbeanstalk, vous pouvez appliquer une paire clé-valeur à une instance en cours d'exécution comme ceci:

  • Créer une paire clé-valeur à partir d'EC2 -> Paires de clés (sous l'onglet RÉSEAU & SÉCURITÉ)
  • Accédez à Elasticbeanstalk et cliquez sur votre application
  • Accédez à la page de configuration et modifiez les paramètres de sécurité
  • Choisissez votre paire de clés EC2 et cliquez sur Appliquer
  • Cliquez sur confirmer pour confirmer la mise à jour. Il mettra fin à l'environnement et appliquera la valeur clé à votre environnement.
Kerem
la source
1

Vous pouvez réellement ajouter une paire de clés via la page de configuration de beanstalk élastique. il redémarre ensuite votre instance pour vous et tout fonctionne.

Vishwas Vaishnav
la source