今回は Microsoft Entra ID(旧Azure AD) と Amazon Cognito を連携し、
AWS上のWebアプリケーションに認証機能を追加する手順を解説します。
Cognito と ALB を組み合わせることで、アプリ側のコードを変更せずに
Entra ID のユーザーを使った SSO を実現できます。
前提条件
本ハンズオンを進める上での前提としては以下になります。
・AWSとEntraIDが使える環境
・MFA用アプリを端末にインストール済(MFAによる多要素認証を検証する場合)
・ALBの設定及びWebサーバ機能をもったEC2を作成済(ALBターゲットとしてEC2指定も含む)
Amazon CognitoとALB(アプリケーションロードバランサー)の連携については以下で解説していますので、そちらをご参照ください。
Amazon Cognitoによる認証をALBに連携
1.EntraIDでのアプリ作成
Azureポータルの「エンタープライズアプリケーション」⇒「新しいアプリケーション」を選択

「独自のアプリケーションの作成」を選択し、任意のアプリケーション名を入力後、作成を選択

画面が遷移したら、「2.シングルサインオンの設定」の「作業の開始」を選択

SAMLを選択

「③SAML証明書」⇒「アプリのフェデレーションメタデータURL」をメモする

2.作成したアプリにユーザーを割り当て
実際に認証させたいユーザーを作成したアプリに割り当てる
左メニューから「ユーザーとグループ」⇒「ユーザーまたはグループの追加」を選択

追加したいユーザーを選択し「割り当て」を選択

ユーザーが追加されていることを確認

3.Amazon Cognitoの設定
1.ユーザープールの作成
Amazon Cognitoの設定画面を開き、「ユーザープールの作成」を選択

アプリケーション名には任意の名前をつけ、オプション設定は下記の通り選択
※EntraID側に登録されているユーザを使う前提なので、自己登録は無効でOK

2.アイデンティティプロバイダーの追加
「アイデンティティプロバイダーを追加」を選択

以下の通り入力し、作成する
プロバイダー名:任意の名前
メタデータドキュメントのエンドポイントURL:先ほどメモしておいたURLを入力
SAML属性:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
※SAML属性の部分はAWSにて取り決めされているものを使用(参考URL)

3.アプリケーションクライアント編集
「アプリケーションクライアント」⇒「ログインページ」⇒「編集」を選択

以下の通り入力し、保存する
許可されているコールバックURL:https://(ALBのDNS名)/oauth2/idpresponse
注意 ALBの仕様によりCognitoの認証結果を「/oauth2/idpresponse」に返すため、記載が必須
IDプロバイダー:先ほど作成したアイデンティティプロバイダーを選択

最後に、作成したユーザープールのIDとCognitoドメインをメモしておく


4.EntraIDにてSAML情報入力
先ほど作成したEntraIDでのアプリ画面にて「基本的なSAML構成」の「編集」を選択

先ほどメモした情報をもとに以下の通り入力し、保存する
識別子(エンティティID):urn:amazon:cognito:sp:ユーザープールID
応答URL:Cognitoドメイン/saml2/idpresponse

5.AWS ALBでのリスナールールにCognitoを追加
ALBを選択し、「リスナーとルール」⇒「リスナーの編集」を選択

デフォルトアクション
事前ルーティングアクション:ユーザーを認証
アイデンティティプロバイダー:Amazon Cognito
ユーザープールID、ユーザープールドメイン、ユーザープールクライアントID:作成済のもの

6.ブラウザからALBのDNSにアクセス
ブラウザにてALBのURLにアクセスすると、MSの認証画面が出るため、事前に作成しておいたユーザー情報にて認証する

認証完了後、ALBのターゲットであるEC2等にアクセス
テストサイトが表示されたため、設定としては問題ないことを確認
(参考)ハマったポイント
一通りの設定完了後、ブラウザからALBのURLアクセスし、MS認証を実施すると、以下エラー表示

切り分けた結果、
EntraID側で作成したユーザー情報にメールアドレスが入っていないことが原因と判明
注意 Cognito側でemailを必須属性にしている限り、値がないと認証後にエラーとなる
今回は、Cognitoでのユーザープール作成時にemailを必須属性としていたため、上記事象が発生
EntraID側で作成したユーザーにメールアドレスを設定することで解消した
まとめ
今回はEntra IDとAmazon Cognitoを組み合わせて、SAML 認証を実装する手順を解説しました。外部IdP連携では、Cognitoユーザープールの必須属性とIdPが返す属性の整合性がとても重要で、今回のように、email属性の不足は認証後の401エラーとして現れる代表的な落とし穴です。
設定ポイントさえ押さえれば、CognitoとEntra IDの SAML 連携はスムーズに構築でき、
既存の社内アカウントを使ったシングルサインオンを実現できます。
AWS 上の Web アプリにセキュアな認証基盤を追加する際の一助となれば幸いです!

コメント