Log Analytics ワークスペースの Auxiliary プラン (補助ログ) に Linux Syslog (/var/log/messages) を取り込む

# 1. はじめに
Log Analytics ワークスペースの新しいプランに Auxiliary テーブルプランが発表されました。本記事では Auxiliary プランを活用検討として、Linux Syslog ログファイルを Azure Monitor DCR 経由で取り込む方法をご紹介します。

# 2. [参考] Auxiliary テーブルプランとは
これまで提供されてきた Analytics (分析)ログ、Basic (基本)ログに加えて、新たに Auxiliary (補助)プランが提供されました。基本的な機能は Basic ログと変わりませんが、より低価格に取り込める半面、パフォーマンスは低速扱いとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/27eaba63-490f-0f12-d482-939e061229ea.png)

[ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/data-platform-logs#table-plans)にも記載されている通り、以下のような違いが有ります。
以下はドキュメント記載のテーブルプランから抜粋したものです。

|  機能  |  分析ログ  |  基本ログ  |  補助ログ<BR>(2024.8 Preview)  |
| ---- | ---- | ---- | ---- |
| 主な用途 |- 継続的な監視<BR>- リアルタイムの検出<BR>- パフォーマンス分析など |- トラブルシューティング<BR>- インシデント応答に必要なデータ | 監査とコンプライアンスデータなど |
|  サポートされているテーブルの種類  | 全て | - 一部のテーブル<BR>- DCRベースのカスタムテーブル | DCRベースのカスタムテーブル |
| ログクエリ | 全て | 単一テーブル内のKQL(JOINを除く) | 単一テーブル内のKQL(JOINを除く) |
| クエリパフォーマンス | 速い | 速い | 遅い |
| Sentinel 分析ルール |  ○ | X | X |
| 検索ジョブ | ○ | ○ | ○ |
| 復元 | ○ | ○ | X |

DCR ベースのカスタムテーブル (-CL が付くテーブル）であれば、機能としては基本ログと変わらず、違いはクエリーのパフォーマンス性能といったところになります。
料金比較は公式サイトをご確認下さい。

https://azure.microsoft.com/ja-jp/pricing/details/monitor/

# 3. Auxiliary プランの前提条件
Auxiliary プランの前提条件として以下記載があります。
2024.8 現在、Auxiliary プランの作成、および DCR ルールの作成は Azure Portal に対応していないため、RESTAPI / Powershell を用いた作成のみになります。

- データ取集エンドポイント(DCE)経由であること
- Log Analytics ワークスペース内のすべてのテーブルに、``TimeGenerated`` という名前の列があること
- ``TimeGenerated`` 列は [ISO8601 形式](https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/scalar-data-types/datetime#iso-8601)であること
- DCR 時に変換 (Transform) は不可
- 2024.8 現在、リージョン限定 (※ 東日本/西日本は未サポート)

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/create-custom-table-auxiliary#prerequisites


# 4. 取り込み方法の検討
2024.8 現在、Auxiliary プランの取り込み方法としては以下の 2 つが提供されています。

- [Azure Monitor エージェントを使用してテキストファイルからログを収集](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/data-sources-custom-logs)
　- AMA エージェントを導入した Windows / Linux サーバーのテキストファイルを読み取って収集する方式
　- 2024.8 現在、正規化はサポートされておらず ``Timegenerated`` と ``RawData`` フィールドのみで取り込まれる
- [Logs ingestion API を使用して Azure Monitor にデータを送信](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/tutorial-logs-ingestion-api?tabs=dcr)
　- Log Ingestion API 経由でデータを取り込む方式。スクリプト化が必要
　- データを JSON アレイ化して、正規化されたフィールドで送付することが可能

# 5. 試してみる
補助ログの活用検討として、以下を検討してみました。

# 5.1 Linux syslog (/var/log/messages) の記録・監査
Linux サーバーの auditd などの監査記録である ``LOG_AUTH`` , ``LOG_AUTHPRIV`` や、アプライアンスなどの CEF (Common Security Event Format) ログを Microsoft Sentinel / Log Analytics ワークスペースに分析対象 (Analytics) として取り込むことは多いと思いますが、汎用的なログになる ``/var/log/messages`` を監査用途として補助ログに取り込んでみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/5e9a685e-0eee-4663-1ed7-b75c043ada74.png)

## 5.1.1 Auxiliary テーブルの作成
ドキュメントの通りに、はじめに補助ログのテーブルを作成します。
ここでは ``Syslog_Text_Aux_CL`` といった Aux テーブルを作成しています。

```powershell
# parameter
$tenantId = "<Your Tenant Id>"
$subscriptionId = "<Your Subsription Id>"
$resourcegroup = "<Your Resource Group>"
$workspace = "<Log Analytics Workspace Name>"
$tableName = "Syslog_Text_Aux_CL"
$tableParams = @'
{
    "properties": {
        "schema": {
            "name": "MyTable_CL",
            "columns": [
                {"name": "TimeGenerated", "type": "datetime"},
                {"name": "RawData", "type": "string"}
            ]
        },
        "totalRetentionInDays": 365,
        "plan": "Auxiliary"
    }
}
'@
# replace $tableName in $tableParams
$tableParams = $tableParams -replace "MyTable_CL", $tableName
# Login
Connect-AzAccount -Tenant $tenantId -Subscription $subscriptionId
# REST API Path
$restApiPath = "/subscriptions/$subscriptionId/resourcegroups/$resourcegroup/providers/microsoft.operationalinsights/workspaces/$workspace/tables/$tableName" + "?api-version=2023-01-01-preview"
# Create custom table
Invoke-AzRestMethod -Path $restApiPath -Method PUT -payload $tableParams
```
スクリプトを実行すると、ターゲットの Log Analytics ワークスペースにカスタムテーブルとしてテーブルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/e18b49ed-e435-b48e-e1dd-963c28723819.png)

## 5.1.2 DCE データ収集エンドポイントの作成
Aux テーブルへの取り込みには、DCE 経由の接続が必須となるため、事前に DCE を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/4511f0aa-584f-a3a3-8bc4-4eee867317f9.png)

