3.3K Views
March 02, 25
スライド概要
JAWS Days 2025にて登壇
Work at JapanDigitalDesign
三度の飯よりCognito Japan Digital Design, Inc. 髙橋 祐平 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
自己紹介 # 髙橋 祐平 (@yuh3i) # Japan Digital Design株式会社 InfraTeam # クラウドインフラの設計・構築・運用が中心 # 社内のIT基盤やOA環境整備といった情シスの役割も一部担当 # 3歳と0歳の娘に翻弄されつつ、日々を生きています # Amazon Cognito はそこそこ好きだった...はず (Workspacesが一番好きかも) CIAMの章を書いています (Cognito vs Identity Platform) ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
一応会社紹介を... ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
弊社Slackに存在する嘆きの絵文字 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
なぜ、人は辛くてもCognitoを使うのか 1 . AWSエコシステムとの ネイティブな統合 2 . サーバーレスで 自動スケール &運用負荷軽減 3 . コスト最適化 された認証基盤 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
主に話すこと 「Cognito愛ゆえに語る、使って感じたツラみ」 Amazon Cognitoは、高い利便性やフルマネージドなど大きな恩恵がある一方、 実際に使ってみると独特なクセがあり、後から「こうしておけば…」と後悔することも。 今回は、Cognitoを愛しているからこそ言いたい、 「ここがツラみだったぜ!」 をざっくばらんに語ります。 ※ 少々記憶が古いのはご容赦くださいmm ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
運命の属性設計!後戻りはもう.... 属性... ユーザーの識別や情報管理のために使用されるデータフィールド ○ 標準属性 (email, nameなど), ○ カスタム属性 (custom:hogehoge) ■ ひとつのユーザプールにつき50個まで追加可能 ■ 最長2048 Byte なにも考えずにカスタム属性をつくると ....😱 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
運命の属性設計!後戻りはもう.... ⚠Cognitoのカスタム属性は、作成後の修正・削除は不可 ● よくあるケース ○ case1. 組織改編で custom:division → custom:division_level1 に変更したい ○ case2. 外部システム連携のため custom:external_id を作成したが、不要になったため削除したい ● やり直すには、ユーザープールを作り直すしかない ● ユーザープールIDは変更、サインアップ済みユーザー情報は消失 ○ 別部署が管理しているIdPと連携…とかだと阿鼻叫喚 (諸々再調整) ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
😱 IdPとの連携!待ち受ける必須属性の選択 必須属性 ... ユーザー登録時に必ず値が必要な属性 (email, phone_numberなど) ● 標準属性から選択可能 ● ユーザ登録時(サインアップ)で値の入力が強制される これもあまり考えずに必須属性を選択すると ....😱 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
IdPとの連携!待ち受ける必須属性の選択 ⚠必須属性はユーザプール作成時のみ設定可能で、修正不可 ● IdPから送られてくる属性をCognitoの必須属性に正確にマッピングする必要あり ○ 必須属性の値がIdPから送られてこないと、ユーザ作成に失敗する ● よくあるケース ○ case1. 社外IdPが電話番号を送ってこないのに必須属性に設定してしまった ○ case2. 後からIdPを追加連携することになったが、新しいIdPには必須設定した属性が 存在しない ● こちらも先程同様、やり直すには、ユーザープールを作り直すしかない ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
救世主? Pre Token Generation トリガー 対応策がないわけではないが ......(この方法だと魔改造になりがち ) ● Lambdaトリガーの[Pre Token Generation(トークン生成前トリガー)]を使用 ● トークン発行時に属性をカスタマイズして、属性やマッピングの問題を一部回避可 ● ただし、ユーザープール内のデータ自体は変更されないため、管理方法の考慮は必須 Client Cognito User Pool 外部IdP Lambda Trigger 1.認証 2.認証トークン 3.Cognitoトークン要求 4.Pre Token Generation 6. ID/アクセストークン 5. 修正されたクレーム トークン内容 カスタマイズ SPが開始するSAMLフローの例 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
Mutable Falseの悲劇 ~更新できないパラメータ~ 各属性に用意されているMutableというパラメータ ● True : 変更可能(後から値の更新が可能) ● False : 変更不可(初回登録時のみ値の設定が可能) ○ 変更されると困る情報や一意に保ちたい情報(IDなど)をFalseにすることが多い これもあまり考えずに Mutableのパラメータ設計をすると ....😱 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
Mutable Falseの悲劇 ~更新できないパラメータ~ True にして起こり得る問題 セキュリティリスクやデータ整合性、監査の複雑化など False にして起こり得る問題 ● データ修正作業の煩雑化 ● ⚠フェデレーションサインインの失敗 ○ 外部IdPからマッピングされた属性のMutableがFalseの場合、2回目以降のログインで401エラーが発生 ○ 現在は一部の古いユーザープールのみ発生する可能性がある(ただし、仕様確定ではなさそう?) ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
Mutable Falseの悲劇 ~更新できないパラメータ~ ⚠ 標準属性におけるMutableの値はGUI上から参照不可 ここは既に修正されているかも ...? ※AWS CLI やAPI から参照可能(以下はCLI例) aws cognito-idp describe-user-pool --user-pool-id <USER_POOL_ID> ⚠ CloudFormationで明示的に標準属性(Schema)を指定すると、デフォルト値はfalseになる ※1 ● マネジメントコンソールから作成したときのデフォルト値は大体がTrue(SubなどはFalse) ⚠ True/Falseの修正は不可能なので、変更の際はユーザプール再作成が必要 ⚠ Mutable:Falseに関する挙動は、ユーザプールの作成時期や環境によって異なることがあるた め、運用前に動作検証が必要 ※1. 同様のIssue https://github.com/aws/aws-cdk/issues/8624 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
CognitoとALBの癒着 〜迷い込んだ認証迷宮〜 Cognito + ALB のメリット ● 認証のオフロード (ALBは標準認証フローに対応) ● シンプルで簡単な統合 ● セッション管理の簡素化 ● アクセス制御の柔軟性 シンプルで便利な統合だが、いくつかハマりがちなポイントも ...😱 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
CognitoとALBの癒着 〜迷い込んだ認証迷宮〜 WAFとの三つ巴 ALB+Cognito構成の上、CognitoにアタッチしたWAFでIPホワイトリスト制限をする ⚠ ALBからの認証リクエストが失敗する 原因 1. ALBとCognito間で認証フローの通信が発生 2. WAFはALBのIPアドレスをチェック 3. ALBのIPは固定ではなく、AWS内部IPレンジから動的に割り当て 4. ユーザーIPのみ許可するWAF設定だとALBからの通信がブロックされる ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
CognitoとALBの癒着 〜迷い込んだ認証迷宮〜 WAFとの三つ巴 考えられる対策 ● ● ● AWS IP範囲許可 ○ Cognito の WAF ホワイトリストに、 AMAZONサービスのパブリックIP アドレス範囲を追 加 NAT Gateway構成 ○ 内部 ALB をプライベートサブネットに置き、固定 IP を持つ NAT Gateway 経由でCognito と通信する。 WAF で許可する IP を NAT Gateway のものに絞る。 ALB側制限 ○ Cognito 側の WAF ではなく ALB のセキュリティグループや WAF で IP 制限を実施 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
CognitoとALBの癒着 〜迷い込んだ認証迷宮〜 SameSite=Noneの落とし穴 ALB+Cognito構成では、ALBから発行されるCookieのSameSite属性はNone固定 ⚠ この設定により、CSRF(クロスサイトリクエストフォージェリ)攻撃のリスクが発生 (悪意のある第三者がユーザーになりすまして、ユーザーが意図しない操作をさせる攻撃) ①サインインリクエスト ②Cookie発行(SameSite=None) Client ALB+Cognito ④偽造リクエスト(Cookie自動添付) ③悪意のあるサイトにアクセス 攻撃サイト -> 正規ユーザのリクエストとして処理 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
CognitoとALBの癒着 〜迷い込んだ認証迷宮〜 SameSite=Noneの落とし穴 対策 Cognito + ALB の場合、アプリケーション側でCSRFトークンを個別実装する必要がある もし Cognito + CloudFront だったら場合は... レスポンスヘッダーポリシーでSameSite属性設定可能 ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
見えない認証の記録 ~Cognitoのログを追え!~ ⚠Cognitoを使った認証のログは、デフォルトのままだと解析が難しい ● デフォルトだと認証成功/失敗はCloudTrailにユーザIDをベースに出力(ユーザ名は記載なし) ● プラスプランに切り替えると... ○ ユーザ認証アクティビティからログやリスク評価を可能 ○ もちろんユーザ名ベースでのログ記録も可能 ⚠ただし、外部IdPを使った認証成功/失敗はCognitoのみで記録はできない ● 外部IdP側のログを参照する必要がある ● もしくはLambdaトリガーを使い、S3やCW Logsに出力するのもあり ○ サインアップ時: PreSignUp_SignUp ○ サインイン時(2度目以降のアクセス) : PostAuthentication_Authentication ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
ちょっと分かりづらいCognito API ~ ログアウトだと思ったのに... ~ ⚠ フロントエンドから単にログアウトエンドポイント※1を呼ぶだけでは不十分 ● ● Cognitoのログアウトエンドポイント(/logout)では、セッションクッキーは削除するがJWTトークンは 無効化しない トークンの有効期限内ならAPIアクセスが可能になってしまう 対策 ● トークン有効期限を短縮(アクセストークン/リフレッシュトークンの寿命を短く設定) ● Revoke Token API を利用(リフレッシュトークンを無効化) ● GlobalSignOut API を利用(全セッションを無効化) ※1 https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html#get-logout ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
これまでのCognitoのツラみを振り返る ● 設計ミスが致命的 になりやすいツラみ ● 運用・管理が一筋縄ではいかない ツラみ ● APIや仕様の クセが強い ツラみ ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
それでもやっぱり.... ● AWSで認証認可をやる、となるとやはりCognitoに落ち着きがち ● 2024年も様々なアップデートがあった ○ むしろre:Invent周辺は”本気出し始めた..?”感ありませんでしたか? ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
ユーザー認証のカスタマイズ性が低い ツラみ改善 ● 従来のツラミ ○ Cognitoのホスト型ログインページはカスタマイズが制限されており、ブランドデザインに合わ せにくい。 ● 改善 ○ ✅ 「Managed Login」の導入で改善※1 ■ カスタマイズ性の向上 ■ パスワードレス認証が簡単に導入可能 ■ 簡単な認証フロー管理 ※1 https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-cognito-managed-login ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a
これからもcognitoを好きでいようと思います もっと改善updateはあるんですが、時間もないとおもうので.... AWSはCognitoを「セキュリティと柔軟性を両立した、次世代のエンタープライズ向けID管理プラット フォーム」に進化させようとしている(と感じた) 今回のようなツラみもどんどん解消されていきますように🙏 (皆様も気になるところはLet’s Feedback) ハッシュタグ:#jawsdays2025 #jawsug #jawsdays2025_a