WinlogbeatでWindowsイベントログを可視化 後編

タイトルは「イベントログを可視化」になってるけど前回に続き今回もちょっと違うのでスミマセン。

SysmonSearch
今月上旬にインターネットのニュースで知ったばかりだけど、JPCERTコーディネーションセンター(JPCERT/CC)がElastic Stack + Winlogbeat + Sysmon環境で利用できるWindows端末調査ツールのSysmonSearchというのをリリースしたということで、面白そうなので触ってみた。

WindowsにSysmonをインストール

面倒だが、監視対象のWindows全台に対してSysmonのインストールとWinlogbeatの設定変更までを行う。

Windows SysinternalsからSysmonをダウンロードする


コマンドプロンプト(管理者)でインストール
Microsoft Windows [Version 10.0.17134.285]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32> cd \users\foobar\downloads\sysmon
C:\Users\foobar\Downloads\Sysmon> .\sysmon64.exe -i -l -n -accepteula

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

Sysmon64 installed.
SysmonDrv installed.
Starting SysmonDrv.
SysmonDrv started.
Starting Sysmon64..
Sysmon64 started.

C:\Users\foobar\Downloads\Sysmon> exit

今回インストールするsysmonは64版でdownloadsフォルダに保存してあるとする。 実行ユーザーのアカウントをfoobarとしているので自分のアカウントに読み替えて。
これでSysmonがサービスとして登録され、且つ起動した状態になる。次回以降のWindowsシステム起動時に自動的にサービスが起動する筈だが、念の為に「サービス」を確認しておいた方が良いかも。

Winlogbeatの設定変更

C:\Program Files\winlogbeat\winlogbeat.yml (変更・追加)
1
2
3
4
5
6
7
8
#=====Elasticsearch template setting ==========
setup.template.enabled: false                #追加

#=====Elasticsearch template setting ==========
#------Elasticsearch output -----------------
output.elasticsearch:
  hosts: ["192.168.1.240:9200", "192.168.1.241:9200"]
  index: "winlogbeat-${+yyyy.MM.dd}"          #インデックス名に勝手にbeatバージョンが付く場合 テンプレートをfalseにすると要らないかな?

「サービス」でwinlogbeatを再起動する。
winlogbeatのインデックスが変わったら既存のインデックスパターンやTimelionやVisualizeでそれを使用するものに影響するので注意。

SysmonSearchのインストール

基本的にはHow to Installに従う。(日本語のドキュメント)
以下のインストール手順はFreeBSDに合わせているのでLinuxの人は読み飛ばして下さい。また、Elasticsearch6とkibana6は既にインストール済みで稼働中とします。

% git clone https://github.com/JPCERTCC/SysmonSearch.git
% wget https://github.com/JPCERTCC/SysmonSearch/archive/master.zip

ディレクトリ名をSysmonSearch-masterからSysmonSearchに変更

FreeBSDのportsではkibanaは/usr/local/www/kibana6に置かれているのでSysmon Searchもその下に置くことにする。Kibanaをインターネットから見られるようになっているなら別のところに置いた方が良いかも。何処に置いても良いんだし。(↓の最初の行)

# mv SysmonSearch /usr/local/www/kibana6/

# cd /usr/ports/devel/py-pip
# make install

# pip install elasticsearch
# pip install elasticsearch_dsl

# cd /usr/local/www/kibana6
# curl -XPUT http://[ElasticsearchのIPアドレス]:9200/_template/template1 -d@SysmonSearch/script/template1.json -H "Content-Type: application/json"
# curl -XPUT http://[ElasticsearchのIPアドレス]:9200/_template/template2 -d@SysmonSearch/script/template2.json -H "Content-Type: application/json"
# curl -XPUT http://[ElasticsearchのIPアドレス]:9200/_template/template3 -d@SysmonSearch/script/template3.json -H "Content-Type: application/json"

# cd /usr/local/www/kibana6/SysmonSearch/script
# mkdir logs

# vim exec_collection_statistical_data.sh (How to Installに従って編集 さらに1行目のbashのpath変更)
# vim collection_statistical_data_setting.py (How to Installに従って編集)
# vim collection_alert_data_setting.py (How to Installに従って編集)

# cp -pR /usr/local/www/kibana6/SysmonSearch/sysmon_search_plugin /usr/local/www/kibana6/plugins/
# vim /usr/local/www/kibana6/plugins/sysmon_search_plugin/conf.js (How to Installに従って編集)

##ここから10コマンドはStixIoc
# cd /usr/ports/www/py-tornado
# make install

# cd /usr/ports/devel/py-virtualenv
# make install

# cd /usr/ports/devel/py-virtualenvwrapper
# make install

# pip install openioc-to-stix
# pip install cti-stix-slider.git
# pip install stix2-slider or pip install git+https://github.com/oasis-open/cti-stix-slider.git

# mkdir /usr/local/www/kibana6/SysmonSearch/stixioc-import-server/logs

FreeBSDのports/pkgでインストールしたPythonがpythonというコマンドで実行できない場合はシンボリックリンクを張る。

