標的型攻撃に対するJPCERT/CCのおすすめログ設定をElasticsearchで構築してみる - エンドポイントログ編（その１- Sysmon）

# はじめに

[前回](https://qiita.com/rhpenguin/items/c221368c75608c71cae2)に続きまして「標的型攻撃に対するJPCERT/CCのおすすめログ設定をElasticsearchで構築してみる」のエンドポイントログ編です。Windows PC上に無償で利用可能な[Winlogbeat](https://www.elastic.co/jp/products/beats/winlogbeat)と[Sysmon](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)をインストールし、Windowsの動作ログをElasticsearchで収集および蓄積します。

JPCERT/CCではエンドポイントログの採取、分析および可視化についても[ツール](https://blogs.jpcert.or.jp/ja/2018/09/SysmonSearch.html)を無償で提供するなど推奨しています。本記事で構築するログ解析基盤ではこのツールそのものは利用しませんが、Windows PC上へ導入するSysmonとWinlogbeatに同様の設定を行います。

* [インシデント調査のための攻撃ツール等の実行痕跡調査に関する報告書](https://www.jpcert.or.jp/research/ir_research.html) (2017-12-05 - JPCERT/CC)
* [SysmonSearchを用いて不審な挙動を調査](https://blogs.jpcert.or.jp/ja/2019/01/sysmonsearch2.html) (2019/01/21 - JPCERT/CC)

本記事の「エンドポイント編」は情報量が多いため、「概要/Sysmon編」と「Winlogbeat/Elasticsearch編」の二回に分けて投稿します。
* [「エンドポイントログ編（その２）- Winlogbeat/Elasticsearch」](https://qiita.com/rhpenguin/items/6dc4c3f82cd87122958c)


（これまでの記事）
* [「準備編」](https://qiita.com/rhpenguin/items/f68bdfdf726cb44c26e7)
* [「プロキシサーバ編」](https://qiita.com/rhpenguin/items/7ec7ddf562906257e297)
* [「メールサーバ編」](https://qiita.com/rhpenguin/items/c221368c75608c71cae2)

これらのログ情報とエンドポイントログを横断的に検索および関連付けすることで、一連の攻撃シナリオを検出および解析することが可能になります。


※本記事で利用する[Winlogbeat](https://www.elastic.co/jp/products/beats/winlogbeat)や[Sysmon](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)の設定例は[こちら](https://github.com/rhpenguin/sysmon-winlogbeat-config)へ仮置きしておきます（今後、もう少しわかりやすい配置にする予定です）。

※ElasticsearchはUbuntu18.04上で構築しますので他のディストリビューションの場合にはファイルの配置場所などを読みかえてください。

※実際の環境で運用するには、ネットワーク設定、個々のソフトウェアのインストール/初期設定や認証/通信の暗号、冗長構成や負荷分散などで相応の設定が必要となります。それぞれ個別のドキュメントをご参照ください。本記事ではログ設定に関係する基本的なコンフィグレーションにフォーカスして記載します。

#利用するソフトウェア
- OS: Ubuntu 18.04
- プロキシサーバ: Squid (3.5.27)
- DNSサーバ: Dnsmasq (2.79)
- Elasticsearch (6.6.0) 
- Kibana (6.6.0)
- Winlogbeat (6.6.0)
- Sysmon (9.01)
- VMware Workstation Player等のVMソフトウェア
- Windows 10 (クライアントPC)

#ネットワーク構成例
ここでは「[準備編](https://qiita.com/rhpenguin/items/f68bdfdf726cb44c26e7)」で説明した以下のようなシンプルなネットワーク構成を想定。
![log_network_sysmon_winlogbeat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/086f5dbc-f421-3cb1-7754-b3513268134d.png)


|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|---|---|
|Webアクセス|Win10クライアントPC上のWebブラウザはインターネットへdmz.example.comで動作するプロキシサーバ(Squid)経由でアクセス|
ログ|Windows 10 PC上で動作するSysmonにより採取されたエンドポイントログをWinlogbeatがElasticsearch(log.example.com)へ転送|

#作業内容
1. ネットワーク構築
2. Sysmonのインストールおよび設定
3. ElasticsearchへSysmon+Winlogbeat用のテンプレート追加
4. ElasticsearchへSysmon/Winlogbeat用のPipeline(ingest node)の設定追加
5. Winlogbeatのインストールおよび設定
6. Kibanaで確認


#Sysmon+Winlogbeat+Elasticsearchの動作概要
![sysmon_winlogbeat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/9c2d397e-66dd-72b2-a920-d95069839a80.png)

#Sysmon v9.0で記録されるWindows動作ログの概要

詳細についてはこちらの[公式サイト](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)を参照ください。また以下の開発者ご自身によるプレゼンテーションが非常に参考になります。
* [Tracking Hackers on Your Network with Sysinternals Sysmon (2016)](https://www.rsaconference.com/writable/presentations/file_upload/hta-w05-tracking_hackers_on_your_network_with_sysinternals_sysmon.pdf) (Mark Russinovich - CTO, Microsoft Azure, Microsoft Corporation)
* [How to Go from Responding to Hunting with Sysinternals Sysmon (2017)](https://www.rsaconference.com/writable/presentations/file_upload/hta-t09-how-to-go-from-responding-to-hunting-with-sysinternals-sysmon.pdf) (Mark Russinovich - CTO, Microsoft Azure, Microsoft Corporation)

## 採取可能な動作ログ
* プロセスの起動および終了
* プロセスのネットワーク通信
* ファイル作成タイムスタンプの変更
* ドライバやDLLのローディング
* Rawデバイスアクセス
* プロセスアクセス
* ファイル作成
* Alternate Data Stream(ADS) (例: ファイルダウンロードやマルウェアの隠蔽など）の検出
* レジストリ操作
* プロセス間通信 (Pipe)
* CreateRemoteThredイベント
* WMIイベント

採取される動作ログには例えば以下のような詳細が含まれます。
* プロセス起動のコマンドライン情報
* プロセス起動の親プロセス情報
* プロセスのEXEファイルやドライバ/DLLファイルのハッシュ値
* 上記ファイルの会社名、プロダクト名、プロダクト説明、ファイルバージョン情報
* ドライバ/DLLファイルの署名情報
* プロセスアクセスのコールトレース情報
* ダウンロードファイルのハッシュ値
* RemoteThreadの開始関数名
* WMIイベントコンシューマの実行内容（例：埋め込みスクリプト）
* WMIイベントフィルタのクエリ内容

また、ログの種類毎に採取対象の詳細なフィルタ条件を指定することができたり、コマンドによって設定を動的に変更可能であることもありがたい点です。通常時と調査時で採取する動作ログ情報の種類や量を変更する際などにOSを再起動せずに済みます。

#SysmonによるWindows動作ログを利用した攻撃の分析
Windows動作ログを利用した具体的な攻撃の分析手法は非常に多岐にわたるトピックのため本記事では扱うことができませんが、いくつかの参考になる情報をご紹介しておきます。

* [インシデント調査のための攻撃ツール等の実行痕跡調査に関する報告書](https://www.jpcert.or.jp/research/ir_research.html) (2017-12-05 - JPCERT/CC)
* [サイバーレスキュー隊(J-CRAT)技術レポート 2017 インシデント発生時の初動調査の手引き ～WindowsOS 標準ツールで感染を見つける～
](https://www.ipa.go.jp/security/J-CRAT/report/20180329.html) (2018/3/29 - 独立行政法人情報処理推進機構 技術本部 セキュリティセンター)
* [Hunt Evil poster](https://www.sans.org/security-resources/posters) (2018 - SANS)
* [Windows Forensic Analysis poster](https://www.sans.org/security-resources/posters) (2018 - SANS)
* [MITRE ATT&CK](https://attack.mitre.org/) (MITRE)
* [Detecting Signs of Ransomware: WannaCry and the Elastic Stack](https://www.elastic.co/blog/malware-analysis-wannacry-elastic-stack) (2017/3/32 - Elasticsearch blog)



# Sysmonのインストールと設定
Sysmonのインストールは非常に簡単です。

###デフォルト設定でインストールしてみる
こちらの[公式サイト](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)からWindows PCへ圧縮ファイルをダウンロードし解凍します。**Sysmon.exe**または**Sysmon64.exe**(64bit)というファイルが含まれていますので、そのEXEファイルを任意の場所にコピーまたは移動して以下のようにコマンドを実行するだけです（管理者として実行）。

```text
#インストール
Sysmon64.exe -i

#インストールおよび設定の確認
Sysmon64.exe -c

#アンインストール
Sysmon64.exe -u
```
これで全てのプロセス起動と終了動作がWindowsイベントログとして採取されるようになります。

またプロセスの全ネットワーク通信履歴をイベントログとして採取する場合は以下の通りです。

```text
#インストール
Sysmon64.exe -i -n
```

###設定ファイルを指定してインストール
インストール時に設定ファイルを指定することで採取対象のイベントタイプ毎に詳細なフィルタ条件を指定することができ、またデフォルトでは採取されないイベントタイプを有効化することもできます。

|ID|イベントタグ|説明|有効化|
|---|---|---|---|
|1| ProcessCreate|プロセス起動|デフォルトで有効|
|2| FileCreateTime|ファイル作成時刻|設定ファイル|
|3| NetworkConnect|ネットワーク接続|コマンドオプション/設定ファイル|
|5| ProcessTerminate|プロセス終了|デフォルトで有効|
|6| DriverLoad|ドライバのロード|コマンドオプション/設定ファイル|
|7| ImageLoad|イメージのロード(DLL)|コマンドオプション/設定ファイル|
|8| CreateRemoteThread|CreateRemoteThread|設定ファイル|
|9| RawAccessRead|RAWアクセス|設定ファイル|
|10| ProcessAccess|プロセスアクセス|設定ファイル|
|11| FileCreate|ファイル作成|設定ファイル|
|12, 13, 14| RegistryEvent|レジストリ操作|設定ファイル|
|15| FileCreateStreamHash|Alternate Data Stream(ADS)|設定ファイル|
|17, 18| PipeEvent|パイプ操作|設定ファイル|
|19, 20, 21|WmiEvent|WMIイベント|設定ファイル|
|255| Error|Sysmonエラー|-|

以下の例では設定ファイル名を**my_sysmon_config.xml**とします。

```text:設定ファイルを指定してインストール
# Sysmonのインストール
Sysmon64.exe -i my_sysmon_config.xml

# 設定ファイルの更新
Sysmon64.exe -c my_sysmon_config.xml

# 設定の確認
Sysmon64.exe -c
```


例えばMimikatzによる攻撃を検出する際には、以下のような**lsass.exe**へのプロセスアクセスを採取する設定がよく見受けられます。
*[「攻撃的セキュリティツール、Mimikatzとは」](https://tech.nikkeibp.co.jp/it/atcl/idg/17/032200221/032200001/)(2019/04/02 - 日経BP社)

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
...
  <EventFiltering>
...
    <ProcessAccess onmatch="include">
      <TargetImage condition="is">C:\windows\system32\lsass.exe</TargetImage>
    </ProcessAccess>
...
  </EventFiltering>
</Sysmon>
```

設定ファイルの仕様については公式サイトの「[Sysmon/Configuration files](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon#configuration-files)」や前述の「[How to Go from Responding to Hunting with Sysinternals Sysmon (2017)](https://www.rsaconference.com/writable/presentations/file_upload/hta-t09-how-to-go-from-responding-to-hunting-with-sysinternals-sysmon.pdf)」にて詳細に説明されていますので参照ください。


ちなみにイベントタイプ毎に全てのイベントを採取する場合には、以下のようにイベントタイプ毎のタグに「**onmatch="exclude"**」のみを設定します。

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
...
  <EventFiltering>
...
    <EventTag onmatch="exclude">
    </EventTag>
...
  </EventFiltering>
</Sysmon>

```
※"EventTag"エレメント名には上述の「イベントタグ」で記述したタグが入ります。

以下はプロセスインジェクションの検証や調査のために、DLLローディング(ImageLoad)とリモートスレッド実行(CreateRemoteThread)の全イベント採取を有効化する設定例です（ImageLoadの採取イベント量が増大するのでご注意ください）。

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
...
  <EventFiltering>
...
    <ImageLoad onmatch="exclude">
    </ImageLoad>
    <CreateRemoteThread onmatch="exclude">
    </CreateRemoteThread>
...
  </EventFiltering>
</Sysmon>
```

###ハッシュ値の取得方法を設定ファイルで指定
Sysmonでサポートされるハッシュ対象は以下の通り。

|ID|イベントタグ|対象|
|---|---|---|
|1| ProcessCreate|プロセスのイメージファイル(*.exe等)|
|6| DriverLoad|ドライバファイル(*.sys等)|
|7| ImageLoad|ローディングファイル(*.dll等)|
|15| FileCreateStreamHash|ダウンロードファイルやAlternate Data Stream(ADS)|

またハッシュ方式は以下から選択できます。複数を同時指定することも可能です。

* ファイルハッシュ: SHA1(デフォルト), SHA256, MD5
* PEインポートテーブルのMD5ハッシュ: IMPHASH

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
...
  <HashAlgorithms>sha256,imphash</HashAlgorithms>
...
</Sysmon>
```

###フィルタ条件にルール名をつけて動作ログを分類する
設定ファイルのフィルタ条件にはname属性を記述することで名前/タグ名を設定することができます。以下はネットワーク接続イベントとして[Firefox](https://www.mozilla.org/ja/firefox/)によるネットワーク通信接とインターネット通信（プロキシ経由通信）を検出および識別する例です。

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
...
  <EventFiltering>    
    <!--イベントID: 1, プロセス起動-->
    <ProcessCreate onmatch="exclude">
    </ProcessCreate>
...

    <!--イベントID: 3, ネットワーク接続-->
    <NetworkConnect onmatch="include">

      <!--Firefoxの接続フィルタ-->
      <Image name="Connection initiated by Firefox" condition="image">firefox.exe</Image>

      <!--インターネットへの接続フィルタ（プロキシ経由通信をポート番号で絞り込み）-->
      <DestinationPort name="Connection via Proxy" condition="is">3128</DestinationPort>

    </NetworkConnect>
...
  </EventFiltering>
</Sysmon>
```

このname属性に指定した値はSysmonのイベントログでは**RuleName**フィールドへ設定されます。
![sysmon_event_viewer4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/d2ec79b0-d5e9-67f5-eb0b-89e99a3ea773.png)


例えばこのname属性に設定する値を以下のように構造化データとしておくことで、後ほどElasticsearch/Ingestノード等でパーシングおよび加工し、分析や集計する場合に利用できます。

name属性値を「プロパティ名1=プロパティ値1, プロパティ名2=プロパティ値2,...」で構造化した例。

```xml:my_sysmon_config.xml
<Sysmon schemaversion="4.00">
  <EventFiltering>    
    <!--イベントID: 3, ネットワーク接続-->
    <NetworkConnect onmatch="include">

      <!--インターネットへの接続フィルタ（プロキシ経由通信をポート番号で絞り込み）-->
      <DestinationPort name="type=internet, via=proxy" condition="is">3128</DestinationPort>

      <!--内部ネットワークへの接続フィルタ（送信先ポート番号で絞り込み）-->
      <DestinationPort name="type=internal, protocol=http" condition="is">80</DestinationPort>
      <DestinationPort name="type=internal, protocol=https" condition="is">443</DestinationPort>

    </NetworkConnect>
...
  </EventFiltering>
</Sysmon>
```

またこれらのフィルタ条件はAND/ORのグループ化することもできます。詳細はこちらの[「Sysmon/Event filtering entries」](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon#event-filtering-entries)を参照してください。

###公開されている設定ファイルを利用する
採取するイベントのフィルタ条件をスクラッチから作成するのは大変です。

そのためあらかじめ必要なフィルタが設定されて公開されているSysmon設定ファイル例をいくつかご紹介します。これらの設定ファイル例をベースにして運用環境にあった設定を行ってもよいかもしれません。

* [「SwiftOnSecurity/sysmon-config: Sysmon configuration file template with default high-quality event tracing」](https://github.com/SwiftOnSecurity/sysmon-config)
* [「Cyb3rWard0g/ThreatHunter-Playbook: A Threat hunter's playbook to aid the development of techniques and hypothesis for hunting campaigns」](https://github.com/Cyb3rWard0g/ThreatHunter-Playbook)
* [「ion-storm/sysmon-config: Advanced Sysmon configuration, Installer & Auto Updater with high-quality event tracing」](https://github.com/ion-storm/sysmon-config)
* [「olafhartong/sysmon-modular: A repository of sysmon configuration modules」](https://github.com/olafhartong/sysmon-modular)

※ 最近では[MITRE ATT&CK](https://attack.mitre.org/)のフレームワークにSysmonイベントをマッピングする試みも行われているようです。

#Sysmonの動作確認
Windowsのイベントビューワーを起動しSysmonイベントログが採取されているかを確認します。
![sysmon_event_viewer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/9ce84304-9f75-1b94-56ff-db234289ff41.png)
![sysmon_event_viewer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/8c52e2c5-f949-ebba-9227-b7313c40d8d0.png)

#Sysmonイベントログサイズの調整
Sysmonイベントログの最大サイズはデフォルトでは最大64MBです。それを超えた場合には古いイベントから上書きされます。ログ取りこぼしの回避など運用環境の要件に応じて最大サイズを調整します。

![sysmon_event_viewer3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/f2f5c02d-d628-74a0-8dea-2aa683534288.png)


#おまけ: Sysmonのインストールを隠蔽する
侵入を許してしまったWindows PC上での攻撃者による初期探索活動に対して、（限定的ではありますが・・・）Sysmonのインストールを隠す以下のような機能も提供されています。

1. **Sysmonサービス名の変更**: Sysmon64.exeを別名でコピーまたはリネームし、インストールを実行します。
2. **Sysmonドライバ名の変更**: -dオプションを指定してインストールを実行します。

※SysmonはWindowsサービス(ユーザ空間)とドライバ(カーネル空間)の2つのコンポーネントから構成されています。

以下はサービス名に**hoge**、ドライバ名に**foo**を指定した場合の例です。

```text
#別名のEXEファイルへコピーします
copy Sysmon64.exe hoge.exe

#別名コピーしたEXEに-d <別名ドライバ名>を指定してインストールします
hoge.exe -i my_sysmon_config.xml -d foo
  System Monitor v9.01 - System activity monitor
  Copyright (C) 2014-2019 Mark Russinovich and Thomas Garnier
  Sysinternals - www.sysinternals.com

  Loading configuration file with schema version 4.00
  Sysmon schema version: 4.20
  Configuration file validated.
  hoge installed.
  foo installed.
  Starting foo.
  foo started.
  Starting hoge..
  hoge started.
```

ただし、**hoge.exe**のファイル情報(会社名、プロダクト名、説明）は当然Sysmon64.exeと同一のため見破られる可能性も高そうです（笑）
![sysmon_hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/01a1b50a-d072-8c81-eeaf-deed6ac91ebb.png)
（ファイル情報の「説明(Description)」は「System activity monitor」のまま）


#まとめ
Elasticsearchを利用した基本的なログ基盤上でエンドポイントログを収取する実装例について、その概要とSysmonの設定について説明しました。

次回はSysmonで記録されたWindows動作ログをElasticsearchへ実際に転送するWinlogbeatをインストールおよび設定していきます。

[「エンドポイントログ編（その２） - Winlogbeat/Elasticsearch」](https://qiita.com/rhpenguin/items/6dc4c3f82cd87122958c)へ続く