ぷろじぇくと、みすじら。

Google (GSuite) を IdP として Azure Active Directory (Office 365) にサインインする

Created at:

Azure Active Directory(以下Azure AD)とGoogleのアカウント連携について調べるとAzure AD (Office 365)をIdPつまりユーザー情報のソースとしてGoogleにサインイン (SSO) する、ユーザープロビジョニングを行うといった設定についてのドキュメントが見つかります。

一方で逆のパターン、つまりGoogle (GSuite, Cloud Identity)をIdPとしてAzure ADやOffice 365にサインインしたり、ユーザー情報を同期するパターンについての説明は少ないので折角ですしメモもかねて残しておきます。

ちなみにAzure AD B2Bの機能としてGoogleをアプリとして登録することでAzure ADにゲストとして登録する機能というのもあるのですがそれとは別です。

公式ドキュメント(Office 365 クラウド アプリケーション - G Suite 管理者 ヘルプ)ushiyasanさんのブログエントリー(GoogleアカウントでOffice365(Azure AD)にSSOログイン)を参考にして大体設定しています。というわけで基本は公式のドキュメントの手順に沿って設定していきます。

Google の IdP 設定を取得する

公式ドキュメントの手順1で、ここはドキュメントそのままです。まずは Google の管理コンソールから設定のための情報を取得します。

特権管理者で管理コンソールにログインして セキュリティシングルサインオン (SSO) の設定 を開いて、各種情報のメモと証明書のダウンロードを…と思ったのですが実はSAMLアプリケーション (Office 365)の追加の手順の途中でも表示されるのでそっちからでもよいです。

特権管理者で アプリSAML アプリサービスやアプリをドメインに追加 をクリックして、SAMLアプリを追加する画面を表示します。SAML アプリケーションで SSO を有効にする という画面が出るのでOffice 365 で検索します。Microsoft Office 365 というアプリが見つかるのでそれをクリックして進めます。

ステップ2 Google IdP 情報 という画面が表示されるとGoogleをIdPとして利用するために必要な情報が表示されますので下記の3つの情報を記録しておきます。

Azure AD をフェデレーテッドモードに変更する

公式ドキュメントの手順 2で、ここからはAzure AD側の設定を行います。先のブログエントリーでも書かれているのですが、手順 2についての手順はPowerShellで設定してぐらいのざっくりとしたことしか書かれていません。

やることは次の二点です。

PowerShell モジュールをインストールし、接続する

Azure ADの設定にはPowerShellで接続できる必要があるのでその準備です。

まずはモジュールをインポートします。

Import-Module -Name MSOnline

次にサービスに接続します。管理権限のあるユーザーで接続してください。

PS> Connect-MsolService
PS> Get-MsolDomain
Name Status Authentication
---- ------ --------------
example.com Verified Managed
examplecom.onmicrosoft.com Verified Managed

既存ユーザーの ImmutableId を設定する

GoogleはAzure AD側のユーザーと突き合わせるためにAzure ADのユーザープロパティ ImmutableId を使用します。

ImmutableId に使用する値は特に理由がなければメールアドレス (例: `user@example.com`) にします。他でもできるはずですが、Google側が受け入れるのがメールアドレスか姓名ぐらいしかないようです。

Azure AD単体で使っている状態ではユーザーに対して設定されていないので既存のユーザーに関しては何らかの方法で設定してあげます。まあ何らかの方法というか Set-MsolUser コマンドレットですね。

Set-MsolUser -UserPrincipalName alice@example.com -ImmutableId alice@example.com
Get-MsolUser | ?{ $_.UserPrincipalName.EndsWith("example.com") } | %{ Set-MsolUser -UserPrincipalName $_.UserPrincipalName -ImmutableId $_.UserPrincipalName }

後々ユーザープロビジョニングでGoogle側からやってきたユーザーに関しては自動で設定されます。

Azure ADの認証モードを Federated に変更し、SAML認証の設定をする

Azure ADの認証モードを Federated に変更し、SAML関連の設定をおこなうことで認証をAzure AD以外の場所で行うようにします。

設定には Set-MsolDomainAuthentication コマンドレットを使用して、先ほどのIdP情報を指定します。

# "SSO の URL" と書かれていた項目
$ssoUrl = "https://accounts.google.com/o/saml2/idp?idpid=<IdPId>"

