Microsoft Graphを利用してAzureADサインインログを取得

2022.04.13
  • t_o_dと申します。
  • Azure ADを利用するにあたり、認証の「調査・記録」を行うことは非常に重要であり、そのためサインインログを残す必要があります。
  • そこでMicrosoft Graphを利用してREST APIで「Azure ADサインインログ」を取得する方法を記録いたします。

環境

  • mac OS Monterey 12.2
  • curl 7.79.1

手順

アプリ登録

  • Graph APIにアクセスするための認証情報を取得するためにアプリケーションを登録する必要があります。
  • まずグローバル管理者の権限をもったアカウントでAzure Portalにサインインしてください。
  • サインイン後、左ウィンドウから「Azure Active Directory」を選択して、表示画面左の「アプリの登録」を選択して、「新規登録」をクリックしてください。

  • アプリケーションの登録情報に以下を入力してください。
    • 名前 : 任意
    • サポートされているアカウントの種類 : この組織ディレクトリのみに含まれるアカウント
    • リダイレクトURI :「Web」→「https://localhost」
  • 入力後、「登録」ボタンをクリックしてください。

アクセス許可

  • 登録後、アプリ情報ページに遷移するため左メニューから「APIのアクセス許可」を選択して、「アクセス許可の追加」ボタンをクリックしてください。

  • 「APIアクセス許可の要求」でMicrosoft Graphを選択して、「アプリケーションの許可」をクリックしてください。

  • 以下の権限にチェックをつけて、「アクセス許可の追加」ボタンをクリックしてください。
    • AuditLog.Read.All
    • Directory.Read.All
    • ※User.Readはすでについています。
  • 以下のように追加されていることを確認してください。

  • 「管理者の同意を与えます」をクリックしてください。
    • ※状態欄にチェックがついていなければ、グローバル管理者に承認を依頼する必要があります。

クライアントシークレットの取得

  • 再度左ウィンドウから「Azure Active Directory」「アプリの登録」「証明書とシークレット」の順に選択して、「新しいクライアントシークレット」をクリックしてください。

  • 以下のように入力して、「追加」をクリックしてください。
    • 説明 : APIの説明
    • 有効期限 : 24か月
  • 保存後、クライアントシークレットの値をコピーしてください。

各種ID

  • ここまででGraph APIにアクセスするための情報は揃いましたので、必要な情報をメモしておきます。
  • メモする値は以下の3つです。
    • テナントID
    • クライアントID
    • クライアントシークレット
      • ※「クライアントシークレットの取得」手順でコピーした値
  • まず、アプリケーションページから「概要」を選択します。
  • 概要ページから「テナントID」「クライアントID」をコピーしてください。

curlでリクエスト

  • それでは実際にGraph APIにリクエストを投げてみます。
  • リクエストの際は以下のように2つ必要です。
    • OAuth2認証でトークンの取得。
    • そのトークンを用いてGraph APIにリクエスト。

トークンの取得

  • リクエストに必要なトークンを取得をするため、以下のコマンドをうってください。
    • ※その際に「クライアントID」「クライアントシークレット」「テナントID」をコピーした値に変更してください。
curl -X POST -d "grant_type=client_credentials&scope=https://graph.microsoft.com/.default&client_id=クライアントID&client_secret=クライアントシークレット" 'https://login.microsoftonline.com/テナントID/oauth2/v2.0/token'
  • 以下のような結果が返されるため、「access_token」の値をメモしてください。
{
    "token_type":"Bearer",
    "expires_in":3599,
    "ext_expires_in":3599,
    "access_token":"アクセストークン"
}

サインインログ取得APIへのリクエスト

  • ここまででサインインを取得する準備が整いましたので、以下のコマンドをうち取得できるか確認してください。
    • その際に「アクセストークン」を取得した値に変更してください。
    • ※デフォルトでは1000件取得されます
curl 'https://graph.microsoft.com/v1.0/auditLogs/signIns' -H 'Authorization: Bearer アクセストークン'
  • 以下のような形式で返ってきます。
{
    "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#auditLogs/signIns",
    "@odata.nextLink":"https://graph.microsoft.com/v1.0/auditLogs/signIns?$skiptoken=xxxx",
    "value":[
        {
            "id":"xxxxx",
            "createdDateTime":"xxxx","userDisplayName":"xxxx",
            "userPrincipalName":"xxxx",
            "userId":"xxxxx",
            "appId":"xxxxx,
            xxxxxx
        }
    ]
}

補足

  • サインインログを絞り込むため、いくつかのオプションをご紹介いたします。
  • まず、特定の文字列や期間で絞り込む際はfilterオプションを付与した以下のURLにリクエストを投げます。
# ユーザー名が「キーワード」で始まるログのみ。
https://graph.microsoft.com/v1.0/auditLogs/signIns?$filter=startswith(userDisplayName,'キーワード')

# 特定期間のログ。
https://graph.microsoft.com/v1.0/auditLogs/signIns?$filter=createdDateTime ge 期間の最初 and createdDateTime lt 期間の最後
  • 次に、結果の件数を指定する際はtopオプションを付与した以下のURLにリクエストを投げます。
# 結果の件数を2件に絞る。
https://graph.microsoft.com/v1.0/auditLogs/signIns?$top=2
  • その他多数あるため全オプションはこちらをご確認ください。

まとめ

  • サインインログの取得や分析は「エラーの調査・知見の蓄積・管理作業の効率化」等に重要だと実感しました。
  • 今後もMicrosoft Graphのさまざまなサービスを適宜利用していき、日々の業務改善に努めてまいります。

参考

  • https://docs.microsoft.com/ja-jp/graph/overview
  • https://docs.microsoft.com/ja-jp/graph/api/signin-list
  • https://docs.microsoft.com/ja-jp/azure/active-directory/roles/permissions-reference#application-administrator
  • https://docs.microsoft.com/ja-jp/graph/auth-v2-service
  • https://docs.microsoft.com/ja-jp/graph/query-parameters

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。