16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WindowsイベントビューアをElasticStackにしてみた話

Last updated at Posted at 2019-01-13

はじめに

自分のWindowsPCのイベントログをより効率的に検索したいと思い、コスト掛けずにローカル内で分析環境を構築したのでアップします。

利用した環境

  • Elasticsearch、Kibanaは最新の6.5.4をDockerコンテナとしてDocker for Windows上にデプロイ
  • Winlogbeat、Sysmonはエージェントとして直接Windows10のOSにインストール
architecture.PNG

実施内容

イベントログ分析環境構築の大まかな作業は次のような内容となります。
※サーバ環境もクライアント環境も同じWindows10上に構築しています。

【サーバ環境】

  1. Docker for windowsのインストール
  2. Elasticsearchコンテナのデプロイ
  3. Kibanaコンテナのデプロイ

【クライアント環境】
4. Sysmonエージェントのインストール
5. Winlogbeatのインストール
6. Winlogbeatの設定

【ログ分析環境】
7. Kibanaのグラフ作成
8. Kibanaのダッシュボード作成

1. Docker for windowsのインストール

Windows10 Pro環境にDocker for windowsを導入します。
参考: Docker for WindowsをWindows10 Proにインストール

2. Elasticsearchコンテナのデプロイ

バージョン指定してDocker環境へElasticsearchコンテナをデプロイします。
参考: Install Elasticsearch with Docker

PS > docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.4
PS > docker run -p 9200:9200 --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:6.5.4

Webブラウザでhttp://localhost:9200にアクセスします。
以下のように、JSON形式でElasticsearchの状態が帰ってくれば動作しています。

