ローカルのテキストファイルを Sentinel の CommonSecurityLog テーブルに書き込む
はじめに
CommonSecurityLog テーブルは 主に Sentinel でファイアウォールやプロキシのアクセス ログを CEF 形式で収集するために使用します。基本的には Azure Monitor エージェントをインストールした Linux サーバを CEF コレクターとして構成し収集するのですが、トラブルによるログ欠損や検証などの目的でローカルのテキストファイルを使用したいケースがあります。logger コマンドなどで 1 レコードずつ処理することは可能ですが、Azure Monitor エージェントのテキストログ収集が使えないかと思い、データ収集ルールをカスタマイズして検証しました。
データ収集ルールを作成する
上記の公式ドキュメントのサンプルと以前データ インジェスト API 経由で CommonSecurityLog に書き込むためのデータ収集ルールを組み合わせ以下のように ARM テンプレートを作成しました。
テキストファイルからログを取り込む場合、既定では RawData に格納されるため、そちらを CommonSecurityLog の Message カラムに格納するように変換ルールを設定しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"dataCollectionRules_name": {
"type": "String"
},
"dataCollectionEndpoints_externalid": {
"type": "String"
},
"workspaces_externalid": {
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Insights/dataCollectionRules",
"apiVersion": "2022-06-01",
"name": "[parameters('dataCollectionRules_name')]",
"location": "japaneast",
"properties": {
"dataCollectionEndpointId": "[parameters('dataCollectionEndpoints_externalid')]",
"streamDeclarations": {
"Custom-CommonSecurityLogStream": {
"columns": [
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "RawData",
"type": "string"
},
{
"name": "Message",
"type": "string"
}
]
}
},
"dataSources": {
"logFiles": [
{
"streams": [
"Custom-CommonSecurityLogStream"
],
"filePatterns": [
"C:\\tmp\\*.log"
],
"format": "text",
"settings": {
"text": {
"recordStartTimestampFormat": "ISO 8601"
}
},
"name": "CEFFile_CL"
}
]
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "[parameters('workspaces_externalid')]",
"name": "laws-for-cef"
}
]
},
"dataFlows": [
{
"streams": [
"Custom-CommonSecurityLogStream"
],
"destinations": [
"laws-for-cef"
],
"transformKql": "source | extend Message = RawData",
"outputStream": "Microsoft-CommonSecurityLog"
}
]
}
}
]
}
上記のデータ収集ルールを Windows サーバーに割り当て、C:\tmp にファイルを格納することで以下のように CommonSecurityLog に取り込むことができました。
変換ルールを詳細化することで、Message から各カラムに該当の値を格納することも可能になるかと思います。
まとめ
あくまで検証レベルになりますが、ローカルのテキストファイルから CommonSecurityLog テーブルに書き込むことができることを確認しました。こちらが実現できると都度データインジェスト API を利用する必要がなくなるため、ログ欠損時の再送や動作検証時の有効的な手段になるかと考えています。
Discussion