SSMやRDPを使えない状態でWindowsFirewall の設定を無効にする方法
どうもさいちゃんです。皆さんは Windows Firewall が有効になっている事が原因でインスタンスにアクセスが出来なくなり、困ったことはありますか?私はあります。
そこで今回は、プライベートサブネットにある SSM エージェントや RDP 接続ができない Windows の EC2 の Windows Firewall の設定を無効にする方法についてご紹介します。
簡単な背景と作業の流れ
SSM 経由で EC2 インスタンスにアクセスを行う想定で AMI からインスタンスを立ち上げたところ、マネージドノードとしてうまく認識されず、原因の特定のために OS 内の設定等を確認する必要がありました。
インスタンスがプライベートサブネットにあったため踏み台サーバーを立てて RDP をしてみましたが、うまくいきませんでした。 WindowsFirewall が怪しいなと睨んでいたんですが、前述の通り SSM が使えないので WindowsFirewall を無効化する術がないという状態でした。
今回はルートボリュームをアクセスできる別のインスタンスに付け替えて WindowsFirewall を無効にすることにしました。
複数台のインスタンスがある場合はかなり地道な作業になってしまいますが、直接インスタンスへのアクセスや SSM の RunCommand や Fleet Manager などは使えないが、WindowsFirewall をオフにしたい場合にお役立てください。
やってみた
手順をまとめるにあたり、インスタンス名がややこしくなるので以下に統一します。
- WindowsFirewall が有効になっており、アクセスが出来ない状態のインスタンス → Target インスタンス
- WindowsFirewall を無効化するために使用する一時インスタンス → Temp インスタンス
今回こちらの手順をまとめるにあたり、Target インスタンスとなるインスタンスを立ち上げました。(テスト用なので最初はアクセスはできます。)
Windows インスタンスは初期設定で WindowsFirewall がすべて有効になっているはずです。本ブログでは、まずは Target インスタンスの現状の設定を編集し、RDP が出来ない状態を再現して、この設定を無効化する事をゴールとします。
ではさっそく Target インスタンスの設定確認と変更を行います。
事象の再現
Target インスタンスの WindowsFirewall の設定を確認します。
想定通り、ドメイン、プライベート、パブリック、すべてが有効になっています。
では RDP が出来ない状態を再現するためにパブリックの設定を編集します。
赤枠の部分にチェックを入れます。
これで内部ネットワークやドメインネットワークの外からの通信はすべてブロックされるようになります。ローカルマシンからの EIC エンドポイント経由の RDP は内部ネットワークでもドメインネットワークでもないためインスタンスへのアクセスが出来なくなります。
この設定を行うと数秒後に画面が固まり、下記のような画面が表示されインスタンスへのアクセスが遮断されます。
実際アクセスしようとすると下記の様に内部エラーとなります。
今回 EIC エンドポイントを使ってアクセスをしているので、Powershell を確認してみましたが、以下のようなエラーが出てました。
[1] Accepted new tcp connection, opening websocket tunnel.
2025-02-06 20:13:44,584 - awscli.customizations.ec2instanceconnect.websocket - ERROR - [1] Encountered error with websocket: (10053, '確立された接続がホスト コンピューターのソフトウェアによって中止されました。', None, 10053, None)
[1] Closing tcp connection.
ルートボリュームの付け替えと設定
RDP 接続が出来ないことが分かったので、さっそく Temp インスタンスを作成していきます。
設定に特に変わったことはありません。適切なインスタンスタイプとキーペアを選択して、Target インスタンスと同じサブネット内にインスタンスを立ち上げます。
Temp インスタンスを立ち上げたら、Target インスタンスを一旦停止します。
停止したインスタンスの詳細から、ストレージタブを選択し、ルートボリュームのボリューム ID をクリックします。
対象ボリュームが選択された状態の画面へ飛ぶので、そのままボリュームをデタッチします。
アカウント内に複数の EBS ボリュームがある場合等は識別のためにボリュームに名前を付けておくといいと思います。
確認画面になるので、ボリューム ID を確認して デタッチをクリックします。
ボリュームのステータス 使用可能になったら、同じボリュームを今度は Temp インスタンスにアタッチします。
Temp インスタンスを選択し、適切なデバイス名でアタッチします。
Temp インスタンスへアクセスします。
Windows アイコンを右クリックし、 Disk Managementをクリックします。
Disk1 とされているのが新たにアタッチしたボリュームです。Offline となっているので、右クリックで Online を選択します。
これで新しくアタッチしたボリュームが D ドライブとして認識されました。
Windows キー+ R で「ファイル名を指定して実行」ウィンドウを開き、入力ボックスに半角で「 regedit 」と入力し OKをクリックすると、レジストリエディタが開きます。
HKEY_LOCAL_MACHINEを選択し、File > Load Hiveを選択します。
エクスプローラーが開くので、先ほど追加された D ドライブを選択し、HKEY_LOCAL_MACHINE のハイブファイルである、D:\Windows\System32\config\SYSTEMを開きます。
キーの名前を指定できるのでわかりやすい名前を付けます。今回はインスタンスの名前をそのまま付けました。
HKEY_LOCAL_MACHINE配下に先ほど作成したキーが作成されています。
この先ほど作成したキー内の ControlSet001\Services\SharedAccess\Parameters\FirewallPolicyへ移動するとxxxxProfileという名前のキーがあります。これが Windows Firewall の設定情報です。
各キーがどのファイアウォールの設定情報化については以下の通りです。
- DomainProfile → ドメインネットワークファイアウォール
- PublicProfile → パブリックネットワークファイアウォール
- StandardProfile → プライベートネットワークファイアウォール
今回はすべてのファイアウォールの設定をオフにしてみます。すべての Profile キーの 右ペインにある EnableFirewall の値を 1 から 0 へ変えてあげれば、ファイアウォールが無効化されローカルの PC から対象インスタンスに EIC エンドポイント経由で RDP 出来るようになるはずです。
EnableFirewall を右クリックしてModifyをクリックします。
Value data を 0 に設定して OK をクリックします。
EnableFirewall の Data の値が 0 になっていれば OK です。
最後に、作成したキーを選択したままFileから Unload Hiveをクリックします。
確認メッセージが出るので、Yesをクリックします。
HKEY_LOCAL_MACHINE配下に作成していた Target-Instnace のキーが消えていますね。
これで該当のハイブファイルに設定が反映されているはずです。早速ボリュームを付け替えてアクセスしてみましょう。
レジストリエディタを閉じて、再び Windows アイコンを右クリックし、 Disk Managementを開きます。
Disk1 を Offline にします。
D ドライブの表示が消えて、Disk1 が Offline の表示になったら、RDP 接続を終了して、ボリュームをデタッチします。
ボリュームのデタッチは最初の要領で行い、アタッチする際にはルートボリュームとして予約済みの /dev/sda1のデバイス名を選択してボリュームをアタッチしてください。
確認
ローカルマシンから EIC エンドポイント経由で RDP を行ってみます。
無事 RDP 出来ました!
WindowsFirewall の設定も確認してみます。
すべてのファイアウォールの設定がオフになっていることが確認できました。
ディスク署名の編集(オプション)
先述の通り、Target インスタンスを Temp インスタンスの AMI が同じ場合、Temp インスタンスで設定変更したボリュームを再度 Target インスタンスへアタッチした際に、Target インスタンスのステータスチェックに失敗し、うまく起動が出来ないという事象が発生してしまします。
同じ AMI からインスタンスを立ち上げてしまった場合は以下の手順を参考にディスク署名の編集を行ってください。
再度 Windows キー+ R で「ファイル名を指定して実行」ウィンドウを開き、入力ボックスに半角で「 regedit 」と入力し、再度レジストリエディタを開きます。
HKEY_LOCAL_MACHINEを右クリックし、Findを選択します。
検索ボックスが開くので、 Windows Boot Managerと入力して Find Nextをクリックします。
11000001というキーを選択してください。このキーは前の手順で検索したキーの兄弟のようなものです。
右側から Elementを選択して、右クリックしたら Modifyをクリックします。
データのオフセット 0x38 で 4 バイトのディスク署名を見つけます。
下記の様に英数字の文字列が表示されるので 0038 のものを見つけます
...
0030 00 00 00 00 01 00 00 00
0038 A5 3A EB E9 00 00 00 00
0040 00 00 00 00 00 00 00 00
...
順序を逆にしてディスク署名を作成し、メモしておきましょう。例えば上記のデータで表されるディスク署名は E9EB3AA5 となります。
次にコマンドプロンプトを開き、diskpart
コマンドで Microsoft DiskPart を開きます。
C:\Users\Administrator>diskpart
Microsoft DiskPart version 10.0.17763.1911
Copyright (C) Microsoft Corporation.
On computer: EC2AMAZ-V62NTF7
DISKPART>
下記のコマンドを実行して Disk1 を選択します。
DISKPART> select disk 1
Disk 1 is now the selected disk.
下記コマンドを実行して現在のディスク署名を取得します。
DISKPART> uniqueid disk
Disk ID: 0C764FA8
このディスク署名を先ほどメモしたモノに書き換えます。
DISKPART> uniqueid disk id=E9EB3AA5
確認のために再度ディスク署名を確認してみます。
DISKPART> uniqueid disk
Disk ID: E9EB3AA5
書き換わっていることが確認出来たので、コマンドプロンプトを閉じて、そのまま Disk Manager から Disk1 を Offline を確認してください。
あとは、上記で説明しているように Target インスタンスにボリュームを再アタッチすれば OK です。
最後に
今回は EC2 へアクセスが出来ない状態で WindowsFirewall の設定をオフにする方法についてご紹介しました。
SSM が使える環境下であれば、Fleet Manager でのアクセスや、RunCommand を使用して WindowsFirewall の無効化が可能ですが、今回は SSM が使えなかったためこちらの方法で WindowsFirewall を無効化しました。複数のインスタンスで WindowsFirewall を無効化したい場合などは地道な作業となってしまいますが、本ブログがどなたかのお役に立てれば嬉しいです。