質問: ###### やったこと ``` 1:AWSでEC2インスタンスを作成。 2:EC2作成後、AWS上で「キーペア」を作成し、〇〇.pem(〇〇はキーペア名)をダウンロード。 3:その〇〇.pemをキーペアとしてEC2インスタンスに結びつける。 4:自分のPCの.sshディレクトリに〇〇.pemを格納。 5:sshコマンドを使用してダウンロードした〇〇.pemを指定し作成したEC2インスタンスに接続。 ``` ###### 質問したいこと 先日、ネットで「公開鍵」と「秘密鍵」について学習をしました。 この〇〇.pemという鍵は公開鍵に当たるのでしょうか? 公開鍵である場合、EC2サーバー側には公開鍵+秘密鍵がある気がしますが、EC2インスタンスに接続し.sshのディレクトリを開いてもauthorized_keysというファイルしかありません。 * 質問1:〇〇.pemという鍵は一体何者なのか * 質問2:なぜEC2インスタンスの中にはauthorized_keysしかないのか(そもそもどういう仕組みでssh接続が行われているのか) すいません教えてください!!!
回答: > > 質問1:〇〇.pemという鍵は一体何者なのか > > > SSH の認証で使われる秘密鍵ファイルです。 > > 質問2:なぜEC2インスタンスの中にはauthorized_keysしかないのか(そもそもどういう仕組みでssh接続が行われているのか) > > > SSH の公開鍵認証では、接続時に共有した値に対してクライアントが秘密鍵で署名して送り、サーバ側がその署名が正しいものである事を公開鍵で検証出来たら認証された事になります。 サーバ側での認証に使用する公開鍵の置き場所が authorized_keys です。なのでサーバ側には authorized_keys のみがあればOKです。 #### クライアント側に公開鍵は必要か 別の回答についているコメントですが、誤解している人が多いので説明を書きます。 まず結論から書くと、**クライアント側にも公開鍵は必要**です。ただし公開鍵ファイルという形である必要はありません。 SSH ではクライアント(C)とサーバ(S)は以下のような手順(プロトコル)で公開鍵認証を行います。 1. C: この公開鍵で認証を行っていい? (公開鍵を送る) 2. S: OK/NGだよ (authorized_keysに登録されているか確認して回答する) 3. C: この公開鍵で認証してね、署名はこれね (公開鍵と署名データを送る) 4. S: OK/NGだよ (署名を検証して回答する) 上記のように、公開鍵認証を行う時はクライアントは公開鍵を送る必要があります。 しかし実際には OpenSSH の SSH クライアント(ssh コマンド)は秘密鍵ファイルがあれば公開鍵ファイルが無くても認証を行えます。 これは、秘密鍵ファイルの中には秘密鍵だけではなく公開鍵の情報も入っているからです。 ssh コマンドは公開鍵ファイルが無い場合はこの秘密鍵ファイルの中にある公開鍵を取り出して使うため、公開鍵ファイルが無くても認証が行えます。 秘密鍵ファイルに公開鍵の情報が入っている事は、以下のコマンドで秘密鍵ファイルから公開鍵が取り出せる事からもわかります。 ``` ssh-keygen -f 秘密鍵ファイル -y ``` ssh コマンドでは、公開鍵ファイルと秘密鍵ファイルの中の公開鍵では公開鍵ファイルの方を優先する為、公開鍵ファイルが壊れていたり、別の鍵の公開鍵だったりすると公開鍵認証が行えなくなるというのも覚えて置くといいと思います。 自分側に公開鍵が必要じゃないのかというのは、中々いい着眼点だと思います。