SaaS

【Entra ID】条件付きアクセスのレポート専用モードで展開したポリシーの適用結果をGraph API(PowerShell)で集計する

はじめに

こんにちは、最近バイクが気になっているすかんくです。

今回は Microsoft Graph PowerShell SDK を用いて条件付きアクセスのレポート専用モード適用結果を集計する方法についてご紹介します。

背景の説明

Entra ID 管理センターのサインインログ画面では、レポート専用モードのフィルタに対応していません。そのため、レポート専用モードで展開したポリシーの適用結果を集計するには LogAnalytics 等にログを転送して集計する必要があります。

しかしながら本番展開準備としてのレポート専用モードのログ集計であれば、標準保管期間の 30 日間で問題無いケースが多いこと、また使い始めの環境で Azure サブスクリプションの用意が難しいケースにおいて今回の方法が有効です。

そこで、Microsoft Graph PowerShell SDK を使ってサインインログを取得し、ポリシー別に集計するスクリプトを作成しましたので紹介となります。

補足

本記事はログ基盤の必要性を否定するものではありません。

実行の前提条件

このスクリプトを実行する前に、以下の前提条件を満たしていることを確認してください:

  • Graph SDK PowerShell Moduleがインストールされていること

スクリプトの詳細

以下のリンクからスクリプトを確認できます:

実行時の注意点

  • メモリ使用量: All:$true オプションを使用すると、組織内のレコード数に応じて大量のメモリを消費する可能性があります。代替として Top 1000 を使用することも検討してください。
  • CSVファイルの出力: ポリシーごとにログを分けてCSVファイルに出力しますが、ファイル名に使用できない文字は削除されます。
  • 次ページデータの取得: All:$true または Top N を指定しても、1,000件以上のレコードが取得される場合があります。そのため、次ページリンクが存在する限りデータを取得する処理が含まれています。
  • 出力対象: 既定では reportOnlyFailure つまりレポート専用モードでの評価結果が失敗として記録されたログのみを出力する仕様となっています。すべてのログを出力したい場合は43-44行目のフィルタ処理を修正してください。

出力内容の調整

Intune コンプライアンスポリシーの準拠状態を要求するポリシーの場合、デバイス情報の取得を実施したいケースがあります。そういったケースの場合、出力パートで必要なプロパティを追加取得するよう修正してあげてください。

# ポリシー毎にログを分割してCSV出力
foreach ($log in $filteredLogs) {
    foreach ($policy in $log.appliedConditionalAccessPolicies) {
        $policyName = $policy.displayName
        $sanitizedPolicyName = $policyName -replace '[\\\\\\/:*?"<>|]', ''
        $logFileName = "./{0}_filteredLogs.csv" -f $sanitizedPolicyName.Replace(' ', '_')
    }
    # エクスポート用にカスタムオブジェクトを作成して必要な情報を展開
    $log | ForEach-Object {
        $exportLogs = [PSCustomObject]@{
            CreatedDateTime           = $_.createdDateTime
            UserDisplayName           = $_.userDisplayName
            AppDisplayName            = $_.appDisplayName
            IPAddress                 = $_.ipAddress
            ConditionalAccessPolicy   = $policyName
            Browser                   = $_.deviceDetail.Browser
            DeviceId                  = $_.deviceDetail.DeviceId
            DeviceDisplayName         = $_.deviceDetail.DisplayName
            IsCompliant               = $_.deviceDetail.IsCompliant
            IsManaged                 = $_.deviceDetail.IsManaged
            OperatingSystem           = $_.deviceDetail.OperatingSystem
            TrustType                 = $_.deviceDetail.TrustType
        }
        $exportLogs | Export-Csv -Path $logFileName -NoTypeInformation -Append
    }
}

おわりに

公式ドキュメントだけを見ると困る人が多そうだったので記載しました。

Microsoft Graph PowerShell SDK を用いたサインインログや監査ログの取得は様々なユースケースに活用できると思いますので、良しなにご活用いただければと思います。

すかんく

2022/1 入社、Identity チームのすかんくと申します。
ブログでは IdP 関連の機能紹介を中心に記載していこうと思います。
好きな漫画はアイシールド21・ハイキュー・ベイビーステップです。