## 5.1.3 DCR データ収集ルールの作成
Azure Monitor Agent に当てる DCR を作成します。
2024.8 現在、Azure Portal からは作成出来ないため、仕様に注意して DCR の JSON ファイルを作成します。

- Location はAuxテーブルを作成した Log Analytics ワークスペースのリージョンを指定
- AMA DCR 経由のため、フィールドは ``TimeGenerated`` と ``RawData`` 指定
- Stream / OutputStream は ``Custom-カスタムテーブル名`` で指定

```json
{
    "location": "australiaeast",
    "properties": {
        "dataCollectionEndpointId": "/subscriptions/<Your Subscription Id>/resourceGroups/<Your Resource Group>/providers/Microsoft.Insights/dataCollectionEndpoints/<DCE 名>",
        "streamDeclarations": {
            "Custom-Syslog_Text_Aux_CL": {
                "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "datetime"
                    },
                    {
                        "name": "RawData",
                        "type": "string"
                    }
                ]
            }
        },
        "dataSources": {
            "logFiles": [
                {
                    "streams": [
                        "Custom-Syslog_Text_Aux_CL"
                    ],
                    "filePatterns": [
                        "/var/log/messages"
                    ],
                    "format": "text",
                    "settings": {
                        "text": {
                            "recordStartTimestampFormat": "ISO 8601"
                        }
                    },
                    "name": "Custom-Syslog_Text_Aux_CL"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/<Your Subscription Id>/resourcegroups/<Your Resource Group>/providers/microsoft.operationalinsights/workspaces/<Log Analytics Name>",
                    "workspaceId": "<LAW Workspace Id>",
                    "name": "<LAW Name>"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Custom-Syslog_Text_Aux_CL"
                ],
                "destinations": [
                    "<LAW Name>"
                ],
                "outputStream": "Custom-Syslog_Text_Aux_CL"
            }
        ]
    }
}
```
作成した DCR の JSON ファイルを Powershell で実行します。

```powershell
 New-AzDataCollectionRule -ResourceGroupName "<Your Resource Group>" -Name "<DCR 名>" -JsonFilePath "C:\temp\AuxLinuxMessagesDCR.json"
```
成功すると以下のように ``DataFlow`` , ``DataSourceLogFile`` などの結果が見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/1419c5cc-66ca-7c1c-ac41-175f3331b606.png)


:::note warn
Azure CLI のコマンド ``az monitor data-collection rule create`` による DCR ルール作成も試したのですが、2024.8.6 現在不具合があるようで ``DataSourceLogFile`` 部分が欠落してしまいます。Powershell だと問題無かったのでご注意下さい。 
:::

## 5.1.4 作成した DCR にリソースを割り当てる
Azure Portal に補助ログ取り込み用に作成した DCR が表示されますので、対象のリソースを割り当てます。今回は Azure Monitor Agent (Linux) のリソースを割り当てています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/e425d6eb-2ee0-09d8-dd91-53308be22480.png)

## 5.1.5 データを確認する
暫くすると、対象のワークスペースにログが取り込まれてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/478e5c26-0a73-e694-ea10-76baa667a511.png)

## 5.1.6 留意事項
2024.8 現在、Preview の制限事項に制限事項の記載が無いのですが、Azure Monior テキストログの収集は 5 分間隔に更新データを取得してアップロードします。Aux テーブル先のスロットルなどの仕様で処理出来ない可能性があります。大容量のデータについては事前評価を実施することをお勧めします。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/data-sources-custom-logs

# まとめ
Auxiliary ログがリリースされたことで、監査ログなどの取り込み方針や、Microsoft Sentinel / Log Analytics ワークスペースの最適化が進むのではと思います。本記事がどなたかの参考になれば幸いです。

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


# 参考資料
本ブログの参考に k.sato さんのブログを参考にさせていただきました。ありがとうございました。

https://zenn.dev/microsoft/articles/c68e9746623335