ストーリー
ミッション概要
| 項目 | 内容 |
|---|---|
| 演習タイトル | ID管理基盤の設計 |
| 想定時間 | 90分 |
| 成果物 | ID管理基盤設計書(認証 + 認可 + フェデレーション) |
| 対象システム | PayConnect(BtoB SaaS、3,000社の顧客企業) |
前提条件
PayConnect ID管理の現状:
認証:
- エンドユーザー: メールアドレス + パスワード(自前実装)
- 管理者: 同上(MFAなし)
- API: 静的APIキー(ヘッダー認証)
- SSO: 未対応(大企業顧客から要望多数)
認可:
- ロール: owner, admin, member, viewer の4ロール
- テナント分離: アプリケーションコードでWHERE tenant_id = ?
(全APIに個別実装、一貫性なし)
課題:
- 大企業顧客(500社以上)からSAML SSO対応の要望
- テナント間のデータ漏洩バグが過去に2件発生
- パスワードポリシーが弱い(6文字以上のみ)
- MFAが未実装
- 退職者のアカウント削除が手動(遅延あり)
- APIキーのローテーション機能なし
Mission 1: 認証アーキテクチャの設計
要件
PayConnectの認証アーキテクチャを設計してください。
- IdPの選定(2つ以上の候補を比較し、選定理由を説明)
- エンドユーザー認証のフロー設計(OAuth 2.0 + OIDC)
- MFA戦略の設計(必須条件、方式選定)
- API認証の設計(JWT + APIキー管理)
解答例
IdP 選定
| 観点 | Auth0 | Keycloak | AWS Cognito |
|---|---|---|---|
| SAML SP対応 | あり | あり | あり |
| エンタープライズSSO | 標準機能 | 要設定 | 限定的 |
| SCIM対応 | あり | プラグイン | なし |
| マルチテナント | Organizations機能 | Realm分離 | ユーザープール |
| コスト(3,000社想定) | 約500万円/年 | OSS(運用コスト) | 約200万円/年 |
| 開発者体験 | 優れている | 中程度 | 良好 |
選定: Auth0
選定理由:
- エンタープライズSSO(SAML/OIDC)が標準機能として提供
- Organizations機能でマルチテナントのSSO管理が容易
- SCIM対応で自動プロビジョニングが実現可能
- 豊富なSDKとドキュメントで開発速度が高い
MFA 戦略
| 対象 | MFA要件 | 許可する方式 |
|---|---|---|
| 全エンドユーザー | 推奨(初回ログイン時に促進) | パスキー、認証アプリ(TOTP) |
| 管理者(owner, admin) | 必須 | パスキー、認証アプリ |
| 決済操作 | 必須(ステップアップ認証) | パスキー、認証アプリ |
| API(M2M) | 該当なし(Client Credentials) | — |
API 認証設計
| API種類 | 認証方式 | トークン/キー管理 |
|---|---|---|
| エンドユーザーAPI | Authorization Code + PKCE → JWT | accessToken: 15分、refreshToken: 7日 |
| 管理者API | 同上 + MFA必須 | accessToken: 15分(MFAクレーム付き) |
| パートナーAPI(M2M) | Client Credentials → JWT | accessToken: 1時間 |
| Webhook受信 | HMAC署名検証 | Webhook Secretをローテーション(90日) |
Mission 2: 認可モデルの設計
要件
PayConnectの認可モデルを設計してください。
- 認可モデルの選定(RBAC/ABAC/ReBAC から選択し根拠を説明)
- ロール/権限体系の設計
- テナント分離の実装方針(アプリケーション層 or データベース層)
- 認可エンジンの選定
解答例
認可モデル: RBAC + テナント分離(ABAC的要素を含む)
選定根拠:
- PayConnectの権限体系は4ロールで比較的シンプル → RBACが適切
- テナント分離が最優先課題 → ABAC的なテナントID属性チェックを追加
- ReBAC(Google Zanzibar型)は現時点でオーバースペック
ロール/権限体系
| ロール | 請求書 | ユーザー管理 | 設定 | 決済操作 | API管理 |
|---|---|---|---|---|---|
| owner | CRUD | CRUD + 招待 | CRUD | 実行 + 承認 | CRUD |
| admin | CRUD | CRU + 招待 | CRU | 実行 | CRU |
| member | CRU | R | R | 実行 | R |
| viewer | R | R | R | — | R |
テナント分離の実装方針
多層防御によるテナント分離:
Layer 1: API Gateway
├── JWTのtenant_idクレームを検証
└── リクエストヘッダーにtenant_idを付与
Layer 2: アプリケーションミドルウェア
├── OPAにtenant_id + role + actionを送信
└── DENY の場合は 403 を返す
Layer 3: データベース(最後の砦)
├── PostgreSQL Row Level Security(RLS)
├── SET app.current_tenant = :tenant_id
└── RLSポリシーで自動フィルタリング
Layer 3 の設定:
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON invoices
USING (tenant_id = current_setting('app.current_tenant')::uuid);
認可エンジン: OPA(Open Policy Agent)
選定理由:
- Kubernetes統合が容易(サイドカーデプロイ可能)
- Rego言語でテナント分離 + RBAC のポリシーを表現可能
- OSSでコスト0円
- 将来的にABAC/ReBACに拡張可能
Mission 3: エンタープライズSSO設計
要件
PayConnectのエンタープライズSSO機能を設計してください。
- SSO対応フロー(SAML + OIDC両対応)
- テナントごとのSSO設定管理の仕組み
- SCIMによる自動プロビジョニング
- フォールバック戦略(IdP障害時の対応)
解答例
SSO対応フロー
エンタープライズSSO対応フロー:
[ユーザー] ──→ PayConnect ログイン画面
│
│ メールアドレス入力: user@enterprise.com
│
┌────┴────┐
│ ドメイン │ enterprise.com を検索
│ ルック │
│ アップ │
└────┬────┘
│
┌──────────┼──────────┐
│ │ │
SSO設定あり SSO設定なし ドメイン未登録
(SAML/OIDC) │ │
│ パスワード エラー
│ ログイン 「組織に問い合わせ」
↓
IdPにリダイレクト
(SAML or OIDC)
│
↓
認証成功 → テナント特定 → ロールマッピング → セッション作成
テナントSSO設定管理
| 設定項目 | SAML | OIDC |
|---|---|---|
| IdP Entity ID | 必須 | — |
| SSO URL | 必須 | — |
| SLO URL | 任意 | — |
| X.509 Certificate | 必須 | — |
| Discovery URL | — | 必須 |
| Client ID | — | 必須 |
| Client Secret | — | 必須 |
| ドメイン認証 | DNS TXT レコードで所有権確認 | DNS TXT レコードで所有権確認 |
| ロールマッピング | IdP属性 → PayConnectロール | claims → PayConnectロール |
フォールバック戦略
| シナリオ | 対応 |
|---|---|
| IdPがダウン | テナント管理者(owner)のみローカルパスワード + MFA でログイン可能 |
| SAML証明書期限切れ | 30日前にテナント管理者にメール通知、7日前にCriticalアラート |
| ユーザーがIdPのアカウントを失った | テナント管理者がPayConnect上でパスワードリセット可能 |
達成度チェック
| 観点 | 達成基準 |
|---|---|
| IdP選定 | 2つ以上の候補を比較し、選定理由が明確 |
| 認証設計 | OAuth 2.0フロー、MFA戦略、API認証が適切に設計されている |
| 認可設計 | 認可モデルが選定され、テナント分離が多層防御で設計されている |
| SSO設計 | SAML/OIDC両対応、ドメインベースのテナント識別が設計されている |
| フォールバック | IdP障害時の対応が設計されている |
推定所要時間: 90分