# ln -s /usr/local/bin/python2 /usr/local/bin/python
または
# ln -s /usr/local/bin/python3 /usr/local/bin/python
/root/.bashrc (新規 or 追記2行)
1
2
source /usr/local/bin/virtualenvwrapper.sh
export WORKON_HOME=~/.virtualenvs

/etc/crontab (追記3行)
1
2
3
0,30 *  *   *   *   root    sh /usr/local/www/kibana6/SysmonSearch/script/exec_collection_statistical_data.sh
0,30 *  *   *   *   root    python /usr/local/www/kibana6/SysmonSearch/script/collection_alert_data.py
0   1   *   *   *   root    DATE=`date -d "-1 day" "+%Y.%m.%d"` ; sh /usr/local/www/kibana6/SysmonSearch/script/exec_collection_statistical_data.sh $DATE
stixioc-import-serverを起動。
% bash
$ cd /usr/local/www/kibana6/SysmonSearch/stixioc-import-server/
$ virtualenv .env
$ source .env/bin/activate
$ python server.py
Kibana6を再起動。
# service kibana restart

再起動後は暫く待つ。再起動前にブラウザでKibanaを表示した状態でKibanaを再起動するのが再起動完了がわかりやすくてオススメ。

SysmonSearchを触ってみる

SysmonSearchはKibanaから操作する。
先に書いておくと、インストールに問題があるのかSysmonSearchの完成度の問題なのかいろいろ機能していない。インストールの問題であれば改善したときにこの記事を更新するかも。

SysmonSearchを触ってみる 1
Kibanaの左列の[SysmonSearch] (左列を折りたたんだ状態では[S]という表示)をクリック。
右列上部で[Search]タブをクリック。それ以外のタブは機能させる方法が解らなかった。
日付・時間で表示範囲を指定。無指定も可。
Fieldはプルダウンメニューから[Process Name]を選択。それ以外の選択肢はHost Name以外は機能させる方法が解らなかった。
プロセス名が解っているならそれを入力する。上の画像ではブラウザのchromeを指定している。プロセス名を指定せず全てを表示するなら半角スペースを入力する。
右の[Find Now]ボタンをクリックすると少し待たされて結果がリスト表示される。
リストの各行でTable, Graph, プロセス名がクリック可能。Tableは後述。
Graphは全てのプロセスの関係がマップが表示されるみたい。そこから詳細を探すことに。(次画像)
リストの一番右列のImageはプロセス名が表示されていて、クリックするとそのプログラムの呼び出し(依存?)関係がグラフ表示されるみたい。

SysmonSearchを触ってみる 2
1つ前の画面でGraphをクリックした。
プロセスの関係がマップ表示される。クリックしたプロセスに関係あるプロセスだけが表示されるわけではなく全て?
マップの拡大縮小はマウスのホイールで行う。

SysmonSearchを触ってみる 3
マップの中の1つのアイテムをクリック。クリックしたアイテムが赤枠付きで中央に表示されるみたい。
何から呼び出されたか(左)と、どこに接続したか(何を呼び出したか)が右に表示されるみたい。

SysmonSearchを触ってみる 4
一つ戻って(単純に「1つ戻る」ができないので最初からやり直して)キーワードにプロセス名を入力して[submit]ボタンをクリック。
入力したキーワードのプロセスに赤枠が付く。上の画像ではブラウザのChromeを指定してみたが、ChromeからChromeを呼び出すというのが多いためかChromeがたくさん赤枠付きになった。
オレンジのアイテムは外部の接続先のよう。それをクリック(次)。

SysmonSearchを触ってみる 5
クリックした接続先だけが表示されるわけではなく、Chromeがどこから呼び出されたか(左)とChromeが呼び出したプロセスや接続先が縦1列にズラリと並ぶ。
その右のアイテムの1つを左クリックした場合は再びリスト表示になるがDatailed Information(詳細情報)というわりに何を示しているのか不明。
その右のアイテムの1つを右クリックした場合は役に立たない情報がポップアップ表示される。

SysmonSearchを触ってみる 6
Tableを表示した。上部のキーワードにtcp[Enter]を入力してみた。これでTCPでの外部接続だけが絞られた。(逆にそれ以外は何も絞られていない?)

ここまでSysmonSearchを触ってみた程度だが、気になったのが日時指定で自由に絞れないこと。どの状態でも絞れないと関係無い情報が大量に出過ぎて欲しい情報に簡単にアクセスできない。逆に自由に絞れるようになったら「監視対象のユーザー」が「いつ」「どこに」アクセスしたとか、「何を起動した」が簡単にわかるようになる。そこまでできるのならIPアドレスやホスト名だけでなくURLも表示できるようにして欲しいところ。ついでにキーロガーも欲しいわね。まぁ、それはSysmonSearchではなくSysmon (Microsoft?)に要望するべきなのかもしれないが。
そういうのができるようになると企業でも従業員の挙動の監査ツールとして使い物になるように思う。
なお、SysmonSearchはプロセスの挙動調査用らしい。社員の監視目的だと用途違いだと怒られるかな?

