はじめに
現在、AWS上でRemoteAppという機能を構築中です。RemoteAppはWindowsの標準機能であるリモートデスクトップ接続の発展版みたいなもので、サーバー上にインストールしてある(たとえばVB6等で書かれたレガシーな)アプリケーションを、あたかもローカルで動いているように見せるといったことが可能です。実はAWSにはすでにWorkSpacesという仮想デスクトップを提供するマネージドサービスがあるのですが、とりあえずベースになっている技術も一通り知っておかなければということで。
で、本題ですが、RemoteAppはリモートデスクトップ接続サービス機能を上書き(?)しますので、何らかの原因でRemoteAppにつながらなくなったら、コンソールのないAWSとしては『詰み』となります。これまでも何度かAWSでは痛い目にあっており、環境構築中にリモートデスクトップで入れなくなったらあきらめてインスタンスを作り直していたんですが、逃げてばかりじゃだめだということで、イベントログくらいはみてやろうかと挑戦した次第です。
DCからのリモート操作
使っているサーバーOSはWindows 2012 R2です。RemoteAppではActive Directory(AD)が必須になっていますので、障害となったメンバーサーバーとは別インスタンスとしてADドメインコントローラー(以下DC)を建てています。今回はこのDCからリモートでログを見てみます。
まずDCにログインしてイベントビューアーを起動します。イベントビューアーで『イベントビューアー(ローカル)』をポイントし、[操作]>[別のコンピューターへ接続]を選んで対象のサーバーを入力して接続できます。
接続ポートが塞がっている
ところが、しばらく待たされたあげく、以下のダイアログが表示されました。どうも接続ポートが塞がっているようです。
ということで、今回はこの塞がっているポートをリモートで解除して、リモートからイベントビューアーでつないでやろうというチャレンジの記録です。
PowerShellならログイン可能
まだ勉強中なので全然使いこなせていませんが、Windowsのドメイン環境ではサーバー間でリモート管理ができるようになっているようです。DCでサーバーマネージャーを起動し、[すべてのサーバー]の中に障害となっているサーバーを追加します。対象サーバー上で右クリックして [PowerShell] を選択すると、対象サーバー上で PowerShell が起動します。
[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 コマンドレットで取得できるらしいです。
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-受信)
- リモート イベント ログ管理グループのすべての規則
これらの正式なグループ名にあたりをつけておきます。
$ 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 コマンドレットで行います。
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
この状態で再度イベントビューアーから接続すると、正常に接続できるようになりました。
これで原因究明の第一歩が踏み出せます!
(参考サイト)
Windows PowerShell によるセキュリティ管理が強化された Windows ファイアウォール
(編集後記 - その1)
こんな面倒なことしなくても、ひょっとして、サーバーマネージャー上で直接リモートサーバーのログが確認できるんじゃね?
というのがふと頭をよぎりましたが、すべては勉強のため。後悔はしていない。ちなみに今回が Qiita 初投稿です。
(編集後記その2)
PowerShell/Win32-OpenSSHを事前に建てておいたので実は ssh 経由で入れはしたのですが、コマンドプロンプトや PowerShell が動かせるところまで確認して、その先に進めなくなってしまっていました。PowerShell 勉強しないと…。さらに、サーバーマネージャーから直接 PowerShell で入れることがわかったので、OpenSSH との使い分けがわからなくなって来ています。。。Linux からリモートでコマンド投入するとかファイル転送とかには使えそうですかね。