はじめに こんにちは、 ネクストモード株式会社 のSaaSおじさん久住です...
【Okta】OktaとSaaSのログインIDと違ったから変換してシングルサインオンしてみた
ネクストモードでは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に
Oktaでadminアカウント専用Google Workspaceのアプリを作成し、SAML認証の設定を進めます
今回はSAML認証設定の説明は省略しますが詳しくはOkta社のドキュメントを御覧ください
SAML認証の設定が完了したら、 Application username format
を編集します
下記の通り、 Custom
を選択して固定値で"
admin@example.com"
を入力して Save
をクリックします
最後に適切なメンバーにアサインして完了です
注意点としてはアサインしたOktaユーザーは変換後のユーザーとしてのログインしかできないことです
今回のケースで説明すると、一般ユーザーと管理者ユーザーそれぞれでログインしたい場合はOktaに管理者ユーザー用のアカウントを別途作成する必要があります
ケース2:ドメインが異なる場合
次は、Oktaで管理しているユーザーとGoogle Workspaceのユーザーのドメインが異なるケースです
ユーザー名は同一でドメインのみ異なる場合を想定して考えてみます
- John, Steve
- Oktaに
@example.com
で登録
- Oktaに
-
- Google Workspaceには
@example.net
でログイン
- Google Workspaceには
ケース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:組織毎にドメインが異なる場合
最後に、組織毎にGoogle Workspaceのドメインが違うケースを考えてみたいと思います
グループ会社全体で利用している場合などではセキュリティポリシー上、Google Workspaceのドメイン分割が必要となることもあるかもしれません
- ユーザー:John
- Oktaに
@example.com
で登録 - Google Workspaceには
@example.net
でログイン
- Oktaに
- ユーザー:Steve, Mary
- Oktaに
@example.com
で登録 - Google Workspaceには
@sub.example.net
でログイン
- Oktaに
まず、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.com
をつけ、そうでなければ @sub.example.net
をつけています
最後にメンバーのアサインですが、Expression LanguageでGroupIDを利用しているのでGroupでアサインをします
注意事項
Application username formatでCustomを利用するためにはUniversal Directoryというオプションライセンスが必要となります
ユーザーの自動プロビジョニングなど入退社の管理に有用なLifecycle Managementを利用するためにも必須機能となりますので利用しない手は思います
さいごに
最初にこのような要件が必要な場面に遭遇したときは「あ、終わったかも・・・」と思ったのですが、Expression LanguageとOktaの柔軟な機能に助けられました
今回ご紹介した内容はUniversal Directoryに含まれる機能が多いですが、Universal Directoryはまだまだ奥が深いので引き続きご紹介したいと思います