{
  "name" : "Eq5yy2R",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "xRVnhqLvQvyy43t_jFfcvA",
  "version" : {
    "number" : "6.5.4",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

3. Kibanaコンテナのデプロイ

バージョン指定してDocker環境へKibanaコンテナをデプロイします。
参考: Running Kibana on Docker

PS > docker pull docker.elastic.co/kibana/kibana:6.5.4
PS > docker run -p 5601:5601 --name kibana --link elasticsearch:elasticsearch docker.elastic.co/kibana/kibana:6.5.4

Webブラウザでhttp://localhost:5601にアクセスします。
MonitoringタブでElasticsearchとKibanaが表示されていればElasticStackの構築は成功です。
kibana01.PNG

4. Sysmonエージェントのインストール

Windows10にSysmonエージェントをインストールします。
参考: SysinternalsのSysmon.exeを使ってみた

PS > cd <ZIP解凍したSysmonフォルダのパス>
PS > Sysmon64.exe -i -n
PS > Sysmon64.exe -c

System Monitor v8.04 - System activity monitor
Copyright (C) 2014-2018 Mark Russinovich and Thomas Garnier
Sysinternals - www.sysinternals.com

Current configuration:
 - Service name:			Sysmon
 - Driver name:				SysmonDrv
 - HashingAlgorithms:       SHA1
 - Network connection:      enabled
 - Image loading:           disabled
 - CRL checking:            disabled
 - Process Access:          disabled

No rules installed

5. Winlogbeatのインストール

Windows10にWinlogbeatをインストールします。
winlogbeat.ymlの設定とサービス起動は後述します。
参考: ElasticStack6 Winlogbeatインストール

Winlogbeatのインストールにおいて、Powershellの実行権限(デフォルトはRestricted)が足りない場合
以下のように権限をRemoteSignedに変更して再度インストールを実行してください。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> cd 'C:\Program Files\Winlogbeat\'
PS C:\Program Files\Winlogbeat> .\install-service-winlogbeat.ps1
.\install-service-winlogbeat.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\Wi
nlogbeat\install-service-winlogbeat.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https:
//go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\install-service-winlogbeat.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\Program Files\Winlogbeat> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\Program Files\Winlogbeat> .\install-service-winlogbeat.ps1

6. Winlogbeatの設定

Windows10では400以上のイベントが存在し、多くはMicrosoft-Windows配下に含まれています。
※今回はこれらのイベントを全て一元的に検索・分析できるようにログ分析環境を構築します。

以下のコマンドにて、winlogbeat.ymlに記載する取得対象のイベント名(全て)をPowershellで効率良くゲットします。

PS > Get-WinEvent -ListLog * | Format-List -Property LogName

winlogbeat.ymlに利用できるようPowershellの出力結果をExcelにコピペし、加工していきます。
image.png
[Ctrl]+[G]キーを押し、[ジャンプ]ダイアログボックスを表示します。
[ジャンプ]ダイアログボックスのセル選択(S)...空白セルを選択してOKします。
image.png
[Ctrl]+[-]キーで[削除]ダイアログボックスを表示します。
上方向へシフト(U)ボタンをクリックし、OKします。
image.png
不要な頭3行を行削除後、[Ctrl]+[H]キーで[検索と置換]ダイアログボックスを表示します。
LogName - nameすべて置換(A)します。(半角スペースも漏れなく!)
image.png
全てのイベント名を選択し、winlogbeat.ymlwinlogbeat.event_logs:配下にコピペします。
※Sysmonのイベント含めて440個あり、超長いYAMLファイルになってしまいました(笑)
image.png
今回はElastixsearchはコンテナとして1ノードのみのため、シャード数も1とします。
3のままでも特に問題はありません。

# ==================== Elasticsearch template setting ==========================

setup.template.settings:
  index.number_of_shards: 1

Winlogbeat用に用意されているダッシュボードをデプロイする場合は、kibanaのホストを指定します。
※今回はコンテナとしてローカルに用意していますので、host: "localhost:5601"と記載します。

# ============================== Kibana =====================================

# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  host: "localhost:5601"

Elasticsearchもコンテナとしてローカルに用意していますので、output.elasticsearchは変更不要です。

# -------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]

Winlogbeatのサービスを[開始]します。
image.png
約半年分のイベントログを全て収集開始しため、CPU使用率が50%近く上昇しました。
※溜まっていた分のイベントログ取得完了後は概ね元の使用率に戻りました。
image.png
KibanaのDev ToolsGET _cat/indices/win*とAPI実行し、WinlogbeatのIndexが生成されていれば完了です。
image.png

7. Kibanaのグラフ作成

まず、KibanaでWinlogbeatのIndexを認識出来るようにIndex Patternを作成します。
KibanaのManagement>Index Patternsをクリックします。
image.png
Index patternwinlogbeat-*と入力し、> Next stepをクリックします。
image.png
Time Filter field name@timestampを指定し、Create index patternをクリックします。
image.png
KibanaのVisualize > Create a visualizationをクリックします。
どんなイベント名のログが収集されたか把握出来る表を作成するため、Data Tableをクリックします。
image.png
作成したWinlogbeatのIndexをwinlogbeat-*と指定します。
以下の設定でグラフを作成し、最後にPlayボタンをクリックして実行します。
image.png
Last 6 monthsとすることで過去半年間のイベント名を件数の多い順に表示する表グラフとなりました。
画面上部のsaveボタンをクリックし、グラフに名前を付けて保存します。
image.png
同じように今度はイベントIDごとの表グラフを作成し名前を付けて保存します。
image.png
次は時系列でイベント件数の推移を把握出来る棒グラフを作成するため、Vertical Barをクリックします。
image.png
以下の設定でグラフを作成し、最後にPlayボタンをクリックして実行します。
image.png
最後にダッシュボードで絞り込んだイベントの中身を確認するための検索結果表示用の設定を作ります。
discover画面に移動し、絞り込み後のログの閲覧をし易くするため、event_idmessageaddで追加します。
※特別に表示させておきたいフィードがあればここはお好みで...
image.png
Selected fieldsに追加したフィールドが増えていることを確認します。
またグラフ下のビューも追加したフィールドに合わせて変わっているはずです。
saveボタンをクリックし、名前を付けてこの検索条件の設定で保存します。
image.png

8. Kibanaのダッシュボード作成

作成したグラフを表示させるためのダッシュボードを作成します。
Dashboard>Addでグラフを追加していきます。
image.png
作成した3つのグラフをクリックします。
image.png
今度はSaved Searchに切り替え、作成した1つの検索条件をクリックします。
image.png
配置や大きさはお好みに合わせて変更することが可能ですが、以下のような感じで完了です。
image.png

使い方

利用イメージですが、この端末にログインしたイベントで絞り込んでみます。
Microsoft-Windows-TerminalServices-LocalSessionManager/Operationalのイベント名で[+]ボタンをクリックします。
image.png
log_name:Microsoft-Windows-TerminalServices-LocalSessionManager/Operationalで絞り込まれました。さらにイベントID21で[+]ボタンをクリックします。
image.png
2つの条件で絞り込まれました。
image.png
絞り込んだ結果、確認したいイベントを選択し、矢印をクリックすることで詳細が開くことが出来ます。
image.png

EventID21
{
  "_index": "winlogbeat-6.5.4-2019.01.13",
  "_type": "doc",
  "_id": "wZ6gRmgBNiZkVZhPbt6Z",
  "_version": 1,
  "_score": null,
  "_source": {
    "@timestamp": "2019-01-13T09:48:45.925Z",
    "user_data": {
      "User": "<WORKGROUP名>\\<ユーザ名>",
      "SessionID": "1",
      "Address": "ローカル",
      "xml_name": "EventXML"
    },
    "host": {
      "os": {
        "family": "windows",
        "build": "17134.523",
        "platform": "windows",
        "version": "10.0"
      },
      "name": "<コンピュータ名>",
      "id": "7a7a5ced-9b61-47b4-a72e-27da5d594e81",
      "architecture": "x86_64"
    },
    "source_name": "Microsoft-Windows-TerminalServices-LocalSessionManager",
    "event_id": 21,
    "message": "リモート デスクトップ サービス: セッション ログオンに成功しました:\n\nユーザー: <WORKGROUP名>\\<ユーザ名>\nセッション ID: 1\nソース ネットワーク アドレス: ローカル",
    "activity_id": "{61A55000-55E5-1017-0000-000000000000}",
    "log_name": "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational",
    "opcode": "情報",
    "user": {
      "type": "User",
      "identifier": "S-1-5-18",
      "name": "SYSTEM",
      "domain": "NT AUTHORITY"
    },
    "beat": {
      "name": "<コンピュータ名>",
      "hostname": "<コンピュータ名>",
      "version": "6.5.4"
    },
    "provider_guid": "{<GUID>}",
    "process_id": 1260,
    "type": "wineventlog",
    "thread_id": 1432,
    "computer_name": "<コンピュータ名>",
    "record_number": "194",
    "level": "情報"
  },
  "fields": {
    "@timestamp": [
      "2019-01-13T09:48:45.925Z"
    ]
  },
  "sort": [
    1547372925925
  ]
}

おまけ

Winlogbeatで標準的に用意されているダッシュボードテンプレートを取り込むこともできます。
Program Files配下のWinlogbeatで以下のコマンドを実行すればKibanaにダッシュボードがロードされます。

PS C:\Program Files\Winlogbeat> .\winlogbeat setup -dashboards
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards

image.png


こんな感じでWindowsイベントログを横断して検索できる仕組みをローカルに構築することが出来ました。
Kibanaダッシュボードも好きにカスタマイズ可能です。普段自分がどんな操作をしているのかログ起点で分析してみることで何か新たな発見が見つかるかもしれません。ぜひ、色々遊んでみてください!

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?