【AWS】Cognito経由でALBにSAML認証を追加してみた!【AzureAD】

今回はCognito経由でALBにSAML認証を追加したいと思います。
IdPはAzureADを利用します。
SAML認証って実装すると結構大変ですが、Cognitoを利用すると結構簡単でした。
前提条件
- ALB作成済みであること
- アプリケーションが動作していること
- AWS CLIが利用できること
ユーザープールの作成
Cognitoにユーザープールを作成します。
$ USER_POOL_NAME=<適当なユーザープール名(例:sample-user-pool)>
$ ALLOW_ADMINC_CREATE_USER_ONLY_FLAG=true
$ REGION=ap-northeast-1
$ aws cognito-idp create-user-pool \
--pool-name ${USER_POOL_NAME} \
--alias-attributes "email" \
--schema \
Name=email,Required=true \
--admin-create-user-config AllowAdminCreateUserOnly=${ALLOW_ADMINC_CREATE_USER_ONLY_FLAG}
ユーザープールドメインの作成
作成したユーザープールにユーザープールドメインを作成します。
$ USER_POOL_ID=<作成したユーザープールのID(USER_POOL_NAMEとは別物です)>
$ COGNITO_DOMAIN_NAME=<適当なドメイン名(例:hikariblog-samplel)>
$ aws cognito-idp create-user-pool-domain \
--user-pool-id ${USER_POOL_ID} \
--domain ${COGNITO_DOMAIN_NAME}
ユーザープールの情報をAzureADに設定
今度はAzureAD側の設定になります。
AzureADのエンタープライズアプリケーションから新しいアプリケーションを追加します。

「独自のアプリケーションの作成」を選択します。

任意の名前を入力し、「ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)」を選択して作成します。

作成したエンタープライズアプリケーションの「シングルサインオン」からSAMLを選択します。

「基本的なSAML構成」の編集から識別子(エンティティID)、応答URL(Assertion Consumer Service URL)にユーザープールの情報を設定します。
- 識別子(エンティティID):urn:amazon:cognito:sp:${USER_POOL_ID}
- 応答URL(Assertion Consumer Service URL):https://${COGNITO_DOMAIN_NAME}.auth.${REGION}.amazoncognito.com/saml2/idpresponse

「SAML署名証明書」の「アプリのフェデレーションメタデータURL」をコピーしておきます。

ユーザープールにAzureADをSAML IdPとして作成
今度はAzureADの情報をユーザープールに登録します。
$ PROVIDER_NAME=AzureAD
$ METADATA_URL=<アプリのフェデレーションメタデータURL>
$ aws cognito-idp create-identity-provider \
--user-pool-id ${USER_POOL_ID} \
--provider-name=${PROVIDER_NAME} \
--provider-type SAML \
--provider-details MetadataURL=${METADATA_URL} \
--attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
アプリクライアントの作成
アプリクライアントを作成します。
$ CLIENT_NAME=<適当なアプリクライアント名(例:hikariblog-app)>
$ CALLBACK_URL=<ALBのエンドポイント>/oauth2/idpresponse
$ aws cognito-idp create-user-pool-client \
--user-pool-id ${USER_POOL_ID} \
--client-name ${CLIENT_NAME} \
--generate-secret \
--callback-urls ${CALLBACK_URL} \
--allowed-o-auth-flows code \
--allowed-o-auth-scopes openid email\
--supported-identity-providers ${PROVIDER_NAME} \
--allowed-o-auth-flows-user-pool-client
エンタープライズアプリケーションにユーザーを登録する
作成したエンタープライズアプリケーションの「ユーザーとグループ」から、認証を許可するユーザー、またはグループを追加します。
ロールは任意のものを割り当ててください。

ALBにユーザープールとアプリクライアントを紐付ける
ALBのリスナールールから作成したユーザープールとアプリクライアントを紐付けます。

動作確認
ALBのエンドポイントにアクセスしてみます。
認証後にサイトが表示できれば完了です。
参考
https://dev.classmethod.jp/articles/using-azure-ad-as-an-external-idp-for-amazon-cognito/