この記事はRevComm Advent Calendar 2023 1日目の記事です。
RevCommでバックエンド開発をしている小門 照太です。 MiiTelにおける認証基盤を担うマイクロサービス(MiiTel Account)に携わっています。
MiiTelでは外部のIDプロバイダー(IdP)と連携したシングルサインオン(SSO)によるログインに対応しています。 この記事ではMiiTelのお客様がSSOログインを利用する際に必要となる手順とAccountチームの運用について紹介します。
SSO利用までのステップ
現在MiiTelではOpen ID Connect(OIDC)という認証規格によるSSOに対応しています。 システム基盤にはAWSを使っており、認証機能のバックエンドとしてAmazon Cognitoを採用しています。
お客様がSSOを利用開始するまでに以下の手順があります。
- IdP上でOAuthアプリケーションの作成(お客様が実施)
- Cognitoに1. の設定情報を登録
- MiiTelで発行した認可リダイレクトURLをお客様に伝達&IdPに登録
OIDCに対応したIdPとして有名なものにはMicrosoft Entra ID(旧 Azure AD)やGoogle Workspaceがあります。
同じAccountチームの同僚が以前OIDC SSOに関する解説の記事を書いていますので、ぜひご覧ください。
Cognito user pool で OpenID Connect を利用した外部 ID Provider によるサインインを実現する - RevComm Tech Blog
上記の手順においてRevCommとしては2. の作業が必要になります。
サービスの構成管理
MiiTel AccountのWebサービスは社内において独立したマイクロサービスであり、AWS上で構築しています。 上述したCogitoをはじめECS/Fargate、ALBなどのインフラリソース一式は基本的にIaCで構成管理しています。IaCにはTerraformを用いています。
インフラの構成変更、つまりAWSサービスの設定変更やリソース追加/変更/削除などはTerraformコードを変更して適用する運用としています。 Terraformコードを修正するPull Requestを作成し、マージされると設定変更が自動適用されるCI/CDの仕組みを整備しています(詳しくは後述します)。
AccountチームにおけるSSOセットアップ
MiiTelのお客様に対するSSO利用開始のためにはCognitoの構成変更が必要となるため、上述したTerraformを用いた構成変更による運用をしています。
OIDC IdPの追加
お客様のIdP設定情報(前述の手順2.)はCognitoユーザープールにおける「アイデンティティプロバイダー」として登録します。
参考 - ユーザープールへの OIDC ID プロバイダーの追加 - Amazon Cognito
Terraformでは aws_cognito_identity_provider
リソースです。
aws_cognito_identity_provider | Resources | hashicorp/aws | Terraform | Terraform Registry
resource "aws_cognito_identity_provider" "azure_customer_A" { user_pool_id = "ap-northeast-1_XXXX" provider_name = "for-Customer-A" provider_type = "OIDC" ... provider_details = { client_id = "1234aaaa-bbbb-cccc-dddd-eeeeeeeeeeee" client_secret = "dummy" ... } }
上述したステップ1. でお客様が作成したOAuthアプリケーションのパラメーターを provider_details
に設定します。なおclient_secret
は秘匿情報と見なし、Terraformコードではダミーの値を入れるようにしています。
変更の適用
Terraformコードを変更したらPull Requestを作成します。 CI/CDの自動化として、GitHub Actionsを利用して構成変更のレビューおよび適用できる仕組みを整備しています。
参考 - Automate Terraform with GitHub Actions
Pull Requestを作成するとCIのジョブが起動してlint(terraform fmt
)、dry run(terraform plan
)などの実行結果がコメントに追記されます。
Show Plan
でterraform plan
の出力結果を確認できます。
... # module.~~~~~~~~~~~~~~~~~ will be created + resource "aws_cognito_identity_provider" "oidc_google" { + attribute_mapping = { + "email" = "email" + "given_name" = "given_name" + "username" = "sub" } + id = (known after apply) + provider_name = "for-Customer-A" + provider_type = "OIDC" + user_pool_id = "ap-northeast-1_xxxx" ... } ... Plan: 1 to add, 1 to change, 0 to destroy.
変更内容に問題ないことを確認してPull Requestのレビューを受けた後、マージすることでリリース( terraform apply
)も自動実行されます。
リリースの実行確認後、client_secretをマネジメントコンソールから手動修正、そして前述のステップ3.「MiiTelで発行した認可リダイレクトURLをお客様に伝達&IdPに登録」して頂ければSSOを利用開始することができます。
まとめ
MiiTelにおけるSSOをご利用頂くにあたる開発チームとしての運用をご紹介しました。 本記事で紹介した各ステップは、作り込み次第では手順をより少なくできたり完全自動化するような方法もあるかと思います。
しかし本機能の利用シーンは1か月あたり数件程度であり、過度な作り込みはせずまずは属人化を防ぎつつリードタイムの少ない方式を確立することを優先し、現在の運用に至っています。