💻

Azure Monitor データ収集ルールの理解とサンプル

2024/07/09に公開

はじめに

Azure Monitor で各種データを取り込む際にはデータ収集ルール (DCR) を使います。Azure ポータルで設定できるルールは一部のみなので、DCR の構造を理解して CLI や ARM テンプレートを使用してカスタマイズが必要です。今回の記事では、自分なりの DCR の構造の理解と、過去の記事で取り上げたサンプルをまとめて記載しておきます。

なお、公式ドキュメントの解説はこちらです。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-rule-structure

データ収集ルールの理解

DCR のフォーマットは以下です。

DCR Format
{
    "location": "eastus",
    "properties": {
        "streamDeclarations": {
            ...
        },
        "dataSources": {
            ...
        },
        "destinations": {
            ...
        },
        "dataFlows": [
            {
                "streams": [
                    "xxx"
                ],
                "destinations": [
                    "xxx"
                ],
                "transformKql": "source",
                "outputStream": "xxx"
            }
        ]
    }
}

streamDeclarations

  • 受信するログデータのフォーマットを json 形式で定義
  • カスタムのデータ フォーマットを利用するときに設定
  • 名前は Custom- から始める必要がある
  • 書き込み先のテーブルのフォーマットと一致する必要はない (一致しない場合は変換を利用)
  • Azure Monitor エージェント (テキスト ログのみ)、 ログ インジェスト API、 イベント ハブの場合に使用

dataSources

  • 取り込むデータ ソースを指定
  • windowsEventLogs, syslog, performanceCounters, logFiles, extension, eventHub のいずれかを指定
  • 各データ ソースの種類で既定のパラメータを指定

destinations

  • ログの書き込み先を指定
  • Log Analytics ワークスペースへの書き込みは logAnalytics を指定
  • ストレージ アカウントへの書き込みは storageBlobsDirect, storageTablesDirect を指定
  • イベント ハブへの書き込みは eventHubsDirect を指定
  • 複数の書き込み先の指定が可能 (ex. 複数の Log Analytics ワークスペース、BLOB ストレージとイベント ハブなど)
  • Azure Monitor エージェント (テキスト ログのみ)、 ログ インジェスト API、 イベント ハブ、ワークスペース変換 DCR の場合に使用

dataFlows

  • streamDeclarations で定義した stream もしくは組み込みの stream と destinations を紐づけ
  • 必要に応じて変換ルールを transformKql で定義
  • outputStream で出力先のテーブルを指定 (組み込みの場合は Microsoft-[tablename]、カスタムの場合は Custom-[tablename])
  • Windows イベント ログやパフォーマンス データなどの既知のデータソースの場合、outputStream は指定不要
  • Azure Monitor エージェント、 ログ インジェスト API、 イベント ハブ、ワークスペース変換 DCR の場合に使用

サンプル

Windows イベントログ + パフォーマンス カウンター

Windows のイベントログとパフォーマンス カウンターを取得し、Log Analytics ワークスペースの Event テーブルと Perf テーブルに記録する。Azure ポータルから設定可能。

