はじめに
自分のWindowsPCのイベントログをより効率的に検索したいと思い、コスト掛けずにローカル内で分析環境を構築したのでアップします。
利用した環境
- Elasticsearch、Kibanaは最新の6.5.4をDockerコンテナとしてDocker for Windows上にデプロイ
- Winlogbeat、Sysmonはエージェントとして直接Windows10のOSにインストール

実施内容
イベントログ分析環境構築の大まかな作業は次のような内容となります。
※サーバ環境もクライアント環境も同じWindows10上に構築しています。
【サーバ環境】
- Docker for windowsのインストール
- Elasticsearchコンテナのデプロイ
- 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の構築は成功です。
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にコピペし、加工していきます。
[Ctrl]+[G]
キーを押し、[ジャンプ]ダイアログボックスを表示します。
[ジャンプ]ダイアログボックスのセル選択(S)...
で空白セル
を選択してOK
します。
[Ctrl]+[-]
キーで[削除]ダイアログボックスを表示します。
上方向へシフト(U)
ボタンをクリックし、OK
します。
不要な頭3行を行削除後、[Ctrl]+[H]
キーで[検索と置換]ダイアログボックスを表示します。
LogName
を - name
にすべて置換(A)
します。(半角スペースも漏れなく!)
全てのイベント名を選択し、winlogbeat.yml
のwinlogbeat.event_logs:
配下にコピペします。
※Sysmonのイベント含めて440個あり、超長いYAMLファイルになってしまいました(笑)
今回は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のサービスを[開始]します。
約半年分のイベントログを全て収集開始しため、CPU使用率が50%近く上昇しました。
※溜まっていた分のイベントログ取得完了後は概ね元の使用率に戻りました。
KibanaのDev Tools
でGET _cat/indices/win*
とAPI実行し、WinlogbeatのIndexが生成されていれば完了です。
7. Kibanaのグラフ作成
まず、KibanaでWinlogbeatのIndexを認識出来るようにIndex Pattern
を作成します。
KibanaのManagement
>Index Patterns
をクリックします。
Index pattern
にwinlogbeat-*
と入力し、> Next step
をクリックします。
Time Filter field name
に@timestamp
を指定し、Create index pattern
をクリックします。
KibanaのVisualize
> Create a visualization
をクリックします。
どんなイベント名のログが収集されたか把握出来る表を作成するため、Data Table
をクリックします。
作成したWinlogbeatのIndexをwinlogbeat-*
と指定します。
以下の設定でグラフを作成し、最後にPlay
ボタンをクリックして実行します。
Last 6 months
とすることで過去半年間のイベント名を件数の多い順に表示する表グラフとなりました。
画面上部のsave
ボタンをクリックし、グラフに名前を付けて保存します。
同じように今度はイベントIDごとの表グラフを作成し名前を付けて保存します。
次は時系列でイベント件数の推移を把握出来る棒グラフを作成するため、Vertical Bar
をクリックします。
以下の設定でグラフを作成し、最後にPlay
ボタンをクリックして実行します。
最後にダッシュボードで絞り込んだイベントの中身を確認するための検索結果表示用の設定を作ります。
discover
画面に移動し、絞り込み後のログの閲覧をし易くするため、event_id
とmessage
をadd
で追加します。
※特別に表示させておきたいフィードがあればここはお好みで...
Selected fields
に追加したフィールドが増えていることを確認します。
またグラフ下のビューも追加したフィールドに合わせて変わっているはずです。
save
ボタンをクリックし、名前を付けてこの検索条件の設定で保存します。
8. Kibanaのダッシュボード作成
作成したグラフを表示させるためのダッシュボードを作成します。
Dashboard
>Add
でグラフを追加していきます。
作成した3つのグラフをクリックします。
今度はSaved Search
に切り替え、作成した1つの検索条件をクリックします。
配置や大きさはお好みに合わせて変更することが可能ですが、以下のような感じで完了です。
使い方
利用イメージですが、この端末にログインしたイベントで絞り込んでみます。
Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
のイベント名で[+]ボタンをクリックします。
log_name:Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
で絞り込まれました。さらにイベントID21
で[+]ボタンをクリックします。
2つの条件で絞り込まれました。
絞り込んだ結果、確認したいイベントを選択し、矢印をクリックすることで詳細が開くことが出来ます。
{
"_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
こんな感じでWindowsイベントログを横断して検索できる仕組みをローカルに構築することが出来ました。
Kibanaダッシュボードも好きにカスタマイズ可能です。普段自分がどんな操作をしているのかログ起点で分析してみることで何か新たな発見が見つかるかもしれません。ぜひ、色々遊んでみてください!