Как скачать открытый ключ из Amazon AWS?

25

У меня запущен экземпляр amazon ec2 linux, связанный с парой ключей (p1), и я загрузил закрытый ключ на свой домашний рабочий стол. Сейчас на работе я создал пару ключей (p2) на рабочем столе и импортировал открытый ключ в Amazon через консоль AWS.

Дома я хочу добавить открытый ключ пары ключей p2, который будет добавлен к authorized_keysмоему экземпляру AMI (доступ к которому я могу получить только из дома). Однако я забыл взять с собой открытый ключ p2, поэтому можно ли каким-то образом экспортировать этот открытый ключ из Amazon.

Jus12
источник

Ответы:

6

Хорошая головоломка, спасибо! Вот один ответ:

  1. Запустите новый временный экземпляр EBS boot t1.micro A, указав пару ключей p2. Укажите зону доступности, где у вас уже есть другой экземпляр B, к которому у вас есть доступ. (Запустите временный, если необходимо).

  2. Остановите (не завершите) экземпляр A после того, как он находился в рабочем состоянии в течение нескольких минут, чтобы у него была возможность сохранить открытый ключ в своем файле author_keys.

  3. Отсоедините корневой том EBS от остановленного экземпляра A. Подключите и подключите его к работающему экземпляру B.

  4. Скопируйте открытый ключ из смонтированной файловой системы.

  5. Отсоедините и удалите том EBS. Завершить временный экземпляр А.

Эрик Хаммонд
источник
1
Не уверен, как это на самом деле решает исходный вопрос ... это определенно один из способов справиться с экземплярами AWS EC2 тогда и только тогда, когда вы используете экземпляры, поддерживаемые EBS.
Джереми Баус
Вам не нужно использовать загрузочные экземпляры EBS, за исключением одного раза, когда вы запускаете временный экземпляр, чтобы извлечь из него открытый ключ. Все, что вы хотите сделать, это получить открытый ключ, который делает этот подход.
Эрик Хаммонд
1
Если у вас есть закрытый ключ, вы можете восстановить открытый ключ, не проходя такие меры.
Джереми Бауз
2
Джереми: Исходя из первоначального вопроса, закрытый ключ возвращается в его офис, где он не может его получить. И как только он возвращается в офис, он не может войти в экземпляр EC2, потому что у него нет открытого ключа для этого личного ключа офиса. Вот почему он хочет получить открытый ключ от Amazon, и единственный способ сделать это - запустить экземпляр с этим открытым ключом. Затем вы должны получить открытый ключ этого экземпляра, который является сложной частью.
Эрик Хаммонд
1
Вот Это Да! много работы, чтобы получить открытый ключ. Для Amazon было бы проще установить опцию «Экспорт открытого ключа».
Jus12
37

Правильная команда ssh-keygen однако:

ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
rsmoorthy
источник
Это должен быть комментарий или предложенное редактирование предыдущего ответа. Вы правы, хотя.
Джоттон
Вы правы, это должен был быть комментарий. К сожалению, я еще не получил привилегии комментировать :-(
rsmoorthy
хаха, ну вот и все. Спасибо, что согласились с исправлением.
JCotton
Этот ответ будет работать, если у него будет доступ к закрытому ключу, но в первоначальном вопросе этот закрытый ключ находится в другом месте и недоступен.
Эрик Хаммонд
1
запустить, chmod 400 your_private_key.pemесли вы получаете сообщение «Ошибка разрешения слишком открыта»
crizCraig
7

Я уже предоставил один ответ, который использует тома EBS для получения открытого ключа ssh, но вот еще один способ получить его, запустив временный экземпляр EC2 с помощью скрипта пользовательских данных, который отправляет открытый ключ на вывод консоли. Вот шаги:

Сохраните следующий код в файл с именем output-ssh-key.userdataна вашем локальном компьютере. НЕ ЗАПУСКАЙТЕ ЭТИ КОМАНДЫ МЕСТНО!

#!/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

Запустите стандартный экземпляр Ubuntu 10.04 LTS с указанным выше файлом в качестве сценария пользовательских данных. Укажите пару ключей, для которой вы хотите получить открытый ключ ssh:

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

Продолжайте запрашивать вывод консоли из экземпляра, пока он не покажет ваш открытый ключ ssh. Укажите идентификатор экземпляра, возвращенный из команды run-instances:

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

В течение 2-10 минут вы получите такой результат:

========================================================================
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)

Временный экземпляр автоматически прекратит работу через час, но вы можете прекратить его самостоятельно, если хотите убедиться, что с вас не взимается плата, превышающая два цента, которые это будет стоить.

Эрик Хаммонд
источник
Я попробовал это с современной установкой awscli, и она работала с вашим скриптом пользовательских данных. Однако мне пришлось немного адаптировать команды. Это сработало для региона eu-west-1: aws ec2 run-instances --key-name mykey --instance-type t1.micro --instance-init-shutdown-поведение прекращать --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
(Отредактировано) Хорошо форматирование здесь ужасно, я выложу как другой ответ.
Бернхард
5

Если у вас есть закрытый ключ SSH, вы можете заново сгенерировать компонент открытого ключа, просто выполнив следующую команду ssh-keygen :

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

Это простая часть ... Консоль и API AWS не поддерживают нажатие двух пар ключей при запуске экземпляра EC2. Это упражнение, оставленное системному администратору для выполнения другими способами.

Если у вас есть доступ к авторизованному ключу идентификации, вы можете просто выполнить следующую команду ssh-copy-id :

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

Это автоматически скопирует данный открытый ключ на сервер и в ~user/.ssh/authorized_keysфайл для вас и обеспечит надлежащие разрешения для файла.

Более элегантный способ - включить дополнительные идентификационные ключи в процессы управления конфигурацией. В моем случае это влечет за собой добавление дополнительных ключей к конфигурации Puppet для узла.

Как примечание, личные предпочтения, но будут использовать лучший метод управления ключами SSH, чем просто включать отдельные ключи для работы и дома. Как я уже упоминал в предыдущем вопросе, мои ключи хранятся на USB-накопителе, а не на любом используемом мной компьютере.

Джереми Бауз
источник
0

Другой вариант - добавить в user_data короткий скрипт, который просто добавляет еще один ключ ssh в root:

#!/bin/bash

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

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

После этого вы можете войти в систему как пользователь root ssh -l root -i <KEYFILE> URLи просто прочитать ключ из authorized_keys пользователя ec2_user, ubuntu или как бы он ни назывался.

Единственное - вам нужно сделать машину общедоступной и убедиться, что доступ к порту 22 возможен снаружи.

Бернхард
источник