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


はじめに

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

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

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

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

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

ログ収集基盤としてElasticsearchを利用し、ネットワークログの収集対象としてプロキシサーバ(Squid)、メールサーバ(Postfix)およびDNSサーバ(Dnsmasq)のログをElastic Stackに含まれるFilebeatで収集します。
そしてエンドポイントログについては、Microsoft社から提供されている無償で利用可能なSysmonのログやセキュリティイベントログをWinlogbeatを利用して収集します。

またFilebeatについては、同製品には同梱されていないSquid、PostfixやDnsmasq用のFilebeatモジュールを作成してデプロイします。

本記事の続編は以下の通りです。
* 「プロキシサーバ編」
* 「メールサーバ編」
* 「エンドポイントログ編(その1- 概要/Sysmon)」
* 「エンドポイントログ編(その2- Winlogbeat/Elasticsearch)」

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

※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)

ネットワーク構成例

ここでは以下のようなシンプルなネットワーク構成を想定。

                            説明
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)へ転送。
Windows 10イベントログをWinlogbeatが同様に転送

作業内容

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

Filebeatモジュールについて

Filebeatモジュールを利用することにより、ログメッセージの加工設定(Elasticsearch/Ingestノードのパイプライン設定)およびマッピングをログ採取元(シッパー側)から注入することができます。

Elasticsearch/IngestノードとFilebeatの詳細についてはこちらの解説を、またFilebeatモジュール作成の詳細についてはこちらの公式サイトを参照ください。

Elasticsearchサイトより
"A New Way To Ingest - Part 2"(Elasticsearch社サイト)より

"Filebeat Overview"(Elasticsearch社サイト)より

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

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

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

Squid用モジュールの例


またそれだけではなく地理情報を付加したり、不要な情報を削除したりなどパイプラインで加工処理を行います。

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のモジュール作成方法はこちらの公式サイトで解説されていますが(テンプレートファイルを生成するMakeファイルも用意されています)、ここではFilebeatのパッケージに同梱されているApache用のモジュールを雛形にして作成してみます。

モジュール本体のファイル構成

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

/usr/share/filebeat/
   `- module/
        `- (モジュール名)/
             |- module.yml
             `- (ログファイル名)/
                  |- manifest.yml
                  |- config/
                  |    `- (ログファイル名).yml
                  `- ingest/
                       `- default.json 
  • モジュール名: ログを採取するソフトウェア名です。例えばsquidpostfix
  • ログファイル名: 各ソフトウェアが出力するログファイル名です。例えば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 
              説明
manifest.yml モジュール関連のファイルパスやElasticsearchプラグイン設定を記述
access.yml Filebeatへの入力ファイルの設定を記述
default.json IngestノードのPipeline設定を記述
module.yml ダッシュボード(Kibana)の設定を記述

Filebeatモジュールに記述すること

本記事では前述のとおりログメッセージをパースしてJSON形式へ変換する機能を実装します。FilebeatモジュールではIngestノード各プロセッサの設定を行います。以下のプロセッサを利用します。

                                       説明
Grokプロセッサ 前述のログメッセージのテキストデータをパースしてJSON形式へ変換するプロセッサ。
パース形式を正規表現を組み合わせたパターンで記述するだけでOKです
Dateプロセッサ 各ソフトウェアのログのタイムスタンプ形式をISO8601形式へ統一して扱えるように変換します
Removeプロセッサ 不要な情報を削除。
Grokによってパースされた後で不要な情報をElasticsearchへ保存する前に削除します
User Agentプロセッサ Webブラウザが送信するユーザエージェント情報をパースします (Squid)
GeoIPプロセッサ ログメッセージに含まれる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
                           説明
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によるおすすめログ設定(「高度サイバー攻撃への対処におけるログの活用と分析方法」)をElasticsearchを利用して構築する準備ができました。次回から実際にネットワークログのコンフィグレーション、プロキシサーバ(Squid)、メールサーバ(Postfix)とDNSサーバ(Dnsmasq)のFilebeatモジュールの作成やログ設定について説明していきます。その後にエンドポイントログ(Windows 10)のコンフィグレーションを行っていきます。

「プロキシサーバ編」へ続く

本記事の続編は以下の通りです。
* 「プロキシサーバ編」
* 「メールサーバ編」
* 「エンドポイントログ編(その1- 概要/Sysmon)」
* 「エンドポイントログ編(その2- Winlogbeat/Elasticsearch)」