web-dev-qa-db-ja.com

Amazonが公開鍵の代わりに秘密鍵をリリースするのはなぜですか?

私の脳は、公開鍵と秘密鍵で車軸を囲んでいます。 AmazonのEC2サービスでクラウドサーバー(インスタンス)を作成し、それをSSH経由でそれに接続する場合、Amazonは接続を確立するために秘密鍵をダウンロードすることを要求します。公開鍵/秘密鍵の背後にある考えは、Amazonが公開鍵をダウンロードすることを要求するべきであることを示唆していませんか?

さらに、顧客が使用できるようにSFTPサーバーをセットアップした場合、サーバーにキーをインストールするか、サーバーからキーを提供する必要がありますか?どちらの場合でも、それは公開鍵であるか秘密鍵である必要がありますか?

21
Seth

認証プロセスについてさらに深く考えると、何を秘密にしておく必要がありますか? Amazonは公開鍵の半分を知っており、anybodyは公開鍵の半分を知ることができます。鍵ペアの公開半分は、秘密半分と一致する場合、秘密半分が認証に使用されたことを示します。

Amazonがあなたに代わってキーペアを生成するときに提供されるあなたの秘密鍵は、あなたがそれを持っている唯一の人である場合にのみ役立ちます。それが秘密でない場合、それを知っている他の誰もが、鍵ペアの公開半分を保持している誰に対しても認証できます。

認証されているである者はprivateの半分を保持する必要があります。世界中の誰もが鍵の公開半分を保持することによってあなたを認証することができても大丈夫ですが、あなただけが秘密半分を制御するべきです。

36
Jeff Ferland

一部のオペレーティングシステム(咳、Windows、咳)ではSSHキーペアの生成が容易でない場合があるため、Amazonはキー生成サービスを提供しています。

SSH(およびSFTP)では、EC2インスタンスの起動時に公開鍵がユーザーのauthorized_keysファイルにインストールされます。秘密鍵はユーザーのみが保持し、サーバーに対して認証するために提示されます。

次のドキュメントから:

http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateKeyPair.html

amazonはサーバーでキーペアを生成し、HTTPS経由で秘密鍵を送信しているようです。これはおそらく完全ではありませんが(理想的には、あなたと他の誰もが秘密鍵を所有することはありません)、認証されたセッションのコンテキストですべてが発生し、あなただけが(そしてAmazonが一時的に)秘密鍵。また、プライベートキーを完全にプライベートに保ちながら、EC2で使用するための独自のパブリックキーを常に生成してアップロードすることもできます。

鍵認証用にSFTPユーザーを設定するには、マシンでSSH鍵を生成する必要があります。鍵ペアを生成したら、関連するauthorized_keysファイルにインストールするための公開鍵のみを送信します。名前が示すように、秘密鍵は秘密です。

18
cjc

公開鍵認証は、おそらくあなたが考えている方法とは逆の方向に機能します。公開鍵はメッセージを暗号化し、秘密鍵はメッセージを復号化します。サーバーはアカウント所有者の公開鍵を保存し、それを使用してメッセージを暗号化します。秘密鍵の所有者だけがそのメッセージを復号化できます。

公開鍵で暗号化されたシークレットを誰かに送信した場合、そのシークレットが何であるかを誰かが教えてくれれば、一致する秘密鍵を保持していることがわかります。次に、ユーザーが認証されます。

AWSは、セキュリティ上の理由から、秘密鍵を保存しないため、ダウンロードして保存する必要があります。秘密鍵はAWSのどこにも保存されないため、EC2インスタンスが安全であると確信できます。

2
JKim

ある意味では、それは重要ではありません。秘密鍵と公開鍵のペアは2つの部分で構成され、どちらが公開鍵であるかはユーザー次第です。何かが1つのキーで暗号化されている場合、それを復号化するにはもう1つが必要です。 1つのキーを公開してもう1つのキーを公開していない場合、秘密キーは公開していないキーです。

実際の質問にたどり着く:おそらくAmazonがあなたに与える鍵はあなたがあなた自身のリソースを制御できるようにすることなので、それは他の人に与えられるべきではありません。このコンテキストでは、少なくともセットアップを行うのに十分な期間、Amazonが秘密鍵を持っていることを信頼する必要があります。

顧客にこの方法でログインしてもらいたい場合は、顧客と共有する準備ができている鍵、つまり公開鍵を提供する必要があります。これをサーバーのauthorized_keysにインストールします。これは、「この公開鍵と一致する秘密鍵を持っている人は誰でもこのリソースにアクセスできる」と効果的に言っています。

1
Dominic Cronin