【Entra ID ハンズオン】OktaをIdPにしたM365のフェデレーション

# 1.はじめに
本記事は、OktaをIdP、Microsoft365の認証(Entra IDによる認証)をSPにした場合の記事です。

Microsoft 365は、Entra IDをデフォルトのIDaaS (Identity as a Service）としていますが、他のIDaaSに設定して利用することも可能です。フェデレーションと呼ばれる設定となり、Entra IDによる認証の際に、他のIDaaSにリダイレクトされ、認証OKの場合は、再度リダイレクトされて、リソースにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/92740730-bcc6-ce4a-1eed-31243c8f0db5.png)


ちなみに、前回の記事では、過去Microsoft 365の認証をフェデレーションする場合において、最有力の候補であったADFSに関して、記載しました。こちらもご参考まで。

https://qiita.com/mokonacl/items/f778fb0dfe06bfd606fc

とはいえ、Entra IDを除いた場合は、ADFSを利用するよりも他のIDaaSを利用すること方が主流となります。
Oktaは、人気のあるIDaaSですので、今回ピックアップし、設定手順をご説明します。
なお、OktaはIdentity Engine(新しい基盤、旧基盤はClassic Engine)を利用しています。

また、Oktaの環境準備に関しては、以下記事をご覧くださいませ。

https://qiita.com/mokonacl/items/2a11cd825ac2db90711a

# 2.WS-Fedarationとは

今回、Microsoft 365のフェデレーションを構成する前に、WS-Fedarationに触れておきます。

WS-Fedarationとは、IBMやMicrosoft社によって開発されたクレームベースの認証方式となります。現在は、SAMLやOpenID Connectといった認証方式を利用される方が多いですが、Microsoft 365のフェデレーションのためには、WS-Fedarationを利用する必要があります。

SAMLプロトコルに似ており、ユーザーID を検証した後、IdP側は、Request Security Token Response （RSTR）を返します。このRSTR の中には、SAML アサーションが含まれます。

WS-Federationの詳細は、Microsoftの公式サイトに記載がありますので、下記よりご確認いただけます。

https://learn.microsoft.com/ja-jp/previous-versions/dotnet/articles/bb498017(v=msdn.10)?redirectedfrom=MSDN

# 3.設定手順

### 3-1.プライマリドメインの設定

フェデレーションの設定をするためには、XXX.onmicrosoft.comをプライマリのドメインにする必要があります。
「Entra 管理センター > 設定 > ドメイン名」から、プライマリドメインをXXX.onmicrosoft.comに変更しましょう。すでに変更済みであれば作業不要です。
なお、プライマリドメインに設定していると、新しいユーザーを作成したときに、そのユーザーの既定のドメイン名にプライマリドメインが設定されたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/c8a21705-734a-406e-c1ee-f4a8b95de182.png)
<br>

もし、カスタムドメインを追加していないようであれば、以下記事をご覧くださいませ。

https://qiita.com/mokonacl/items/72b789210a3e0054211e

### 3-2.OktaへのOffice 365の登録

Oktaの管理ポータルに移動します。「Applications > Applications」を選択し、「Browse App Catalog」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/f6ba3216-fcdf-5d3e-a99c-f83a060aada4.png)

カタログから「Office」と検索して、「Microsoft Office 365」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/86476458-eeeb-a31a-d1d9-4afeb7af660f.png)
<br>

「Add Integration」をクリックします。
なお、画像キャプチャを添付しますが、連携時に利用可能な機能もこちらで確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/e381d1bd-9465-55a8-4497-5446c1f1b35d.png)
<br>

個人的に重要と感じるのが、Provisioningのところです。
これは、SCIM（System for Cross-domain Identity Management）やAPIによるユーザプロビジョニングのことを示しています。SSOはできるが、ユーザプロビジョニングはできないSaaSもあったりするので、事前に確認しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/1c7a82fa-1a82-4434-3efb-08f6a80502fa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/8abb00c1-cbc1-ab4d-7cdd-ee255a29b3b2.png)
<br>

設定画面に入っていきます。
General Settingのところでは、Microsoft側のドメイン情報を入力します。
上部の「Microsoft Tenant Name」に関しては、[固有].onmicrosoft.comにおける[固有]の部分を入力し、「Your Office 365 company domain」に関しては、今回利用したい（OktaをIdPとして利用したい）ドメイン情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/d3c4ade4-5ca6-2cb5-2615-7a426f582312.png)
<br>

