Comment télécharger une clé publique depuis Amazon AWS?

25

J'ai une instance amazon ec2 linux en cours d'exécution associée à une paire de clés (p1) et j'ai téléchargé la clé privée sur mon bureau à domicile. Maintenant au travail, j'ai créé une paire de clés (p2) sur mon bureau de travail et importé la clé publique sur Amazon via la console AWS.

À la maison, je souhaite ajouter la clé publique de keypair p2 à ajouter à authorized_keysmon instance AMI (à laquelle je ne peux actuellement accéder que depuis la maison). Cependant, j'ai oublié d'apporter la clé publique de p2 avec moi, il est donc possible d'exporter cette clé publique d'Amazon.

Jus12
la source

Réponses:

6

Joli puzzle, merci! Voici une réponse:

  1. Démarrez une nouvelle instance temporaire A de démarrage EBS t1.micro A, en spécifiant paire de clés p2. Spécifiez une zone de disponibilité dans laquelle vous avez déjà une autre instance B en cours d'exécution et à laquelle vous avez accès. (Démarrez un temporaire si nécessaire).

  2. Arrêtez (sans terminer) l'instance A après qu'elle ait été en cours d'exécution pendant quelques minutes, afin qu'elle ait la possibilité d'enregistrer la clé publique dans son fichier authorized_keys.

  3. Détachez le volume EBS racine de l'instance arrêtée A. Attachez-le et montez-le à votre instance en cours d'exécution B.

  4. Copiez la clé publique à partir du système de fichiers monté.

  5. Détachez et supprimez le volume EBS. Mettre fin à l'instance temporaire A.

Eric Hammond
la source
1
Je ne sais pas comment cela résout réellement la question d'origine ... c'est certainement une façon de traiter les instances AWS EC2 si et seulement si vous utilisez des instances soutenues par EBS.
Jeremy Bouse
Vous n'avez pas besoin d'utiliser des instances de démarrage EBS, sauf pour la première fois que vous exécutez l'instance temporaire pour en retirer la clé publique. Tout ce que vous voulez faire, c'est obtenir la clé publique que cette approche fait.
Eric Hammond
1
Si vous avez la clé privée, vous pouvez régénérer la clé publique sans passer par de telles mesures.
Jeremy Bouse
2
Jeremy: Sur la base de la question d'origine, la clé privée est de retour à son bureau où il ne peut pas l'obtenir. Et une fois qu'il est revenu au bureau, il ne peut pas accéder à l'instance EC2 car elle n'a pas la clé publique pour cette clé privée du bureau. C'est pourquoi il veut obtenir la clé publique d'Amazon, et la seule façon de le faire est de démarrer une instance avec cette clé publique. Ensuite, vous devez retirer la clé publique de cette instance, ce qui est la partie délicate.
Eric Hammond
1
Hou la la! beaucoup de travail pour obtenir la clé publique. Il aurait été plus facile pour Amazon de mettre une option "Exporter la clé publique".
Jus12
37

La commande ssh-keygen correcte est cependant:

ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
rsmoorthy
la source
Il doit s'agir d'un commentaire ou d'une modification proposée sur la réponse précédente. Vous avez raison cependant.
JCotton
Vous avez raison, cela aurait dû être un commentaire. Malheureusement, je n'ai pas encore gagné les privilèges pour commenter :-(
rsmoorthy
haha, et bien voilà. Merci d'avoir sonné la correction.
JCotton
Cette réponse fonctionnerait s'il avait accès à la clé privée, mais dans la question d'origine, cette clé privée se trouve à un emplacement différent et n'est pas accessible.
Eric Hammond
1
exécuter chmod 400 your_private_key.pemsi vous obtenez "Les autorisations sont trop ouvertes erreur"
crizCraig
7

J'ai déjà fourni une réponse qui utilise des volumes EBS pour accéder à la clé publique ssh, mais voici une autre façon d'y accéder en démarrant une instance EC2 temporaire avec un script de données utilisateur qui envoie la clé publique à la sortie de la console. Voici les étapes:

Enregistrez le code suivant dans un fichier nommé output-ssh-key.userdatasur votre ordinateur local. NE PAS EXÉCUTER CES COMMANDES LOCALEMENT!

#!/bin/bash -ex
exec> >(tee /var/log/user-data.log|logger -t user -s 2>/dev/console) 2>&1
adminkey=$(GET instance-data/latest/meta-data/public-keys/ | 
  perl -ne 'print $1 if /^0=[^a-z0-9]*([-.@\w]*)/i')
cat <<EOF
SSHKEY:========================================================================
SSHKEY:HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "$adminkey":
SSHKEY:$(cat /home/ubuntu/.ssh/authorized_keys)
SSHKEY:========================================================================
SSHKEY:Halting in 50min ($(date --date='+50 minutes' +"%Y-%m-%d %H:%M UTC"))
EOF
sleep 3000
halt

