Identity Protection の「危険なユーザー」を PowerShell で一括して「破棄済み」できるモジュールをインストールして動作確認してみた。

#はじめに

2020/07/31 の Azure AD Tech Community に Identity Protection に関する新しい記事が投稿されました。

-参考情報
Azure AD Mailbag: Identity protection
URL:https://techcommunity.microsoft.com/t5/azure-active-directory-identity/azure-ad-mailbag-identity-protection/ba-p/1257350

Q1 から Q6 どれも興味深い内容ですが、その中の Q1 に記載されている 「危険なユーザー」を PowerShell を利用し一括して「ユーザー リスクを無視する」を実行し「リスクの状態」を「破棄済み」にすることができるようになりました。

「危険なユーザー」に対して実行する「ユーザー リスクを無視する」は基本的には管理者が当該のユーザーに関するリスクを調査し、Identity Protection が検知したリスクに該当しない、そのユーザー自身が安全だと判断できた際に実行するものになります。

また、Identity Protection が「False Positive (リスクとして検知したけど結果的にはリスクではなかった)」の場合、いわゆる「誤検知」をした場合には影響が結果的にはなかったということになるので、この場合も「ユーザーリスクを無視する」を実行しそのユーザー自体のリスクを「破棄済み」にすることになります。

上記いずれかのケースに該当した場合に Azure ポータル上で一括して「ユーザーリスクを無視する」を実行することも可能ですが、今回 PowerShell でも一括して実行するモジュールが用意されたみたいなので、そちらを実際にインストールして試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/4ad4ff11-f3f0-2773-700d-35b1247c3a30.png)

#やってみる

下記 GitHub 上に手順が公開されていますが、記載されているコマンドレットが違ったりモジュールの指定先が微妙に異なっていたりハマりポイントがいくつかあったので、それらを乗り越えた上で確実に実行ができる手順にまとめました。


-参考情報
Sample PowerShell module and scripts for automating activities for the Azure Active Directory Identity Protection services API
https://github.com/AzureAD/IdentityProtectionTools

