【GCE/CentOS 7】Google Compute Engine で ssh に繋がらない(sshd起動失敗)場合の復旧方法

こちらを参考に初期設定を進めていたのですが、ssh のポート番号を変更する箇所でミスをしてしまい、sshd が起動できなくなって ssh 接続できくなりました…。AWS の記事はよく見かけるのですが、GCEのケースはほぼ見つからなかったので、まとめておきます。

まずはシリアルコンソールに繋げるようにする

GCEには「シリアルコンソール」という、さくらVPSなどでおなじみの緊急用コンソールが存在します。VMインスタンス→インスタンス名→編集→「カスタム メタデータ」という設定箇所があるので、のキーに「startup-script-url」値に「1」を設定します。

インスタンスを再起動(しなくていもいいかも?)した後に、VMインスタンス→インスタンス名→「リモート アクセス」のシリアルコンソールをクリックして接続できます。

起動スクリプトを使って復旧する

ようやくシリアルコンソールに接続できるようにしたものの、「sshd.service failed」というメッセージが表示されているだけで、何かコマンドを叩いても root のパスワードを聞かれたりして、何の操作もできない状況でした。

いろいろ調べてみると、stackoverflow で「SSH service broken after sshd_config was modified」という記事が見つかりました。まずはブートディスクを変更する方法。

Delete the instance keeping the boot disk, attach it to another instance as secondary, modify the sshd_config file, detach the disk and then create a new instance using that disk.

最悪この方法もありのようですが、私は起動スクリプトを利用する方法で対応しました。

!/bin/bash

/bin/sed -i.bak ‘s/^Port .*/Port 22/g’ /etc/ssh/sshd_config

This startup-script will modify the line that starts with “Port” to “Port 22”. Also it will create a backup at /etc/ssh/sshd_config.bak.

After updating the instance metadata with the startup-script you need to reboot the instance because startup-scripts are executed when the instances boot up. Once you gain access to the instance, remove the script in order to avoid executing it to no avail.

VMインスタンス→インスタンス名→編集→「カスタム メタデータ」の設定箇所から、キーを「startup-script」値を以下に設定すると、PORT番号を元に戻すことが出来ました。

#!/bin/bash
/bin/sed -i.bak 's/^Port .*/Port 22/g' /etc/ssh/sshd_config

再起動を2回ほど行うと、接続できるようになるかと思います。

iptables(firewall)とSELinuxの無効化を忘れずに…

そもそもsshdの起動に失敗した原因ですが、GCPで無料枠のサーバを立るときに、初見でハマりそうなところ のsshポート変更の手順が少し雑で、CentOSで標準に備わっている SELinux と iptables(firewall) の無効化を行っていないことが原因でした。

sudo systemctl disable firewalld
sudo vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled

必ずsshd_configの編集を行う前に対応して下さい。完了したらサーバを再起動し、

systemctl is-enabled firewalld
getenforce

を叩き、どちらも disabled(Disabled)となっていれば問題ありません。ちなみに firewalld はGCE側の設定だけあれば基本的には十分なので、常にdisabledで問題ないでしょう。