PowerShellでWindowsファイアーウォールの制限を緩和

# はじめに
　現在、AWS上でRemoteAppという機能を構築中です。RemoteAppはWindowsの標準機能であるリモートデスクトップ接続の発展版みたいなもので、サーバー上にインストールしてある（たとえばVB6等で書かれたレガシーな）アプリケーションを、あたかもローカルで動いているように見せるといったことが可能です。実はAWSにはすでにWorkSpacesという仮想デスクトップを提供するマネージドサービスがあるのですが、とりあえずベースになっている技術も一通り知っておかなければということで。

　で、本題ですが、RemoteAppはリモートデスクトップ接続サービス機能を上書き(?)しますので、何らかの原因でRemoteAppにつながらなくなったら、コンソールのないAWSとしては『詰み』となります。これまでも何度かAWSでは痛い目にあっており、環境構築中にリモートデスクトップで入れなくなったらあきらめてインスタンスを作り直していたんですが、逃げてばかりじゃだめだということで、イベントログくらいはみてやろうかと挑戦した次第です。

![リモートコンピューターに接続できません.png](https://qiita-image-store.s3.amazonaws.com/0/47305/d65ec63e-b26b-8d90-9cfb-f38a088db6bd.png)

# DCからのリモート操作

　使っているサーバーOSはWindows 2012 R2です。RemoteAppではActive Directory(AD)が必須になっていますので、障害となったメンバーサーバーとは別インスタンスとしてADドメインコントローラー（以下DC）を建てています。今回はこのDCからリモートでログを見てみます。

　まずDCにログインしてイベントビューアーを起動します。イベントビューアーで『イベントビューアー（ローカル）』をポイントし、[操作]＞[別のコンピューターへ接続]を選んで対象のサーバーを入力して接続できます。

![イベントビューアー-コンピューターの選択.png](https://qiita-image-store.s3.amazonaws.com/0/47305/a265539c-21cc-7e28-9c88-cb3f6f177998.png)

# 接続ポートが塞がっている

　ところが、しばらく待たされたあげく、以下のダイアログが表示されました。どうも接続ポートが塞がっているようです。

![イベントビューアー-接続タイムアウト.png](https://qiita-image-store.s3.amazonaws.com/0/47305/faea66f8-eeb6-5317-d879-1edbd6c0126f.png)

　ということで、今回はこの塞がっているポートをリモートで解除して、リモートからイベントビューアーでつないでやろうというチャレンジの記録です。

# PowerShellならログイン可能

　まだ勉強中なので全然使いこなせていませんが、Windowsのドメイン環境ではサーバー間でリモート管理ができるようになっているようです。DCでサーバーマネージャーを起動し、[すべてのサーバー]の中に障害となっているサーバーを追加します。対象サーバー上で右クリックして [PowerShell] を選択すると、対象サーバー上で PowerShell が起動します。

![すべてのサーバー.png](https://qiita-image-store.s3.amazonaws.com/0/47305/2b683910-8b26-7bad-532b-7278622ede7e.png)


```ps1
[rds-test.union-test.local]: PS C:\Users\administrator.UNION-TEST\Documents> cd \
[rds-test.union-test.local]: PS C:\> 
```

プロンプトが長いので、以下プロンプトは単に “PS C:\>” で表します。これで障害となっているサーバー上で、PowerShell のコマンドを発行できるようになりました。

（ひょっとして、コマンド（機能）単位で GUI によるリモート操作もできるのかもしれません。知っている方は教えてください。）


# Windowsファイアーウォールの設定

　Windows ファイアーウォールルールの一覧は、Get-NetFirewallRule コマンドレットで取得できるらしいです。

```ps1
PS C:\> Get-NetFirewallRule

Name                  : vm-monitoring-icmpv6
DisplayName           : 仮想マシンの監視 (エコー要求 - ICMPv6 受信)
Description           : エコー要求のメッセージは、他のノードに対する ping 要求として送信されます。
DisplayGroup          : 仮想マシンの監視
Group                 : @vmicres.dll,-700
Enabled               : False
Profile               : Any
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

Name                  : vm-monitoring-rpc
DisplayName           : 仮想マシンの監視 (RPC)
.....
```
（以下、数千行にわたってルールの一覧と現在の状態が表示される）


目 grep はツラいので、出力をテキストをファイルに UTF-8 で保存して Linux に転送しました。許可が必要な規則は、前述の警告ダイアログによると以下の通りです。

- COM+ ネットワーク アクセス（DCOM-受信）
- リモート イベント ログ管理グループのすべての規則
 
これらの正式なグループ名にあたりをつけておきます。

```bash
$ cat Get-NetFirewallRule.txt | grep -C 2 -E '(DCOM-受信|ログ管理)' | grep -E '^(Name|DisplayName|DisplayGroup)'
Name                  : RemoteEventLogSvc-In-TCP

DisplayGroup          : リモート イベントのログ管理
Name                  : RemoteEventLogSvc-NP-In-TCP
DisplayName           : リモート イベントのログ管理 (NP 受信)
DisplayGroup          : リモート イベントのログ管理
Name                  : RemoteEventLogSvc-RPCSS-In-TCP
DisplayName           : リモート イベント ログ管理 (RPC-EPMAP)
DisplayGroup          : リモート イベントのログ管理
Name                  : ComPlusNetworkAccess-DCOM-In
DisplayName           : COM+ ネットワーク アクセス (DCOM-受信)
DisplayGroup          : COM+ ネットワーク アクセス
Name                  : ComPlusRemoteAdministration-DCOM-In
DisplayName           : COM+ リモート管理 (DCOM-受信)
```

Windows ファイアーウォールルールの設定は、Set-NetFirewallRule コマンドレットで行います。

```ps1
PS C:\> Set-NetFirewallRule -DisplayGroup "リモート イベントのログ管理" –Enabled True -RemoteAddress 172.16.1.8
PS C:\> Set-NetFirewallRule -DisplayGroup "COM+ ネットワーク アクセス" –Enabled True -RemoteAddress 172.16.1.8
```

この状態で再度イベントビューアーから接続すると、正常に接続できるようになりました。

![イベントビューアー-接続完了.PNG](https://qiita-image-store.s3.amazonaws.com/0/47305/80f27e5b-dbd2-d861-66ab-976d28d0c5e3.png)

これで原因究明の第一歩が踏み出せます！

（参考サイト）
[Windows PowerShell によるセキュリティ管理が強化された Windows ファイアウォール](https://msdn.microsoft.com/ja-jp/library/hh831755(v=ws.11).aspx)

（編集後記 - その１）
こんな面倒なことしなくても、ひょっとして、サーバーマネージャー上で直接リモートサーバーのログが確認できるんじゃね？
というのがふと頭をよぎりましたが、すべては勉強のため。後悔はしていない。ちなみに今回が Qiita 初投稿です。

![サーバーマネージャー-リモートサーバーのログ.png](https://qiita-image-store.s3.amazonaws.com/0/47305/68d9b7e8-c3db-6049-5d4d-0d3d40eee5c1.png)

（編集後記その２）
[PowerShell/Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH)を事前に建てておいたので実は ssh 経由で入れはしたのですが、コマンドプロンプトや PowerShell が動かせるところまで確認して、その先に進めなくなってしまっていました。PowerShell 勉強しないと…。さらに、サーバーマネージャーから直接 PowerShell で入れることがわかったので、OpenSSH との使い分けがわからなくなって来ています。。。Linux からリモートでコマンド投入するとかファイル転送とかには使えそうですかね。