J'ai une instance Linux Amazon ec2 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 veux ajouter la clé publique de keypair p2 à ajouter à authorized_keys
de mon instance AMI (à laquelle je ne peux actuellement accéder que depuis mon domicile). Cependant, j'ai oublié d'apporter la clé publique de p2 avec moi, il est donc possible d'exporter cette clé publique d'Amazon.
Joli puzzle, merci! Voici une réponse:
Démarrez une nouvelle instance temporaire 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-en un temporaire si nécessaire).
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.
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.
Copiez la clé publique à partir du système de fichiers monté.
Détachez et supprimez le volume EBS. Mettre fin à l'instance temporaire A.
La commande ssh-keygen correcte est cependant:
ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
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.userdata
sur 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 qu'il vous en coûtera pour fonctionner.
Si vous avez la clé SSH privée, vous pouvez recréer 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 et l'API AWS 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_keys
fichier automatiquement pour vous et assurez-vous des 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 d'ajouter les 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 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.
Une autre option serait d'ajouter un court script dans user_data qui ajoute simplement 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> URL
et il suffit de lire la clé à partir des clés autorisées de l'utilisateur ec2_user, ubuntu ou de la façon dont 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.