Azure Policy で監査した結果を Azure Monitor で通知する

上限付きのサブスクリプションで使っていると地味に SSD のディスクってコミットから削られていきます。
ということで、Azure Policy を使って、SSD ディスクを見つけるポリシーを書いてみました。

また、検知するだけだとダッシュボードを見に行く必要があるので、Log Analytics を使って、アラートも作ってみます。

Azure Policyの定義

下の JSON を見てもらえれば分ると思いますが、type が Microsoft.Compute/disks のもので、SKU の名前が SSD の場合、アクティビティログに出すようにしました。

{
  "if": {
    "allof": [
      {
        "field": "type",
        "equals": "Microsoft.Compute/disks"
      },
      {
        "field": "Microsoft.Compute/disks/sku.name",
        "in": [
          "Premium_LRS",
          "StandardSSD_LRS",
          "UltraSSD_LRS"
        ]
      }
    ]
  },
  "then": {
    "effect": "audit"
  }
}

ポリシーを作ったら、ログをひっかけるときに使う、定義 ID をコピーしておきます。
f:id:mitsuki0820:20190113054221p:plain

Log Analytics のクエリと Azure Monitor の設定

続いて、Log Analytics のクエリです。
アクティビティログを見ると、OperationNameは、"Microsoft.Authorization/policies/audit/action" の様です。
また、ログの Properties から、policies 要素を取ってます。この部分もうちょっと改善したいところですが。。

また、policies を展開した 変数 a には、ポリシーのプロパティが入っているので文字列として扱って、ポリシーの 定義 ID(policyDefinitionId) をひっかけてます。

AzureActivity
| where OperationName == "Microsoft.Authorization/policies/audit/action"
| extend a = extractjson("$", Properties)
| where a contains "8630d37b-2d65-44ff-be11-a0763c3c31ea"

Azure Policy のチェック間隔は、24 時間に1回なので、アラートは設定できる最大の 1 時間に 1 回チェックするようにしました。

f:id:mitsuki0820:20190113054552p:plain

ポリシーと組み合わせるといろいろできそうなので積極的に使ってみようと思います。