関連記事:

WinlogbeatでWindowsイベントログを可視化 中編

タイトルは「イベントログを可視化」になってるけど今回(次回も?)はちょっと違うのでスミマセン。

企業などで社内の全Windows端末を集中監視できるウイルス対策ソリューションを導入しているということであればそのウイルス検知監視アプリを使えば良いんだろうけど、(中)小企業だとその手のソリューションを採用していないということもある筈。最近のWindowsはマルウエアの検知という部分だけについていえばDefenderが優秀なので検知はそれにまかせて、集中監視についてはElastic Stackを使うという方法もある。
前回WinlogbeatをWindowsにインストールしたので引き続きそれを利用する。

winlogbeatディレクトリの設定ファイル winlogbeat.ymlを編集する。
C:\Program Files\winlogbeat-6.4.0\winlogbeat.yml (追記など)
1
2
3
4
5
6
winlogbeat.event_logs:
  - name: Application
  - name: Security
  - name: System
  - name: Microsoft-Windows-Windows Defender/Operational  #←追加
    include_xml: true                                     #←追加

YAMLファイルは行頭の字下げが階層を示すのでデタラメに下げたり行頭の空白を除去しない。

Winlogbeatのサービスを再起動する。またはWindowsを再起動。

とりあえず、マルウエアの検体として EICARのテストファイルを使う。もちろん、テキストファイルの擬似ウイルスなので安全で、多くの(全ての?)ウイルス対策ソフトと同様にWindows Defenderでも「ウイルス」という扱いで検知される。EICARのテスト文字列をエディタに貼ってファイルとして保存しようとすると「ウイルス」として検知される。(おそらく保存はできない筈)
または、EICARのテストファイルをウェブで配布しているところからブラウザで「ファイルとして保存」をしようとすると「ウイルス」として検知される 。(おそらく保存はできない筈)
あちこちで配布されているけど例としてトレンドマイクロの「各製品共通テストウイルス」を挙げておく。

しばらく動かして、またはマルウエア(EICARテストファイル)を検知してからKibanaの左列のManagementから右列のIndex Patternsを選択し、左上のWinlogbeat-*を選択して、右上の(インデックスパターンの更新)をクリックする。(重要)

KibanaのDiscoverでウイルス検知のレポートを見る
Windowsでマルウエアを検知したらその時刻を元にKibanaのDiscoverでWinlogbeat-*のインデックスを表示する。
マルウエアを検知したログが届いていることがわかる。
ログの詳細を見たところ、以下の項目に注目するとマルウエアの検知履歴を作成できそうなことがわかる。

  1. event_data.Threat Name: 検知したマルウエアの名称
  2. event_data.Category Name: 検知したマルウエアのカテゴリ
  3. beat.hostname: ログを出力したホスト名
  4. event_data.Detection User: ログを出力したホスト名とWindowsのユーザー名
  5. event_data.Error Description: 説明(どのように処理されたか等)
  6. event_data.Detection Time: ログの発生日時(UTC) 月日が短い形式
  7. @timestamp: ログの発生日時(ローカル時刻) 月日が長い形式
  8. log_name: Microsoft-Windows-Windows Defender/Operationalのログで絞り込む(フィルター)

今回は1, 2, 3, 7, 8を使用することにする。
なお、4はマルウエア検知のときのWindowsユーザーも表示してくれるのが良さそうなのだが、検知以外のログでその項目が存在しないことがあり、そうするとそのログが抽出されない原因になるので今回はホスト名だけを利用することにした。

KibanaのVisualizeでウイルス検知履歴を可視化
Visualizeで可視化する。今回は履歴を作るということでData Tableを使用することにした。
左メニューでVisualizeをクリック。
新規作成の をクリック。
[Data Table]をクリック。
まず、フィルタを作成する。左上の方の[Add a filter ]をクリック。
[log_name] [is] [Microsoft-Windows-Windows Defender/Operational]を指定して[Save]。
Metricsの指定はAggregationにCountを選択。
以下Buckets。今回はBucketsはSplit Rowsで4つ。
1つめのSplit RowsはAggregationでTermsを選択。Fieldsにevent_data.Threat Nameを指定。
2つめのSplit RowsはAggregationでTermsを選択。Fieldsにevent_data.Category Nameを指定。
3つめのSplit RowsはAggregationでTermsを選択。Fieldsに@timestampを指定。
4つめのSplit RowsはAggregationでTermsを選択。Fieldsにbeat.hostnameを指定。
上部の (Apply Changes)をクリック。
気に入ったら最上部の[Save]でVisualizeを保存。

社内のWindows端末にWinlogbeatをインストールすることでマルウエアの検知やWindows Defenderの挙動をElastic Stackで集中監視できそうね。(触りだけだが)
Elastic Stackに通知機能を追加すれば例えばマルウエアを検知したら管理者にメールで知らせるようなこともできる(筈)。(有料X-Pack Watcher・無料ElastAlertなど)

関連記事:
Up