概要
こんにちは、RevCommのエンジニア、加藤(涼)です。今回はMiitelでAWS CognitoでSAML/OIDC SSOを汎用化した件についてお話ししようと思います。
背景
MiitelではOIDCの認証プロトコルかつ、GoogleとMicrosoft Azureのプロバイダーを用いたSSOのみにしか対応していませんでした。しかし今回、お客様からのご要望に伴いSAMLプロトコルやその他のプロバイダーに対応することとなりました。まず各用語について確認していきたいと思います。
OIDC とは
OIDC (OpenID Connect)は、OAuth 2.0をベースにした認証プロトコルです。OAuth 2.0はRFC 6749にて規定されています。
OIDCの主な特徴は以下の通りです:
- OAuth 2.0の認可フローに加えて、IDトークン(JWT)を使用したユーザー認証情報のやり取り
- Claim(ユーザー属性情報)の標準化された取得方法を提供
Authorization Code Flow、Implicit Flow、Hybrid Flowなどの認証フローが規定されており、用途に応じて適切なフローを選択します。
SAML とは
SAML(Security Assertion Markup Language)は、XMLベースの標準規格で、組織間でユーザー認証情報を安全に交換するためのプロトコルです。主にエンタープライズ環境での Single Sign-On (SSO) に使用されます。SAMLはRFC 7522で規定されています。
SAMLの主な特徴は以下の通りです:
- XMLベースのメッセージフォーマットを使用し、セキュリティアサーションを交換
- IdP(Identity Provider)とSP(Service Provider)の間で認証情報を安全に伝送
SAMLでは、ユーザーがサービスにアクセスする際、IdPが認証を行い、認証結果をSPに対してXML形式のアサーションとして送信します。これにより、ユーザーは一度の認証で複数のサービスにアクセスすることが可能になります。
AWS Cognito とは
AWS Cognitoは、AWSが提供するユーザー認証・認可サービスです。Webアプリケーションやモバイルアプリケーションにおけるユーザー管理、認証、アクセス制御を実装することができます。
Miitelではユーザー管理にCognitoを利用しています。SAML/OIDCプロバイダーをユーザープールに設定することができるため、今回は自前で実装せず、その機能をメインで使うことにしました。
構成
before
課題を再確認します。
- GoogleとMicrosoft Azure のプロバイダーにしか対応していない。(DBやAPIでEnumでの管理)
- OIDC プロトコルのみ
- ユーザーがMiitel管理者にSSO設定依頼をする必要があった。
これらの問題の影響でSAMLでのご要望に応えられなかったり、SSOの設定に時間がかかり、ヒューマンエラーが発生することもありました。
After
上記の課題から
- ユーザのSSO設定フローを変更
- SAMLの設定を可能に
- GoogleとMicrosoft Azure以外のプロバイダーをサポート
するよう変更しました。
変更後のイメージはこのような感じです。
ユーザーはMiitel Admin上でSSOを自由に設定できるようになりました。
OIDC/SAMLおよびプロバイダーの種類に制限がなくなりました。
開発時の注意点
AWS Cognitoの1ユーザーにリンクされたID数は5つまで
開発時に陥ったエラーです。Cognitoでは1ユーザーに紐づくIDプロバイダーの数が5つまでに設定されています。
これはSSOログインをする度にユーザー属性のidentities
にログインのプロバイダーが登録されていき、6つ目のプロバイダーではログインしようとするとできないようになっています。
実際6以上のプロバイダーを使うユーザーはほぼほぼいないのですが、開発時には何個も登録するためこのクォータに引っかかりました。
上記の解決方法ですがaws cognito-idp admin-disable-provider-for-user
を使うことによりユーザーとSSOの連携を解除できます。
create/update-identity-providerのProviderDetailsオプションが複雑
ユーザープールにidentity providerを設定するにはcreate-identity-provider
/update-identity-provider
で可能です。
ただ、SAML, OIDCでパラメータが大きく異なります。
ProviderDetails
というオプションがあるのですが、この中にSAMLとOIDCの詳細を全て追加します。OIDCはスネークケースのキー名なのに対し、SAMLはパスカルケースになっています。
https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-identity-provider.html
—saml-provider-details
/—oidc-provider-details
に名前を分けてほしいですね。
まとめ
今回はMiitelでOIDC/SAMLプロトコルの両方に対応し、プロバイダーも複数選べるようになった件についてお話ししました。
認証方法については「ログイン・パスワード」・「Google」というのは良くみますが、SAMLプロトコルを用いたSSOにしか対応していないお客様も少なくありません。本記事が参考になれば幸いです。
以上、アカウントチームより、加藤がお話しさせていただきました。
参考
- https://auth0.com/intro-to-iam/saml-vs-openid-connect-oidc
- https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-saml-idp.html
- https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-disable-provider-for-user.html
- https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/quotas.html#resource-quotas