Windowsのイベントログを可視化してみる~CloudWatch Logs,Elasticsearch,Kibana編~

記事タイトルとURLをコピーする

こんにちは。技術1課の高橋です。

先日ジョン・ブルックフィールドの「握力王」という本を買いました。握力を高めるには地道なトレーニングが不可欠のようです。

さて今回、CloudWatch Logs,Amazon Elaticsearch ServiceおよびKibanaで、 Windowsのイベントログを可視化する方法をご紹介します。

このシステムを利用することで、文字だけでは分かりにくいWindowsのイベントログを、特定のイベントがいつ何時、どれだけ発生したかを簡単にグラフに出力して確認することができます。

システム構成図

Kibana_Elasticsearch1202109

本システムの構成図は上記の通りです。

EC2インスタンス(Windows)内のCloudWatch Logs Agentから、イベントログをCloudWatchに送信します。

CloudWatchにアップロードされたログはLambdaによりAmazon Elasticsearch(以下、ES)にストリーミングで送られます。

ESに送られたログは内部で分析され、Kibanaによりグラフとして可視化することができます。

CloudWatch Logsとは?

CloudWatch Logs(以下、CW Logs)とは、EC2インスタンス内のログをリアルタイムにモニタリングすることができるサービスです。

EC2インスタンス内にAgent入れ有効化することで、ログデータをCloudWatch内にアップロードすることができ、ESやその他AWSのサービスと組み合わせることで、ログに特定の文字が含まれている場合にアラートの発令や、ジョブの実行を行うことが可能です。

またログのアーカイブも可能です。AWSではAutoScaleのスケール時や、ログの解析、アーカイブ、およびログを利用したアラート発行・ジョブ実行のため、ログをサーバ外部に保存することを推奨しています。CW Logsでは簡単にログをアップロードすることができ、最大無期限までログを保存することができるのです!

 

それでは今回、Windowsのセキュリティイベントログを可視化する手順をご紹介します。

OSは Windows Server 2012 R2を想定しています。

IAM Roleの割り当て

CloudWatch Logsでログを収集したいインスタンスに、IAMロールをアタッチします。
IAMロールの権限は、 公式ドキュメントに記載されているものと同じでいいでしょう。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "arn:aws:logs:*:*:*"
    ]
  }
 ]
}

http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html

(IAMロールを付与していないインスタンスについては後述します)

CloudWatch Logs Agentの有効化

スタート画面よりEC2ConfigService Settings を選択します。

kibanacsdcd01
次に Ec2 Service PropertiesCloudWatch Logs の項目にチェックを入れます。

kibanaicec02

設定ファイルの編集

%PROGRAMFILES%AmazonEc2ConfigServiceSettingsAWS.EC2.Windows.CloudWatch.json 内の
"Id": "SecurityEventLog"Parameters - Levels7に、Flow対象に SecurityEventLog を追加します。

 {
                "Id": "SecurityEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogName": "Security",
                    "Levels": "7"
                }
            },

 

"Flows": {
            "Flows":
            [
                "SecurityEventLog,CloudWatchLogs"
            ]
        }

次にCloudWatch Logsの使用リージョン、LogGroup、LogStreamを入力します。
IAMロールのアタッチを忘れた場合は、IAMユーザのアクセスキーを入力してください。
(IAMロールがアタッチされている場合、アクセスキーの入力は不要です)

 

            {
                "Id": "CloudWatchLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "SYSTEM-WorkSpaces-Default-Log-Group",
                    "LogStream": "{instance_id}"
                }
            },

サービスの起動

「サービス」- 「Ec2Config」にて、サービスの起動を行います。

設定ファイルの修正毎に再起動が必要となります。
 wc03

結果

CloudWatchの画面の、LogGroup、LogStreamのメニューより、ログが表示されます。

esqwdwce04

CloudWatch LogsからElasticSearchへのストリーミング

ストリーミング対象の Log Groupsを選択し、[アクション]から[Stream to Amazon Elasticsearch Service]を選択します。
cwcwec05

次にストリーミング先のAmazon ES clusterを選択します。

ストリーミングのためLambda functionの作成を促されます。一度作成すればそちらのfunctionを何度も再利用する形となります。

その後 [Configure Log Format and Filters]のメニューにて、
[Subscription Filter Pattern]に [type, id, auditing, hostname, object] を記入し、フィルタリングをかけます。

[Next]で進み、最後に [Start Streaming] をクリックしてストリーミングを開始します。

ESのクラスター作成方法は別の記事で紹介する予定ですので、今回は省略します。

余談ですが、改行コード含むログはカラムごとに分けられません。

例として下記は今回取り込んだセキュリティイベントログの1つなのですが、改行コードを含んでいるパートがごっちゃになっているのが分かるかと思います。

awluf

今回はイベントIDベースですのでカラムが作成でき、簡単にグラフにすることができますが、要件が難しい場合、複雑な対応が必要になるかと思います。

Kibana,ESクラスターへのアクセス制御(IAMポリシー)

Kibana,ESへのアクセス制御は、IAMポリシーで記述します。
テンプレートが用意されており、全世界からアクセス可能/不可能、また特定のIPからの通信を許可する設定が可能です。

なおKibana へのアクセスは IP アドレスでの制限のみ可能です。ユーザを分けるといったことはできません。

IAMユーザでのアクセス制限は、Elasticsearchのクラスターにのみ対応しています。

下記は、特定のIPからのみアクセスを許可するポリシーのサンプルです。

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:AWSアカウントid:domain/ドメイン名/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "(すきな IPを きにゅうしてね!)"
        }
      }
    }
  ]
}

ESへのアクセス制御について同期が記事を書いていましたので、そちらもご覧ください。

Elasticsearch ServiceへのアクセスをIPで制限する

Kibanaでの可視化

ESの画面より、Kibanaのリンクをクリックします。

uvoijiefwoiejwf06

[Settings]-[Indices]のページにて、下記のパラメータを入力し、[Create]をクリックします。

vewwevvew07

index name or patterncwl-*
Time fieldname@timestamp

グラフの表示(Discover)

試しに今回は、ファイルサーバへのアクセスログを見てみたいと思います。

[Discover]画面に移り、イベントIDを元にしたグラフを表示してみます。
[Popular fields]から[# id]を選択し、[add]をクリックします。
enfweoifwna08

するとx軸が時刻、y軸がイベントID総数のグラフが表示されます。
awinef09

時刻の範囲指定(x軸)

画面右上の時計のアイコンをクリックすることで、時刻の範囲指定ができます。
lodw10

特定のIDのみ表示させる(y軸)

検索欄にて、 フィールド名:値 を入力することで、
y軸の値を絞ることが可能です。

イベントIDで絞る場合、 id:(数値) と入力してください。
fieinpfq11イベントIDの一例を記載します。IDからの検索で、いつ何時どのイベントがどれだけ起きたかが分かると思います。

Event ID内容
5158共有ファイル(AD)へのアクセス許可
4625アカウントがログオンに失敗した
5145共有ファイルへのアクセス確認

https://support.microsoft.com/ja-jp/kb/977519

ユーザの絞り込み

IDの絞り込みと同じく、ユーザの絞り込みが可能です。
検索欄にて、 @message:(ユーザ名) と入力してください。
eidfqwmwpd12

イベントIDをカウントする

[Visualize]の欄より、期間中のイベントの"id"の総数を表示できます。

viwnewnewewew02-01

さいごに

いかがでしたでしょうか。意外と簡単にグラフが出せたかと思います。

Windowsのイベントログはそのままでは見にくいので、こういったシステムで可視化できるのは非常に便利ですね。

ではでは。