🧑‍💻

OktaでAzureADのSSOを構成するときに詰まったImmutableIDの上書きをPowerShellを使わないでやる方法

2021/12/18に公開

こんにちは、株式会社イエソドでソフトウェアエンジニアをしている、tbashiyyです。

この記事は、「Okta Advent Calendar 2021」の18日目の記事です!

要約

  • OktaでAzureAD(Office 365)のSSO設定をするときに、既存のアカウントがある場合は、AzureAD側・Okta側双方で ImmutableIDの設定が必要になる
  • PowerShellで上書きする方法が一般的?のようですが、私のようなwindows機を持っていない人でも、Microsoft Graph API を使えば簡単にできます!

課題

弊社では、IdPとしてOktaを導入しています。
また、AzureAD(Office365)も利用しているので、SSOを構成する必要があったのですが、チュートリアル通りに設定してもうまくSSOが出来ませんでした。

そこで、いろいろ検索をかけていく中で、下記のようなことが判明しました。

  • OktaからAzureAD(Office365)にSSOをする際には、 ImmutableIDと呼ばれるものが必要になる。
  • そして、AzureADの管理画面上から作成したユーザーについては、ImmutableIDが発行されていない。

参考にさせていただいた記事などはこちらです(感謝)🙏
okta公式(OktaからOffice 365へのSSOがエラーになる:AADSTS51004)
https://support.okta.com/help/s/article/SSO-from-Okta-to-office365-shows-error-AADSTS51004?language=ja
kobasoさんの記事
https://note.com/kobaso/n/n6ab079fa0d34
thdyさんの記事
https://zenn.dev/thdy/articles/okta_azuread_integrations

ここまでたどり着いた私はもう余裕の表情です。
だって、PowerShellからImmutableID付与していけばいいだけなんですもん!!!

......

Windows機、持ってないやん。(終)

Windows機がなくPowerShellが使えない

会社ではMacを使っています。
そんな私はどうにかMacでPowerShellが使えないか色々調べてみたのですが、どうもうまく動きません。

https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.2

色々ためしてとりあえずPowerShellからやるのは厳しそうだったので、天下のMicrosoftさんなら、APIぐらい公開してるやろと思い、探し始めました。

すると思惑通りちゃんとありました!!!

Microsoft Graph API を利用する

Micorsoft Graph APIとは、

Microsoft Graph は、Microsoft Cloud サービス リソースへのアクセスを可能にする RESTful Web API です。アプリを登録 して、サービス または ユーザーの認証トークンを取得する と、Microsoft Graph API に対して要求を行うことができます。

要するに、AzureADのリソースに対してAPI経由で色々操作できるものみたいですね!(雑)
細かい利用方法やできることについては、公式リファレンスに移譲して、ここからは本題のGraph APIを利用してImmutableIDの上書き方法について説明します。

公式リファレンス
https://docs.microsoft.com/ja-jp/graph/

また、便利なことに Graph Explorerが用意されているので、ブラウザから権限のあるアカウントでサインインするだけでそのままAPIを叩けます。
ここから先は、Gpraph Exploerを利用して説明をします。

1. 権限のあるアカウントでサインインする

まず、Graph Exploerへアクセスし、下記画像の赤枠の箇所から、権限のあるアカウントでサインインします。

2. 現状のユーザーのImmutableIDを確認する

Graph Exploerの上部で HTTP Methodと リクエストURLを指定し、クエリの実行 を押すことで実行をすることができます。

まずはじめに、下記のリクエストをなげて、ユーザーのImmutableIDを確認します。

GET https://graph.microsoft.com/v1.0/users?$select=onPremisesImmutableId&$select=displayName&$select=userPrincipalName

クエリパラメータの$select={parameter}で、レスポンスに返ってくるフィールドを指定することができます。
上のリクエストの中で、onPremisesImmutableId というものがありますが、これが今回上書きをしていきたい ImmutableIDに該当しています。

リクエストを投げると、下記のようなレスポンスが返ってくると思います。

{
  "value": [
    {
	"onPremisesImmutableId": null, // 設定がない場合はnullになる
	"displayName": "苗字 名前",
	"userPrincipalName": "xxxx@domain.com",
    },
    {
	"onPremisesImmutableId": "xxxxxxx", // すでに設定されていれば何か入っている
	"displayName": "苗字 名前2",
	"userPrincipalName": "yyyy@domain.com",
    },
  ]
}
		

3. onPremisesImmutableIdのないユーザーに一意なIDを付与していく

上で、ImmutableIDが設定されていないユーザーが把握できたと思うので、そのユーザーに対して ImmutableIDを付与していきます。
ImmutableIDはユニークな文字列であればなんでも良さそうだったので、私はUUIDv4でランダム生成したものを利用しました。

リクエストは、PATCHで下記URLに対してをImmutbaleIDを指定したbodyとともに送ります。

PATCH https://graph.microsoft.com/v1.0/users/<userPrincipalName>

BODY

{
  "onPremisesImmutableId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}

これを、設定していないユーザー分やります。
(人数多い場合は普通にスクリプト書いた方がいいです。)

4. 先ほど設定したImmutableIDをOkta上で設定する

AzureAD側でImmutableIDの設定が完了したら、最後にOktaで各ユーザーに対してImmutableIDを設定していきます。

Application > Microsoft Office 365 > Assignments で、各ユーザーの設定画面を開き、ImmutableIDの設定画面があるので、先ほど設定したものを転記していきます。

これでImmutableIDの設定は完了です! 無事SSOができることを確認しましょう!

最後に

AzureADにすでにユーザーが作られているようなケースで、OktaからSSOを構成する際にはまったことを書きました。

ちなみに、OktaからAzureADへのProvisioningで作られたユーザーについては、作成時にImmutableIDが自動的に付与されるみたいです。

Discussion