CloudWatch Logsでリモートデスクトップログを管理

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

はじめに こんにちは。
くコ:彡がトレードマークの阿部です。

CloudWatch Logsを使って、Windowsインスタンスのリモートデスクトップログをアップロード、監視する方法を調べてみました。

やってみたこと

ユーザーがリモートデスクトップ(以下、RDP)接続すると、ログが記録されます。
ログをCloudWatch Logsにアップロードし、フィルタ条件に一致する場合にメール通知します。

構成図

Windows Server 2012 R2では、
イベントビューアー -> アプリケーションとサービス ログ -> Microsoft -> TerminalServices-LocalSessionManagerに
リモートデスクトップの接続ログが残ります。

イベントID:21では、RDPでログインしたユーザーと接続元IPアドレスが記録されます。
21が記録されたら、指定したメールアドレスに通知します。

0

WindowsインスタンスのLaunch

設定手順の紹介に移ります。
CloudWatch Logsにログをアップロードする権限が必要です。
検証では、IAMロールをアタッチしCloudWatchFullAccessポリシーを適用しました。
AMIは"Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2016.05.11 (ami-d67e99b7)"を使用しました。

CloudWatch Logs統合の有効化

Windowsインスタンスにリモートデスクトップ接続し、
スタートメニューから、[EC2ConfigService Settings]を起動します。

1

Generalタブ中、[Enable CloudWatch Logs integration]を選択し、OKをクリックします。

2

JSONファイルの編集

C:\Program Files\Amazon\Ec2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.jsonファイルを編集し、
LocalSessionManagerログをアップロードします。

CloudWatchLogs セクション

RegionをTokyoリージョン(ap-northeast-1)に変更します。
LogGroupは任意の名前に変更します。今回は、TerminalServices-Managerとしました。
LogStreamはデフォルトのままにし、インスタンスIDが適用されるようにします。

{
    "Id": "CloudWatchLogs",
    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
    "Parameters": {
        "AccessKey": "",
        "SecretKey": "",
        "Region": "ap-northeast-1",
        "LogGroup": "TerminalServices-Manager",
        "LogStream": "{instance_id}"
    }
},

セクションの追加

RDPログに関するセッションを追加します。
Idは、アップロードするログの名前を指定します。

FullNameは、イベントビューアーから指定する内容を確認します。
イベントビューアーから[TerminalServices-LocalSessionManager] -> [Operational]を右クリックし、[カスタムビューの作成]を選択します。

3

XMLタブ中のSelect Pathで指定された内容を入力します。

4

Levelsでは、アップロードするログレベルを指定する事が出来ます。
7を指定した場合、全てのログレベルについてアップロードする動作になります。

{
    "Id": "LocalSessionManager",
    "FullName": dows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.
    "Parameters": {
    "LogName": "Microsoft-Windows-TerminalServices-Manager/Operational",
    "Levels": "7"
}

フロー設定

Flowsセクションで、LocalSessionManagerCloudWatchLogsを紐付けます。

"Flows": {
    "Flows": 
    [
        "(LocalSessionManager),CloudWatchLogs"
    ]
}

EC2 Configの再起動

[管理ツール] -> [サービス]を起動します。
Ec2Configを右クリックし、再起動を選択します。

アップロードの確認

Windowsインスタンスにリモートデスクトップし、ログを出力させます。
AWSマネジメントコンソールから、CloudWatch Logsを確認すると、
ロググループTerminalServices-Managerが作成されているはずです。

5

TerminalServices-Managerを選択すると、ログストリームが表示されます。
ログストリームにはインスタンスIDが入ります。

6

ログストーム名を選択すると、アップロードされたログを確認する事が出来ます。
デフォルトでは、作成時刻列が表示されないようです。表示/非表示(歯車マーク)を選択にて、表示する列を選択出来ます。

7

Windowsインスタンスで2台、3台と同じ設定を行うと、ロググループTerminalServices-Manager配下に、
インスタンス毎のログストリームが作成されていきます。

16-2

キーワード検索

アップロードしたログに対して、キーワード検索を行う事が可能です。
ログストリームの選択画面で、検索を行いたいインスタンスIDを選択し[イベントの検索]を選択します。

17

フィルタに「"リモート デスクトップ サービス: セッション ログオンに成功しました"」と入力してみます。
ログインログを一括して確認出来ました。

18

RDP接続時にメールを送信する

メトリクスフィルタの作成

ロググループを選択し、メトリックスフィルタの作成を選択します。

8

フィルターしたい文字列を指定します。
今回は「"リモート デスクトップ サービス: セッション ログオンに成功しました"」としました。
アルファベット文字とアンダースコア以外の文字を含むメトリックスフィルタは二重引用符("")で囲む必要があります。

9

フィルタ名とメトリクス設定を入力し、フィルタを作成します。

11

メトリクスフィルタが設定されます。

12

メトリクスフィルタを作成した事で、
CloudWatchのネームスペースLogMetricsにカスタムメトリクスRDPLogonが作成されました。
フィルタに一致した時に、"1"が記録されます。それ以外の状態は"値なし"となります。

14

アラームの作成

メトリクスに対して、アラームを設定する事が出来ます。
状態が[警告]の時に、通知が行われるようにしました。Amazon SNSによる通知が行われます。

13

リモートデスクトップ接続を行うと、以下メールが送信されました。
AWSアカウントやアラーム名が記載されています。

15

今回行った設定では、アラームメールだけではインスタンスの特定が出来ません。
メールでインスタンスを特定するためには、アラームの命名規則や運用方法等を検討する必要がありそうです。

保存期間の設定

アップロードされたログは、デフォルトでは無期限に保存されます。
[失効しない]を選択すると、ロググループ単位で保持期間を指定する事が可能です。

16

参考

おわりに

CloudWatch Logsを使って、Windowsインスタンスのリモートデスクトップログをアップロード、監視してみました。
リモートデスクトップに限らず、Windows上のログをCloudWatch Logsにアップロードすれば、キーワード検索を行ったり、期限を設定した上で長期保存する事が出来ます。

複数のインスタンスにまたがって検索出来るため、全てのインスタンスに接続してイベントビューワーを確認する。。
といった事も不要になるかと思います。

では、また。