Sign-On methodsに関しては、「WS-Federation」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/9c92e29c-970e-7d2a-aef9-887f791c1a16.png)
<br>

次に、「I want to configure WS-Federation myself using PowerShell」にチェックをいれます。
「View Setup Instructions」をクリックすると、新しくタブが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/ff5df8a0-f4c7-166d-b620-f1e421c88831.png)
<br>

新しく開いたページには、powershellコマンドが表示されます。表示されたコマンドは、実際にテナント単位の情報を反映しているため、コマンドを実行するだけで、WS-Federation完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/17c11e17-60fc-6436-43c7-07a524ef001f.png)
<br>

:::note info
ポイント：Microsoft Graph API
2023年6月ごろに、Azure AD Graph や MSOnline Powershell モジュールは廃止になっています。
OktaのHelpページは、すでにコマンド反映済みでしたが、情報媒体によっては古いことがあるので注意をする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/9b598434-51b3-63e4-4347-df5eddf12498.png)

https://jpazureid.github.io/blog/azure-active-directory/how-to-determine-depreacated-azuread-msol/

例えば、コマンド体系が変わっており、Get-MsolUserやGet-AzureADUserコマンドが、Get-MgUser コマンドに変更になっています。
:::

:::note info
もし、Graph PowerShell SDKをインストールしていなければ、以下URLを確認して入れる必要があります。
例えば、以下コマンドをPowerShellで実行することで、インストールできます。

```PowerShell
Install-Module Microsoft.Graph
```
https://learn.microsoft.com/ja-jp/powershell/microsoftgraph/installation?view=graph-powershell-1.0
:::

<br>

コマンドを投入した際の画面は以下の通りとなります。
各コマンド実行後に、ブラウザにリダイレクトされて、認証が発生しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/a67c3858-9230-fcdf-bd2b-84477c437ee0.png)

なお、ここで実行しているコマンドは、``New-MgDomainFederationConfiguration`` で、新しいフェデレーションドメインを作成することが可能となっています。
以下はサンプルコマンドと公式のコマンドリファレンスです。

```powershell

New-MgDomainFederationConfiguration `
  -DomainId example.com `
  -DisplayName example.com `
  -IssuerUri https://[***] `
  -PreferredAuthenticationProtocol "wsFed" `
  -ActiveSignInUri https://dev-[***].okta.com/app/office365/[***]/sso/wsfed/active `
  -PassiveSignInUri https://dev-[***].okta.com/app/office365/[***]/sso/wsfed/passive `
  -MetadataExchangeUri https://dev-[***].okta.com/app/office365/[***]/sso/wsfed/mex `
  -SigningCertificate [***] `
  -SignOutUri https://dev-[***].okta.com/app/office365/[***]/sso/wsfed/signout `
  -FederatedIdpMfaBehavior [***] 

