HikariBlog
Webエンジニア向けブログ
インフラ

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

cognito-saml-azure-ad

今回は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

echoコマンドで確認できます。
例: $ echo urn:amazon:cognito:sp:${USER_POOL_ID}

「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/

https://oji-cloud.net/2021/11/08/post-6634/