リソース変更を検知するアラートを作成する

Last Update: feedback 共有

こんにちは、Azure Monitoring チームの佐々木です。
今回はリソース変更を検知するアラートが作成できる様になりましたので、その設定方法やサンプルクエリを紹介させていただきます。

目次

  • Log Analytics から Azure Resource Graph へクエリ出来る様になりました
  • Azure Resource Graph にはリソース変更を記録するテーブルがあります
  • サンプルクエリ
  • 設定手順
  • より複雑なサンプルクエリ
    • 操作者を確認したい

Log Analytics から Azure Resource Graph へクエリ出来る様になりました

Log Analytics より Azure Resource Graph (ARG) へクエリが出来る様になりました。

このアップデートにより、Log Analytics 内に記録されたログだけでなく、ARG へのクエリ結果を アラート ルールにて監視できる様になりました。

Azure Resource Graph のデータに対してクエリを実行する (プレビュー)

※ 2023/11/9 時点でプレビューでの公開となります。

Azure Resource Graph にはリソース変更を記録するテーブルがあります

resourcechanges というテーブルに ARM のリソース変更履歴が記録されています。

例えば、properties 列を見る事で以下が確認可能です。

  • changeTypeがUpdate -> 更新されたという事になります。
  • changes -> 変更があったプロパティと新しい値(newValue)、過去の値(previousValue)が入ります。

※このテーブルの保持期間は14日で変更できないため、長期的な保管は行われません。

これを踏まえ、以下の properties 列のサンプルでは、microsoft.network/networkinterfaces リソースに MAC アドレスのプロパティが追加された事がわかります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"targetResourceType": "microsoft.network/networkinterfaces",
"targetResourceId": "/subscriptions/***/resourceGroups/1627/providers/Microsoft.Network/networkInterfaces/1627vm837",
"changeAttributes": {
"previousResourceSnapshotId": "08585022745207585807_a9667ff8-fb74-82a5-ffd1-419287f1063f_3620098351_1699332364",
"newResourceSnapshotId": "08585022744595915807_7aa3a796-054b-ebe0-df8e-673414ebfde7_82482185_1699332425",
"correlationId": "43c5d84a-c3bb-47c7-bdc5-7ecf69209fc2",
"changesCount": 3,
"timestamp": "2023-11-07T04:47:05.8860000Z",
"changedByType": "User",
"clientType": "Azure Portal",
"operation": "Microsoft.Network/networkInterfaces/write",
"changedBy": "***@microsoft.com"
},
"changeType": "Update",
"changes": {
"properties.virtualMachine.id": {
"propertyChangeType": "Insert",
"changeCategory": "User",
"previousValue": null,
"newValue": "/subscriptions/***/resourceGroups/1627/providers/Microsoft.Compute/virtualMachines/1627vm"
},
"properties.primary": {
"propertyChangeType": "Insert",
"changeCategory": "User",
"previousValue": null,
"newValue": "True"
},
"properties.macAddress": {
"propertyChangeType": "Insert",
"changeCategory": "User",
"previousValue": null,
"newValue": "60-45-BD-66-0D-B8"
}
}
}

この様に changeType が Update のログが新しく記録された場合、何か設定値が変更されたという事がわかります。

詳しくは以下ドキュメントをご確認ください。

サンプルクエリ

1
2
3
4
5
6
arg("").resourcechanges
| extend timestamp = todatetime(properties["changeAttributes"]["timestamp"])
| extend changes = properties["changes"]
| extend ResourceId = tostring(properties["targetResourceId"])
| extend CorrelationId = tostring(properties["changeAttributes"]["correlationId"]) // AzureActivity (アクティビティログ) と結合可能
| where timestamp >= ago(5min) // arg("") で検索するテーブルにはアラートルールの粒度や期間指定が機能しないため、クエリで期間を指定します。

image

設定手順

以下に、変更履歴を検知するアラートルールの作成方法を記載させていただきます。

