【過去こんなことがあったなシリーズ①】AWS EC2(Ubuntu)がファイアウォール設定のミスでSSHログインが出来なくなった時の対処方法
過去の出来事
PaaSに頼り切っているクラウド兼インフラエンジニアです。「過去こんなことがあったなシリーズ」を記事にしたいと思います。
今回はAWS EC2(Ubuntu)がファイアウォール設定のミスでSSHログインが出来なくなった時の対処方法を取り上げたいと思います。
失敗談
- ユーザーと公開鍵&秘密鍵でSSHログインの仕様です。まず流れは下記の通り。(スクショは検証環境で再現しました)
- Ubuntuではデフォルトではファイアウォールは無効設定です。有効化するには下記のコマンドを実行しました。
ufw enable
- 当時、80番ポートと443番ポートを開けました。
ufw allow 80
ufw allow 443
- 更に誤ってこのコマンドを実施。これが原因でSSHログインが不可能になりました。
ufw delete allow 'Apache'
- 当時、検証環境ではあったのですが作業前にバックアップを取得せずに作業しており、急にネットの調子が悪くなり、接続が遮断されました。再度、SSHログインしたところ、「あれ!?できない...」と焦る事態が発生しました。
当時取った対応策
①セキュリティグループの設定確認
既にセキュリティグループの設定で22番ポート、80番ポートと443番ポートを開けていたが、接続不可のままでした。
②EBSボリュームの切り離しと新しいインスタンスへのアタッチ
EBSボリュームを切り離して、新しくインスタンスを作成を実施。その後、新しいインスタンスの方にEBSボリュームをアタッチしましたがこちらも接続が失敗しました。デバイスを変更しても同様でした。(下記のURL参照)
③EC2 Instance Connectの使用
試してみたが接続できませんでした。
④AWS Systems Manager Session Managerの使用
AWS Systems Manager Session Managerを使用するといった情報も見つけましたが、インスタンスにSSMエージェントをインストールしていないのでこれもダメでした。
解決方法
- ひたすら調査した結果、AWS EC2のユーザーデータスクリプトを使用する方法で解決しました!!その手順を共有します。
-
AWSコンソールに入る。
https://ap-northeast-1.console.aws.amazon.com/ -
検索欄で「EC2」を検索し、[EC2]をクリックする。
-
[インスタンス]をクリックする。
-
対象のインスタンスのチェックボックスをクリックする。
-
[インスタンスの状態]をクリックし、[インスタンスを停止]をクリックする。
※インスタンスを停止しないと、AWS EC2のユーザーデータスクリプトの設定が不可能なため。
-
インスタンスの停止を確認後、対象のインスタンスのチェックボックスをクリックする。
-
[アクション]→[インスタンスの設定]→[ユーザーデータを編集]の順番でクリックする。
-
[ユーザーデータをテキストで変更]を選択する。ユーザーデータに下記のスクリプトをコピペし、[保存]をクリックする。今回は"sudo ufw disable"の記載を忘れずに行います。ファイアウォール無効化のスクリプトを実行させます。
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type:
text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
iptables -P INPUT ACCEPT
iptables -F
sudo ufw disable
sudo apt-get remove firewalld
systemctl restart sshd.service || service sshd restart
if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
--//
- その後、インスタンスを起動させ、SSHログインができるようになりました!!なお、ユーザーデータが残したままにすると再起動のたびに実行されるように今回設定され、再起動のたびにiptablesのフラッシュとufw(ファイアウォール)の無効化が行われてしまうので、またインスタンスを停止する手間が発生しますがユーザーデータは無記載の状態に戻すことをお勧めします。
伝えたいこと
- こういった失敗談を共有するのも大切だと思い、今回は記事にしました!
- AWSではクラウド上にセキュリティグループがあり、ファイアウォールの役割を果たしているので環境内で設定するよりはAWS上で設定することをお勧めします!!
- 次回も「【過去こんなことがあったなシリーズ②】AWS EC2(Ubuntu)がファイアウォール設定のミスでSSHログインが出来なくなった時の対処方法」を公開します!!
参考URL
Discussion