ストーリー
田
田中VPoE
脅威ランドスケープを把握した。次は「脅威」を「要件」に変換する作業だ。脅威がわかっても、それを具体的な要件に落とし込めなければ実装に繋がらない
あなた
「SQLインジェクション対策をする」のような要件でしょうか?
あ
田
田中VPoE
もう少し構造化が必要だ。セキュリティ要件には「機能要件」と「非機能要件」がある。さらに、各要件には検証方法と受け入れ基準が必要だ。曖昧な要件は実装されない
あなた
テストできない要件は要件ではない、ということですね
あ
田
田中VPoE
その通り。「セキュリティを強化する」は要件ではない。「すべてのAPIエンドポイントでJWTによる認証を必須とし、未認証リクエストには401を返す」これが要件だ
セキュリティ要件の構造
機能要件と非機能要件
| 分類 | 内容 | 例 |
|---|
| 機能要件 | セキュリティ機能として実装するもの | 認証、認可、暗号化、ログ出力 |
| 非機能要件 | セキュリティ品質として満たすべき基準 | 応答時間、可用性、コンプライアンス準拠 |
セキュリティ要件の記述テンプレート
security_requirement:
id: "SEC-AUTH-001"
category: "認証"
title: "API認証の必須化"
description: |
すべてのAPIエンドポイント(/healthを除く)で
JWT Bearer トークンによる認証を必須とする
threat_ref: "STRIDE-S-001" # 対応する脅威ID
priority: "Critical"
acceptance_criteria:
- "未認証リクエストに対して HTTP 401 を返す"
- "期限切れトークンに対して HTTP 401 を返す"
- "不正な署名のトークンに対して HTTP 401 を返す"
verification_method: "自動テスト(DAST + 単体テスト)"
compliance_ref: "PCI-DSS 8.3"
要件カテゴリ別の定義
1. 認証要件
| 要件ID | 要件 | 優先度 | 検証方法 |
|---|
| SEC-AUTH-001 | すべてのAPIでJWT認証を必須化 | Critical | DAST自動テスト |
| SEC-AUTH-002 | MFA(多要素認証)の導入 | High | E2Eテスト |
| SEC-AUTH-003 | パスワードポリシー(12文字以上、複雑性要件) | High | 単体テスト |
| SEC-AUTH-004 | アカウントロックアウト(5回失敗で15分ロック) | High | 統合テスト |
| SEC-AUTH-005 | セッションタイムアウト(30分無操作で失効) | Medium | 統合テスト |
2. 認可要件
| 要件ID | 要件 | 優先度 | 検証方法 |
|---|
| SEC-AUTHZ-001 | RBAC(ロールベースアクセス制御)の実装 | Critical | 統合テスト |
| SEC-AUTHZ-002 | リソースレベルの権限チェック(BOLA防止) | Critical | DAST + 手動テスト |
| SEC-AUTHZ-003 | 最小権限の原則の適用 | High | 設計レビュー |
| SEC-AUTHZ-004 | 管理者操作の承認フロー | Medium | E2Eテスト |
3. データ保護要件
| 要件ID | 要件 | 優先度 | 検証方法 |
|---|
| SEC-DATA-001 | 通信の暗号化(TLS 1.2以上) | Critical | 自動スキャン |
| SEC-DATA-002 | 保存データの暗号化(AES-256) | Critical | 設計レビュー |
| SEC-DATA-003 | PII(個人情報)のマスキング | High | 単体テスト + ログ監査 |
| SEC-DATA-004 | バックアップデータの暗号化 | High | 運用手順レビュー |
| SEC-DATA-005 | データ保持ポリシーの実装 | Medium | 運用テスト |
4. ログ・監査要件
| 要件ID | 要件 | 優先度 | 検証方法 |
|---|
| SEC-LOG-001 | 認証イベントの全記録 | Critical | ログ分析テスト |
| SEC-LOG-002 | 権限変更の監査ログ | Critical | 統合テスト |
| SEC-LOG-003 | ログの改ざん防止(Immutable Storage) | High | インフラ検証 |
| SEC-LOG-004 | ログの保持期間(最低1年) | High | 運用手順レビュー |
| SEC-LOG-005 | セキュリティアラートの自動通知 | High | 統合テスト |
5. 入力検証要件
| 要件ID | 要件 | 優先度 | 検証方法 |
|---|
| SEC-INPUT-001 | すべてのユーザー入力のバリデーション | Critical | SAST + 単体テスト |
| SEC-INPUT-002 | パラメータ化クエリの使用(SQLインジェクション防止) | Critical | SAST |
| SEC-INPUT-003 | XSS防止(出力エスケープ) | Critical | SAST + DAST |
| SEC-INPUT-004 | ファイルアップロードの検証(型、サイズ、内容) | High | 統合テスト |
| SEC-INPUT-005 | APIリクエストのレート制限 | High | DAST |
脅威から要件への変換プロセス
STRIDE → 要件マッピング
脅威分析結果 → セキュリティ要件への変換:
[S] なりすまし脅威
│
├── 脅威: 攻撃者が正規ユーザーのセッションを乗っ取る
│ └── 要件: SEC-AUTH-005(セッションタイムアウト)
│ SEC-AUTH-002(MFA導入)
│
└── 脅威: APIキーの漏洩による不正アクセス
└── 要件: SEC-AUTH-001(JWT認証必須化)
SEC-DATA-001(TLS暗号化)
[T] 改ざん脅威
│
├── 脅威: リクエストパラメータの改ざん
│ └── 要件: SEC-INPUT-001(入力バリデーション)
│ SEC-AUTHZ-002(リソースレベル権限チェック)
│
└── 脅威: ログの改ざんによる証拠隠滅
└── 要件: SEC-LOG-003(ログ改ざん防止)
[I] 情報漏洩脅威
│
├── 脅威: APIレスポンスに不要な情報が含まれる
│ └── 要件: SEC-DATA-003(PIIマスキング)
│
└── 脅威: エラーメッセージによる内部情報の漏洩
└── 要件: SEC-INPUT-001 + カスタムエラーハンドリング
セキュリティ要件の優先順位付け
リスクベースの優先順位付け
| 優先度 | 基準 | 対応期限 | 例 |
|---|
| Critical | 悪用されると重大な被害が発生、修正が容易 | 即時〜1週間 | SQLインジェクション防止、認証必須化 |
| High | 悪用されると大きな被害、または規制要件 | 2週間〜1ヶ月 | MFA導入、暗号化、ログ保持 |
| Medium | 悪用の難易度が高い、または影響が限定的 | 1〜3ヶ月 | セッション管理の強化 |
| Low | 悪用のリスクが低い、防御層が複数存在 | 次の四半期 | UI上のCSP細分化 |
要件トレーサビリティマトリクス
脅威 ──→ 要件 ──→ 設計 ──→ 実装 ──→ テスト
STRIDE-S-001 ──→ SEC-AUTH-001 ──→ JWT Middleware ──→ auth.ts ──→ auth.test.ts
STRIDE-I-003 ──→ SEC-DATA-003 ──→ PII Filter ──→ filter.ts ──→ filter.test.ts
STRIDE-T-002 ──→ SEC-LOG-003 ──→ Immutable Log ──→ logger.ts ──→ log.test.ts
「要件のトレーサビリティは監査のためだけではない。なぜこのコードが存在するのか、どの脅威への対策なのかを全員が理解するための仕組みだ」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|
| 要件の構造 | 機能要件と非機能要件を分け、検証方法と受け入れ基準を明記する |
| 5つのカテゴリ | 認証、認可、データ保護、ログ・監査、入力検証 |
| 脅威→要件変換 | STRIDEの各脅威を具体的な要件にマッピングする |
| トレーサビリティ | 脅威→要件→設計→実装→テストの追跡可能性を確保する |
チェックリスト
次のステップへ
次は「コンプライアンスマッピング」を学びます。セキュリティ要件を各種規制・基準にマッピングする方法を身につけましょう。
推定読了時間: 30分