EC2で秘密鍵を無くしたインスタンスへSSMでログインする方法

インスタンスにsshでログインするときに秘密鍵が必要ですが、それをなくしてしまった場合のログイン方法の紹介です。

AMIをとって復旧する場合の手順は色んなところに書いてありますが、その方法だとサーバー自体が変わってしまいます。

今回はサーバーを変えずにログインする方法を紹介します。 (AmazonLinux2を使っています。)

この方法では、AWS Systems Manager(SSM)を使って復旧をさせます。

もし、ログインできなくなる前にSSMの起動を行っていなければ下記手順はできないので別の方法を取って下さい。

尚、AmazonLinux2ではデフォルトでSSMが自動的に起動するようになっています。

IAMロールの割り当て

まずは適切な権限を設定します。 EC2インスタンスの一覧画面でログインしたいインスタンスを右クリックし、メニュー内の「インスタンスの設定」から「IAMロールの割り当て/置換」を選びます。

次にIAMロールの割り当てを行います。AWS Systems Managerによって操作ができるためのロールが既にあれば、それを選択して、右下にある適用ボタンを押せば大丈夫です。

新しくSystems Manager用のロールを作る場合、「新しいIAMロールを作成する」をクリックします。

その後、「ロールの作成」をクリックします。

ロールを使用するサービスの選択のところでEC2を選択し、右下にある「次のステップ:アクセス権限」をクリックします。

そうすると、たくさんのポリシーが出てきますが、その中でだいぶ下の方にある「AmazonSSMFullAccess」という名前のポリシーにチェックを入れて、右下にある「次のステップ:確認」をクリックします。

そこで、ロール名を入力して、「ロールの作成」を押せば完成です。後は、上記のとおりに、ロールの割り当てをしましょう。

インスタンスのパスワード認証を有効化

AWS Systems Managerを使うとログインせずに、シェルスクリプトを実行することができるので、シェルスクリプトでパスワード認証を有効化し、秘密鍵ではなく、パスワードを使ってログインできるようにするという方針で行きます。

EC2インスタンスの一覧画面の左側にある、「コマンドの実行」をクリックします。

続いて、「コマンドを実行」を押します。

続いて、「コマンドのドキュメント」欄から「AWS-RunShellScript」を選びます。

続いて、「インスタンスの選択」から、ログインしたいインスタンスを選択します。(IAMロールの設定が反映されるまでに時間がかかってしまって、「インスタンスの選択」を押してもログインしたいインスタンスがなかなか出ないことがあるようです。しばらく待ちましょう。)

続いて、Commandsの欄に以下のスクリプトを書いてください。

useradd test_user
echo "test_user:test" | chpasswd
echo "test_user ALL=(ALL) ALL" >> /etc/sudoers
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org 
echo "PasswordAuthentication yes" > /etc/ssh/sshd_config
systemctl start sshd

そして、一番下にある実行ボタンを押せば大丈夫です。これで、ユーザー名test_user、パスワードtestのユーザーが作成されます。

ssh test_user@IP

を実行するとパスワードが要求されるので、testを打てば、ログインできます。 なお、上のスクリプトで、test_userはsudoが使えるようにしてあります。

パスワードログインの許可は、セキュリティレベルを下げることになるので、一時的に許可したあとには、また鍵認証を再設定してパスワード認証を閉じましょう。