LESSON 30分

ストーリー

田中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認証を必須化CriticalDAST自動テスト
SEC-AUTH-002MFA(多要素認証)の導入HighE2Eテスト
SEC-AUTH-003パスワードポリシー(12文字以上、複雑性要件)High単体テスト
SEC-AUTH-004アカウントロックアウト(5回失敗で15分ロック)High統合テスト
SEC-AUTH-005セッションタイムアウト(30分無操作で失効)Medium統合テスト

2. 認可要件

要件ID要件優先度検証方法
SEC-AUTHZ-001RBAC(ロールベースアクセス制御)の実装Critical統合テスト
SEC-AUTHZ-002リソースレベルの権限チェック(BOLA防止)CriticalDAST + 手動テスト
SEC-AUTHZ-003最小権限の原則の適用High設計レビュー
SEC-AUTHZ-004管理者操作の承認フローMediumE2Eテスト

3. データ保護要件

要件ID要件優先度検証方法
SEC-DATA-001通信の暗号化(TLS 1.2以上)Critical自動スキャン
SEC-DATA-002保存データの暗号化(AES-256)Critical設計レビュー
SEC-DATA-003PII(個人情報)のマスキング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すべてのユーザー入力のバリデーションCriticalSAST + 単体テスト
SEC-INPUT-002パラメータ化クエリの使用(SQLインジェクション防止)CriticalSAST
SEC-INPUT-003XSS防止(出力エスケープ)CriticalSAST + DAST
SEC-INPUT-004ファイルアップロードの検証(型、サイズ、内容)High統合テスト
SEC-INPUT-005APIリクエストのレート制限HighDAST

脅威から要件への変換プロセス

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の各脅威を具体的な要件にマッピングする
トレーサビリティ脅威→要件→設計→実装→テストの追跡可能性を確保する

チェックリスト

  • セキュリティ要件の記述テンプレートを理解した
  • 5つの要件カテゴリの代表的な要件を把握した
  • STRIDE脅威から要件への変換プロセスを理解した
  • 要件の優先順位付け基準を理解した

次のステップへ

次は「コンプライアンスマッピング」を学びます。セキュリティ要件を各種規制・基準にマッピングする方法を身につけましょう。


推定読了時間: 30分