ストーリー
STRIDE脅威モデリングとは
STRIDEは、Microsoftが1999年に提唱した脅威モデリングのフレームワークです。システムに対する脅威を6つのカテゴリに分類し、網羅的に分析します。
STRIDEの6カテゴリ
| カテゴリ | 英語 | CIAとの対応 | 脅威の例 |
|---|---|---|---|
| S なりすまし | Spoofing | 認証 | 他人のアカウントでログイン、IPスプーフィング |
| T 改ざん | Tampering | 完全性 | データの不正変更、通信の改ざん |
| R 否認 | Repudiation | 監査 | 操作の証拠を消す、ログの改ざん |
| I 情報漏洩 | Information Disclosure | 機密性 | 機密データの流出、エラーメッセージによる情報露出 |
| D サービス妨害 | Denial of Service | 可用性 | DDoS攻撃、リソース枯渇 |
| E 権限昇格 | Elevation of Privilege | 認可 | 一般ユーザーが管理者権限を取得 |
脅威モデリングのプロセス
4ステップの脅威モデリング
graph LR
S1["Step 1<br/>対象の定義<br/>・DFD作成<br/>・境界の定義"] --> S2["Step 2<br/>脅威の特定<br/>・STRIDE適用<br/>・脅威の列挙"]
S2 --> S3["Step 3<br/>脅威の評価<br/>・リスク評価<br/>・優先順位"]
S3 --> S4["Step 4<br/>対策の計画<br/>・緩和策検討<br/>・対策の実装"]
classDef step fill:#0d6efd,stroke:#0d6efd,color:#fff
class S1,S2,S3,S4 step
Step 1: データフローダイアグラム(DFD)の作成
DFDは、システム内のデータの流れを可視化するための図です。
| 要素 | 記号 | 説明 |
|---|---|---|
| 外部エンティティ | 四角形 | システム外のアクター(ユーザー、外部サービス) |
| プロセス | 円 | データを処理するコンポーネント |
| データストア | 二重線 | データを保存する場所(DB、ファイル) |
| データフロー | 矢印 | データの流れ |
| 信頼境界 | 点線 | セキュリティレベルが変わる境界 |
graph TD
subgraph trust["信頼境界"]
User["ユーザー"] -->|HTTPS| APIGateway["APIゲートウェイ"]
APIGateway --> Auth["認証サービス"]
APIGateway --> Order["注文サービス"]
Order --> Payment["決済サービス"]
Order --> OrderDB[("注文DB")]
end
subgraph external["外部決済API"]
Payment --> Stripe["外部決済サービス"]
end
classDef entity fill:#4a90d9,stroke:#2c5f8a,color:#fff
classDef store fill:#f5a623,stroke:#c47d10,color:#fff
classDef boundary fill:transparent,stroke:#e94560,stroke-dasharray:5 5
class User,APIGateway,Auth,Order,Payment entity
class OrderDB store
class trust,external boundary
Step 2: STRIDEによる脅威の特定
DFDの各要素にSTRIDEカテゴリを適用します。
// 脅威モデリングの構造をTypeScriptで表現
interface Threat {
id: string;
category: 'S' | 'T' | 'R' | 'I' | 'D' | 'E';
target: string; // DFD上のコンポーネント
description: string; // 脅威の説明
attackVector: string; // 攻撃経路
impact: 'Critical' | 'High' | 'Medium' | 'Low';
likelihood: 'High' | 'Medium' | 'Low';
mitigation: string; // 緩和策
}
// 脅威モデリング結果の例
const threats: Threat[] = [
{
id: 'T-001',
category: 'S',
target: 'APIゲートウェイ',
description: '盗まれたJWTトークンによるなりすまし',
attackVector: 'XSSでトークンを窃取し、正規ユーザーとしてAPIを呼び出す',
impact: 'High',
likelihood: 'Medium',
mitigation: 'HttpOnly Cookie、トークンのローテーション、異常検知',
},
{
id: 'T-002',
category: 'T',
target: '注文サービス',
description: '注文金額の改ざん',
attackVector: 'APIリクエストの価格パラメータを改ざん',
impact: 'Critical',
likelihood: 'Medium',
mitigation: 'サーバーサイドでの価格再計算、入力値の検証',
},
{
id: 'T-003',
category: 'I',
target: '注文DB',
description: 'SQLインジェクションによるデータ漏洩',
attackVector: '検索パラメータに悪意のあるSQLを挿入',
impact: 'Critical',
likelihood: 'Low',
mitigation: 'パラメータ化クエリ、ORM使用、WAF',
},
{
id: 'T-004',
category: 'D',
target: 'APIゲートウェイ',
description: 'DDoSによるサービス停止',
attackVector: '大量のリクエストでサーバーリソースを枯渇',
impact: 'High',
likelihood: 'Medium',
mitigation: 'レート制限、CDN、オートスケーリング',
},
{
id: 'T-005',
category: 'E',
target: '認証サービス',
description: 'IDOR(Insecure Direct Object Reference)による権限昇格',
attackVector: '他ユーザーのIDを指定して管理者操作を実行',
impact: 'Critical',
likelihood: 'Medium',
mitigation: '全エンドポイントでの認可チェック、RBAC実装',
},
];
信頼境界の定義
信頼境界は、セキュリティレベルが変わる箇所であり、脅威が最も発生しやすいポイントです。
| 信頼境界 | 説明 | 必要な対策 |
|---|---|---|
| インターネット ↔ DMZ | 外部からの最初のアクセスポイント | WAF、DDoS防御、TLS |
| DMZ ↔ 内部ネットワーク | パブリック領域と内部の境界 | API Gateway、認証・認可 |
| アプリケーション ↔ データベース | データアクセスの境界 | 暗号化、アクセス制御、監査ログ |
| サービス間 | マイクロサービスの境界 | mTLS、サービスメッシュ |
| 自社 ↔ 外部サービス | 外部APIとの境界 | API Key管理、タイムアウト、サーキットブレーカー |
アタックツリー
アタックツリーは、攻撃者の視点から攻撃の手順を木構造で表現する手法です。
目標: ユーザーの個人情報を窃取する
├── 1. Webアプリケーション経由
│ ├── 1.1 SQLインジェクション
│ │ ├── 検索フォームへの攻撃
│ │ └── APIパラメータへの攻撃
│ ├── 1.2 XSSでセッション窃取
│ │ ├── 反射型XSS
│ │ └── 格納型XSS
│ └── 1.3 IDOR(直接オブジェクト参照)
│ └── ユーザーIDの推測
├── 2. ネットワーク経由
│ ├── 2.1 中間者攻撃(MITM)
│ │ └── TLSの設定不備を悪用
│ └── 2.2 DNS偽装
├── 3. サプライチェーン経由
│ ├── 3.1 悪意のあるnpmパッケージ
│ └── 3.2 CI/CDパイプラインの侵害
└── 4. 内部犯行
├── 4.1 データベースへの直接アクセス
└── 4.2 ログからの情報収集
脅威モデリングのベストプラクティス
| プラクティス | 説明 |
|---|---|
| 早期に実施 | 設計フェーズで脅威モデリングを行う |
| 定期的に更新 | 機能追加・アーキテクチャ変更時に見直す |
| チームで実施 | 開発者・セキュリティ担当・運用担当が協力 |
| 文書化する | 脅威モデルをADR(Architecture Decision Record)として記録 |
| 自動化と統合 | CI/CDパイプラインに脅威モデリングのチェックを組み込む |
// 脅威モデルをコードで管理する例
interface ThreatModel {
systemName: string;
version: string;
lastReviewDate: string;
reviewers: string[];
dataFlowDiagram: string; // DFDファイルへのパス
trustBoundaries: TrustBoundary[];
threats: Threat[];
mitigations: Mitigation[];
}
interface TrustBoundary {
id: string;
name: string;
from: string;
to: string;
protections: string[];
}
interface Mitigation {
threatId: string;
strategy: 'Mitigate' | 'Accept' | 'Transfer' | 'Avoid';
description: string;
status: 'Planned' | 'InProgress' | 'Completed';
owner: string;
}
まとめ
| ポイント | 内容 |
|---|---|
| STRIDE | 6カテゴリ(なりすまし、改ざん、否認、情報漏洩、DoS、権限昇格)で脅威を分類 |
| 脅威モデリングプロセス | 対象定義 → 脅威特定 → 脅威評価 → 対策計画 |
| DFD | データの流れと信頼境界を可視化する図 |
| 信頼境界 | セキュリティレベルが変わるポイント、脅威が最も発生しやすい |
| アタックツリー | 攻撃者の視点で攻撃手順を木構造で分析 |
チェックリスト
- STRIDEの6つのカテゴリを説明できる
- DFD(データフローダイアグラム)を作成できる
- 信頼境界を識別し、脅威を特定できる
- アタックツリーを使って攻撃経路を分析できる
- 脅威モデリングのプロセスを4ステップで実施できる
次のステップへ
次は「リスクアセスメント」を学びます。特定した脅威の深刻度を評価し、優先順位をつける方法を身につけましょう。
推定読了時間: 30分