Skip to main content

CloudFront+S3 による静的サイトを Cognito + IAM Identity Center で認証する

概要

CloudFront+S3 による静的サイトを、社内のエンジニアのみがアクセスできるよう、Amazon Cognito + IAM Identity Center で認証をおこなうよう設定する方法です。

構成

参考

以下のサイトを参考にさせていただきました。

構築手順

CloudFront+S3 による静的サイトは構築済みとします。

IAM Identity Center

Cognito から IAM Identity Center を IdP として使用するために、IAM Identity Center にアプリケーションを追加します。

  1. AWS 管理コンソール > IAM Identity Center
  2. アプリケーションの割り当て > アプリケーション
  3. 「アプリケーションを追加」
  4. 以下の設定を追加
    • アプリケーションタイプ
      • 「設定するアプリケーションがある」を選択
      • アプリケーションタイプ: 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 の設定で必要になるため、控えておきます。

アプリケーションを追加後、属性マッピングを以下のとおり設定します。

  1. AWS 管理コンソール > IAM Identity Center

  2. アプリケーションの割り当て > アプリケーション > 「カスタマー管理」タブ > 作成したアプリケーションをクリック

  3. 「アクション」 > 「属性マッピングを編集」で以下の属性を追加します。

    アプリケーションのユーザー属性マッピング形式
    Subject${user:subject}persistent
    email${user:email}basic

最後に、アクセスを許可するユーザーまたはグループを設定します。

  1. AWS 管理コンソール > IAM Identity Center
  2. アプリケーションの割り当て > アプリケーション > 「カスタマー管理」タブ > 作成したアプリケーションをクリック
  3. 「ユーザーとグループを割り当てる」
  4. アクセスを許可するユーザーまたはグループを選択して「ユーザーを割り当て」

Amazon Cognito

以下の手順で Cognito ユーザープールを作成します。

ユーザー自体は IAM Identity Center で管理するため、Cognito ユーザープールは認証処理のために使用します。以下は最小限の設定例ですので、必要に応じて設定をおこなってください。

  1. AWS 管理コンソール > Amazon Cognito
  2. 「ユーザープールを作成」
  3. 以下の設定で作成
    • 認証プロバイダー
      • プロバイダーのタイプ: 「フェデレーテッドアイデンティティプロバイダー」をチェック
      • 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) に設定します。

  1. AWS 管理コンソール > Amazon CloudFront
  2. ディストリビューションを選択 >「ビヘイビア」タブ > ビヘイビアを選択して「編集」
  3. 関数の関連付けの「ビューアーリクエスト」に以下を設定します。
    • ビューワーリクエスト
      • 関数タイプ: Lambda@Edge
      • 関数 ARN/名前: ARN (例: arn:aws:lambda:(リージョン):(アカウントID):function:(関数名):(バージョン))