💻

Azure Monitor Agent で CEF 形式の syslog を転送する場合の TimeGenerated を変更する

2023/10/27に公開

はじめに

Sentinel にオンプレミスのプロキシやファイアウォールのログを CEF 形式で取り込む際、Log Analytics Agent もしくは Azure Monitor Agent をインストールしたログ転送サーバ (Linux) を準備する必要があります。
https://learn.microsoft.com/ja-jp/azure/sentinel/connect-cef-ama

この際、テーブルに読み込まれたログの TimeGenerated には Log Analytics Agent もしくは Azure Monitor Agent がイベントを受信した時刻が記録され、実際にログが生成された時刻 (=プロキシであればアクセスがあった時刻) とずれが発生する可能性があります。Log Analytics Agent ではログ生成時刻に修正するための設定スクリプトが準備されているのですが、 Azure Monitor Agent に関しては残念ながら 2023.10 時点では未提供です。
https://learn.microsoft.com/ja-jp/azure/sentinel/connect-common-event-format#changing-the-source-of-the-timegenerated-field

そのため、今回はデータ収集ルール (DCR) の変換を使用して、TimeGenerated にログ生成時刻を記録します。

設定

まず CEF でカスタムの時刻が記録できる DeviceCustomDate1にログ生成時刻を記録します。
https://learn.microsoft.com/ja-jp/azure/sentinel/cef-name-mapping#custom-timestamp-fields

送信元デバイスのログ転送設定のフォーマットで以下のように項目を追加します。

DeviceCustomDate1=%d{yyyy}-%02d{mth}-%02d{dd} %02d{hh}:%02d{mm}:%02d{ss}

なお、フォーマットは以下の datetime 形式に合わせる必要があります。
https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/scalar-data-types/datetime#supported-formats

すると、以下のように CommonEventFormat テーブルに DeviceCustomDate1 が記録されるようになります。


次にこの DeviceCustomDate1 を TimeGenerated に指定するように DCR に変換を設定します。当初テーブルの管理から変換用の DCR をすればよいかと考えていたのですが、よく調べてみると、データ収集用の DCR がある場合にはその DCR で収集されたログはテーブルの変換用 DCR は適用されないようです。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-transformations#workspace-transformation-dcr

そのため、Sentinel の「AMA による Common Event Format (CEF) (プレビュー)」 コネクタから作成した DCR に、変換の設定を追加した新たな DCR を作成して VM を紐づけます。

なお、この DCR の場合はポータルでは変換の設定できないため、Azure PowerShell を使用しています。
https://learn.microsoft.com/ja-jp/powershell/module/az.monitor/new-azdatacollectionrule?view=azps-10.4.1

Azure Powershell
New-AzDataCollectionRule -Location japaneast -ResourceGroupName "DCRResourceGroup" -RuleName "DCR-CEF" -RuleFile "C:\tmp\dcr-cef.json"
dcr-cef.json
{
    "properties": {
        "dataSources": {
            "syslog": [
                {
                    "streams": [
                        "Microsoft-CommonSecurityLog"
                    ],
                    "facilityNames": [
                        "local0"
                    ],
                    "logLevels": [
                        "Info"
                    ],
                    "name": "sysLogsDataSourceForCEF"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-monitor/providers/Microsoft.OperationalInsights/workspaces/SentinelLaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "DataCollectionEvent"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-CommonSecurityLog"
                ],
                "destinations": [
                    "DataCollectionEvent"
                ],
                "transformKql": "source | extend TimeGenerated = iif(isnotempty(DeviceCustomDate1), todatetime(DeviceCustomDate1), TimeGenerated)"
            }
        ]
    }
}

transformKql では、DeviceCustomDate1 がある場合に TimeGenerated に入力する変換としています。こちらの DCR でデータを収集した結果、以下のように TimeGenerated が変更できました。

まとめ

監査目的などアクセスログの正確な時刻を求められるケースの場合、今回のような対応が必要になると考えられます。将来的には Log Analytics Agent と同じように設定スクリプトが提供される可能性がありますが、現時点の機能でも実現できることを確認しました。

Microsoft (有志)

Discussion