Microsoft Entra PIM 監査ログ用の Azure Monitor Workbook を自作してみた
Microsoft Entra Privilege Identity Management(PIM)
PIM はいわゆる特権アカウント管理のサービスで、JIT での特権付与などの機能を提供します。
詳細な説明については公式のサイトに譲ります。
PIM の監査ログの長期保管についての問題点
PIM のいつ、だれに権限が付与されたか、誰が承認したかなどのログはEntra ID の監査ログとして保持されますが、Entra 標準での監査ログが保存される期間としては30日間となります。[1]
30日以上の監査ログを保存しておくためには、診断設定などで Log Analaytics Workspace や外部のストレージ サービスなどにエクスポートすることが必要になります。[2]
多くの場合は Log Analaytics Workspace(Sentinel) に送るケースが多いと思いますが、監査ログは以下のようなイメージでユーザーフレンドリーではない形式で保存されております。対象のロールやグループ、ユーザーなどの情報は TargetResources または AdditionalDetails の項目で配列で保持されているのですが、どの要素が何を指しているかが分かりにくいかと思います。さらに行った操作により、配列の順番が変わってしまっており、一律同じ番号の情報を見ればいいというわけではない点も運用する上で辛い点となります。
Entra に保存されている30日間のログであれば、リソースの監査履歴の機能で理解しやすい形で確認できますが、長期保管として別のサービスではこのような形式で確認することができません。
Azure Monitor Workbook を作ってみた
PIM のリソースの監査機能と同じような見え方で Log Analaytics Workspace に保存した監査ログを確認するようにできないかという事で Azure Monitor Workbook を試しに作成してみました。
上記の問題点として記載した通り、必ず特定の項目に関連する情報が、決まった配列の要素に入っているわけではないため KQL の作成はかなり大変でした。
私の環境の情報で作成している為、これですべての環境で正しく動くかわかりませんが、同じことでお困りな方もいらっしゃるかと思いまして、Github にて作成した Workbook を公開することにしました。単純な一覧の出力だけでなくいくつか PIM の利用状況の分析に使えるような簡単なグラフ等も要素として入れてみております。
デプロイ時にデプロイ先の Log Analaytics Workspace の Resource ID が必要となります。Resource ID は以下の通り入手ください。
- デプロイ先の Log Analaytics Workspace の概要ページから右上の[JSONビュー]をクリックします。
- 表示された画面の[Resource ID]をコピーします。
上記で Resource ID を取得したら、後はDeploy to Azureをクリック頂き、以下の "Workspace Resource ID" に上記で取得した Resource ID を入力ください。
ワークブックの名前を変更したければ、"Workbook Display Name" の項目もお好みで変更ください。
Workbook のイメージ
デプロイ後のイメージ配下のような形です。更新も適宜している為、以下とは見え方が違う可能性がありますのでその点はご了承ください。
注意点や事前にご了承いただく必要がある点
- あくまで作成者が出力された監査ログを確認し、リソースの監査履歴の機能となるべく近い形で出力できるようにしたブックとなります。すべての環境で期待した動作するとは限りません。
- 一部の操作(承認など)についてはレコードが持っている情報からではリソースの監査履歴の機能と同等の情報が保持されておらず、情報が一部欠損している点があります。
- 将来の監査ログの出力形式の変更などにより、正しく結果が出力されなくなる可能性があります。
最後に
もしご利用いただけた方がいらっしゃいましたら「ワークブックとして追加してほしいグラフなどの要望」や「こういうケースに正しく見れなかったなどの不具合」等についてフィードバックを頂けると嬉しいです。
おまけ
Workbook の設定方法 Tips
Workbook のパラメーターの機能で、Category の対象を選択できるようにしたかったので、パラメーターの設定を JSON 形式のフォームで設定しようとしたのですが、どのような JSON の形式で記載すればいいか、KQL のクエリ中でどう設定すればいいか情報がありませんでした。
他の標準のブックを確認した結果以下の記載でできることを確認しましたのでここに残しておきます。
- パラメーターの JSON としての記載
value,label,selected のキーを持つ JSON の配列として記載する。
[
{ "value":"RoleManagement", "label":"RoleManagement", "selected":true },
{ "value":"GroupManagement", "label":"GroupManagement", "selected":true },
{ "value":"ResourceManagement", "label":"ResourceManagement", "selected":true }
]
- KQL 中のパラメーター値での絞り込み
{}(波かっこ)でパラメーター名を囲むことで、value の配列として条件にできましたので、以下のように記載することで、選択された Ctegory の結果だけ表示することが可能となります。
| where Category in ({Category})
Discussion