手順概要
[1. Microsoft.Graph.Authentication と Microsoft.Graph.Identity.Protection モジュールをインストール (事前準備)](https://qiita.com/Shinya-Yamaguchi/items/4cc44e4e5efa2894d644#1-microsoftgraphauthentication-%E3%81%A8-microsoftgraphidentityprotection-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB--%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
[2. Identity Protection RiskyUsers API を実行するために必要な権限を実行ユーザーに付与  (事前準備)](https://qiita.com/Shinya-Yamaguchi/items/4cc44e4e5efa2894d644#2-identity-protection-riskyusers-api-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E6%A8%A9%E9%99%90%E3%82%92%E5%AE%9F%E8%A1%8C%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E4%BB%98%E4%B8%8E--%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
[3. リポジトリから PowerShell スクリプト モジュールをインストール](https://qiita.com/Shinya-Yamaguchi/items/4cc44e4e5efa2894d644#3-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89-powershell-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[4. GitHub に記載されているオプションなどを参考にして一括して「危険なユーザー」を「破棄済み」に変更](https://qiita.com/Shinya-Yamaguchi/items/4cc44e4e5efa2894d644#4-github-%E3%81%AB%E8%A8%98%E8%BC%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AA%E3%81%A9%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E4%B8%80%E6%8B%AC%E3%81%97%E3%81%A6%E5%8D%B1%E9%99%BA%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E7%A0%B4%E6%A3%84%E6%B8%88%E3%81%BF%E3%81%AB%E5%A4%89%E6%9B%B4)

1. と 2. の事前準備が既に完了している環境であれば 3. から始めてください。

### 1. Microsoft.Graph.Authentication と Microsoft.Graph.Identity.Protection モジュールをインストール  (事前準備)

1-1. PowerShell を起動し下記コマンドレットで 2 つのモジュールをインストール

```
Install-module Microsoft.Graph.Authentication,Microsoft.Graph.Identity.Protection
```

確認メッセージが表示されるので「Y」をクリック

```
Untrusted repository                                                                                                                                                      
 You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are  you sure you want to install the modules from 'PSGallery'?
                                                                                                                [Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y    
```

1-2. インストール完了後に「Get-InstalledModule」でモジュールがインストールされたことを確認

```
Get-InstalledModule -Name Microsoft.Graph.* 
```

出力例)

```
PS C:\WINDOWS\system32> Get-InstalledModule -Name Microsoft.Graph.*                                                                                                        
Version              Name                                Repository           Description
-------              ----                                ----------           -----------
0.7.1                Microsoft.Graph.Authentication      PSGallery            Microsoft Graph PowerShell Authentication Module.
0.7.1                Microsoft.Graph.Identity.Protection PSGallery            Microsoft Graph PowerShell Cmdlets
```

インストールされてない場合 (合致するモジュール名がない場合)は「No match was found for the specified search criteria and module names～」みたいな感じで怒られます。


### 2. Identity Protection RiskyUsers API を実行するために必要な権限を実行ユーザーに付与  (事前準備)

次に Identity Protection RiskyUsers API を実行するための権限を付与します。

2-1.  Microsoft Graph エクスプローラー (https://developer.microsoft.com/ja-jp/graph/graph-explorer) に本作業を実行する管理者でサインインします。
2-2.  サインイン後に「歯車マーク(設定)」→「アクセス許可を選択する」の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/dc2cfae9-96a6-9786-adb6-11e89745cd85.png)

2-3. 検索ボックスで「IdentityRiskyUser」と入力して表示される「IdentityRiskyUser.Read.All」および「IdentityRiskyUser.ReadWrite.All」の 2 つの権限を選択し「同意」をクリックします。

ちなみに「IdentityRiskyUser.Read.All」は「危険なユーザー」の一覧を表示させるために必要で「IdentityRiskyUser.ReadWrite.All」は「ユーザーリスクを無視する」を実行しステータスを「破棄済み」に「変更」させるために必要な権限になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/beb3598b-64e4-2da5-7a06-d524238396ab.png)

2-4. 同意画面の中に選択した「権限」が含まれていることを確認し、「承諾」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/8e977bf3-2bee-4c46-738a-7ce88fdcf714.png)

ちなみに下記画面ショットが表示された場合は文字通り「管理者の同意」が必要なので、例えばですが、「エンタープライズ アプリケーション」→「Graph Explore」→「アクセス許可」から「xxxに管理者の同意を与えます」を実行し管理者が同意を付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/da2b787a-1405-4340-fd44-8eb37bdc55cf.png)

※「管理者の承認が必要」に関する詳しい説明はこちらの Blog が非常にわかりやすく解説しているので参考にしてみてください。
[「管理者の承認が必要」のメッセージが表示された場合の対処法](https://jpazureid.github.io/blog/azure-active-directory/azure-ad-consent-framework/)

### 3. リポジトリから PowerShell スクリプト モジュールをインストール

3-1. 実行ファイルがある GitHub のリポジトリ (https://github.com/AzureAD/IdentityProtectionTools) から「Code」→「Download ZIP」の順にクリックして ZIP ファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/2c1d2d1e-128e-9bc9-1d29-1cfee0771da7.png)

3-2. ファイルを解凍し、「modules」フォルダ内にあるフォルダ名「IdentityProtectionTools」をフォルダごとコピーし PowerShell の実行モジュールのフォルダ (例：C:\Program Files\WindowsPowerShell\Modules) 直下にコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/0ddce297-9cb6-48d1-7a87-8ad7400f8771.png)

3-3. この状態で PowerShell より「Import-module IdentityProtectionTools」を実行し、エラーが返らないことを確認します。
※ GitHub 上の手順では「Import-module IdentityProtectionTools.psm1」と記載されていますが、「IdentityProtectionTools」を引数として指定してモジュールごとインストールしないとコマンドがうまく Import できないのでモジュール名を指定してください。

3-4.下記画面ショットのように「Get-Module -Name IdentityProtectionTools 」コマンドレットにて「ExportedCommands」の列にコマンド名 (Get-AzureADIPRiskyUser) が記載されていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/01e5a318-f9d4-67d4-29d3-69a536f0506f.png)

