この記事では、Amazon EC2 で突然 SSH 接続ができなくなったときに、 どのように原因を特定し、実際に復旧したかを時系列で詳しく解説します。

  • Permission deniedConnection refused が出ている
  • EBS を救出して設定を直したい
  • 「PasswordAuthentication no」で締め出された

こうした状況の人に、きっと役立つ内容です。

1. 発生状況| EC2 で SSH が「Connection refused」になった

2025 年 10 月 18 日、Amazon EC2(Amazon Linux 2023)に SSH 接続を試みた際、次のエラーが発生しました。

ssh: connect to host 57.181.53.168 port 22: Connection refused

Web サイトSIer社員の生存戦略は正常に稼働しており、Apacheも動作中。
しかし SSH だけが完全に拒否され、サーバへログインできない状態になっていました。

2. SSH 接続できなくなった原因の分析

✅ 結論

原因は、以前お名前.comのセキュリティ診断の指摘を受けてSSH 設定を強化したことにありました。 その設定が過剰に厳しく、結果としてサーバが自己ロックアウト状態に陥りました。

具体的には、以下の/etc/ssh/sshd_config の設定です。

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

この設定は一見正しいのですが、次の 3 つの条件が重なり、SSH が完全に使えなくなっていました。

① sshd が設定エラーでクラッシュしていた

sshd(SSH サーバ)は起動時に/etc/ssh/sshd_configを読み込みますが、構文ミスや存在しない設定項目があると、即座にエラー終了します。

実際、systemctl status sshdでは以下のように出ていました:

Active: activating (auto-restart) (Result: exit-code)
Process: 21554 ExecStart=/usr/sbin/sshd -D (code=exited, status=255/EXCEPTION)

つまり、設定ファイルの文法誤りやコメント削除時の改行抜けなどにより、sshdが正常起動できていなかったのです。

.sshディレクトリのパーミッション不整合

sshd はセキュリティ上、権限が少しでも緩いとその鍵を自動的に無視します。
たとえば以下のような状態だと認証が拒否されます。

パス 問題例
/home/ec2-user が 755 他ユーザーに読み取り権限あり
/home/ec2-user/.ssh が 755 鍵が他人に見える可能性
authorized_keys が 644 公開鍵リストが第三者に読める
所有者が root ec2-user 本人のものではない
SELinux ラベル不一致 Amazon Linux では即拒否

この問題は、障害発生時点の原因ではなく、復旧作業中に root 権限で操作した際に一時的に発生した副作用でした。 chroot 環境で .ssh ディレクトリを編集した結果、所有者が root:root になり、 sshd が「ec2-user 本人が管理していない鍵」と判断して無視していました。 そのため、修復の最終段階で公開鍵認証が通らず、接続に失敗する状態となっていました。


③ PasswordAuthentication no により代替経路も封鎖

SSH には複数のログイン方法があります。

  1. 公開鍵認証(pem キー)
  2. パスワード認証
  3. PAM/キーボードインタラクティブ認証

しかしこの設定では:

PasswordAuthentication no
PubkeyAuthentication yes

つまり「鍵だけ許可」。
その鍵が ② の理由で認識されなかったため、全てのログイン手段が失われたのです。

🔄 要因の連鎖まとめ

段階 内容 結果
sshd_config の構文エラー sshd が起動せず「Connection refused」
パーミッション不正 鍵を無視され認証失敗
PasswordAuthentication=no 代替経路が封鎖され完全ロックアウト

3. EC2 SSH 接続を復旧する手順(EBS マウント・chroot 編)

まず、結構色々しているので、大きく 6step に分けると以下のことをやりました。

🧾 今回行った復旧アクション一覧

  1. EBS を他インスタンスに接続して中身を調査
  2. chroot で仮想ログインして設定修正
  3. OpenSSH を再構築(rpm 再インストール)
  4. SSH 設定を初期化
  5. パーミッションと SELinux を修正
  6. EBS を元に戻して再起動

次にそれぞれについて詳細を記載します。

(1) EBS を別インスタンスに接続

AWS マネジメントコンソール(Management Console)から以下の手順でEBSの付け替えをしました。 特に注意点はありませんが、別インスタンスを立ち上げるので、別途料金が発生してしまうことは注意しないとですね。

  1. 元の EC2 インスタンスを停止
  2. ルート EBS ボリュームをデタッチ
  3. 別のインスタンスを起動(同一 AZ 内)
  4. 問題の EBS を /dev/nvme1n1 として接続