Exécutez une instance stock Ubuntu 10.04 LTS avec le fichier ci-dessus en tant que script de données utilisateur. Spécifiez la paire de clés pour laquelle vous souhaitez récupérer la clé publique ssh:

ec2-run-instances \
  --key YOURKEYPAIRHERE \
  --instance-type t1.micro \
  --instance-initiated-shutdown-behavior terminate \
  --user-data-file output-ssh-key.userdata \
  ami-ab36fbc2

Continuez à demander la sortie de la console à l'instance jusqu'à ce qu'elle affiche votre clé publique ssh. Spécifiez l'ID d'instance renvoyé par la commande run-instances:

ec2-get-console-output YOURINSTANCEID | grep SSHKEY: | cut -f3- -d:

Dans les 2 à 10 minutes, vous obtiendrez une sortie comme celle-ci:

========================================================================
HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "erich":
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6rn8cl41CkzaH4ZBhczOJZaR4xBBDI1Kelc2ivzVvCB
THcdJRWpDd5I5hY5W9qke9Tm4fH3KaUVndlcP0ORGvS3PAL4lTpkS4D4goMEFrwMO8BG0NoE8sf2U/7g
aUkdcrDC7jzKYdwleRCI3uibNXiSdeG6RotClAAp7pMflDVp5WjjECDZ+8Jzs2wasdTwQYPhiWSiNcfb
fS97QdtROf0AcoPWElZAgmabaDFBlvvzcqxQRjNp/zbpkFHZBSKp+Sm4+WsRuLu6TDe9lb2Ps0xvBp1F
THlJRUVKP2yeZbVioKnOsXcjLfoJ9TEL7EMnPYinBMIE3kAYw3FzZZFeX3Q== erich
========================================================================
Halting in 50min (2011-12-20 05:58 UTC)

L'instance temporaire se terminera automatiquement en moins d'une heure, mais vous pouvez la terminer vous-même si vous souhaitez vous assurer que vous n'êtes pas facturé plus que les deux cents que cela coûtera pour fonctionner.

Eric Hammond
la source
J'ai essayé cela avec une installation moderne d'awscli, et cela a fonctionné avec votre script de données utilisateur. Cependant j'ai dû adapter légèrement les commandes. Cela a fonctionné pour la région eu-west-1: aws ec2 run-instances --key-name mykey --instance-type t1.micro --instance-started-shutdown-behavior terminate --user-data file: // output- ssh-key.userdata --image-id ami-c1167eb8; aws ec2 get-console-output --instance-id i-0ce56c0e02086160d; aws ec2 terminate-instances --instance-id i-0ce56c0e02086160d
holmb
(Modifié) Le formatage ok est horrible ici, je posterai une réponse différente.
Bernhard
5

Si vous avez la clé SSH privée, vous pouvez régénérer le composant de clé publique en exécutant simplement la commande ssh-keygen suivante :

 ssh-keygen -i -f /path/to/private-key > /path/to/public-key

C'est la partie simple ... La console AWS et l'API ne prennent pas en charge la pression de 2 paires de clés lors du démarrage d'une instance EC2. Il s'agit d'un exercice laissé à l'administrateur système par d'autres moyens.

Si vous avez accès à la clé d'identité déjà autorisée, vous pouvez simplement exécuter la commande ssh-copy-id suivante :

 ssh-copy-id -i /path/to/public-key user@EC2-instance

Cela copiera la clé publique donnée sur le serveur et dans le ~user/.ssh/authorized_keysfichier automatiquement pour vous et garantira les autorisations appropriées sur le fichier.

La manière la plus élégante serait d'inclure les clés d'identité supplémentaires dans vos processus de gestion de configuration. Dans mon cas, cela implique l'ajout de clés supplémentaires à la configuration Puppet pour le nœud.

En guise de remarque, la préférence personnelle, mais utiliserait une meilleure méthode de gestion des clés SSH que le simple fait d'inclure des clés distinctes pour le lieu de travail et le domicile. Comme je l'ai mentionné dans une question précédente, je conserve mes clés sur une clé USB que je garde avec moi plutôt que sur n'importe quel ordinateur que j'utilise.

Jeremy Bouse
la source
0

Une autre option serait d'ajouter un court script dans user_data qui ajoute juste une autre clé ssh à root:

#!/bin/bash

touch ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys

echo "<KEY>" >> ~/.ssh/authorized_keys

Ensuite, vous pouvez vous connecter à la machine en tant que root avec ssh -l root -i <KEYFILE> URLet simplement lire la clé à partir des clés autorisées de l'utilisateur ec2_user, ubuntu ou comment elle est appelée.

Seule chose - vous devez rendre la machine accessible au public et vous assurer que l'accès au port 22 est possible de l'extérieur.

Bernhard
la source