Azure MonitorでAzure AD B2Cのトレースログを取得する（①環境構築編）

AD B2CではAzure Monitorと連携し、ユーザーのログインなどのフローのログを収集することができます。

今回は下記のドキュメントを参考に、B2CのログをLog Analyticsで送信できるようになるまでの環境構築をご紹介します。

参考：https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/azure-monitor

## 概要・用語説明
今回は2つのテナントを使い環境構築を行うため、混在しないよう以下の通りとします。
* ADテナント：Log Analyticsを作成するテナント
* B2Cテナント：ユーザーフロー、カスタムポリシーやB2Cユーザーを管理するテナント

また、各テナントで必要なリソースやグループ、どのように関連づけるかの概要は下記の図の通りです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/91d39fd2-62d6-9de9-8fd7-c173ae93b97e.png)


## 前提
* サブスクリプションが適用されたADテナントと、B2Cテナントがあるものとします。
* 各テナントにログインするユーザーは、下記の権限を持つものとします。
    * ADテナント：サブスクリプションの所有者
    * B2Cテナント：グローバル管理者
* B2Cテナントでユーザーフローまたはカスタムポリシーを定義済みで、B2Cユーザーがそれらの実行によりログインできる状態とします。

### Log Analyticsワークスペースの作成(ADテナント)
ADテナントにログインし、Log Analyticsワークスペースを作成します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/445a3502-3ad1-e08e-c88e-b8568f4029a4.png)

Log Analyticsワークスペースの設定で、サブスクリプション、リソースグループ、名前、リージョンを入力します。
リソースグループがない場合は新規作成もできます。

この時重要なのが**リソースグループ名**です。この後の手順でリソースグループ名は使用するため控えておいてください。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/06df3b52-be7a-c982-acac-6e9718276fe1.png)


## リソース管理の委任
### B2Cテナントで必要な各種IDを取得(B2Cテナント)
後述の手順では個人のオブジェクトIDも指定できるため厳密にはグループの作成は必須ではないのですが、下記の引用のとおり管理のしやすさの観点からグループを作成する手順をご紹介します。
> 管理をより簡単にするには、各ロールに Azure AD のユーザー "グループ" を使用することをお勧めします。これにより、個々のユーザーに直接アクセス許可を割り当てるのではなく、ユーザーをグループに追加または削除することができます。

引用：https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/azure-monitor#32-select-a-security-group

#### テナントIDの取得
1. Azureサービスから「Azure Active Directory」を選択します
    * ※「B2Cテナント」や「Azure AD B2C」ではありません
     ![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/af5bf26e-fc36-0519-aea6-9e005be71ee4.png)

1. 「概要」ページに表示される「テナントID」を控えておきます。
   ![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/bc673432-97b1-46f2-a1f6-955a7c789a8e.png)


#### セキュリティグループの作成
1. Azureサービスから「Azure Active Directory」を選択します
    * ※「B2Cテナント」や「Azure AD B2C」ではありません
1. 左メニューから「グループ」を選択します
   ![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/d6fe8bb2-c5a6-52c7-a589-4c143cb260d5.png)


1. 「すべてのグループ」から新しいグループを作成します
    * グループの種類：セキュリティ
    * グループ名：任意の名前
    * 所有者：ADユーザーやグループを選択
        * 後から追加できます
    * メンバー：ADユーザーやグループを選択
        * 後から追加できますが、**今回の手順では1人以上追加する必要があります。後の「診断設定の構成」の際の時にB2Cテナントにログインするユーザーを追加してください。**
  ![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/a2e2c460-77d3-d13e-7a36-a85b9b594645.png)


1. グループが作成されるとオブジェクトIDが発行されるため、このIDを控えておきます。
   ![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/987c9ea0-7eff-db7e-1e48-7c71632d2450.png)


### リソース管理を委任するARMテンプレートの作成(ADテナント)
ADテナントで作成したLog Analyticsが配置されているリソースグループ名、およびB2Cテナントで取得した「テナントID」「グループのオブジェクトID」を元に、下記URLの「Deploy to Azure」からリソース管理を委任するARMテンプレートを実行します。

※こちらのARMテンプレートの実行には、サブスクリプションの所有者権限が必要です。

