ストーリー
高橋アーキテクトが新しいプロジェクトの要件書を広げました。
課題概要
| 項目 | 内容 |
|---|---|
| 対象システム | ECサイト(Web + モバイルアプリ) |
| 課題数 | 6つ |
| 合計時間 | 90分 |
| 評価基準 | 各課題の設計ドキュメントを作成すること |
システムのデータ一覧
- ユーザープロフィール(名前、メール、住所、電話番号)
- 認証情報(パスワードハッシュ、MFAシード)
- 決済情報(クレジットカード番号、有効期限)
- 注文履歴(注文内容、金額、配送先)
- 商品データ(名前、価格、説明、画像)
- 操作ログ(アクセス履歴、操作内容)
課題1: データ分類を行おう(15分)
上記のデータ一覧を4段階のレベルに分類してください。
解答例(自分で分類してから確認しよう)
| データ | レベル | 分類理由 |
|---|---|---|
| 商品データ(名前、価格、説明) | Level 1(公開) | 公開情報 |
| 商品画像 | Level 1(公開) | 公開情報 |
| 注文履歴 | Level 2(内部) | ビジネスデータ |
| 操作ログ | Level 2(内部) | 内部運用データ |
| ユーザー名前 | Level 3(機密) | 個人情報 |
| メールアドレス | Level 3(機密) | 個人情報 |
| 住所 | Level 3(機密) | 個人情報 |
| 電話番号 | Level 3(機密) | 個人情報 |
| パスワードハッシュ | Level 4(最高機密) | 認証情報 |
| MFAシード | Level 4(最高機密) | 認証情報 |
| クレジットカード番号 | Level 4(最高機密) | PCI DSS対象 |
| カード有効期限 | Level 4(最高機密) | PCI DSS対象 |
課題2: 暗号化戦略を設計しよう(15分)
レベル別の暗号化戦略を策定してください。暗号化アルゴリズム、鍵管理方式を明記してください。
解答例(自分で設計してから確認しよう)
| レベル | 保存時暗号化 | 通信時暗号化 | 鍵管理 |
|---|---|---|---|
| Level 1 | なし(DBの透過暗号化のみ) | TLS 1.2+ | - |
| Level 2 | DBの透過暗号化(TDE) | TLS 1.2+ | AWS KMS |
| Level 3 | フィールドレベル暗号化(AES-256-GCM) | TLS 1.2+ | AWS KMS + エンベロープ暗号化 |
| Level 4 | フィールドレベル暗号化(AES-256-GCM) | TLS 1.3 | HSM + エンベロープ暗号化 |
// エンベロープ暗号化の設計
const encryptionConfig = {
level3: {
algorithm: "aes-256-gcm",
kekSource: "AWS KMS",
dekRotation: "90日",
kekRotation: "365日",
},
level4: {
algorithm: "aes-256-gcm",
kekSource: "AWS CloudHSM",
dekRotation: "30日",
kekRotation: "180日",
additionalProtection: "トークナイゼーション(カード番号)",
},
};
課題3: シークレット管理を設計しよう(15分)
システムで使用するシークレットを一覧化し、管理方針を策定してください。
解答例(自分で設計してから確認しよう)
| シークレット | 保存場所 | ローテーション間隔 | アクセス権限 |
|---|---|---|---|
| DB接続パスワード | AWS Secrets Manager | 90日(自動) | App Server のみ |
| JWT署名鍵 | AWS Secrets Manager | 30日 | Auth Service のみ |
| Stripe APIキー | AWS Secrets Manager | 180日 | Payment Service のみ |
| TLS証明書 | ACM(AWS Certificate Manager) | 自動更新 | ALB のみ |
| 暗号化マスターキー | AWS KMS | 365日 | Encryption Service のみ |
| SendGrid APIキー | AWS Secrets Manager | 90日 | Notification Service のみ |
// シークレットアクセスのIAMポリシー
const iamPolicy = {
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Action: "secretsmanager:GetSecretValue",
Resource: "arn:aws:secretsmanager:*:*:secret:myapp/payment/*",
Condition: {
StringEquals: {
"aws:PrincipalTag/Service": "payment-service",
},
},
},
],
};
課題4: データマスキングを実装しよう(15分)
各データフィールドのマスキングルールを定義し、TypeScriptで実装してください。
解答例(自分で実装してから確認しよう)
const maskingConfig: Record<string, (value: string) => string> = {
email: (v) => {
const [local, domain] = v.split("@");
return `${local[0]}${"*".repeat(local.length - 1)}@${domain}`;
},
phone: (v) => v.replace(/\d(?=\d{4})/g, "*"),
creditCard: (v) => `****-****-****-${v.slice(-4)}`,
address: (v) => {
const parts = v.split(/[都道府県]/);
return parts[0] + "***" + (parts.length > 1 ? "***" : "");
},
name: (v) => v[0] + "*".repeat(v.length - 1),
};
// コンテキスト別のマスキングレベル
type ViewContext = "owner" | "admin" | "support" | "analytics";
const getMaskingLevel = (context: ViewContext, field: string): "full" | "masked" | "hidden" => {
const rules: Record<ViewContext, Record<string, "full" | "masked" | "hidden">> = {
owner: { email: "full", phone: "full", creditCard: "masked", name: "full" },
admin: { email: "masked", phone: "masked", creditCard: "hidden", name: "masked" },
support: { email: "masked", phone: "masked", creditCard: "hidden", name: "full" },
analytics: { email: "hidden", phone: "hidden", creditCard: "hidden", name: "hidden" },
};
return rules[context]?.[field] ?? "hidden";
};
課題5: 通信保護を設計しよう(15分)
全ての通信経路を列挙し、それぞれの保護方式を定義してください。
解答例(自分で設計してから確認しよう)
| 経路 | プロトコル | 認証方式 | 備考 |
|---|---|---|---|
| ブラウザ → CDN | HTTPS (TLS 1.3) | - | HSTS preload |
| CDN → API Gateway | HTTPS (TLS 1.2+) | APIキー | CloudFront → ALB |
| API Gateway → App | HTTP (内部) | Bearer Token | VPC内部通信 |
| App → Database | TLS | 証明書認証 | RDS SSL |
| App → Redis | TLS | パスワード | ElastiCache TLS |
| App → Stripe | HTTPS (TLS 1.2+) | APIキー | 外部API |
| App → App(内部) | mTLS | クライアント証明書 | サービス間通信 |
課題6: データ保存期間ポリシーを作成しよう(15分)
各データの保存期間と削除・匿名化の方針を策定してください。
解答例(自分で策定してから確認しよう)
| データ | 保存期間 | 削除方式 | 法的根拠 |
|---|---|---|---|
| セッションログ | 30日 | 完全削除 | 運用上の判断 |
| 操作ログ | 1年 | アーカイブ後削除 | 監査要件 |
| 注文履歴 | 7年 | 匿名化 | 税法上の保管義務 |
| 決済情報 | 取引完了後90日 | 完全削除 | PCI DSS |
| ユーザー個人情報 | 退会後30日 | 完全削除 | 個人情報保護法 |
| アクセスログ | 90日 | 完全削除 | 運用上の判断 |
| バックアップ | 90日 | 自動消去 | 運用上の判断 |
// 自動削除ジョブの設計
const retentionJobs = [
{ cron: "0 2 * * *", task: "deleteExpiredSessions" }, // 毎日2時
{ cron: "0 3 * * 0", task: "archiveOldLogs" }, // 毎週日曜3時
{ cron: "0 4 1 * *", task: "anonymizeOldOrders" }, // 毎月1日4時
{ cron: "0 5 1 * *", task: "deleteExpiredPaymentData" }, // 毎月1日5時
];
達成度チェック
| 課題 | テーマ | 完了 |
|---|---|---|
| 課題1 | データ分類 | [ ] |
| 課題2 | 暗号化戦略 | [ ] |
| 課題3 | シークレット管理 | [ ] |
| 課題4 | データマスキング | [ ] |
| 課題5 | 通信保護 | [ ] |
| 課題6 | データ保存期間ポリシー | [ ] |
まとめ
| ポイント | 内容 |
|---|---|
| データ分類 | 4段階でデータの重要度を分類 |
| 暗号化 | レベルに応じた暗号化戦略を策定 |
| シークレット | 集中管理 + ローテーション |
| マスキング | コンテキスト別の表示制御 |
チェックリスト
- 全データを4段階に分類できた
- レベル別の暗号化戦略を策定できた
- シークレット一覧と管理方針を作成できた
- データマスキングを実装できた
- 全通信経路の保護方式を定義できた
- データ保存期間ポリシーを作成できた
次のステップへ
お疲れさまでした。データ保護設計の演習が完了しました。 次はStep 4のチェックポイントです。
推定所要時間: 90分