上級 25分 Lesson 13

Cognito & STS — 「あなたは誰?」を正しく聞く

認証と認可、User Pools/Identity Pools、STS AssumeRole、Confused Deputyを講義形式で解説

AWS Cognito STS SCS-C03 Security

皆さん、国際空港に行ったことありますか。搭乗する時、何が起きるか。まずセキュリティゲートで、「あなたは誰?」と聞かれます。パスポート、チケットを見せる。顔認証。これは認証(Authentication)です。「あなたが本当にあなたであることを確認する」ステップ。OK、あなたは本物。では次、「あなたはどこに行っていいの?」という話。日本の市民ですか?ビザはありますか?飛行機に乗る予約は?これは認可(Authorization)です。「あなたが何をしていいかを決める」ステップ。

ウェブアプリケーション。「ユーザーがログイン」した後、「このユーザーが何をアクセスできるか」を制御する。その仕組みが Cognito と STS。分業体制。Cognito は認証(ユーザーを確認)。STS は認可(権限を付与)。

Cognito の 2大コンポーネント

User Pools。認証。ユーザー名、パスワード管理。トークン発行(ID Token、Access Token、Refresh Token)。

Identity Pools。認可。AWS リソースへのアクセス権。一時認証情報(AccessKeyId、SecretAccessKey、SessionToken)を発行。

両方必須。User Pools だけでは、AWS リソースアクセスできない。Identity Pools だけでは、ユーザー確認できない。

初心者が引っかかるポイント。「Cognito で S3 にアクセスできるのか」。User Pools では不可。Identity Pools と組み合わせて初めて可能。

User Pools の詳細

MFA。三択。SMS(ショートメッセージ)、TOTP(Google Authenticator)、Email(SES)。設定で選択。

Advanced Security。侵害された認証情報検出。AWS の脅威インテリジェンスとマッチング。パスワード漏洩 DB に引っかかれば、パスワード変更強制。適応型認証。異常なログイン試行の検出。リスク評価に基づいて MFA 要求。

Lambda トリガー。認証フロー内の 8 つのポイント。Pre Sign-up(サインアップ前)。Pre Authentication(ログイン直前)。Post Authentication(ログイン後)。Pre Token Generation(トークン発行直前)。Custom Message。User Migration。Post Confirmation。Custom Authflow Challenge。

重要。Lambda トリガーのタイムアウト。5 秒。外部 API 呼び出しとか DB クエリとか。5 秒以内に完了必須。遅いと認証フロー全体が失敗。これ、VPC 内 Lambda だと危ない。起動時間だけで 1~2 秒かかることも。

Identity Pools の流れ

ステップ 1。User Pools からトークン取得。ステップ 2。そのトークン使って Identity Pools から Identity ID を取得。ステップ 3。Identity ID で一時認証情報を取得。ステップ 4。その一時認証情報で S3、DynamoDB にアクセス。

Python コード例。boto3 で cognito-idp、cognito-identity、sts クライアント作成。順番に呼ぶ。この流れ。

ロールマッピング

Identity Pools、複数 IAM ロール管理可能。どのロール割り当てるか。トークンベース。ID Token のカスタムクレームで選択。ルールベース。Priority ベースのマッピング。複数条件組み合わせ。

トークンベース。シンプル。ID Token に「department=engineering」クレーム入ってれば、engineer-role 割り当て。

ルールベース。複雑。複数ロール管理時に便利。「department=engineering AND project=project-a なら role-a」みたいな。

外部 IdP 連携

Google、Facebook、Apple、Amazon。SAML プロバイダー(Okta、Salesforce、AD)。OpenID Connect(OIDC)。

Cognito User Pools と外部 IdP の連携。「Google でログイン」ボタンクリック。Google に遷移。ログイン。トークン返却。Cognito が仲介。

Identity Pools も直接連携可能。「Google の ID Token を Cognito Identity Pools に」。Identity Pools が検証。ロール割り当て。AWS リソースアクセス可能。

STS の役割

STS。一時認証情報発行。長期的なアクセスキーの代わりに、期限付き認証情報。セキュリティ向上。

AssumeRole

クロスアカウント認証の基本。Account A のユーザーが、Account B のロール引き受ける。STS AssumeRole API。期限付き認証情報返却。

重要な脆弱性。Confused Deputy 問題。悪意のある Account C が、Account A のサービスを利用。知らないうちに Account B のロール権限で C の指示実行。対策。External ID。Account B のロール作成時に External ID 指定。Account A が AssumeRole 時に External ID 送信。マッチしないと失敗。必須。

Session Tags

AssumeRole 時にセッションタグ設定。そのセッション内で属性ベースアクセス制御。「Project=ProjectA」タグ付けば、IAM ポリシーで「s3:ProjectA/*」へのアクセスのみ許可。部門別、プロジェクト別の自動分離。

セッション期間の制約

AssumeRole。最小 15 分、最大 12 時間。

GetSessionToken(MFA 付き)。最小 15 分、最大 36 時間。

重要。ロールチェーン。Account A → Account B → Account C のように複数ロール AssumeRole チェーンする場合。合計期間 1 時間以内。「A で発行した一時認証情報の有効期限が 30 分」なら、B からの一時認証情報も 30 分以下。時間が短くなります。これ、仕組みを理解しないと、トラブル原因に。

Cognito + API Gateway

Lambda Authorizer。API Gateway の手前。ID Token 検証。JWT 署名確認。有効期限確認。OK なら API Gateway へ。NG なら拒否。

Cognito の公開鍵を取得。JWKS エンドポイント。署名検証。装備品。

試験ポイント

「User Pools vs Identity Pools」。何度も出題。認証(User Pools)。認可(Identity Pools)。完全に分別。

「Lambda トリガー 5 秒制限」。外部 API 呼び出し設計で要注意。非同期処理化とか、事前準備が必須。

「Confused Deputy」。External ID の使用は必須。ロール作成時に External ID 指定。AssumeRole 時に送信。

「ロールチェーン 1 時間制限」。複数アカウント跨ぐときに要確認。セッション期間が短くなります。

「IdP 連携」。Google、SAML、OIDC。複数対応。各々の実装パターン異なります。

できないこと

Cognito User Pools。AWS リソースに直接アクセス不可。Identity Pools と組み合わせが必須。

Lambda トリガー。5 秒以上の長時間処理不可。タイムアウト。

STS AssumeRole。12 時間以上のセッション不可。長期間が必要なら、GetSessionToken で 36 時間まで。

Cognito + STS の連携

フルフロー。User Pools でログイン。ID Token 取得。Identity Pools に送信。ロール割り当て。一時認証情報発行。AWS リソースアクセス。さらに、STS AssumeRole で別アカウントのロール引き受け。複雑だけど、これが現代のマルチアカウント環境。

まとめ

SCS-C03 全 13 講を通じて。IAM、KMS、CloudTrail、GuardDuty、Security Hub、VPC、S3、WAF・Shield、Config、Secrets・Parameter・ACM・CloudHSM、Inspector・Macie、Organizations・Control Tower・Identity Center、Cognito・STS。

セキュリティのいろいろな側面。ネットワーク、データ、認証、監視、検出、修復。それぞれが独立してなく、相互に連携。全体像の理解が試験合格のカギ。各サービスの「制約」「できないこと」を正確に把握。これが差別化。頑張ってください。では、健闘をお祈りします。