※ARMテンプレートの実行から適用までには5分程度時間がかかる場合があります

参考：https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/azure-monitor#33-create-an-azure-resource-manager-template

基本的にはドキュメント通りの内容で良いですが、ポイントとなる入力項目は下記の通りです。

* Managed By Tenant Id：B2Cテナントで取得したテナントIDを入力
* Authorizations：「principalId」の部分にB2Cテナントで作成したセキュリティグループのオブジェクトIDを入力
* Rg Name：ADテナントのLog Analyticsが配置されているリソースグループ名
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/5d70dfb9-6f35-c1f7-2a49-b6f9e5e62bb2.png)


### 委任の確認
テンプレートの実行後、Azure Portalの「サービスプロバイダー」から委任を確認できます
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/36ac9cd6-94b6-fcbf-6dc0-69d24e8ff2be.png)


名前を選択すると、サービスプロバイダーおよびロールの割り当てからB2CテナントIDやグループのオブジェクトIDが設定されていることが確認できます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/887337df-ec94-bdf1-0f8d-fa97edadbaa5.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/8d9315e9-42fb-f59c-c335-e3460332df1f.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/e59f102d-a38e-6fb1-68d7-8b0886ca5cf6.png)

## 診断設定の構成(B2Cテナント)
以下の手順でB2CのログをLog Analyticsに送信する設定を追加します。

※B2Cテナントにログイン中のユーザーは、上述の「セキュリティグループの作成」で追加したグループのメンバーである必要があります。

※診断設定を追加してからログが取得できるようになるまで15分程度かかることがあります。

1. B2Cテナントの「ディレクトリとサブスクリプション」の「既定のサブスクリプションフィルター」からADテナントにチェックを付与します。
   1. 「ディレクトリとサブスクリプション」の画面はAzure Portalのヘッダー右上部分のアイコンから遷移できます。
   ![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/140aaad6-cad0-3f0f-f217-12392381381e.png)

1. Azureサービスから「Azure Active Directory」を選択します
    * ※「B2Cテナント」や「Azure AD B2C」ではありません
1. 左メニューの「診断設定」から「診断設定を追加する」を選択します。
   ![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/26aef411-7ed6-d330-ef96-86cbf4f70ca9.png)
   ![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/f79c5d45-d083-721c-5a8b-329e860da2ed.png)

1. 下記のように診断設定を行い保存します。
    * ログ：AuditLogs、SignInLogs
    * 宛先の詳細：Log Analyticsワークスペースへの送信
        * こちらをチェックすると、ADテナントのサブスクリプションおよび作成したLog Analyticsが選択できます
   ![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/3a578461-3af1-0c7c-d3fe-f01fb98bbaf8.png)


## Log AnalyticsでB2Cのログを取得する(ADテナント)
実際にお使いのユーザーフローやカスタムポリシーを実行し、ログインを実行してみます。

その後、Log Analyticsの「ログ」から下記のクエリを実行します。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/cbec6546-5be4-c594-bb7b-6fd77e8ec5ca.png)


```
AuditLogs
| where TimeGenerated  > ago(90d)
| where OperationName contains "issue"
| extend  UserId=extractjson("$.[0].id",tostring(TargetResources))
| extend Policy=extractjson("$.[1].value",tostring(AdditionalDetails))
| summarize SignInCount = count() by Policy, OperationName
| order by SignInCount desc  nulls last
```

実行すると、ポリシー名や実行した回数が取得できました！
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/f5c23b15-bd3d-64cf-dcb8-18e70dd2755b.png)


## まとめ
今回は、環境構築編としてB2CのログをAzure Monitorに連携させるまでの手順をご紹介しました。

次回は、ログで取得できる内容やアラートの送信など、どういったことができるか踏み込んだ内容を記事にまとめる予定です！

## 関連記事
* 次回の記事：[Azure MonitorでAzure AD B2Cのトレースログを取得する（②実践編）](https://qiita.com/AsukaSeki/items/dcfedd6524faf290752c)
* [AD B2C記事まとめ](https://qiita.com/AsukaSeki/items/46afb6846cb4057b8050)


## 参考資料
* [Azure Monitor で Azure AD B2C を監視する](https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/azure-monitor)