Amazon Cognito×ALBでユーザーアクセスを制御する
製品のリリース日が迫る中、ステージング環境や管理画面へのユーザーアクセスをコントロールしたいがプログラム側で実装するのは大変、、、そんなときはAWSのAmazon Cognitoというサービスを使って、コンソール画面の設定だけで簡単に認証機能を導入することができます。
⚠2023年3月以降Amazon Cognitoのコンソール画面が新しくなります。
なお、こちらの記事では新コンソールで設定をおこなっています。
前提
現状、EC2でアプリケーションを提供しており、ALB(Application Load Balancer)×Route53×ACMのサーバー証明書でHTTPS化ができている。
今回は管理者がユーザープールにユーザーを追加⇒各ユーザーに招待メールを送信⇒ユーザーがEメールアドレスとパスワードで認証を行います。
今回の設定内容はチュートリアル向けです。導入にあたっては目的や必要に応じてセキュリティの強度を検討してください。
ユーザープールを作成する
まずはAWSのサービスからAmazon Cognito のコンソール画面へ移動
「ユーザープールを作成」をクリックします。
ステップ1 サインインエクスペリエンスを設定
プロバイダーのタイプはCognito ユーザープール(デフォルト)
サインインオプションは「Eメール」のみチェック
「次へ」
ステップ2 セキュリティ要件を設定
パスワードポリシー:Cognitoのデフォルト
多要素認証:MFAなし
ユーザーアカウントの復旧:無効
「次へ」
ステップ3 サインアップエクスペリエンスを設定
セルフサービスのサインアップ:事項登録は無効
属性検証とユーザーアカウントの確認:画像を参照
必須の属性:追加の必須属性はなし
「次へ」
ステップ4 メッセージ配信を設定
Eメールプロバイダー:Cognito でEメールを送信
送信元Eメールアドレス:no-reply@verificationemail.com(デフォルト)
「次へ」
ステップ5 アプリケーションを統合
ユーザープール名:任意の名称
CognitoのホストされたUIを使用:有効
ドメインタイプ:Cognitoドメインを使用する
Cognitoドメイン:https://任意のドメイン名.auth.ap-northeast-1.amazoncognito.com
⚠Route53に登録済みの独自ドメインも選択できるが、ACMのサーバー証明書が「us-east-1」で発行されている必要があるので注意
アプリケーションタイプ:パブリッククライアント
アプリケーションクライアント名:アプリケーションサーバーと接続するALBの名称(わかりやすいように)
クライアントのシークレット:生成する
許可されているコールバックURL= https://アプリケーションのドメイン名/oauth2/idpresponse
⚠ /oauth2/idpresponseはALBの認証用で、アプリケーション側で対応するフォルダを作る必要はありません。
高度なアプリケーションクライアントの設定:デフォルト
属性の読み取りおよび書き込み許可:デフォルト
ステップ6 確認および作成
「ユーザープールを作成」をクリック
Amazon Cognito>作成したユーザープールを選択>「ユーザーを作成」
ユーザープールにユーザーを追加する
さきほど作成したユーザープールを選択>「ユーザーを作成」
ユーザー情報の設定
今回は初回認証時にユーザーにパスワードの再発行を求めるので以下の内容にして「ユーザーを作成」⇒ユーザーに招待メールが送信されます
ユーザープールにユーザーが追加されています
ALBのリスナールールを編集する
ロードバランサーから、さきほどアプリケーションクライアントとして登録したALBを選択して、リスナールールを編集します
今回ルールを編集するのはHTTPS:443のルール
黄色くマークした数字(=登録しているルール数)をクリックする
「Manage rules」をクリック
デフォルトアクションの編集✍をクリック
ルールの編集画面からTHENの内容を以下のように編集
1.認証:Amazon Cognito
Cognito ユーザープールをプルダウンから選択
アプリケーションクライアントをプルダウンから選択
✓をクリックして更新
2.転送先:アプリケーション用インスタンスを登録したターゲットグループ
画面右上の「更新」をクリック
ALBのセキュリティグループを確認する
通常ALBとEC2インスタンス間はHTTP:80で通信を行うため、ALBのセキュリティグループのアウトバウンドでHTTP:80は許可されていると思います。
今回、 Amazon Cognitoの認証機能を利用するにあたってALBとCognito間でHTTPS通信が発生します。そのため、アプリケーションALBのセキュリティグループでHTTPS:443のポートを解放する必要があります。
以下のように、HTTPSをIPv4 IPv6のスタックで追加してポートを解放します
アプリケーションクライアント>認証フローの設定
今回のチュートリアルではEメールアドレスとパスワードによる認証でアクセスを許可しています。ただし、デフォルトの設定では上記の認証フローが有効になっていないため設定を変更する必要があります。
ユーザープールを選択>アプリケーションの統合タブに切り替え
>アプリケーションクライアント名をクリック
アプリケーションクライアントに関する情報>「編集」をクリック
>認証フローのプルダウンから「ALLOW_USER_PASSWORD_AUTH」に✓して「変更を保存」
これでAmazon Cognito側の設定ができました。
それではブラウザからアプリケーションにアクセスしてみましょう。
ブラウザでアプリケーションにアクセス⇒ユーザー認証
ブラウザでアプリケーションにアクセス⇒招待メールに記載されたパスワードでサインインします。
⚠アプリケーションの統合タブ>ホストされた UI のカスタマイズを編集でロゴだけ変えてあります。
パスワードの変更画面に遷移するので、求められるパスワード要件を満たしたパスワードを入力して「Send」します。
無事にアプリケーションにアクセスできました!
ポイント
最後にAmazon Cognito 導入でつまづいた部分をおさらいします。
1.許可されているコールバックURL
https://アプリケーションのドメイン名/oauth2/idpresponse
かならずアプリケーションのドメイン名のあとに/oauth2/idpresponseをつけてください。
2.ALBのセキュリティグループ
アウトバウンドでHTTPS:443のポートを解放してください。
3.アプリケーションクライアントの認証フロー
「ALLOW_USER_PASSWORD_AUTH」を有効にしてください。
もしも同じような環境構築をしたい人がいたとき、その方のお役に立てたなら幸いです。