```

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.graph.identity.directorymanagement/new-mgdomainfederationconfiguration?view=graph-powershell-1.0

:::note info
コマンド補足
今回実行したコマンドは、Oktaのヘルプページの情報に、以下コマンドを加えて、Microsoft Graphから明示的に切断しています。
下記コマンドを実施しない場合は、資格情報が保持され、再アクセスがスムーズになりますが、すぐ再アクセスをしないなら、明示的に切断しておいた方がよいと思います。（個人的な意見です）

```PowerShell
Disconnect-MgGraph
```

:::

<br>

Entra 管理センターに移動し、「設定 > ドメイン名」からカスタムドメイン名を確認します。
すると、今回対象としたドメインのフェデレーションが有効になっていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/93b548b1-76de-366c-9f88-5f21f89a08c3.png)
<br>

:::note info
フェデレーションは、ドメイン単位の設定可能です。
あるドメインAは、ADFSによってフェデレーションさせて、あるドメインBは、Oktaでフェデレーションさせて、あるドメインCは、Entra IDでそのまま認証・認可させることができたりします。

:::

# 4.ユーザのプロビジョニング

### 4-1.注意点

フェデレーションの設定をしている場合、Entra IDでは、フェデレーション対象ドメインを利用して、新規ユーザを作ることができません。

* NG例：Entra IDで直接　[username]@[フェデレーションのドメイン] を作成
* OK例：Entra IDで直接　[username]@[マネージドドメイン] を作成
* OK例：Oktaでユーザを作り、Entra IDにユーザ同期

Entra IDで直接、[username]@[フェデレーションのドメイン] を作成しようとすると、以下のようにエラーが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/a232936d-2d7f-4ce3-96d2-28cfd4be7cf8.png)
<br>

https://learn.microsoft.com/ja-jp/microsoft-365/troubleshoot/domain-management/cannot-assign-federated-domain-to-user

### 4-2.Oktaを利用したIDプロビの設定

上記注意点がありますので、ユーザの作成は、Oktaを利用する必要があります。なお、Active DirectoryからEntara Connectを利用してもEntra IDにユーザを作成することは可能な模様です。

「Applications」から、M365を選択し、「Sign On」に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/3e37fc25-69dc-bac1-0c40-e303c41e4e25.png)
<br>

「Advanced API Access」の「Allow administrator to consent for Advanced API access」にチェックを入れます。その後、Authenticate with Microsoft Office 365をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/07ccf7aa-d11f-7510-de29-93b6fa01ad12.png)
<br>

認証フォームがポップアップし、要求されるアクセスの許可を「承諾」すると完了となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/42f2b36b-4cfb-4ea1-bbd6-60c48abbcc4f.png)
<br>

「Provisioning」に移り、「Configure API Integration」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/2cd8c8eb-1817-f420-a889-c1f87d10df9f.png)
<br>

「Enable API integration」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/dcdc33da-5dff-3400-9ff1-c65cc741e913.png)
<br>

グローバル管理者権限を持つユーザを入力します。（自動で入力される場合もあります）
入力したら、「Test API Credentials」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/b4be4893-ae78-177b-cc52-cc9688e17e33.png)
<br>

問題なければ、Microsoft Office 365 was verified successfully!　と表示されますので、「SAVE」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/0ff349cf-b0b2-fcd7-f966-584fe587f32b.png)

To App , To Oktaというサイドメニューが表示されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/62ea310b-df7c-3fe8-e7bb-fdac96753d65.png)
<br>

必要なIDプロビの作業に関して、「Enable」にチェックを入れて、「Save」を押して完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/81669354-ab5c-9936-7a7d-789ce2ac3247.png)
<br>

### 4-3.IDプロビのためのユーザ割り当て（手動）

Oktaの管理ポータルで、「Directory > People」に移動します。
「Add person」よりユーザを作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/23eab949-5460-1f5a-c1fd-00fc5e9e0c13.png)
<br>

ドメイン名のところは、フェデレーションの設定をしたドメインにして、ユーザを作成します。
入力できましたら、「Save」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/1cd1d864-ba9c-2797-b6e7-ae30ac66fdd5.png)
<br>

作成したユーザをクリックします。「Applications > Assign Applications」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/0b565989-1b06-68e2-c307-0fa1699181cd.png)
<br>

そして、先ほど設定した「Microsoft Office 365」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/9b289de1-c6f7-c5cc-27fe-266bcb35caf8.png)
<br>

アサイン時には、ライセンスやロールもセットで付与することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/cfac371e-f488-9c57-0eb7-b246b24138bb.png)
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/dc6ae0d8-d367-0523-a405-1875b3243fe1.png)

<br>

:::note info
Immutable ID
アプリの登録時に、Immutable IDの設定も可能となっています。
任意で設定しない場合は、Entra ID側にランダムな値が自動で割り当てられます。
加えて、一度設定したImmutable IDは上書きすることができないので注意する必要があります。
:::

以下画像のように、ユーザーにアプリを割り当てることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/a112fc05-e050-58fc-1f96-bc636367eb1d.png)
<br>

### 4-4. 動作確認

それでは作成したユーザで、動作確認を行います。
Entra IDの認証が発生する何らかのサイトにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/67a07bbc-a6ac-f2af-cb74-66852c163684.png)
<br>

ユーザ情報を入力するとOktaの認証フォームにリダイレクトされました。次へをクリックし、パスワードを入力すると、無事Microsoft側のサービスにログインすることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/d1058938-d62e-d07d-c078-0984f7c1f21e.png)
<br>

加えて、Oktaの「Reports > System Log」に、フェデレーションでの認証ログが残っていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/e2d4ef8a-5551-e888-229a-02827f4249c2.png)
<br>

# 5.おわりに

これでOktaをIdPにしたM365のフェデレーションは一応完了です。
ただ実運用上だと、大量にあるライセンスやロールの割り当てなどを手動で実施するのは、大変です。
そのため、Okta Workflowを利用したりするなど、工夫が必要かもしれませんね。