逆に下記画面ショットのように Import-module コマンドレット自体が成功してもモジュールが正しく Import されていない場合は、コマンド欄に何も表示されない表示になります。この場合はコマンドを叩いても失敗するのでモジュール名を指定して正しく入れなおしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/86003bc4-482b-5105-afa5-693b9a0033d0.png)


### 4. GitHub に記載されているオプションなどを参考に一括して「危険なユーザー」を「破棄済み」に変更

コマンドが実行できるようになったので、Microsoft Graph にアクセスし、インポートしたコマンドを使い「危険なユーザー」を「破棄済み」に変更してみます。

4-1. まず、以下 2 行を実行し、Microsoft Graph にサインインします。

```powershell
$apiPermissionScopes = @("IdentityRiskyUser.Read.All", "IdentityRiskyUser.ReadWrite.All")
Connect-Graph -Scopes $apiPermissionScopes
```

Connect-Graph -Scopes $apiPermissionScopes を実行すると下記画面ショットのように「https://microsoft.com/devicelogin」 にサインインして記載されている Code で認証するように促されるのでこの URL にアクセスしてサインインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/96193873-c4ae-995f-3d10-471aed0b197e.png)

4-2. 「次へ」をクリックします。
※当然ですが実行環境の PowerShell 上に表示されているコードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/5e7893a6-6ec3-1d1e-ed26-f2da4b09ef4f.png)

4-3. 手順2. [2. Identity Protection RiskyUsers API を実行するために必要な権限を実行ユーザーに付与  (事前準備)](https://qiita.com/Shinya-Yamaguchi/items/4cc44e4e5efa2894d644#2-identity-protection-riskyusers-api-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E6%A8%A9%E9%99%90%E3%82%92%E5%AE%9F%E8%A1%8C%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E4%BB%98%E4%B8%8E--%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99) で権限を付与した UPN でサインインをします。「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/27a6a3a4-15a5-739e-db59-335bfc617781.png)

4-4. パスワードを入力して「サインイン」をクリックします。
また、MFA を設定している場合には MFA の認証を続けて行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a14bb8eb-ec66-c0b1-ffcb-bc54e7735e66.png)

アプリへの同意画面が表示される場合は「承諾」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/f9bd3c2f-7f16-c414-f577-414e55969f46.png)

4-5. これでサインインが完了したので、このウィンドウは閉じても問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/d0588a71-7262-1b47-dd45-73124fe45176.png)

4-6. 下記画面ショットのように「Welcome To Microsoft Graph!」と表示されていればサインイン成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/d8ed4728-8ed4-3231-4872-a72fd4d1216c.png)

これでようやくコマンドで「危険なユーザー」の制御が可能になりました。
GitHub 上に書かれているように使い方はシンプルです。

- リスクレベル (low,medium,high) ごとに指定するか、何も指定しないで「危険なユーザー」をすべて表示させるか、選択できます。
- 「リスクの最終更新日時」を対象に「-日数」のオプションをつけることで、対象の危険なユーザーを絞り込むこともできます。
- 「-Verbose」オプションをつけることで、検索対象の詳細のログを出力させながら確認することができます。

以下実行例は、過去 90 日以内に更新のあったリスク レベル「高」の「危険なユーザー」の一覧になります。

コマンド：Get-AzureADIPRiskyUser -RiskLevel High -Verbose -90
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a73612da-ee3e-dfd9-08a9-5e705fec8441.png)

この中で「Invoke-AzureADIPDismissUserRisk」コマンドレットを実行して「ユーザー リスクを無視する」を指定する際に必要な引数は「-UserIds (ユーザー ID)」になります。

