web-dev-qa-db-ja.com

Amazon AWSから公開鍵をダウンロードするにはどうすればよいですか?

実行中のAmazon ec2 linuxインスタンスがキーペア(p1)に関連付けられており、秘密鍵をホームデスクトップにダウンロードしました。仕事中に、私は自分の仕事用デスクトップにキーペア(p2)を作成し、AWSコンソールを介してAmazonに公開鍵をインポートしました。

自宅で、追加するキーペアp2の公開鍵をAMIインスタンスのauthorized_keysに追加したいと思います(現在は自宅からしかアクセスできません)。しかし、p2の公開鍵を携帯するのを忘れたため、Amazonからこの公開鍵を何らかの方法でエクスポートすることは可能です。

26
Jus12

いいパズル、ありがとう!ここに1つの答えがあります:

  1. キーペアp2を指定して、新しい一時的なEBSブートt1.microインスタンスAを開始します。別のインスタンスBがすでに実行されており、アクセスできるアベイラビリティーゾーンを指定します。 (必要に応じて一時的なものを開始します)。

  2. 数分間実行状態になった後、インスタンスAを停止(終了ではない)するため、公開鍵をauthorized_keysファイルに保存する機会があります。

  3. 停止したインスタンスAからルートEBSボリュームを切り離します。実行中のインスタンスBに接続してマウントします。

  4. マウントされたファイルシステムから公開鍵をコピーします。

  5. EBSボリュームを切り離して削除します。一時インスタンスAを終了します。

6
Eric Hammond

ただし、正しいssh-keygenコマンドは次のとおりです。

ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
38
rsmoorthy

EBSボリュームを使用してssh公開鍵を取得する1つの回答をすでに提供しましたが、公開鍵をコンソール出力に送信するユーザーデータスクリプトを使用して一時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コマンドから返されるインスタンスIDを指定します。

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)

一時的なインスタンスは1時間以内に自動的に終了しますが、実行にかかる2セントを超えて課金されないようにしたい場合は、自分で終了できます。

7
Eric Hammond

秘密SSH鍵がある場合は、次の ssh-keygen コマンドを実行するだけで、公開鍵コンポーネントを再生成できます。

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

それだけが簡単な部分です... AWSコンソールとAPIは、EC2インスタンスの起動時に2つのキーペアのプッシュをサポートしていません。これは、システム管理者が他の方法で実行できる課題です。

すでに承認されているIDキーにアクセスできる場合は、次の ssh-copy-id コマンドを実行するだけです。

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

これにより、指定された公開鍵がサーバーと~user/.ssh/authorized_keysファイルに自動的にコピーされ、ファイルに対する適切な権限が確保されます。

よりエレガントな方法は、構成管理プロセスに追加のIDキーを含めることです。私の場合、これはノードの Puppet 構成に追加のキーを追加することを伴います。

補足として、個人的な好みは、仕事用と自宅用に別々のキーを単に含める必要があるよりも、より良いSSHキー管理方法を利用します。 前の質問 で述べたように、私はキーを、使用しているコンピュータではなく、私が持っているUSBドライブに保持しています。

5
Jeremy Bouse

別のオプションは、ルートに別のSSHキーを追加するだけの短いスクリプトをuser_dataに追加することです。

#!/bin/bash

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

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

次に、ssh -l root -i <KEYFILE> URLを使用してrootとしてマシンにログインし、ユーザーec2_user、ubuntu、またはそれが呼び出されたユーザーのauthorized_keysからキーを読み取るだけです。

唯一のこと-マシンをパブリックに到達可能にして、外部からポート22にアクセスできることを確認する必要があります。

1
Bernhard