CloudWatch Logsでリモートデスクトップログを管理
はじめに
はじめに こんにちは。
くコ:彡がトレードマークの阿部です。
CloudWatch Logsを使って、Windowsインスタンスのリモートデスクトップログをアップロード、監視する方法を調べてみました。
やってみたこと
ユーザーがリモートデスクトップ(以下、RDP)接続すると、ログが記録されます。
ログをCloudWatch Logsにアップロードし、フィルタ条件に一致する場合にメール通知します。
Windows Server 2012 R2では、
イベントビューアー -> アプリケーションとサービス ログ -> Microsoft -> TerminalServices-LocalSessionManagerに
リモートデスクトップの接続ログが残ります。
イベントID:21では、RDPでログインしたユーザーと接続元IPアドレスが記録されます。
21が記録されたら、指定したメールアドレスに通知します。
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]を起動します。
Generalタブ中、[Enable CloudWatch Logs integration]を選択し、OKをクリックします。
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]を右クリックし、[カスタムビューの作成]を選択します。
XMLタブ中のSelect Path
で指定された内容を入力します。
Levels
では、アップロードするログレベルを指定する事が出来ます。
7を指定した場合、全てのログレベルについてアップロードする動作になります。
{ "Id": "LocalSessionManager", "FullName": dows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows. "Parameters": { "LogName": "Microsoft-Windows-TerminalServices-Manager/Operational", "Levels": "7" }
フロー設定
Flowsセクションで、LocalSessionManager
とCloudWatchLogs
を紐付けます。
"Flows": { "Flows": [ "(LocalSessionManager),CloudWatchLogs" ] }
EC2 Configの再起動
[管理ツール] -> [サービス]を起動します。
Ec2Configを右クリックし、再起動を選択します。
アップロードの確認
Windowsインスタンスにリモートデスクトップし、ログを出力させます。
AWSマネジメントコンソールから、CloudWatch Logsを確認すると、
ロググループTerminalServices-Manager
が作成されているはずです。
TerminalServices-Manager
を選択すると、ログストリームが表示されます。
ログストリームにはインスタンスIDが入ります。
ログストーム名を選択すると、アップロードされたログを確認する事が出来ます。
デフォルトでは、作成時刻列が表示されないようです。表示/非表示(歯車マーク)を選択にて、表示する列を選択出来ます。
Windowsインスタンスで2台、3台と同じ設定を行うと、ロググループTerminalServices-Manager
配下に、
インスタンス毎のログストリームが作成されていきます。
キーワード検索
アップロードしたログに対して、キーワード検索を行う事が可能です。
ログストリームの選択画面で、検索を行いたいインスタンスIDを選択し[イベントの検索]を選択します。
フィルタに「"リモート デスクトップ サービス: セッション ログオンに成功しました"」と入力してみます。
ログインログを一括して確認出来ました。
RDP接続時にメールを送信する
メトリクスフィルタの作成
ロググループを選択し、メトリックスフィルタの作成を選択します。
フィルターしたい文字列を指定します。
今回は「"リモート デスクトップ サービス: セッション ログオンに成功しました"」としました。
アルファベット文字とアンダースコア以外の文字を含むメトリックスフィルタは二重引用符("")で囲む必要があります。
フィルタ名とメトリクス設定を入力し、フィルタを作成します。
メトリクスフィルタが設定されます。
メトリクスフィルタを作成した事で、
CloudWatchのネームスペースLogMetrics
にカスタムメトリクスRDPLogon
が作成されました。
フィルタに一致した時に、"1"が記録されます。それ以外の状態は"値なし"となります。
アラームの作成
メトリクスに対して、アラームを設定する事が出来ます。
状態が[警告]の時に、通知が行われるようにしました。Amazon SNSによる通知が行われます。
リモートデスクトップ接続を行うと、以下メールが送信されました。
AWSアカウントやアラーム名が記載されています。
今回行った設定では、アラームメールだけではインスタンスの特定が出来ません。
メールでインスタンスを特定するためには、アラームの命名規則や運用方法等を検討する必要がありそうです。
保存期間の設定
アップロードされたログは、デフォルトでは無期限に保存されます。
[失効しない]を選択すると、ロググループ単位で保持期間を指定する事が可能です。
参考
- CloudWatch へのパフォーマンスカウンタの送信と EC2Config を使用した CloudWatch Logs へのログの記録(Amazon Elastic Compute Cloud Microsoft Windows インスタンス用ユーザーガイド)
- フィルタとパターンの構文(Amazon CloudWatch 開発者ガイド)
おわりに
CloudWatch Logsを使って、Windowsインスタンスのリモートデスクトップログをアップロード、監視してみました。
リモートデスクトップに限らず、Windows上のログをCloudWatch Logsにアップロードすれば、キーワード検索を行ったり、期限を設定した上で長期保存する事が出来ます。
複数のインスタンスにまたがって検索出来るため、全てのインスタンスに接続してイベントビューワーを確認する。。
といった事も不要になるかと思います。
では、また。