課題23: Cognito認証基盤 - 医療情報プラットフォームの認証システム
難易度: 🟡 中級
1. 分類情報
| 項目 | 内容 |
|---|---|
| 難易度 | 中級 |
| カテゴリ | 認証・認可 / セキュリティ |
| 処理タイプ | リアルタイム |
| 使用IaC | CloudFormation |
| 想定所要時間 | 4-5時間 |
2. ビジネスシナリオ
企業プロファイル: 〇〇株式会社
| 項目 | 内容 |
|---|---|
| 企業名 | 〇〇株式会社 |
| 業種 | 医療情報プラットフォーム |
| 設立 | 2021年 |
| 従業員数 | 30名 |
| 本社 | 東京 |
| 事業 | 医療機関向けオンライン診療プラットフォーム |
| ユーザー | 医師5000名、患者30万人、医療機関500施設 |
プラットフォーム概要
3種類のクライアントアプリケーション(患者アプリ、医師ポータル、管理画面)から認証基盤を経由してバックエンドAPIにアクセスする構成です。
認証要件
| ユーザー種別 | 認証方式 | セキュリティ要件 |
|---|---|---|
| 患者 | メール/パスワード + ソーシャルログイン | MFA推奨 |
| 医師 | メール/パスワード + 医師免許番号確認 | MFA必須 |
| 管理者 | メール/パスワード + IP制限 | MFA必須 + 監査ログ |
規制要件
個人情報保護法・医療情報ガイドライン対応
1. 認証強度
- 医療従事者は多要素認証必須
- パスワードポリシー: 12文字以上、複雑性要件
- セッションタイムアウト: 30分
2. アクセス制御
- 役割ベースのアクセス制御(RBAC)
- 最小権限の原則
- 担当患者のみアクセス可能
3. 監査証跡
- 全ログイン試行の記録
- アクセスログの7年間保存
- 異常アクセスの検知
4. データ保護
- 通信の暗号化(TLS 1.2以上)
- トークンの安全な管理
- 個人情報の匿名化
ビジネス要件と KPI
セキュリティ目標
| 指標 | 目標 | 基準 |
|---|---|---|
| MFA有効化率 | > 95% | 医療従事者は100% |
| 不正ログイン検知 | < 1分 | 自動ブロック |
| パスワード漏洩対応 | < 15分 | 強制リセット |
| 監査ログ保存期間 | 7年 | 規制要件 |
ユーザー体験目標
| 指標 | 目標 | 現状の課題 |
|---|---|---|
| ログイン成功率 | > 99% | - |
| ログイン時間 | < 3秒 | - |
| パスワードリセット | セルフサービス | 現在は手動 |
| サポート問い合わせ | 50%削減 | 認証関連が多い |
3. 学習目標
習得スキル
1. Amazon Cognito基礎
- User Pool(ユーザー管理)
- Identity Pool(一時認証情報)
- 認証フロー(OAuth 2.0 / OIDC)
- トークン(ID/Access/Refresh)
2. セキュリティ設定
- パスワードポリシー
- MFA(TOTP / SMS)
- 高度なセキュリティ機能
- Lambda トリガー
3. API Gateway統合
- Cognito Authorizer
- スコープベースアクセス制御
- カスタム認可
- APIキー管理
4. CloudFormationによる構築
- User Pool定義
- App Client設定
- API Gateway統合
- Lambda トリガー設定
4. 使用するAWSサービス
コアサービス
| サービス | 用途 | 重要度 |
|---|---|---|
| Cognito User Pool | ユーザー認証管理 | ★★★★★ |
| Cognito Identity Pool | AWS認証情報発行 | ★★★☆☆ |
| API Gateway | API認可 | ★★★★★ |
| Lambda | カスタム処理 | ★★★★☆ |
| CloudFormation | インフラ定義 | ★★★★★ |
支援サービス
| サービス | 用途 | 重要度 |
|---|---|---|
| CloudWatch Logs | 認証ログ | ★★★★☆ |
| SNS | MFA SMS送信 | ★★★☆☆ |
| SES | メール送信 | ★★★☆☆ |
| WAF | API保護 | ★★★☆☆ |
5. 前提条件と事前準備
必要な環境
bash
# AWS CLI バージョン確認
aws --version
# aws-cli/2.x.x 以上
# Node.js(Lambda関数用)
node --version
# v18.x 以上AWS環境の準備
bash
# 環境変数設定
export AWS_REGION=ap-northeast-1
export PROJECT_NAME=medconnect
export ENVIRONMENT=dev
# 作業ディレクトリ作成
mkdir -p ~/medconnect-cognito/{cfn,lambda,scripts}
cd ~/medconnect-cognito6. アーキテクチャ設計
認証基盤全体像
| コンポーネント | 役割 |
|---|---|
| Patient App | 患者向けモバイルアプリ |
| Doctor Portal | 医師向けWebポータル |
| Admin Console | 管理者向けWeb画面 |
| User Pool | ユーザー認証管理(患者・医師・管理者) |
| Users | ユーザーデータ(患者・医師・管理者) |
| Groups | グループ管理(patients・doctors・admins) |
| MFA | 多要素認証(TOTP・SMS) |
| App Clients | アプリケーションクライアント設定 |
| Lambda Triggers | カスタム認証処理(PreSignUp・PostAuth) |
| Cognito Authorizer | APIリクエストのトークン検証 |
| API Endpoints | 保護されたAPIエンドポイント(/patients /doctors /admin) |
7. トラブルシューティング演習
演習7-1: MFA設定の問題
状況: 医師ユーザーがMFAを設定しようとしているが、「MFA設定が利用できません」というエラーが表示される。
エラーメッセージ:
InvalidParameterException: User pool does not have MFA enabled課題:
- MFAが有効になっていない原因を特定してください
- CloudFormationテンプレートを修正してください
- 既存ユーザーへの影響を確認してください
演習7-2: トークンの検証エラー
状況: 有効なはずのアクセストークンでAPI呼び出しをしているが、401 Unauthorizedエラーが返される。
エラーログ:
API Gateway execution log:
Unauthorized request: JWT token expired
Token exp claim: 1704067200 (2024-01-01 00:00:00)
Current time: 1704153600 (2024-01-02 00:00:00)課題:
- トークン期限切れの原因を確認してください
- リフレッシュトークンによる更新処理を実装してください
- クライアント側のトークン管理を改善してください
8. 設計課題
設計課題8-1: ソーシャルログイン対応
課題: 患者向けアプリにGoogleとAppleでのソーシャルログインを追加してください。
要件:
- Google / Apple Sign-Inの統合
- 既存メールユーザーとのアカウントリンク
- ソーシャルログインユーザーの属性マッピング
- MFA要件の調整(ソーシャルログインはMFA不要)
成果物:
- Identity Provider設定
- 属性マッピング設計
- CloudFormationテンプレート
9. 発展課題
発展課題9-1: リスクベース認証
シナリオ: 不正アクセスを検知し、リスクレベルに応じて追加認証を要求する仕組みを実装したい。
技術要件:
- Cognitoの高度なセキュリティ機能の活用
- 異常なログインパターンの検出
- リスクスコアに基づくMFA要求
- ブロックリスト/許可リストの管理
成果物:
- リスク評価ロジック設計
- Lambda トリガー実装
- 監視ダッシュボード
10. 学習のまとめ
学習チェックリスト
Cognito基礎
- User Pool / Identity Pool の違いを説明できる
- OAuth 2.0 / OIDC フローを理解した
- ID/Access/Refresh トークンの役割を説明できる
- App Clientの設定ができる
セキュリティ
- パスワードポリシーを適切に設定できる
- MFAを設定できる
- Lambda トリガーを実装できる
- 監査ログを設定できる
API Gateway統合
- Cognito Authorizerを設定できる
- スコープベースのアクセス制御ができる
- グループベースのアクセス制御ができる
CloudFormation
- User Poolを定義できる
- App Clientを定義できる
- Lambda トリガーを統合できる
11. コスト見積もり
想定コスト(月額)
Cognito料金体系
- 最初の50,000 MAU: 無料
- 50,001〜100,000 MAU: $0.0055/MAU
- 100,001以上: $0.0046/MAU
- 高度なセキュリティ: $0.05/MAU
想定コスト(MAU 35,000)
| 項目 | 数量 | 月額(USD) |
|---|---|---|
| Cognito基本料金 | 35,000 MAU | $0 (無料枠内) |
| 高度なセキュリティ | 35,000 MAU | $1,750 |
| SMS MFA | 5,000通/月 | $40 |
| API Gateway | 1M リクエスト | $3.50 |
| Lambda | 500K 呼び出し | $0.10 |
| CloudWatch Logs | 10GB | $5.00 |
| 小計 | 約 $1,800(約 ¥270,000) |
📝 補足:
- 高度なセキュリティを無効にすると大幅にコスト削減可能
- 開発環境では $5/月 程度
リソースのクリーンアップ
bash
# CloudFormationスタック削除
aws cloudformation delete-stack --stack-name medconnect-api-gateway-dev
aws cloudformation delete-stack --stack-name medconnect-cognito-dev
# 削除完了を待機
aws cloudformation wait stack-delete-complete --stack-name medconnect-cognito-dev
echo "Cleanup completed!"次の課題: 課題24
前の課題: 課題22