{
    "properties": {
        "streamDeclarations": {},
        "dataSources": {
            "performanceCounters": [
                {
                    "streams": [
                        "Microsoft-Perf"
                    ],
                    "samplingFrequencyInSeconds": 60,
                    "counterSpecifiers": [
                        "\\Processor Information(_Total)\\% Processor Time",
                        "\\Memory\\Available Bytes",
                        "\\LogicalDisk(_Total)\\Free Megabytes",
                        "\\Network Interface(*)\\Bytes Total/sec"
                    ],
                    "name": "perfCounterDataSource60"
                }
            ],
            "windowsEventLogs": [
                {
                    "streams": [
                        "Microsoft-Event"
                    ],
                    "xPathQueries": [
                        "Security!*[System[(band(Keywords,13510798882111488))]]"
                    ],
                    "name": "eventLogsDataSource"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-Perf"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source",
                "outputStream": "Microsoft-Perf"
            },
            {
                "streams": [
                    "Microsoft-Event"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source",
                "outputStream": "Microsoft-Event"
            }
        ]
    }
}

Linux イベントログ + パフォーマンス カウンター

Linux のイベントログとパフォーマンス カウンターを取得し、Log Analytics ワークスペースの Syslog テーブルと Perf テーブルに記録する。Azure ポータルから設定可能。

{
    "properties": {
        "immutableId": "dcr-5b36310aaa91472e9094e72dc4542198",
        "dataSources": {
            "performanceCounters": [
                {
                    "streams": [
                        "Microsoft-Perf"
                    ],
                    "samplingFrequencyInSeconds": 60,
                    "counterSpecifiers": [
                        "Processor(*)\\% Processor Time",
                        "Memory(*)\\Available MBytes Memory",
                        "Logical Disk(*)\\Free Megabytes",
                        "Network(*)\\Total Bytes Transmitted"
                    ],
                    "name": "perfCounterDataSource60"
                }
            ],
            "syslog": [
                {
                    "streams": [
                        "Microsoft-Syslog"
                    ],
                    "facilityNames": [
                        "local0",
                        "syslog"
                    ],
                    "logLevels": [
                        "Error",
                        "Critical",
                        "Alert",
                        "Emergency"
                    ],
                    "name": "sysLogsDataSource"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-Perf"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source",
                "outputStream": "Microsoft-Perf"
            },
            {
                "streams": [
                    "Microsoft-Syslog"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source",
                "outputStream": "Microsoft-Syslog"
            }
        ]
    }
}

Windows セキュリティ イベント

Windows のセキュリティ イベントログを取得し、Log Analytics ワークスペースの SecurityEvent テーブルに記録する。Sentinel を使用している場合はコネクタのページから作成可能。

{
    "properties": {
        "dataSources": {
            "windowsEventLogs": [
                {
                    "streams": [
                        "Microsoft-SecurityEvent"
                    ],
                    "xPathQueries": [
                        "Security!*[System[(EventID=1102) or (EventID=4624) or (EventID=4625) or (EventID=4657) or (EventID=4663) or (EventID=4688) or (EventID=4700) or (EventID=4702) or (EventID=4719) or (EventID=4720) or (EventID=4722) or (EventID=4723) or (EventID=4724) or (EventID=4727) or (EventID=4728)]]",
                        "Security!*[System[(EventID=4732) or (EventID=4735) or (EventID=4737) or (EventID=4739) or (EventID=4740) or (EventID=4754) or (EventID=4755) or (EventID=4756) or (EventID=4767) or (EventID=4799) or (EventID=4825) or (EventID=4946) or (EventID=4948) or (EventID=4956) or (EventID=5024)]]",
                        "Security!*[System[(EventID=5033) or (EventID=8222)]]",
                        "Microsoft-Windows-AppLocker/EXE and DLL!*[System[(EventID=8001) or (EventID=8002) or (EventID=8003) or (EventID=8004)]]",
                        "Microsoft-Windows-AppLocker/MSI and Script!*[System[(EventID=8005) or (EventID=8006) or (EventID=8007)]]"
                    ],
                    "name": "eventLogsDataSource"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-SecurityEvent"
                ],
                "destinations": [
                    "mylaws"
                ]
            }
        ]
    }
}

Windows テキスト ログ (To CommonSecurityLog テーブル)

Windows の特定パスのファイルに書き込まれたログを読み取り、Log Analytics ワークスペースの CommonSecurityLog テーブルに記録する。ログファイルからの書き込みの場合はデータ収集エンドポイントの指定が必要になる。

{
    "properties": {
        "dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/microsoft.insights/dataCollectionEndpoints/mydcep",
        "streamDeclarations": {
            "Custom-CommonSecurityLogStream": {
                "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "datetime"
                    },
                    {
                        "name": "RawData",
                        "type": "string"
                    }
                ]
            }
        },
        "dataSources": {
            "logFiles": [
                {
                    "streams": [
                        "Custom-CommonSecurityLogStream"
                    ],
                    "filePatterns": [
                        "C:\\tmp\\*.log"
                    ],
                    "format": "text",
                    "settings": {
                        "text": {
                            "recordStartTimestampFormat": "ISO 8601"
                        }
                    },
                    "name": "CEFFile_CL"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Custom-CommonSecurityLogStream"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source | extend Message = RawData",
                "outputStream": "Microsoft-CommonSecurityLog"
            }
        ]
    }
}

Linux テキスト ログ

Linux の特定パスのファイルに書き込まれたログを読み取り、Log Analytics ワークスペースの カスタム テーブルに記録する。

{
    "properties": {
        "dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/microsoft.insights/dataCollectionEndpoints/mydcep",
        "streamDeclarations": {
            "Custom-Text-LinuxAudit_CL": {
                "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "datetime"
                    },
                    {
                        "name": "RawData",
                        "type": "string"
                    }
                ]
            }
        },
        "dataSources": {
            "logFiles": [
                {
                    "streams": [
                        "Custom-Text-LinuxAudit_CL"
                    ],
                    "filePatterns": [
                        "/var/log/audit/audit.log"
                    ],
                    "format": "text",
                    "settings": {
                        "text": {
                            "recordStartTimestampFormat": "ISO 8601"
                        }
                    },
                    "name": "Custom-Text-LinuxAudit_CL"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Custom-Text-LinuxAudit_CL"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source | where RawData startswith \"type=EXECVE\" | extend EpochTime = toint(todouble(extract(@\"audit\\((\\d+\\.\\d+)\", 1, RawData)))  | extend TimeGenerated = datetime_add(\"second\", EpochTime, datetime(1970-01-01)) | project-away EpochTime",
                "outputStream": "Custom-LinuxAudit_CL"
            }
        ]
    }
}

ログ インジェスト API 経由で CSV 形式ログ

csv 形式のログをログ インジェスト API 経由で Log Analytics ワークスペースのカスタム テーブルに記録する。API 経由の場合はデータ収集エンドポイントの指定が必要になる。

{
    "properties": {
        "dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.Insights/dataCollectionEndpoints/mydcep",
        "streamDeclarations": {
            "Custom-TableForLogIngesionAPI": {
                "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "datetime"
                    },
                    {
                        "name": "RawData",
                        "type": "string"
                    }
                ]
            }
        },
        "dataSources": {},
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Custom-TableForLogIngesionAPI"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source | parse RawData with DetectionTime ',' Domain ',' Action ',' QueryType ',' Reason ',' List ',' Category ',' ObservedCategories ',' Policy ',' Location ',' SubLocation ',' SourceIP ',' InternalClientIP ',' DeviceName ',' InternalClientName ',' OnrampType",
                "outputStream": "Custom-MyTable_CL"
            }
        ]
    }
}

