📘

Azureのアクティビティログに「診断設定」を仕掛ける際のスコープ

に公開

はじめに

Azureに限らず、パブリッククラウドの類を扱うときに必要になるのが、監査ログの類を保管することです。私の書いた記事「Azure環境作ったら最初にやるべきこと」の中でも、かなり序盤にやるべきこととしてログ保管について触れています。
https://zenn.dev/tomot/articles/51bf444c65ffe6

さて、Azureにおいては「診断設定」という機能でログの保管を設定できるのですが、その設定する際のスコープ、すなわち「どこを対象に」ログを取得する設定を施すか?がポイントになるので、記録しておきたいと思います。

診断設定

アクティビティログとは

そもそもアクティビティログとは、「サブスクリプション レベルのイベントに関する分析情報を提供するプラットフォーム ログ」と定義されています。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/activity-log?tabs=powershell?wt.mc_id=AZ-MVP-5004802

すなわち、リソースを作成したり、リソースの設定を変更したり、仮想マシン起動したりといった操作を記録します。一般的には、監査ログ・・・というニュアンスで呼ばれるものです。わかりやすくAWSで例えると、CloudTrailですね。
いわゆる「コントロールプレーン」のログが対象で、データプレーンのログは対象外となります。つまり、ストレージアカウントのBLOBストレージを対象に考えると、
・ストレージアカウントを作成したりネットワーク制限を設定したりするのがコントロールプレーンの操作
・中身のBLOBを書き込んだり読み取ったりというのがデータプレーンの操作
です。

診断設定とは

さて、そのアクティビティログをエクスポートするための機能が「診断設定」です。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/diagnostic-settings#activity-log-settings?wt.mc_id=AZ-MVP-5004802

ログのエクスポート先は、3種類選択することができます。

Log Analytics ワークスペース

ただ保管するだけでなく、検索するための出力先。規程の保持期間分のログ保管は無料ですが、それ以上に保管期間を延ばすと、結構なお値段となる印象・・・。

ストレージアカウント

安価に長期間保管するため、すなわちアーカイブ用途として使うのが一般的です。

Eventhubs

外部システムのデータをストリームするのに使います。Eventhubsでストリーム→StreamAnalyticsでクエリしてフィルタリング→コンピュートリソースに連携してデータ処理、といった処理パターンがあります。

スコープ

この診断設定を設定する場所をいくつかから選ぶことができます。

サブスクリプション

当該サブスクリプションの中の操作ログを扱うことができます。最も一般的な設定先と言えます。冒頭で紹介した「Azure環境作ったら最初にやるべきこと」の中でも、サブスクリプションレイヤーで設定する方法を紹介しています。
サブスクリプションのみを扱う場合や小規模環境を扱う場合は、サブスクリプションを対象にすると思えば問題ないでしょう。

管理グループ

管理グループは、複数のサブスクリプションをまとめて管理するための機能です。
https://learn.microsoft.com/ja-jp/azure/governance/management-groups/overview?wt.mc_id=AZ-MVP-5004802

アクセス権の設定(IAM)や、Azureポリシーの設定先として使うことができますが、アクティビティログの診断設定の対象としても使うことができます。共通して言えることですが、複数のサブスクリプションを同じ設定で使いたい、という場合に管理グループを使うのはとても便利です。

なお、この設定はAzureポータルから設定することができず、REST APIなどを使用することが必要なので、その点は注意が必要です。
https://learn.microsoft.com/ja-jp/rest/api/monitor/management-group-diagnostic-settings/create-or-update?view=rest-monitor-2020-01-01-preview&tabs=HTTP?wt.mc_id=AZ-MVP-5004802

リソース

リソースを対象に設定する「診断設定」はちょっと用途が違います。
例えば、WebAppsにおいては、ウェブアプリケーションとしての接続ログやエラーログを取得することが可能です。
https://learn.microsoft.com/ja-jp/azure/app-service/troubleshoot-diagnostic-logs?wt.mc_id=AZ-MVP-5004802

同じ機能名なので、同じような用途に見えますが、「スコープを絞ってアクティビティログを取る」ということではないので、注意しましょう。

設定先(スコープ)による動作の違いと注意点

さて、1点注意が必要なのが、「管理グループスコープ」に設定した場合と「サブスクリプションスコープ」に出力した場合で出力先のディレクトリ構成(BLOBにおけるプレフィックス)が変わるということです。
実例で見てみます。

管理グループ設定の場合

プレフィックスに出てくるのは「テナントID」です。管理グループはテナント(Entra IDの単位)で設定しますので、そのレイヤで管理することが想定されているようです。中身のログファイルにも、管理グループ配下のサブスクリプション(複数)のログが混じり合って出てくるようです。

サブスクリプション設定の場合

プレフィックスに出てくるのは「サブスクリプションID」です。こちらだと、当然サブスクリプションごとにファイルが別れますので、サブスクリプションごと(=システムごとや責任部署ごとなどの単位)でログも分割され、後日監査用途などで必要になった場合も便利になるなと思います。

おまけ(リソースの診断設定の場合)

こんな感じで、リソース別のプレフィックスになるようです。

おわりに

一括設定できて便利な管理グループスコープで設定するか、サブスクリプションが増えるごとに設定が必要だが管理・保存・調査などのフェーズで便利なサブスクリプションスコープで設定するか悩ましいところです。
ぜひみなさんのベストプラクティスを教えてください!

Discussion