# "エンティティ ID" と書かれていた項目
$entity = "https://accounts.google.com/o/saml2?idpid=<IdPId>"

# 対象のドメイン名
$domain = "example.com"

# 証明書
$cert = "ダウンロードした証明書の -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- までの「間」を改行をなしで一行で"

Set-MsolDomainAuthentication -Authentication Federated -DomainName $domain -ActiveLogOnUri $ssoUrl -PassiveLogOnUri $ssoUrl -IssuerUri $entity -LogOffUri $ssoUrl -SigningCertificate $cert -PreferredAuthenticationProtocol SAMLP
PS> Get-MsolDomain
Name Status Authentication
---- ------ --------------
example.com Federated Managed
examplecom.onmicrosoft.com Verified Managed

下記のようなエラーが発生した場合には指定したドメインがAzure ADのプライマリドメインとなっていると思うので onmicrosoft.com や他のドメインにプライマリを一度切り替える必要があります。

Set-MsolDomainAuthentication : You cannot remove this domain as the default domain without replacing it with another
default domain. Use the the Set-MsolDomain cmdlet to set another domain as the default domain before you delete this
domain.

Google (GSuite) の SAML アプリケーション設定

再びGoogleの管理コンソールに戻ってステップを進めます。

Microsoft Office 365 の基本情報 はそのままで「次へ」で進めます。

サービス プロバイダの詳細 は「署名付き応答」にチェックを入れて「次へ」で進めます。

属性のマッピング は「IDPEmail」を「基本情報」「メインのメールアドレス」を選択して「次へ」で進めます。

これでアプリの基本設定は完了ですがまだ有効になっていないので動きません。

Microsoft Office 365 アプリを有効化する

SAMLアプリを追加しただけでは有効になっていないのでそれを有効化する必要があります。

アプリSAML アプリ でアプリの一覧から Microsoft Office 365 を選択して、右上の「サービスを編集」をクリックします。

「サービスのステータス」で「オン (すべてのユーザー)」を選択します。

サインインをしてみる

ここまでの設定でAzure ADにGoogle経由でサインインできるようになっているはずでしょう。多分。

Cookieが残っていると挙動が怪しいのでプライベート ブラウジングやIn Private ウィンドウなどでテストするのをオススメします。

トラブルシューティング: Google側で 400 エラーが発生する

  1. That’s an error.
    Error parsing the request, No SAML message present in request That’s all we know.

Azure ADから一度Googleにリダイレクト後、上記のようなエラーメッセージが出て進まない場合には Set-MsolDomainAuthentication コマンドレットで設定時に -PreferredAuthenticationProtocol SAMLP が指定されてなく、SAMLではなくWSで認証をかけている可能性があります。

トラブルシューティング: 無限サインインループ

無限サインインループになった場合はAzure AD側に ImmutableId が設定されていない可能性や設定が間違っている可能性があるのでそちらを確認してください。

ユーザー プロビジョニングを設定する

サインインできるようになった後はGoogle側からAzure AD側へユーザー情報を同期するためにユーザープロビジョニングの設定を行います。ユーザープロビジョニングによってGoogle側にユーザーを追加するとAzure ADにユーザーを自動で作成するといったことが可能になります。

ユーザープロビジョニングの設定は アプリSAML アプリ でアプリの一覧から Microsoft Office 365 を選択し、ユーザー プロビジョニング を開きます。

「ユーザー プロビジョニングを設定」をクリックするとダイアログが開くので「承認」をクリックします。

Azure AD側でアクセス許可の確認が表示されるので「組織の代理として同意する」にチェックして「承諾」でGoogleの管理コンソールに戻ります。

最後に属性のマッピング設定画面が表示されるので onPremisesImmutableId基本情報 > ユーザー名 にマッピング設定して「次へ」で完了です。

後はしばらく待つとGoogle側のユーザー情報がAzure AD側へと反映され、ユーザーが作成されたりします。

おわりに

というわけでGoogle (GSuite)をユーザー情報のソースとしてAzure ADを利用できるようになることでOffice 365やAzureに関連したサービス(AzureやAzure DevOps等)などのサインインを一元化できるのでよいのではないでしょうか。

すでにGSuiteを使用している環境ではAzure ADをIdPにするのが怖かったり抵抗がある、めんどくさいということもあるのでこの構成もオススメです。