(2) マウントと chroot 環境の構築

別インスタンスに元のEBSを繋いで、マウントとchroot環境の構築をします。 ここも、特に詰まるポイントはないと思います。

sudo mkdir /mnt/recovery
sudo mount /dev/nvme1n1p1 /mnt/recovery
sudo chroot /mnt/recovery

💡chroot とは?

chroot は指定ディレクトリを“仮想的なルート(/)”として扱う機能。
壊れた EBS の中にログインしたかのように操作できます。
これにより、停止中のシステムの設定を直接修正可能になります。

(3) OpenSSH の再構築

目的

sshd が壊れている・依存関係が壊れている可能性を排除するため、再インストールを実施。

recoveryインスタンス側で

sudo dnf reinstall -y --downloadonly --downloaddir=/home/ec2-user/sshpkgs openssh openssh-server openssh-clients
sudo cp /home/ec2-user/sshpkgs/*.rpm /mnt/recovery/root/

chroot内で

cd /root
rpm -Uvh --force *.rpm
コマンド 意味
-Uvh アップグレード+インストール
--force 競合しても強制上書き
.rpm OpenSSH 関連パッケージファイル群

この処理で壊れた sshd を健全な状態へ再構築。

(4) SSH 設定をリセット

SSH設定を厳格にしてしまっていたので、一時的に緩和させます。

cat > /etc/ssh/sshd_config <<'EOF'
Port 22
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
UsePAM yes
Subsystem sftp /usr/libexec/openssh/sftp-server
EOF

sshd -t
systemctl enable sshd
systemctl restart sshd
設定 意味
PermitRootLogin yes 緊急時に root ログインを許可
PasswordAuthentication yes パスワードログインを再有効化
PubkeyAuthentication yes 鍵認証を維持
UsePAM yes PAM 経由の認証を許可

※ 本設定は復旧作業のための一時的なものであり、復旧後は「PermitRootLogin prohibit-password」に戻すことを推奨します。


(5) 権限の修正

鍵ファイルの修正もします。 最初に述べたように、sshd はセキュリティ上、権限が少しでも緩いとその鍵を自動的に無視しますので、 この値はちゃんと設定が必要ですね。

chmod 700 /home/ec2-user
chmod 700 /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
chmod 600 /home/ec2-user/.ssh/id_rsa
chmod 644 /home/ec2-user/.ssh/id_rsa.pub
chown -R ec2-user:ec2-user /home/ec2-user/.ssh
restorecon -Rv /home/ec2-user/.ssh
コマンド 目的
chmod 700 ディレクトリを本人専用に
chmod 600 鍵ファイルを本人だけが読めるように
chown 所有者を修正
restorecon SELinux コンテキストを修正

これにより、sshd が鍵ファイルを信頼できるようになります。

(6) EBS を戻して再起動

sudo umount /mnt/recovery

AWS コンソールで EBS を元インスタンスに再接続し、起動。

systemctl status sshd

active (running) であれば復旧成功。 ここまでスムーズに行かなかったので、私は4時間ほど要しました。

4. 再発防止策

対策 内容
設定変更前にバックアップ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
PasswordAuthentication は段階的に no へ 最初から no にしない
構文チェックの徹底 sshd -t 実行で構文エラーを防ぐ
パーミッション確認 ls -ld ~/.sshls -l ~/.ssh/* を都度確認
UserData 過信禁止 編集後再実行されないため復旧用途には不適
recovery 手順を保存 chroot+EBS マウント手法を記録しておく

5. 教訓まとめ

  • 原因:セキュリティ強化による過剰な制限と権限不整合
  • 結果:鍵・パスワードの両方が無効化されログイン不可
  • 対応:EBS マウント+ chroot + OpenSSH 再構築+権限修正
  • 教訓:安全性を上げる前に「再入室ルート」を必ず確保する

EC2 は“中身(EBS)さえ無事なら復活できる”。
今回のトラブルで、それを実感しました。

SIer で働いていると、セキュリティといえば「ネットワークを物理的に遮断する」アプローチが多く、 こうしたサーバ設定レベルでの制御にはあまり触れません。

今回の件で、インフラ管理の基本を改めて学べた気がします。 ただ、貴重な土曜日が潰れたのはやっぱり痛かったですね……(笑)