🧙‍♂️

[Azure]管理グループの診断設定はAPIから有効にする

2023/03/31に公開

細かいところですが見落としがちなポイントに思えたのでまとめ。

診断設定とは

特定のリソースが出力するログを、ストレージアカウントやLog Analytics Workspaceに転送するための設定です。以下のようなログを転送するために使用されます。

  • サブスクリプション、管理グループなどのアクティビティログ
  • 仮想マシンやDBなどの個別リソースのシステムログ

例えばアクティビティログの場合、Azure上の保存期間は90日ですが
監査の観点で1年間のログ保存が求められるようなケースでは診断設定を追加してログをアーカイブする運用が必要にあります。

管理グループも例外ではなく、管理グループをスコープとしてRBACのアサインや管理グループの追加/変更などのアクティビティログを転送するには診断設定を使います。

管理グループの診断設定はAPIからしか受け付けない

この診断設定ですが、管理グループに関してはAPIを叩く以外に設定方法がありません。
https://learn.microsoft.com/ja-jp/azure/governance/management-groups/overview#audit-management-groups-using-activity-logs

注意
Azure Resource Manager REST API を使用して、管理グループの診断設定を有効にして、関連する Azure アクティビティ ログ エントリを Log Analytics ワークスペース、Azure Storage、または Azure Event Hub に送信できます。 詳細については、「管理グループの診断設定 - 作成または更新」を参照してください。

アクティビティログの診断設定の設定方法を探すと、以下の記事にたどり着くと思います。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/diagnostic-settings?tabs=portal#create-diagnostic-settings-in-azure-portal
ただしこちらの設定で出力されるのはサブスクリプションまでです。
管理グループの診断設定とは別の設定になっています。
管理グループの診断設定を入れたつもりが実はできていない…という状態になりかねません。

できそうでできないAzure Portalからの診断設定

Azure Portalの管理グループのページから[動作状況ログ]を開くと[アクティビティ ログのエクスポート]というボタンがありAzure Portalから設定できそうな雰囲気を漂わせています。

しかし紛らわしいことに、クリックしても診断設定を入れられるリソースの一覧が表示されるのみで管理グループ自体の診断設定を有効化することはできません。
Azure Portalのことはいったん忘れてAPIから診断設定を有効化する必要があります。

診断設定を有効化するAPIリクエスト

有効化自体はAPIリファレンスに従ってPUTするだけなので比較的簡単です。

なおAPIクライアントですが、手動で実行する分にはInvoke-AzRestMethodaz restを使うと認証周りの処理をスキップできて楽です。

  • APIコールをするスクリプト(実行環境:Cloud ShellのPowerShell7.3.3)
    • ストレージアカウントに転送する場合
    • 無効にする場合は'enabled'のbooleanを'false'にするだけ
    • ログのカテゴリは'Administrative'と'Policy'のみ
$mg_id = '<管理グループのid>'
$sa_id = '<ストレージアカウントのリソースid>'
$diag_name = '<診断設定の名前>'
$url = "https://management.azure.com/providers/microsoft.management/managementGroups/${mg_id}/providers/microsoft.insights/diagnosticSettings/${diag_name}?api-version=2020-01-01-preview"
$header =  'Content-Type=application/json' 

$json = "{
  `"properties`" : {
    `"storageAccountId`" : `"$sa_id`",
    `"logs`" : [
      {
        `"category`" : `"Administrative`",
        `"enabled`" : `"true`"
      },
      {
        `"category`" : `"Policy`",
        `"enabled`" : `"true`"
      }
    ]
  }
}"

az rest `
    --method put `
    --url $url `
    --body $json `
    --headers $header

  • レスポンス例
{
  "id": "providers/Microsoft.Management/managementGroups/mg-test/providers/microsoft.insights/diagnosticSettings/mg_diagsetting",
  "location": "global",
  "name": "mg_diagsetting",
  "properties": {
    "logs": [
      {
        "category": "Administrative",
        "categoryGroup": null,
        "enabled": true
      },
      {
        "category": "Policy",
        "categoryGroup": null,
        "enabled": true
      }
    ],
    "storageAccountId": "***"
  },
  "type": "Microsoft.Insights/diagnosticSettings"
}
  • ストレージアカウントにアーカイブされることを確認

まとめ

設定できそうで実はできないAzure Portalの表示に若干困惑しました。
いつ改修されるのか、GUIやAzure CLIからの操作を受け付けるようになるかは現時点で不明なのでAPIを叩くようにしましょう。

Discussion