[Azure] Microsoft Entra IDのユーザーパスワードを無期限にする

:::note warn
Azure ADの名前がMicrosoft Entra IDに置き換わるため、この投稿ではAzure ADのことをMicrosoft Entra IDと記載します。
:::

Microsoft Entra ID上に直接作成しているユーザーのパスワードを無期限に設定する方法を紹介します。
※ オンプレミスのActive Directoryから同期しているユーザーについては対象外です。

設定には強い権限が必要となるため、グローバル管理者ロールを持っているユーザーで実施する前提です。

# テナント全体でパスワードを無期限にする
テナント全体でパスワードを無期限にするにはMicrosoft Entra IDの管理画面ではできません。Microsoft 365 管理センターからおこないます。

1. [Microsoft 365 管理センター](https://admin.microsoft.com/)にログオンします。
1. [設定]→[組織設定]→[セキュリティとプライバシー]→[パスワードの有効期限ポリシー]を選択します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/25b83b5b-eb0a-6e68-7a74-8c63c3021204.png)

1. [パスワードを無期限に設定する]にチェックを入れて保存します。逆にパスワード期限を設定したい場合はチェックを外し、パスワードの有効期限が切れるまでの日数を指定してください。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/652facda-3df1-9771-8d68-fcf5f915457e.png)

   この設定の既定値はテナントをいつ開設したかで変更されています。
2021年の春頃以降に開設されたテナントでは既定値が「無期限」に設定されており、それ以前に開設したテナントでは既定値が「90日」になっています。

# 特定のユーザーのみパスワード期限を無期限にする
設定にはMicrosoft Graph PowerShellを使う必要があります。以下で紹介する手順はCloud Shellを使っている前提となっています。

1. Cloud ShellをPowerShellモードで起動します。
1. Cloud Shellには「Microsoft Graph PowerShell」が既定ではインストールされていないため、まずはMicrosoft Graph PowerShellをインストールします。
   ~~~
   Install-Module Microsoft.Graph -Scope CurrentUser
   ~~~

1. インストールが完了したら、以下のコマンドを実行して必要な権限を取得します。
   ~~~
   Connect-MgGraph -Scopes "User.ReadWrite.All","Group.ReadWrite.All"
   ~~~
   以下のメッセージが表示されるので、リンクをクリックします。
   ~~~
   To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ********* to authenticate.
   ~~~

1. コードの入力を求められるので、CloudShell側に表示されているコード（*********の部分)をコピーして貼り付けます。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/602e6bd1-9f53-c09d-a4fa-6870b9bbb8ef.png)

1. アカウントを選択します。
※「シンガポールにある別のデバイス」と出てきますが、Cloud Shellが東南アジアリージョンで動いているためです。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/7b415277-4b4e-5d9b-4506-69009fa2b189.png)

1. [承諾]を選択します。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/3246df6a-a109-05ec-2c53-d6fe814a3178.png)

1. この画面が表示されたらウィンドウを閉じてCloud Shell側に戻ります。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/82ccdf90-70fd-b48e-dd18-bb568e1d7b5d.png)

1. 認証が成功していればCloud Shellに以下のメッセージが表示されます。
   ~~~
   Welcome to Microsoft Graph!
   
   Connected via delegated access using ********-****-****-****-************
   Readme: https://aka.ms/graph/sdk/powershell
   SDK Docs: https://aka.ms/graph/sdk/powershell/docs
   API Docs: https://aka.ms/graph/docs
   
   NOTE: You can use the -NoWelcome parameter to suppress this message.
   ~~~

1. 以下のコマンドで特定のユーザーのパスワードを無期限に設定できます。
   ~~~
   Update-MgUser -UserId <user ID> -PasswordPolicies DisablePasswordExpiration
   ~~~
   \<user ID\>には `hoge@contoso.onmicrosoft.com` のようなユーザーIDを入力します。

1. パスワード無期限になっているかは以下のコマンドで確認します。
   ~~~
   Get-MGuser -UserId <user ID> -Property UserPrincipalName, PasswordPolicies | Select-Object UserPrincipalName,@{
    N="PasswordNeverExpires";E={$_.PasswordPolicies -contains "DisablePasswordExpiration"}
   }
   ~~~
   結果は以下のようになります。
   ~~~
   UserPrincipalName               PasswordNeverExpires
   -----------------               --------------------
   hoge@contoso.onmicrosoft.com                 True
   ~~~
   パスワードの無期限設定を解除したい場合には以下のコマンドを使います。
   ~~~
   Update-MgUser -UserId <user ID> -PasswordPolicies None
   ~~~

# 参考文献
* [よくわかるパスワード ポリシーとよくある質問](https://jpazureid.github.io/blog/azure-active-directory/comprehend-password-policy/)
* [個別のユーザーのパスワードを無期限に設定する](https://learn.microsoft.com/ja-jp/microsoft-365/admin/add-users/set-password-to-never-expire?view=o365-worldwide)
* [Install the Microsoft Graph PowerShell SDK](https://learn.microsoft.com/ja-jp/powershell/microsoftgraph/installation?view=graph-powershell-1.0)