OktaのメールアドレスがSaaS側と違ったから変換してシングルサインオンしてみた

Oktaを経由して別メールアドレス(NameID)で運用しているGoogle WorkspaceにSAML認証でシングル・サインオンする設定をご紹介します。
2021.09.13

こんにちは、 ネクストモード株式会社 のSaaSおじさん久住です。

はじめに

ネクストモードではID統合管理(IDaaS)のOktaを利用して各SaaSへのシングル・サインオンやプロビジョニングの一元管理をしています。

今回は少し特殊な使い方として、Okta側のメールアドレスとSaaS側のメールアドレスが異なる場合のOktaの設定についてご紹介します。

どんなケース?

企業で新システムへの移行タイミングやトライアル中は、メインで利用しているグループウェアなどの基幹システムへは既にID統制がなされていて手を加えられないことが多く、既存システムと切り離して別ドメインで検証することがあります。

また、admin@のような特定のメールアドレスを準備することもあるかと思います。

構成

OktaでID管理しているユーザーのメールアドレスとGoogle Workspaceのメールアドレスが異なるケースでお話します。OktaとGoogle Workspaceの認証認可はSAML2.0で実施します。 Google WorkspaceのNameIDフォーマットはメールアドレスです。

ケース1:adminアカウントにログイン

Google Workspaceでadmin@example.comのようなadminアカウントを持っていたとして、Oktaからadminアカウントにシングル・サインオンしたいというケースです。

  • 久住(SaaS管理者)
    • Oktaにkusumi@example.comで登録
    • Google Workspaceにはadmin@example.comでログイン

Oktaでadminアカウント専用Google Workspaceのアプリを作成し、SAML認証の設定を進めます。今回はこちらの説明は省略しますが詳しくはOkta社のドキュメントを御覧ください。

SAML認証の設定が完了したら、Application username formatを編集します。

下記の通り、Customを選択して固定値で"admin@example.com"を入力してSaveをクリックします。

最後に適切なメンバーにアサインして完了です。

ケース2:ドメインが異なる場合

次は、Oktaで管理しているユーザーとGoogle Workspaceのドメインが異なるケースです。ユーザー名は同一でドメインのみ異なる場合を想定して考えてみます。

  • John, Steve
    • Oktaに@example.comで登録
    • Google Workspaceには@example.netでログイン

ケース1と同様にApplication username formatの編集で対応します。先程の画面をもう一度見てみるとExpression Language Referenceという文言があります。

SpEL式言語に基づいて関数を記述でき、SAML認証に必要なNameID属性の値(Application username formatの値)を変更することが出来ます。

今回はGoogle WorkspaceにアサインされたユーザーのNameIDをexample.comからexample.netに変更するので下記の式となります。

String.substringBefore(user.login, "@") + "@example.net"

String.substringBeforeを利用すると、2番目に指定した引数の文字列の前までを取ってくるので、その後ろにドメインを追加しています。正しい構文となっているか、ユーザーを入力して確認することが可能ですので、試しましょう。

最後に適切なメンバーにアサインして完了です。

ケース3:Oktaグループ毎にドメインが異なる場合

最後に、組織毎にGoogle Workspaceのドメインが違うケースを考えてみたいと思います。グループ会社全体で利用している場合などではセキュリティポリシー上、Google Workspaceのドメイン分割が必要となることもあるかもしれません。

  • John, Steve
    • Oktaに@example.comで登録
    • Google Workspaceには@example.netでログイン
  • Mary
    • Oktaに@example.comで登録
    • Google Workspaceには@sub.example.netでログイン

まず、Johnを特定のOktaグループに所属させます(実際に設定する際は部署毎やRole毎にグループを作成しているかと思いますのでそちらを利用すると良いでしょう)。

次にJohnが所属しているOktaグループのGroupIDを取得するのですが、先程作成したグループの管理画面上のURLの最後の文字列がGroupIDとなります。

https://hogehoge-admin.okta.com/admin/group/1234567891234

Johnの所属するGroupIDが確認できたら、Johnが所属するOktaグループは@example.net, それ以外は@sub.example.netという設定をします。

isMemberOfGroup("1234567891234") ? String.substringBefore(user.login, "@") + "@example.net" : String.substringBefore(user.login, "@") + "@sub.example.net"

こちらでは特定のOktaグループに所属しているかによってTrue/Falseを返すisMemberOfGroupと条件式を利用して、特定のOktaグループに所属していたら@example.netをつけ、そうでなければ@sub.example.netをつけています。

最後にメンバーのアサインですが、Expression LanguageでGroupIDを利用しているのでGroupでアサインをします。

注意事項

Application username formatでCustomを利用するためにはUniversal Directoryというオプションライセンスが必要となります。ユーザーの自動プロビジョニングなど入退社の管理に有用なLifecycle Managementを利用するためにも必須機能となりますので利用しない手は思います。

さいごに

最初にこのような要件が必要な場面に遭遇したときは「あ、終わったかも・・・」と思ったのですが、Expression LanguageとOktaの柔軟な機能に助けられました。

今回ご紹介した内容はUniversal Directoryに含まれる機能が多いですが、Universal Directoryはまだまだ奥が深いので引き続きごご紹介したいと思います。