標的型攻撃に対するJPCERT/CCのおすすめログ設定をElasticsearchで構築してみる（準備編）

# はじめに
標的型攻撃やサプライチェーン攻撃という現実がますます身近になり、これまでの事前防御の対策だけでは十分ではなく、侵入や攻撃をされてしまったことを想定した早い段階での攻撃検出およびその被害状況を効率的に可視化、追跡する対策が必要といわれています。そしてその具体的な対応方法の一つとして改めて重要視されているのがログを活用した分析です。またインシデント発生時に専門家に実際の解析を依頼する場合にもこのログの有無が成否を大きく左右します。

本記事ではJPCERT/CCより[「高度サイバー攻撃への対処におけるログの活用と分析方法」](https://www.jpcert.or.jp/research/apt-loganalysis.html)にて紹介されているおすすめログ設定をもとに基本的なログ解析基盤を構築してみます。本記事ではもちろん無償で利用可能なソフトウェアだけを利用して構築します。

* ネットワークログ(プロキシサーバ、メールサーバ、DNSサーバ)

またJPCERT/CCではエンドポイントログの採取、分析および可視化についても[ツール](https://blogs.jpcert.or.jp/ja/2018/09/SysmonSearch.html)を無償で提供するなど推奨しています。本記事で構築するログ解析基盤でもそのコンフィグレーションに基づいて収集してみます。

* エンドポイントログ (Windows 10)

ログ収集基盤として[Elasticsearch](https://www.elastic.co/jp/products/elasticsearch)を利用し、ネットワークログの収集対象としてプロキシサーバ([Squid](http://www.squid-cache.org/))、メールサーバ([Postfix](http://www.postfix.org/))およびDNSサーバ([Dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html))のログをElastic Stackに含まれる[Filebeat](https://www.elastic.co/jp/products/beats/filebeat)で収集します。
そしてエンドポイントログについては、Microsoft社から提供されている無償で利用可能な[Sysmon](https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon)のログやセキュリティイベントログを[Winlogbeat](https://www.elastic.co/jp/products/beats/winlogbeat)を利用して収集します。

またFilebeatについては、同製品には同梱されていないSquid、PostfixやDnsmasq用の[Filebeat](https://www.elastic.co/jp/products/beats/filebeat)モジュールを作成してデプロイします。

本記事の続編は以下の通りです。
* [「プロキシサーバ編」](https://qiita.com/rhpenguin/items/7ec7ddf562906257e297)
* [「メールサーバ編」](https://qiita.com/rhpenguin/items/c221368c75608c71cae2)
* [「エンドポイントログ編（その１- 概要/Sysmon）」](https://qiita.com/rhpenguin/items/a53484fa76e375f27f24)
* [「エンドポイントログ編（その２- Winlogbeat/Elasticsearch）」](https://qiita.com/rhpenguin/items/6dc4c3f82cd87122958c)



※本記事で作成するFilebeatモジュールや各ソフトウェアの設定例は[こちら](https://github.com/rhpenguin/)へ仮置きしておきます（今後、もう少しわかりやすい内容にする予定です）。

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

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

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

#ネットワーク構成例
ここでは以下のようなシンプルなネットワーク構成を想定。
![log_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/975db785-c581-e6fc-8b2a-bac4121f9de8.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アクセス|Windows 10クライアントPC上のWebブラウザはインターネットへdmz.example.comで動作するプロキシサーバ(Squid)経由でアクセス|
|メール|Windows 10クライアントPC上のメールクライアントはdmz.example.comで動作するメールサーバ(Postfix/Dovecot)へアクセス|
ログ|dmz.example.com上で動作するプロキシサーバ、メールサーバとDNSサーバのログをFilebeatがElasticsearch(log.example.com)へ転送。<br/>Windows 10イベントログをWinlogbeatが同様に転送|

#作業内容
1. ネットワーク構築および各ソフトウェアのインストールと設定
2. ネットワークソフトウェア(Squid、PostfixとDnsmasq)でのログ設定およびフォーマットを追加または変更
3. ネットワークソフトウェア用のFilebeatモジュールの作成
4. Filebeatモジュールをdmz.example.comに配置し設定
5. SysmonおよびWinlogbeatをWindows10 PCにインストールと設定
6. Kibanaで確認

#Filebeatモジュールについて

[Filebeatモジュール](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html)を利用することにより、ログメッセージの加工設定（Elasticsearch/Ingestノードのパイプライン設定）およびマッピングをログ採取元(シッパー側)から注入することができます。

Elasticsearch/IngestノードとFilebeatの詳細についてはこちらの[解説](https://www.elastic.co/blog/new-way-to-ingest-part-1)を、またFilebeatモジュール作成の詳細については[こちらの公式サイト](https://www.elastic.co/guide/en/beats/devguide/current/filebeat-modules-devguide.html)を参照ください。

![Elasticsearchサイトより](https://www.elastic.co/assets/blt26d27a955d1401fc/Screen%20Shot%202016-11-07%20at%2018.41.10.png)
["A New Way To Ingest - Part 2"(Elasticsearch社サイト)より](https://www.elastic.co/blog/new-way-to-ingest-part-2)
![Elasticsearchサイトより](https://www.elastic.co/guide/en/beats/filebeat/current/images/filebeat.png)
["Filebeat Overview"(Elasticsearch社サイト)より](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html)


Elasticsearch/[Ingestノード](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html)ではログメッセージをインデックスへ格納する前処理として様々な加工を実行できますが、本記事ではログメッセージのテキスト値をパーシングして必要な情報を抽出し、JSON形式（Kibanaで各情報単位で検索や集計したり、自作ツール等で扱いやすい形式）へ変換するために利用します。

FilebeatにはApacheやNginx用に利用可能なモジュールがあらかじめ同梱されており有効化するだけで利用可能です。一方でSquid、PostfixやDnsmasq用のモジュールは（現状では）含まれていないようです。そのため上述のようにイベントログのメッセージをパーシングし、JSON出力するためのモジュールを作成してみます。

ただし、モジュールといってもいくつかの必要な設定ファイル(YAMLとJSONファイル)を作成するだけでOKです。

####Squid用モジュールの例
![filebeat_json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/e15c74d6-9eee-1a96-1590-71ecd35ec0d7.png)
またそれだけではなく地理情報を付加したり、不要な情報を削除したりなどパイプラインで加工処理を行います。
![filebeat_json2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362125/3f98786c-c08e-7656-49e8-59dfedc66916.png)


# Filebeatが作成するインデクス名
Filebeatはログを転送する際、デフォルトで日付単位でインデクスを作成します。

```
curl http://192.168.2.10:9200/_cat/indices?v

health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   filebeat-6.6.0-2019.04.10 1rEHhcxxxxCUu4v4bEaPhw   5   1        212            0    990.1kb        990.1kb
yellow open   filebeat-6.6.0-2019.04.11 klYKHTxxxxSzvgw-asWCsg   5   1        227            0    897.5kb        897.5kb
yellow open   filebeat-6.6.0-2019.04.09 SkDQFkxxxxSv7gZ4D7Hkag   5   1        673            0        1mb            1mb
yellow open   filebeat-6.6.0-2019.04.12 nSe_rJxxxxaB9X9ZgzNrUw   5   1          9            0     49.4kb         49.4kb
yellow open   filebeat-6.6.0-2019.04.13 R1vQM6xxxxGY084IWk3gsQ   5   1        190            0    845.8kb        845.8kb
```

#Filebeatモジュールの作成
Filebeatのモジュール作成方法は[こちらの公式サイト](https://www.elastic.co/guide/en/beats/devguide/current/filebeat-modules-devguide.html)で解説されていますが（テンプレートファイルを生成するMakeファイルも用意されています）、ここではFilebeatのパッケージに同梱されているApache用のモジュールを雛形にして作成してみます。

### モジュール本体のファイル構成
Filebeatのインストールディレクトリ(例:**/usr/share/filebeat/**)配下のmodulesディレクトリに必要ないくつかのYAML/JSONファイルを決められたディレクトリ構成で配置します(これだけ！)。

```
/usr/share/filebeat/
   `- module/
        `- (モジュール名)/
             |- module.yml
             `- (ログファイル名)/
                  |- manifest.yml
                  |- config/
                  |    `- (ログファイル名).yml
                  `- ingest/
                       `- default.json 
```
* モジュール名: ログを採取するソフトウェア名です。例えば**squid**や**postfix**。
* ログファイル名: 各ソフトウェアが出力するログファイル名です。例えばapacheの**access**.logや**error**.logからファイル拡張子を取り除いたもの。

（必ずしも上記の命名にする必要はありませんが、Filebeatに同梱されている他モジュールに合わせておきます）

例えば本トピックで扱うSquidの**/var/log/squid/access.log**では以下のような構成となります。

```
/usr/share/filebeat/
   `- module/
        `- squid/
             |- module.yml
             `- access/
                  |- manifest.yml
                  |- config/
                  |    `- access.yml
                  `- ingest/
                       `- default.json 
```

|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|---|---|
|manifest.yml|モジュール関連のファイルパスやElasticsearchプラグイン設定を記述|
|access.yml|Filebeatへの入力ファイルの設定を記述|
|default.json|IngestノードのPipeline設定を記述|
|module.yml|ダッシュボード（Kibana）の設定を記述|

### Filebeatモジュールに記述すること
本記事では前述のとおりログメッセージをパースしてJSON形式へ変換する機能を実装します。Filebeatモジュールでは[Ingestノード](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html)の[各プロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest-processors.html)の設定を行います。以下のプロセッサを利用します。

|&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|---|---|
|[Grokプロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html)|前述のログメッセージのテキストデータをパースしてJSON形式へ変換するプロセッサ。<br>パース形式を正規表現を組み合わせたパターンで記述するだけでOKです|
|[Dateプロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/date-processor.html)  |各ソフトウェアのログのタイムスタンプ形式をISO8601形式へ統一して扱えるように変換します|
|[Removeプロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/remove-processor.html)  |不要な情報を削除。<br>Grokによってパースされた後で不要な情報をElasticsearchへ保存する前に削除します|
|<nobr>[User Agentプロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/user-agent-processor.html)</nobr>|Webブラウザが送信するユーザエージェント情報をパースします (Squid)|
|[GeoIPプロセッサ](https://www.elastic.co/guide/en/elasticsearch/reference/current/geoip-processor.html)|ログメッセージに含まれるIPアドレスの地理情報を追加します (Squid)|

これらは前述の**ingest/default.json**へ記述します。


#各Filebeatモジュールの設定手順
各ソフトウェアのための具体的な設定手順は次回以降の記事にご紹介しますが、ここでは概要を説明しておきましょう。

### モジュールの設定ファイル作成
```
/etc/filebeat/
   `- modules.d/
      |- squid.yml
      |- postfix.yml
       ` dnsmasq.yml
```
各ソフトウェア用のモジュール毎に設定ファイルを作成します。こちらもApache用の設定ファイルを雛形にして多少変更するだけです。各ソフトウェア用の記事にて詳細は説明します。

### モジュールのテンプレート設定を追加
```
/etc/filebeat/
   `- my_fields.yml
```
デフォルトのテンプレート設定ファイルでるfields.ymlに各ソフトウェア用のマッピング定義を追加します。こちらもApache用の定義を雛形にして変更するだけです。

### Filebeatの設定を追加
```
/etc/filebeat/
   `- filebeat.yml
```
|&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;|説明|
|---|---|
|hosts: ["log.example.com:9200"]|Elasticsearchが動作するホストアドレスとポート番号を指定|
|filebeat.overwrite_pipelines: true|Elasticsearchへの接続毎にIngestノードのパイプライン設定を注入（開発デバッグ用）|
|setup.template.enabled: true|テンプレート設定の注入を有効化|
|setup.template.fields: "/etc/filebeat/my_fields.yml"|テンプレート設定ファイルの場所を変更|
|setup.template.overwrite: true|既存のテンプレート設定を更新|

詳細は**/etc/filebeat/filebeat.reference.yml**を参照してください。

### モジュールの有効化 
```
filebeat modules enable モジュール名(例: squid)
```

### モジュールのテンプレート設定をElasticsearchへ注入
```
filebeat setup --template
```

### モジュールのパイプライン設定をElasticsearchへ注入
```
filebeat setup --pipelines -modules モジュール名,モジュール名(例:squid,postfix,dnsmasq)
```

#まとめ
JPCERT/CCによるおすすめログ設定（[「高度サイバー攻撃への対処におけるログの活用と分析方法」](https://www.jpcert.or.jp/research/apt-loganalysis.html)）をElasticsearchを利用して構築する準備ができました。[次回](https://qiita.com/rhpenguin/items/7ec7ddf562906257e297)から実際にネットワークログのコンフィグレーション、プロキシサーバ(Squid)、メールサーバ(Postfix)とDNSサーバ(Dnsmasq)のFilebeatモジュールの作成やログ設定について説明していきます。その後にエンドポイントログ（Windows 10）のコンフィグレーションを行っていきます。

[「プロキシサーバ編」](https://qiita.com/rhpenguin/items/7ec7ddf562906257e297)へ続く

本記事の続編は以下の通りです。
* [「プロキシサーバ編」](https://qiita.com/rhpenguin/items/7ec7ddf562906257e297)
* [「メールサーバ編」](https://qiita.com/rhpenguin/items/c221368c75608c71cae2)
* [「エンドポイントログ編（その１- 概要/Sysmon）」](https://qiita.com/rhpenguin/items/a53484fa76e375f27f24)
* [「エンドポイントログ編（その２- Winlogbeat/Elasticsearch）」](https://qiita.com/rhpenguin/items/6dc4c3f82cd87122958c)