[AWS EC2]AMI共有でローンチしたインスタンスにSSHしようとすると鍵拒否される問題の解決策
AWSのEC2でAMI共有で共有されたAMIよりローンチしたEC2インスタンスにSSHしようとした際に、AWSコンソールで設定したキーペアを用いているのに鍵が拒否されてしまう問題の対処方法を紹介します!
鍵があっているはずなのにSSHに失敗する!
ある日、あるAWSアカウントで運用していたEC2インスタンスを別のAWSアカウントに移行する必要が生じました。このようなシナリオでは、通常、EC2インスタンスを移行する手段としてAMI(Amazon Machine Image)共有の方法が広く用いられます。私もこの手法を試み、最初にAMIを共有し、その共有されたAMIを用いて新しいAWSアカウント内でEC2インスタンスをローンチしました。
ところが、EC2インスタンスを正常にローンチできたにもかかわらず、そのインスタンスにSSHで接続しようとした際に、以下のようなエラーが表示されました。
認証ログ (詳細はセッション ログを見て下さい):
ユーザ名”ec2-user” を使用中
サーバが鍵を拒否しました
認証に失敗
このエラーメッセージは、AWSにおいてSSH接続に失敗した際に一般的に表示されるものです。私自身、このエラーに困惑し、何度か再試行しましたが、状況は改善されませんでした。そのため、SSH接続が失敗する原因を調査し、解決策を考える必要がありました。このような状況に遭遇した場合のために、原因と2つの解決策をここに書き残しておこうと思います。
原因
AWSのEC2インスタンスでは、セキュリティの観点から公開鍵暗号方式が採用されています。一般的に、EC2インスタンスを初めてローンチする際には、キーペア(公開鍵と秘密鍵)を新規作成するか、既存のキーペアを使用するかを選択することが求められます。
新しいキーペアを作成する場合、EC2インスタンス内部には、
/home/ec2-user/.ssh/authorized_keys
というファイルが自動的に生成され、その中に公開鍵が保存されます。
この公開鍵はインスタンスがローンチされた際に自動的に配置されるため、ユーザーは何もする必要はありません。一方、SSHでインスタンスにアクセスする際には、AWS管理コンソールやCLIを通じてダウンロードした秘密鍵を使用して認証が行われます。
※ここで言う秘密鍵とはユーザー目的のEC2インスタンスにSSHする際に用いる.pemや.ppkファイルのような俗に言うSSHキーのことを指します。
さて、問題の核心は、この「公開鍵と秘密鍵のペア」がEC2インスタンスと密接に結びついている点にあります。AMIを共有し、そのAMIを使用して新しいEC2インスタンスを別のAWSアカウントでローンチした場合でも、元のインスタンスに関連付けられていた公開鍵情報はそのまま引き継がれます。つまり、EC2インスタンス内部に保存されている公開鍵は変更されず、そのまま残ってしまいます。これにより、たとえ新しいキーペアをAWSコンソール上から設定したとしても、インスタンス内部では依然として元の公開鍵が使用されていることになります。
その結果、新しく設定したキーペアの秘密鍵を用いても認証に失敗し、SSH接続ができなくなるのです。これは、AWSアカウントを跨いでAMIを共有する場合にしばしば発生する問題の一つです。
解決策1: 元のキーペアを使用する
最も簡単な解決策は、元々のEC2インスタンスで使用されていたキーペア、すなわち元の環境で使用していた秘密鍵をそのまま利用することです。この場合、既に手元にある元の秘密鍵を使って新しいEC2インスタンスにSSH接続を試みるだけで、問題なく接続できるはずです。
具体的には、次のような流れになります。
- 元のAWSアカウントで使用していた秘密鍵を手元に保管していることを確認します。
- 新しいAWSアカウントでAMI共有を利用してローンチしたEC2インスタンスに、その元の秘密鍵を使ってSSH接続を試みます。
この方法であれば、特に追加の設定変更を行うことなく、比較的簡単にSSH接続が可能です。しかし、この方法にはいくつかの欠点もあります。たとえば、新しいAWSアカウントでローンチしたEC2インスタンスには、新しいキーペアが設定されているにもかかわらず、実際にはその新しいキーペアは使用されず、元のキーペアが引き続き使われることになります。これにより、キーペアの管理が混乱し、将来的な運用に支障をきたす可能性があります。
解決策2:元のキーペアをインポートしておく
そこで、より運用上の一貫性を保つためには、新しいAWSアカウントで使用するキーペアを適切に管理する必要があります。具体的には、以下の手順を踏むことで、新しいキーペアをインポートし、運用に一貫性を持たせることができます。
1.元のAWSアカウントで運用していたEC2インスタンスにSSH接続し、
/home/ec2-user/.ssh/authorized_keys ファイル
を取得します。
このファイルには、元のインスタンスで使用されていた公開鍵が含まれています。このファイルをローカルマシンに保存します。
2.次に、移行先のAWSアカウントにログインし、EC2ダッシュボードに移動します。そこで、キーペアのページにアクセスします。
3.キーペアのページで「アクション」を選択し、「キーペアをインポート」をクリックします。
4.表示される画面で、インポートするキーペアに適切な名前を付け、「閲覧」より先ほど保存しておいたauthorized_keys ファイルを指定してインポートします。名前は元のEC2インスタンスで使用していたキーペアの名前を付けると、運用上の管理が容易になるでしょう。
5.最後に、共有されたAMIから新しいEC2インスタンスをローンチする際には、ここでインポートしたキーペアを選択します。これにより、公開鍵が一貫して管理され、新しい環境でもSSH接続が可能になります。
この方法を用いることで、AWSコンソール上で指定されたキーペアと実際に使用するキーペアが一致し、将来的な運用やトラブルシューティングにおいても混乱を避けることができます。
まとめ
AWSアカウント間でEC2インスタンスを移行する際に、AMI共有を使用するのは一般的な手法ですが、キーペアの扱いには注意が必要です。元のインスタンスの公開鍵がそのまま引き継がれるため、新しいキーペアを設定してもそのままではSSH接続ができなくなります。
そのため、元の秘密鍵をそのままSSH時に使用する方法か、もしくは運用上の一貫性を保つために元のキーペアを移行先のAWS環境にインポートして運用する方法を選択する必要があります。
カテゴリー: