Logstash で Azure Sentinel (Azure Log Analytics) にデータを格納する

# ＊2023年3月時点において

こちらの記事で紹介している LogStash のプラグインは Log Analytics Data Collector API を利用したレガシー版です。

https://learn.microsoft.com/ja-jp/azure/sentinel/connect-logstash

今後は現時点でパブリックプレビューとなっている、DCR ベース版が主流になっていくと思われます。

https://learn.microsoft.com/ja-jp/azure/sentinel/connect-logstash-data-connection-rules

DCR ベース版では、DCR によってデータのエンリッチやフィルタリングができ、かつ既存のテーブル (Syslog, WindowsEvent, CommonSecurityLog など) へのログ格納も可能になっています。


# 本記事について

[Azure Sentinel](https://docs.microsoft.com/ja-jp/azure/sentinel/overview) は Microsoft Azure の一サービスで、SIEM や SOAR の機能をマネージドサービスとして利用することができます。Azure Sentinel には様々なコネクターやサーバー用のエージェントが用意されており、大半のログソースから簡単にデータを取得できます。

一方で、コネクターがない際やログ格納の前にフィルタリングやエンリッチメントを行いたい際には、Logstash を活用することができます。本記事では、[こちらの公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/sentinel/connect-logstash)を基に、実際にログを格納していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/90866bf7-edcb-b5b1-785a-ff38dc6cd986.png)


# 準備

##Logstash 用のサーバーの作成

今回は Azure IaaS 上の仮想マシンを利用します。Ubuntu OS で一台 Linux のマシンを使います。

## Logstash のインストール

まず、Javaのバージョンを確認し、openjdk8をインストール・バージョン変更します。

```Bash
sudo apt install openjdk-8-jdk
```

次に、LogStash のインストールを行います。

Log Analytics 用の出力プラグインが、Logstash のバージョン7以上しか対応していないため、必ず7以上が入るように設定します。

```bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
```

Logstash をインストールします。

```bash
sudo apt update
sudo apt install logstash
```

## Logstash のプラグインのインストール

logstash のインストール先のディレクトリに移動し、Log Analytics (Sentinel) 用の出力プラグインである、microsoft-logstash-output-azure-loganalytics をインストールします。

```bash
cd /usr/share/logstash/bin
sudo ./logstash-plugin install microsoft-logstash-output-azure-loganalytics
```

これにて準備は完了です。

# ログの格納と検索

## ログの格納

今回は下記のようなCSVファイルで試してみます。これをログを格納するディレクトリに置きます。
（今回は、/home/yoshiakioi/logを使います。）

```csv:signin.csv
"TimeGenerated [UTC]",Identity,Location,AppDisplayName,ClientAppUsed
"6/16/2021, 1:12:53.754 PM","Traveler Account",RU,"Microsoft Azure PowerShell","Mobile Apps and Desktop clients"
"6/16/2021, 1:12:53.301 PM","Traveler Account",RU,"Microsoft Azure PowerShell","Mobile Apps and Desktop clients"
"6/16/2021, 1:10:47.192 PM","Gershon Local",IL,"Azure Advanced Threat Protection",Browser
"6/16/2021, 1:10:05.376 PM","Anand Kumar",IN,"Azure Portal",Browser
"6/16/2021, 1:08:29.846 PM","Arseny Vasilev",RU,"Azure Portal",Browser
"6/16/2021, 1:08:10.688 PM","Arseny Vasilev",RU,"Azure Portal",Browser
"6/16/2021, 1:07:40.785 PM","Arseny Vasilev",RU,"Azure Portal",Browser
"6/16/2021, 1:07:34.655 PM","Gopakumar G",IN,"Azure Portal",Browser
"6/16/2021, 1:03:14.627 PM","Arseny Vasilev",RU,"Azure Portal",Browser
"6/16/2021, 1:02:18.634 PM","Arseny Vasilev",RU,"Azure Portal",Browser
```

次にコンフィグファイルを用意します。your workspace id と your workspace key にはそれぞれ、Log Analytics ワークスペースの ID とキーを入れてください。

