【過去こんなことがあったなシリーズ②】AWS EC2(Ubuntu)がファイアウォール設定のミスでSSHログインが出来なくなった時の対処方法
過去の出来事
PaaSに頼り切っているクラウド兼インフラエンジニアです。前回に続き、「過去こんなことがあったなシリーズ」を記事にしたいと思います。
今回もAWS EC2(Ubuntu)がファイアウォール設定のミスでSSHログインが出来なくなった時の対処方法を取り上げたいと思います。
失敗談
- 前回と同じユーザーと公開鍵&秘密鍵でSSHログインの仕様です。詳細は下記、URLを参照してください。
- まず流れは下記の通り。(スクショは検証環境で再現しました)
- Ubuntuではデフォルトではファイアウォールは無効設定です。Ubuntuにはデフォルトでufwというファイアウォール管理コマンドが用意されています。下記のコマンドで有効化しました。
ufw enable
-
その後、"fifewalld"というファイアウォールを有効化したところ、環境が落ちて、更にSSHログインを実施してもログインできない事態が発生...(またバックアップを取得していなかったです...)
-
調査したところ、ufwとfirewalldが競合するとすべてのポートが閉じられてしまうことが判明。
解決方法
- 前回と同じようにAWS EC2のユーザーデータスクリプトを使用する方法を用いました。
-
AWSコンソールに入る。
https://ap-northeast-1.console.aws.amazon.com/ -
検索欄で「EC2」を検索し、[EC2]をクリックする。
-
[インスタンス]をクリックする。
-
対象のインスタンスのチェックボックスをクリックする。
-
[インスタンスの状態]をクリックし、[インスタンスを停止]をクリックする。
※インスタンスを停止しないと、AWS EC2のユーザーデータスクリプトの設定が不可能なため。
-
インスタンスの停止を確認後、対象のインスタンスのチェックボックスをクリックする。
-
[アクション]→[インスタンスの設定]→[ユーザーデータを編集]の順番でクリックする。
-
[ユーザーデータをテキストで変更]を選択する。ユーザーデータに下記のスクリプトをコピペし、[保存]をクリックする。今回はファイアウォールの削除と無効化の"sudo systemctl disable firewalld"、"sudo apt remove --purge fifewalld"、"sudo disable ufw"の記載を忘れずに行います。ファイアウォール削除&無効化のスクリプトを実行させます。
- 全体的には下記の記載になります。
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 systemctl disable firewalld
sudo apt remove --purge fifewalld
sudo disable ufw
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上で設定することをお勧めします!!
参考URL
Discussion