ユーザー ID だけを抽出する場合には「Get-AzureADIPRiskyUser -RiskLevel High -Verbose -90 -AsUserIDs」のように「-AsUserIDs」オプションを付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/188be412-a428-b1a7-f106-9b69ffb7a93f.png)

「Invoke-AzureADIPDismissUserRisk」を実行する場合には、「危険なユーザー」の変数に一覧のユーザー ID を代入し、変数を利用して一括して「ユーザーリスクを無視する」を実行します。

※ GitHub には「Invoke-AzureADIPDismissUserRisk」を実行するように書いてますが、Import するモジュールでは「Invoke-AzureADIPDismissRiskyUser」がインポートされます、正しいコマンドレットは「Invoke-AzureADIPDismissRiskyUser」なのでこちらを使用します。

具体的には以下のような感じで実行します。

```powershell
#実行例  (リスク レベル「高」の 90 日以前に更新のあった危険なユーザーを指定)
$riskyUsers = Get-AzureADIPRiskyUser -RiskLevel High -Verbose -90 -AsUserIDs                 

詳細: Retrieving RiskyUsers with RiskLevel of High
詳細: Retrieving RiskyUsers who had their risk updated since -90 days
詳細: Retrieving RiskyUsers with Filter (RiskLevel eq 'High') and (riskLastUpdatedDateTime gt 2020-05-04T00:00:00Z)
詳細: 7 Risky Users Retrieved!

#実行例 (一括して「ユーザーリスクを無視する」を実行)
Invoke-AzureADIPDismissRiskyUser -UserIds $riskyUsers -Verbose
```

実行前の危険なユーザーの一覧が下記です。7名いますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/1398ea35-60f7-933b-4acb-3e7ef1f600bd.png)

では実行します。

```powershell
Invoke-AzureADIPDismissRiskyUser -UserIds $riskyUsers -Verbose                                                                                              
```

確認画面が表示されるので「Y」入力し「Enter]を押し実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/cbefdb2f-533b-bf08-4e2f-209cd1cd4000.png)

Complete しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/42595269-75e5-5501-5463-13186a0a4f8d.png)

コマンドレットで確認してみますが、即時反映はされないので、反映まで数分待ちましょう。
該当ユーザーがいない場合は、***0*** Risky Users Retrieved と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c5fe4ac2-f330-a29a-e7e9-206d9372501b.png)

Azure ポータルでも確認してみます。きれいに一覧からいなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/5dd87bce-dbcc-8999-bb5a-305ccd4b80b6.png)

「破棄済み」に状態が遷移したかどうか確認するために、リスクの状態の「破棄済み」だけを選択してみてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/79deca5c-c063-580e-c00e-76484a41bda4.png)

過去に破棄済みにしたユーザーもまざってますが、PowerShell を実行した同タイミングで 7 名のユーザーが「破棄済み」として遷移していることが確認できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/82ae356f-8ca9-c238-1f93-732b8d26f7cf.png)

#おわりに
今回は新しく Identity Protection 用に追加されたモジュール「IdentityProtectionTools」をインストールして PowerShell コマンドレットを利用して「危険なユーザー」を複数ユーザー指定して「ユーザーリスクを無視する」をまとめて実行してみました。

今回試したコマンドレットは以下 2 つになります。

- ***Get-AzureADIPRiskyUser*** 危険なユーザーの一覧を確認する
- ***Invoke-AzureADIPDismissRiskyUser***  「***Get-AzureADIPRiskyUser***」 で指定した ID を対象に一括して「ユーザーリスクを無視する」が実行できる。

Azure ポータルでポチポチしたくない、 PowerShell でまとめてなんとかできないか、という要望に応えられるモジュールという検証でした。
「ユーザーリスクを無視する」を実行しなくても ***Get-AzureADIPRiskyUser*** 単体で危険なユーザーを PowerShell で手軽に確認できるのもポイント高いですね。

今回の記事が少しでも参考になれば幸いです。