```:singin.conf
input {
    file {
        path => ["/home/yoshiakioi/log/*.csv"]
        sincedb_path => "/home/yoshiakioi/log/sincedb"
        start_position => "beginning"
        codec => plain { 
            charset => "UTF-8"
        }
    }
}
filter {
    csv {
        columns => ["TimeGenerated", "Identity", "Location","AppDisplayName", "ClientAppUsed"]
        skip_header => true
    }
}
output {
    microsoft-logstash-output-azure-loganalytics {
        workspace_id => "<your workspace id>" # <your workspace id>
        workspace_key => "<your workspace key>" # <your workspace key>
        custom_log_table_name => "LogStash_Signin_Test"
    }
}
```

そして、このコンフィグファイルを使って、Logstashを起動します。

```
sudo /usr/share/logstash/bin/logstash -f /home/yoshiakioi/signin.conf
```

以上で、Linux マシン側の作業は終了です。

## ログの検索

Logstashの起動後数分待つと、Log Analytics ワークスペースのカスタムログに指定されたテーブル名のスキーマが新たに追加されます。Logstash の Log Analytics のプラグインは内部的には [Azure Monitor Data Collector API](https://docs.microsoft.com/ja-jp/azure/azure-monitor/logs/data-collector-api)を利用しています。そのため、事前に Log Analytics ワークスペース側でスキーマなどの設定を行うことなく、自動的にカスタムログとしてテーブルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/3f69f6e2-1166-4cde-d02a-ad9ae7fc63eb.png)

上記のcsvフィルターを使うことによって、Location_s や Identity_s といったカラムにそれぞれの値が分配され、検索できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/792f7ac8-7c76-6bd6-edec-f0275a88dded.png)

以上で、本記事の検証作業は終了です。

# 補足：Log Analytics のカスタムで取り込む手法のまとめ

Sentinel へデータをカスタムで取り込む手法には、それぞれ利点と欠点があります。ケースに合わせて最適な選択が行えるよう、簡単に利点・欠点をまとめてみます。

## Log Analytics Agent - カスタムログ

Log Analytics エージェントには、テキストログの取り込みを行う[カスタムログ](https://docs.microsoft.com/ja-jp/azure/azure-monitor/agents/data-sources-custom-logs)という機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/46f79e50-7a2c-e90f-6734-c505f219ce81.png)

### 利点

* GUI で簡単にログ形式の設定が可能
* エージェントのサポートもマイクロソフトから提供

### 欠点

* 形式の指定を満たさないものは取れない
* フィルタリングやエンリッチメント機能が無い
* 大量のログを捌くのが苦手

## DCR ベースのテキストログ

2022年にリリースされた DCR ベースのテキストログについては下記にて解説しております。DCR をベースにしておりスケーラビリティなどが改善されています。

https://qiita.com/YoshiakiOi/items/0a93fe3bbde8845fe3d0

### 利点

* GUI で簡単にログ形式の設定が可能
* エージェントのサポートもマイクロソフトから提供

### 欠点

* 形式の指定を満たさないものは取れない

## Logstash

### 利点

* フィルタリングやエンリッチメント機能がある
* 既存で Logstash を利用している場合は、そのまま Sentinel を利用できる

### 欠点

* マイクロソフトのサポートは、出力プラグインのみ
* Logstash 用の VM のコストや運用負荷が発生

## Azure Monitor Data Collector API

[Azure Monitor Data Collector API](https://docs.microsoft.com/ja-jp/azure/azure-monitor/logs/data-collector-api)はデータを格納するための Rest APIです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/282f1227-0aaa-831f-3e16-c314540135dc.png)


### 利点

* 柔軟に取り込みがカスタマイズできる
* Logic Apps などのワークフローに組み込める

### 欠点

* PowerShell や Python などの知識が必要
* Rest API の実行間隔や一時ストレージなどの設計が必要
* Logic Apps を使う場合は、基盤側の制約がある（最大サイズ、コネクターの実行回数など）

## Log Ingest API

2023年3月現在 Data Collector API のアップグレード版である Log Ingest API も利用できるようになっています。詳細は下記をご参照ください。

https://qiita.com/YoshiakiOi/items/466c1660ff2811225624

### 利点

* 柔軟に取り込みがカスタマイズできる

### 欠点

* PowerShell や Python などの知識が必要
* Rest API の実行間隔や一時ストレージなどの設計が必要

# 最後に

Logstash を利用した格納は、多少の構築や運用負荷が発生するものの、柔軟に Azure Sentinel に取り込みを行いたい際には有力な選択肢になるかと思います。本稿がその一助となれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。