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

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

# 利用した環境
- Elasticsearch、Kibanaは最新の6.5.4をDockerコンテナとしてDocker for Windows上にデプロイ
- Winlogbeat、Sysmonはエージェントとして直接Windows10のOSにインストール
<img width="824" alt="architecture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211371/8c3d1b0d-59c6-6ce9-ebdb-6f652651afef.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にインストール][01]

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

```
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][03]

```
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の構築は成功です。
<img width="873" alt="kibana01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211371/acadc082-ec7d-2379-ec21-324f08fa6083.png">

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

```
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インストール][05]

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](https://qiita-image-store.s3.amazonaws.com/0/211371/e5247f26-3c50-effe-e13a-3e6d9219d05c.png)
`[Ctrl]+[G]`キーを押し、[ジャンプ]ダイアログボックスを表示します。
[ジャンプ]ダイアログボックスの`セル選択(S)...`で`空白セル`を選択して`OK`します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/d46962e1-211c-d41c-f77e-47f04bd41f79.png)
`[Ctrl]+[-]`キーで[削除]ダイアログボックスを表示します。
`上方向へシフト(U)`ボタンをクリックし、`OK`します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/8b7a273e-78f2-293d-fc49-94da723a11f0.png)
不要な頭3行を行削除後、`[Ctrl]+[H]`キーで[検索と置換]ダイアログボックスを表示します。
`LogName `を` - name`に`すべて置換(A)`します。(半角スペースも漏れなく！)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/be29020c-44e2-d807-e061-370233a1a891.png)
全てのイベント名を選択し、`winlogbeat.yml`の`winlogbeat.event_logs:`配下にコピペします。
※Sysmonのイベント含めて440個あり、超長いYAMLファイルになってしまいました(笑)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/1005aac3-6561-f75f-68ae-dfafa3f5729a.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](https://qiita-image-store.s3.amazonaws.com/0/211371/ece83aa1-81b1-dd81-0f51-b9c5639b9e2c.png)
約半年分のイベントログを全て収集開始しため、CPU使用率が50％近く上昇しました。
※溜まっていた分のイベントログ取得完了後は概ね元の使用率に戻りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/eecae9a6-b011-f0d5-9241-f108513d26a4.png)
Kibanaの`Dev Tools`で`GET _cat/indices/win*`とAPI実行し、WinlogbeatのIndexが生成されていれば完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/98d5fb68-74f2-bca0-c84f-772607547a2f.png)

## 7. Kibanaのグラフ作成
まず、KibanaでWinlogbeatのIndexを認識出来るように`Index Pattern`を作成します。
Kibanaの`Management`>`Index Patterns`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/21a6e25e-5dff-e954-eb27-2804a002d0ff.png)
`Index pattern`に`winlogbeat-*`と入力し、`> Next step`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/7bc7cb6a-4fef-f7eb-e757-dec42c68f24d.png)
`Time Filter field name`に`@timestamp`を指定し、`Create index pattern`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/d201193d-cf2b-1d34-89dd-125973c83a7b.png)
Kibanaの`Visualize` > `Create a visualization`をクリックします。
どんなイベント名のログが収集されたか把握出来る表を作成するため、`Data Table`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/e61b7775-70c0-6829-1f6e-0be0912aedee.png)
作成したWinlogbeatのIndexを`winlogbeat-*`と指定します。
以下の設定でグラフを作成し、最後に`Play`ボタンをクリックして実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/ef36d184-3a55-ce6e-863b-aa90a75e8e11.png)
`Last 6 months`とすることで過去半年間のイベント名を件数の多い順に表示する表グラフとなりました。
画面上部の`save`ボタンをクリックし、グラフに名前を付けて保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/1a396f4a-889a-252c-978b-97bb08350954.png)
同じように今度はイベントIDごとの表グラフを作成し名前を付けて保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/03cef53d-28a8-02f9-d25f-2c8cea3731e4.png)
次は時系列でイベント件数の推移を把握出来る棒グラフを作成するため、`Vertical Bar`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/ff7df678-176b-6bb2-b294-107f964500e5.png)
以下の設定でグラフを作成し、最後に`Play`ボタンをクリックして実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/3cf61d3a-855b-d5cb-8bed-cf87b8e7f25e.png)
最後にダッシュボードで絞り込んだイベントの中身を確認するための検索結果表示用の設定を作ります。
`discover`画面に移動し、絞り込み後のログの閲覧をし易くするため、`event_id`と`message`を`add`で追加します。
※特別に表示させておきたいフィードがあればここはお好みで...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/cb0376a4-0dbf-0290-971a-a39bd9b218d2.png)
`Selected fields`に追加したフィールドが増えていることを確認します。
またグラフ下のビューも追加したフィールドに合わせて変わっているはずです。
`save`ボタンをクリックし、名前を付けてこの検索条件の設定で保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/3fd86e1b-e71a-1436-8472-0aa51272299a.png)

## 8. Kibanaのダッシュボード作成
作成したグラフを表示させるためのダッシュボードを作成します。
`Dashboard`>`Add`でグラフを追加していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/a960ad9a-0617-6773-aebd-4f9837d0dea5.png)
作成した3つのグラフをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/e50aa401-b17f-ccef-71cd-c8b73ac1445d.png)
今度は`Saved Search`に切り替え、作成した1つの検索条件をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/6c85f5c9-c5e0-42b8-53ac-ccd3b4d51f7d.png)
配置や大きさはお好みに合わせて変更することが可能ですが、以下のような感じで完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/4bccbc42-c262-2693-fb23-e76e36d5b3fe.png)

## 使い方

利用イメージですが、この端末にログインしたイベントで絞り込んでみます。
`Microsoft-Windows-TerminalServices-LocalSessionManager/Operational`のイベント名で[+]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/ce9ddb83-cc15-c5bc-d475-f06dcf319211.png)
`log_name:Microsoft-Windows-TerminalServices-LocalSessionManager/Operational`で絞り込まれました。さらにイベントID`21`で[+]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/dc979bfd-1ee0-8b71-d76f-448df24a32b1.png)
2つの条件で絞り込まれました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/6f250453-fead-e03f-00e9-49e10f07da08.png)
絞り込んだ結果、確認したいイベントを選択し、矢印をクリックすることで詳細が開くことが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211371/828308bf-a420-cd0b-f030-64e76c9cea1a.png)

```ruby: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](https://qiita-image-store.s3.amazonaws.com/0/211371/86674c3c-a5a6-7916-1b69-59b1753b8d92.png)

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

[01]: https://qiita.com/anikundesu/items/7ecf20b7e8a60f8439a8 "Docker for WindowsをWindows10 Proにインストール"
[02]: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html "Install Elasticsearch with Docker"
[03]: https://www.elastic.co/guide/en/kibana/current/docker.html "Running Kibana on Docker"
[04]: http://rtaki.sakura.ne.jp/infra/?p=1895 "SysinternalsのSysmon.exeを使ってみた"
[05]: https://www.server-world.info/query?os=CentOS_7&p=elasticstack6&f=10 "ElasticStack6 Winlogbeatインストール"
[06]: https://www.docker.elastic.co/# "Docker@elastic"
[07]: http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html "WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する"