ある日、いつも通りEC2インスタンスへSSH接続しようとしたら、突然つながらなくなりました。
IPアドレスも間違っていないし、秘密鍵のパスも合っています。 前日までは普通に接続できていたのに。

さらに、そのときの対処をまとめた自分のブログ記事を確認しようとしたのですが、
そもそもそのブログ自体がEC2上で動いているため、当然アクセスできないというオチ。笑
自分の技術ブログに技術ログを残しても、肝心のブログが落ちていたら見られないんですよ、、、

仕方なくGitから過去の記録を辿ったのですが、今回の問題は別の原因だと判明しました。
この記事では、その原因と対処についてまとめていきます。


しばしの調査と気づき

問題の切り分けをおこなうために、まず、SSHをデバックモードで実施しました。

ssh -vvv -i xxxxxxx.pem ec2-user@xx.xx.xx.xx

するとログの中に identity file xxx.pem type -1と表示され、秘密鍵が認識されていない様子でした。

そこで秘密鍵ファイルのアクセス権を確認し、試しにchmod 600へ変更して再接続。 すると、なんと接続が復活しました。 やったことはそれだけです。

chmod 400 と 600 の違いをおさらい

Linuxでは、ファイルのアクセス権を3桁の数字で表します。
それぞれの数字には「読み取り (r)」「書き込み (w)」「実行 (x)」の権限が対応しています。

設定値 内容 意味
400 所有者のみ読み取り可 秘密鍵として最も安全な設定
600 所有者が読み取り・書き込み可 書き換え可能なため、SSHが拒否することがある

SSHでは、セキュリティ上の理由から、
「他のユーザーからアクセスできる可能性がある鍵」を拒否します。
そのため、AWS公式ドキュメントでも秘密鍵はchmod 400にするよう明記されています。

もしかすると、元々400に設定していたものを、いつの間にか600に変更してしまったのかもしれません。 そんなことはないと思うのですが、、、

今回の教訓:まずは基本設定から疑う

当初は「サーバーが落ちたのでは?」と思いましたが、
結果としては単純なローカル設定ミスでした。

SSH接続ができないときは、焦る前に次の3つを確認するのがおすすめです。

  1. 秘密鍵ファイルのパーミッション(chmod 400
  2. 接続先IPアドレスとセキュリティグループ設定
  3. インスタンスが起動中か(AWSコンソールで要確認)

この3つを順にチェックするだけで、原因の大半は特定できます。

💡VS Codeを利用している人は、以下の記事も参考になると思います。
EC2でRemote-SSHが頻繁に切れる原因と対処法【VSCode接続エラー解説】

ふりかえり:今回の経験から得た教訓

  • 秘密鍵のパーミッションは、400にする必要がある。※600でも動くことはありますが、400が安全かつ確実。
  • 突然のSSH接続不可時は、まず「権限設定」「IPアドレス変更」「インスタンスの状態」など基本からチェックすること。
  • ssh -vvvなどのデバッグモードで詳細ログを確認すると、原因特定が早くなる。
  • AWSのインフラも人が運用しているので、細かな環境の変化に気を配る必要がある。