ワークスペース変換

Log Analytics ワークスペースに取り込むログの加工、フィルタを行う。Azure Monitor Agent など別のデータ収集ルールを用いたログは対象外となる。(多重で DCR は適用されないので、Azure Monitor Agent などに適用するデータ収集ルールで変換を設定)
ワークスペース変換のデータ収集ルールは Log Analytics ワークスペースと 1:1 となる。

{
    "properties": {
        "dataSources": {},
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.OperationalInsights/workspaces/mylaws",
                    "workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "name": "mylaws"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-Table-DeviceLogonEvents"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source | where ActionType == \"LogonFailed\""
            },
            {
                "streams": [
                    "Microsoft-Table-SigninLogs"
                ],
                "destinations": [
                    "mylaws"
                ],
                "transformKql": "source | where UserDisplayName != \"On-Premises Directory Synchronization Service Account\""
            }
        ]
    }
}

BLOB ストレージへの記録

Linux の syslog を 直接 BLOB ストレージに記録する。

{
    "properties": {
        "dataSources": {
            "syslog": [
                {
                    "streams": [
                        "Microsoft-Syslog"
                    ],
                    "facilityNames": [
                        "local0",
                        "syslog"
                    ],
                    "logLevels": [
                        "Warning",
                        "Error",
                        "Critical",
                        "Alert",
                        "Emergency"
                    ],
                    "name": "syslogDataSource"
                }
            ]
        },
        "destinations": {
            "storageBlobsDirect": [
                {
                    "containerName": "syslogblob",
                    "storageAccountResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.Storage/storageAccounts/mysa295892",
                    "name": "blobNamedLinux"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-Syslog"
                ],
                "destinations": [
                    "blobNamedLinux"
                ]
            }
        ]
    }
}

その他サンプル

https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-rule-samples

データ収集ルールのデプロイ

上記の DCR サンプルを json ファイルに保存し、以下のコマンドから作成可能です。

New-AzDataCollectionRule -Location japaneast -ResourceGroupName "DCRResourceGroup" -RuleName "dcr-sample" -RuleFile "C:\tmp\dcr-sample.json"

https://learn.microsoft.com/ja-jp/powershell/module/az.monitor/new-azdatacollectionrule?view=azps-12.0.0&viewFallbackFrom=azps-10.4.1

Microsoft (有志)

Discussion