この操作を行うアカウントでは、サブスクリプションスコープ の 閲覧者権限 と 閲覧者 ロールが必要になります。

閲覧者
ロールベースのアクセス制御管理者

  1. Azureポータルにログインし、何れかの Log Analytics > ログ ブレードを開きます。
  2. 例えばサンプルのクエリを指定し、一度検索します。
1
2
3
4
5
6
arg("").resourcechanges
| extend timestamp = todatetime(properties["changeAttributes"]["timestamp"])
| extend changes = properties["changes"]
| extend ResourceId = tostring(properties["targetResourceId"])
| extend CorrelationId = tostring(properties["changeAttributes"]["correlationId"]) // AzureActivity (アクティビティログ) と結合可能
| where timestamp >= ago(5min) // arg("") で検索するテーブルにはアラートルールの粒度や期間指定が機能しないため、クエリで期間を指定します。

image

  1. “新しいアラート ルール” より アラートルールの作成画面へ移動します。

image

  1. 条件 セクションでは例えば以下の設定値とします。

image

  • 測定
    • メジャー: テーブルの行
    • 集計の種類: カウント
    • 集計の粒度: 5分
  • ディメンションで分割する
    • リソースID 列: ResourceId (これによりリソース毎にアラートが発生する様になります。)
    • ディメンション: 指定無し
  • アラート ロジック
    • 演算子: 次の値より大きい
    • しきい値: 0
    • 評価の頻度: 5分
  1. アクション セクションでは必要に応じてアクショングループを指定します。

  2. 詳細 セクションにて、 System assigned managed Identity を指定し、作成します。

ARG へのクエリにはサブスクリプションスコープの閲覧者ロールが必要ですが、Default を選択した場合、アラートルールは ARG を閲覧できず検知されません。

image

  1. アラートルールの マネージドID の権限設定

モニター > アラート > アラート ルール > ID (プレビュー) を確認します。
この時、もしもシステム割り当て済 が オフ となっている場合にはオンにします。

image

Azure ロールの割り当て へ進み、サブスクリプションスコープの閲覧者権限を付与します。

以上で設定は完了です。

より複雑なサンプルクエリ

操作者を確認したい

操作者はアクティビティログの Caller プロパティに記載されています。

診断設定で アクティビティログ を Log Analytics に送ると、AzureActivity テーブル上にアクティビティログが記録されますが、

AzureActivity テーブルは resourcechanges テーブルと CorrelationId が同じになるため、結合可能です。

そのため、以下のクエリで結合し、検索する事ができます。このクエリをアラートルールで指定し、検知する事も可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
arg("").resourcechanges
| extend timestamp = todatetime(properties["changeAttributes"]["timestamp"])
| extend changes = properties["changes"]
| extend ResourceId = tostring(properties["targetResourceId"])
| extend CorrelationId = tostring(properties["changeAttributes"]["correlationId"]) // AzureActivity (アクティビティログ) と結合可能
| where timestamp >= ago(14d) // arg("") で検索するテーブルにはアラートルールの粒度や期間指定が機能しないため、クエリで期間を指定します。
| join kind=leftouter (
AzureActivity // Administrative を送る診断設定が必要です。
| where CategoryValue =~ "Administrative"
| where ActivityStatusValue =~ "Start" // 一度の操作 でStart,Success 等複数のログが出るため、Start のログのみ対象とします。
)
on CorrelationId
| order by TimeGenerated

Q&A

アラートが発生しない

マネージドID へ サブスクリプションスコープの read 権限は付与されていますか?

マネージドID へ Azure Resource Graph のログを確認するために必要なロールが割り当てられているかご確認ください。

image
image

Azure Resource Graph のログを表示するために、サブスクリプションスコープの read 権限が必要となります。

そのため、例えば マネージドID へ サブスクリプションスコープ の閲覧者権限が付与されていない場合には、アラートルールは Azure Resource Graph のログが確認できず、アラートは発生しません。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。