CloudFront+S3 による静的サイトを Cognito + IAM Identity Center で認証する
概要
CloudFront+S3 による静的サイトを、社内のエンジニアのみがアクセスできるよう、Amazon Cognito + IAM Identity Center で認証をおこなうよう設定する方法です。
参考
以下のサイトを参考にさせていただきました。
- CloudFront+S3による静的サイトにCognito認証を追加してみた - DevelopersIO
- Cognito に IAM Identity Centerを統合する - Qiita
- How do I integrate IAM Identity Center with an Amazon Cognito user pool? - AWS re:Post
構築手順
CloudFront+S3 による静的サイトは構築済みとします。
IAM Identity Center
Cognito から IAM Identity Center を IdP として使用するために、IAM Identity Center にアプリケーションを追加します。
- AWS 管理コンソール > IAM Identity Center
- アプリケーションの割り当て > アプリケーション
- 「アプリケーションを追加」
- 以下の設定を追加
- アプリケーションタイプ
- 「設定するアプリケーションがある」を選択
- アプリケーションタイプ: SAML 2.0
- アプリケーションの設定
- アプリケーションを設定
- 表示名: (任意の名前)
- 説明: (任意の説明)
- アプリケーションメタデータ
- 「メタデータ値をマニュアルで入力する」を選択
- アプリケーション ACS URL:
https://{Cognito ドメイン}.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
- アプリケーション SAML 対象者:
urn:amazon:cognito:sp:{ユーザープール ID}
- アプリケーションを設定
- アプリケーションタイプ
アプリケーション ACS URL、アプリケーション SAML 対象者は Cognito の設定で確認する内容を設定します。Cognito は未設定のためいったん仮の値を設定し、のちほど Cognito の設定で取得した値に変更します。
IAM Identity Center メタデータの「IAM Identity Center SAML メタデータファイル」の URL は Cognito の設定で必要になるため、控えておきます。
アプリケーションを追加後、属性マッピングを以下のとおり設定します。
-
アプリケーションの割り当て > アプリケーション > 「カスタマー管理」タブ > 作成したアプリケーションをクリック
-
「アクション」 > 「属性マッピングを編集」で以下の属性を追加します。
アプリケーションのユーザー属性 マッピング 形式 Subject ${user:subject}
persistent email
${user:email}
basic
最後に、アクセスを許可するユーザーまたはグループを設定します。
- AWS 管理コンソール > IAM Identity Center
- アプリケーションの割り当て > アプリケーション > 「カスタマー管理」タブ > 作成したアプリケーションをクリック
- 「ユーザーとグループを割り当てる」
- アクセスを許可するユーザーまたはグループを選択して「ユーザーを割り当て」
Amazon Cognito
以下の手順で Cognito ユーザープールを作成します。
ユーザー自体は IAM Identity Center で管理するため、Cognito ユーザープールは認証処理のために使用します。以下は最小限の設定例ですので、必要に応じて設定をおこなってください。
- AWS 管理コンソール > Amazon Cognito
- 「ユーザープールを作成」
- 以下の設定で作成
- 認証プロバイダー
- プロバイダーのタイプ: 「フェデレーテッドアイデンティティプロバイダー」をチェック
- Cognito ユーザープールのサインインオプション: 「E メール」をチェック
- フェデレーティッドサインインのオプション: 「SAML」をチェック
- セキュリティ要件
- 多対要素認証: 「MFA なし」を選択
- ユーザーアカウントの復旧: 「セルフサービスのアカウントの復旧を有効化」のチェックを外す
- セキュリティ要件
- セルフサービスのサインアップ: 「自己登録を有効化」のチェックを外す
- 属性検証とユーザーアカウントの確認: 「メッセージを自動的に送信しない」を選択
- メール配信を設定
- E メールプロバイダー: 「Cognito で E メールを送信」を選択
- SAML
- プロバイダー名: (任意の名前) (例:
IAMIdentityCenter
) - メタデータドキュメントのソース
- 「メタデータドキュメントのエンドポイント URL を入力」を選択
- メタデータドキュメントのエンドポイント URL を入力: (IAM Identity Center で取得したメタデータの URL) (例:
https://portal.sso.ap-northeast-1.amazonaws.com/saml/metadata/XXXXXXXX
)
- SAML プロバイダーとユーザープールの間で属性をマッピング
- 以下の属性を追加
- ユーザープール属性: email
- SAML 属性:
email
- 以下の属性を追加
- プロバイダー名: (任意の名前) (例:
- アプリケーションを統合
- ユーザープール名: (任意の名前)
- ホストされた認証ページ: 「Cognito のホストされた UI を使用」をチェック
- ドメイン
- ドメインタイプ: 「Cognito ドメインを使用する」を選択
- Cognito ドメイン: (グローバルユニークな任意の名前)
- 最初のアプリケーションクライアント
- アプリケーションクライアント名: (任意の名前)
- 許可されているコールバック URL: (CloudFront+S3 でホストしている URL) (例:
https://xxxxxxxx.yh1224.com
)
- 認証プロバイダー
CloudFront: Cognito で認証する Lambda@Edge を追加
Lambda@Edge で Cognito による認証ライブラリ cognito-at-edge を使用し、CloudFront へのアクセスを認証します。
以下のコードで Lambda 関数を作成しておきます。
const {Authenticator} = require("cognito-at-edge");
const authenticator = new Authenticator({
region: "ap-northeast-1",
userPoolId: "(ユーザープール ID)",
userPoolAppId: "(アプリケーションクライアントのクライアント ID)",
userPoolDomain: "(ユーザープールの Cognito ドメイン)",
});
exports.handler = async (request) => authenticator.handle(request);
これを CloudFront の Lambda@Edge (Viewer Request) に設定します。
- AWS 管理コンソール > Amazon CloudFront
- ディストリビューションを選択 >「ビヘイビア」タブ > ビヘイビアを選択して「編集」
- 関数の関連付けの「ビューアーリクエスト」に以下を設定します。
- ビューワーリクエスト
- 関数タイプ: Lambda@Edge
- 関数 ARN/名前: ARN (例:
arn:aws:lambda:(リージョン):(アカウントID):function:(関数名):(バージョン)
)
- ビューワーリクエスト