コンテンツまでスキップ

【Okta】OktaとSaaSのログインIDと違ったから変換してシングルサインオンしてみた

 

はじめに


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

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

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

どんなケース?


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

本番環境とセットで提供されるSandbox環境はhogehoge@example.com.fugaのように接尾語(.fuga)をつけるSaaSも存在します

また、admin@ のような特定のメールアドレスに対してシングルサインオンしたいケースもあるかと思います

ユースケース


OktaでID管理しているユーザーのメールアドレスとGoogle Workspaceのメールアドレスが異なるケースでお話します

Google WorkspaceへのシングルサインオンをSAML2.0で実施する場合のGoogle WorkspaceのNameIDフォーマットはメールアドレスとなります

ケース1:違うIDにログイン

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

  • ユーザー:久住(SaaS管理者)
    • Oktaに kusumi@example.com で登録
    • Google Workspaceには admin@example.com でログイン
okta-username-custom-01

Oktaでadminアカウント専用Google Workspaceのアプリを作成し、SAML認証の設定を進めます

今回はSAML認証設定の説明は省略しますが詳しくはOkta社のドキュメントを御覧ください

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

Okta-Custom-004

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

Okta-Custom-005

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

Okta-Custom-006

注意点としてはアサインしたOktaユーザーは変換後のユーザーとしてのログインしかできないことです

今回のケースで説明すると、一般ユーザーと管理者ユーザーそれぞれでログインしたい場合はOktaに管理者ユーザー用のアカウントを別途作成する必要があります

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

次は、Oktaで管理しているユーザーとGoogle Workspaceのユーザーのドメインが異なるケースです

ユーザー名は同一でドメインのみ異なる場合を想定して考えてみます

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

ケース1と同様に Application username format の編集で対応します

先程の画面をもう一度見てみるとExpression Language Referenceという記述があります

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

Okta-Custom-007

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

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

String.substringBeforeを利用すると、2番目に指定した引数の文字列の前までを取ってくるので、その後ろにドメインを追加しています

正しい構文となっているか、プレビュー機能を利用することで確認することが可能ですので、ユーザーを入力して確認してみましょう

Okta-Custom-008

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

ケース3:組織毎にドメインが異なる場合

最後に、組織毎にGoogle Workspaceのドメインが違うケースを考えてみたいと思います

グループ会社全体で利用している場合などではセキュリティポリシー上、Google Workspaceのドメイン分割が必要となることもあるかもしれません

  • ユーザー:John
    • Oktaに @example.com で登録
    • Google Workspaceには @example.net でログイン
  • ユーザー:Steve, Mary
    • Oktaに @example.comで登録
    • Google Workspaceには@sub.example.net でログイン
okta-username-custom-03okta-username-custom-03

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

Okta-Custom-009

次に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.com をつけ、そうでなければ @sub.example.net をつけています

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

Okta-Custom-010

注意事項


Application username formatでCustomを利用するためにはUniversal Directoryというオプションライセンスが必要となります

ユーザーの自動プロビジョニングなど入退社の管理に有用なLifecycle Managementを利用するためにも必須機能となりますので利用しない手は思います

さいごに


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

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