PowerShellからAzure ADレポートのエクスポート

皆さんこんにちは。国井です。

Azure ADの研修サービスを提供させていただく中で、
色々なお客様からのご要望の多い
「最大で30日しか保存されないレポートをどうするか?」問題。

以前、私はPowerShellスクリプトを作ってローカルにダウンロードしておきましょうという投稿を書いたのですが、そのときに書いた内容もクラシックポータルでの作成方法だったので、今回改めて新しいポータルサイトでの作り方を見ておくことにしたいと思います。

※2019年8月現在、Azure AD PowerShell v2のコマンドレットでレポートを取得できるようになっています。ただし、一部操作ができなかったりします。
https://docs.microsoft.com/ja-jp/azure/active-directory/reports-monitoring/reference-powershell-reporting

※2019年12月18日追記
下に記した、MSさんの公式サイトですが、本稿執筆当時とは違う内容に変わっています。本稿で参考にしているスクリプトもなくなってしまいました。

#途中まで書いたところで、MSさんの公式サイトにも同じような内容が掲載されていたことに気がつきました。。そのため、内容がかぶってしまっているところが一部あるので、ご了承ください。

■Azure Active Directory サインイン アクティビティ レポート API のサンプル
https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-reporting-api-sign-in-activity-samples

前提条件:ADALライブラリのロード

以前の投稿「PowerShellでAzure ADの情報を収集」に書いた通りです。こちらを参考にしてください。

Azure ADのアプリを作成

Azure ADでは、外部(ここでいう外部とはPowerShellのスクリプトのことです)からAzure ADにアクセスする場合、Azure ADのアプリを作成し、外部からのアクセスを受けられるようにしておく必要があります。
そのため、まずはAzure管理ポータルにアクセスし、Azure ADの画面から[アプリの登録]を利用して新しいアプリを作成します。
ここでは、名前を「PSAccess」、アプリケーションの種類を「Webアプリ/API」、サインオンURLを「http://localhost」としておきます。
なお、サインオンURLに入れるURLは実際にアクセスするものではないので、なんでもいいです。

アプリの登録からアプリを作成したら、[設定]-[必要なアクセス許可]を開き、PowerShellからアクセスしたときに、どこまでのアクセスを許可するか設定します。
[追加]ボタンを押して、

[アクセスの有効化]からRead directroy dataを許可するように設定します。
保存したら、前の画面に戻って[アクセス許可の付与]ボタンを押すことも忘れずに。

これでログにアクセスするためのアクセス許可が割り当てられた状態になります。
あとは、アプリの登録の[設定]画面から
[キー]にアクセスしてキーを発行することと、

image
[プロパティ]にアクセスしてアプリケーションIDを確認しておいてください。

image

PowerShellスクリプトの実行

ここまで設定したら、「Azure Active Directory サインイン アクティビティ レポート API のサンプル」サイトからPowerShellスクリプトをコピーして、
PowerShell画面に貼り付けます。
このとき、<clientId>欄にアプリケーションID、<clientSecret>欄にキーの値、<tenantDomain>欄にドメイン名(***.onmicrosoft.com)をそれぞれ入力します。

※本校執筆時点では、スクリプトの6行目にある

$ daterange # For example, contoso.onmicrosoft.com

の行はまるごと削除しておかないとエラーになるのでご注意を。

実行すると、カレントディレクトリにjsonファイルが保存され、ファイル内にアクセスログが書き込まれます。

image

CSV形式で結果を出力したい

とっても便利なスクリプトファイルですが、出力がjsonファイルじゃなくて、CSVで欲しいんだよな。。という要望もあるかと思います。
その場合は、スクリプトの30行目を

$myReport.Content | Out-File -FilePath SigninActivities$i.json –Force

から

($myReport.Content | ConvertFrom-Json).value | ConvertTo-Csv -NoTypeInformation | Out-File -FilePath SigninActivities$i.csv -Force

と書き換えてあげればOKですよ。

image
このログによると、city=Tokyo,state=Saitamaと表示されているので、東京は埼玉の属国になったそうです。

期間を絞って出力したい

デフォルトのスクリプトでは、過去7日間の結果が出力されているようになっているけど、それは8行目の

$7daysago = "{0:s}" -f (get-date).AddDays(-7) + "Z"

で定義されているので、(-7)部分を書き換えてあげればOKです。例えば30日分なら

$7daysago = "{0:s}" -f (get-date).AddDays(-30) + "Z"

とすればよいでしょう。ちなみに$7daysagoは変数なので、$30daysagoと変更するなら、すべての項目を変更するように。

色々なログを出力したい

クラシックポータル時代のAzure ADレポートを見たことがある人ならご存知だと思いますが、どのアプリケーションへのアクセスがあったかをアプリケーション単位で表示するログとかありましたよね?あれもスクリプトをちょっといじれば表示できます。
下のPowerShell画面は、

$url = 'https://graph.windows.net/' + $tenantdomain + '/activities'

として、Invoke-WebRequestコマンドレットを実行した結果ですが、
/activities配下には、サインインイベントのsigninEvents以外にも、
管理者作業の結果のログであるauditとか、
アプリへのアクセス結果を出力するsigninEventsAppSummaryなど、
色々なものが用意されていることがわかります。

image

このことを踏まえて、21行目の

$url = "https://graph.windows.net/$tenantdomain/activities/signinEvents?api-version=beta&`$filter=signinDateTime ge $7daysago"

部分を

$url = "https://graph.windows.net/$tenantdomain/activities/signinEventsAppSummary?api-version=beta"

と書き換えればOKです。ちなみにオリジナルのスクリプトにあった
$filter=signinDateTime ge $7daysago部分は
7日前までのログを取ってきなさいという意味ですが、signinEventsAppSummaryログにsigninDateTimeという属性はそもそも存在しないので、betaから後ろの部分は削除してあります。
それでもって、取得したデータがこちら。

image

アクセスしたアプリケーションとアクセスした回数が表示されるのですが、アプリケーションIDで表示されてしまうので、どのアプリケーションにアクセスしたか、わかりにくいのですよね。。

■ ■ ■

いずれにしても、色々なログがPowerShellからとってこれるので、Azure AD管理者の方はぜひ使いこなせるようになっていただければと思います。

■参考:Azure Active Directory Identity Protection と Microsoft Graph の基本
https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-identityprotection-graph-getting-started
■参考:Get Office365 usage reports from the Microsoft Graph using Windows PowerShell
https://blogs.technet.microsoft.com/dawiese/2017/04/15/get-office365-usage-reports-from-the-microsoft-graph-using-windows-powershell/