第1部 設計・アーキテクチャ
第2章 脅威モデリング — STRIDEとデータフロー図
「作ってから守る」のではなく「作る前に脅威を洗い出す」。設計段階で攻撃者の視点を持ち込み、構造的に弱点を見つける手法が脅威モデリングです。
🎯 この章で学ぶこと
- 脅威モデリングの4つの問いと、それが設計判断に効く理由
- データフロー図(DFD)の描き方と「信頼境界」の見つけ方
- STRIDEで脅威を体系的に洗い出し、CIA・認証・認可へ対応づける
- 洗い出した脅威に優先順位をつけ、緩和・受容・転嫁・回避で扱う
2.1 脅威モデリングとは
脅威モデリングとは、システムを作る(あるいは変更する)前に、「どこが、どんな攻撃にさらされ得るか」を構造的に洗い出し、対策を設計に織り込む作業です。攻撃を受けてから慌てて対処するのではなく、設計図の段階で攻撃者になりきって弱点を探します。第1章で触れた「攻撃者視点と防御者視点の往復」を、開発プロセスの中で制度化したものだと考えてください。
難しく考える必要はありません。脅威モデリングは、次の4つの問いに順番に答えていく営みに集約できます。この4つは Adam Shostack が広めた枠組みで、実務でも標準的に使われます。
| 問い | やること | 本章の該当節 |
|---|---|---|
| ① 何を作っているのか? | 対象をデータフロー図(DFD)で描き、構成要素と信頼境界を明らかにする | 2.2 |
| ② 何がうまくいかなくなり得るか? | STRIDEなどの分類で、各要素・各境界の脅威を洗い出す | 2.3・2.4 |
| ③ それにどう対処するか? | 緩和・受容・転嫁・回避のいずれかを、リスクの大きさに応じて選ぶ | 2.5・2.6 |
| ④ 十分な仕事をしたか? | 洗い出しと対応をレビューし、モデルを更新し続ける | 2.5 |
重要なのは、これが一度きりの儀式ではなく、設計が変わるたびに回す反復作業だという点です。新しいAPIを1本足す、外部SaaSと連携する、といった変更のたびに「②何がうまくいかなくなり得るか」を問い直します。完璧な網羅を目指すより、チームで対話しながら「見落としていた脅威に気づく」ことに価値があります。
専用ツール(Microsoft Threat Modeling Tool や OWASP Threat Dragon など)もありますが、本質はホワイトボードと付箋、あるいは1枚の図と表で十分に始められます。大切なのはツールではなく、設計を目の前にして「攻撃者ならどこを突くか」をチームで言語化する時間を取ることです。
2.2 データフロー図(DFD)と信頼境界
脅威を洗い出す前に、まず「何を作っているのか」を目に見える形にします。そのための道具がデータフロー図(Data Flow Diagram, DFD)です。DFDは以下の5種類の要素だけで、システム内をデータがどう流れるかを表現します。
| 要素 | 意味 | 例 |
|---|---|---|
| 外部エンティティ | システムの外にいて、データをやり取りする相手。制御できない | 利用者、外部API、ブラウザ |
| プロセス | データを受け取り、加工し、渡す処理の主体 | Webサーバー、認証処理、バッチ |
| データストア | データが保存される場所 | データベース、ファイル、キャッシュ |
| データフロー | 要素間を流れるデータそのもの(矢印で表す) | HTTPリクエスト、SQLクエリ |
| 信頼境界(trust boundary) | 信頼レベルが変わる境目。多くは点線で描く | インターネットと社内、アプリとDB |
この中でセキュリティ上もっとも重要なのが信頼境界(trust boundary)です。信頼境界とは、「ここから内側と外側では、データやリクエストの信頼度が違う」という境目を指します。たとえば「インターネット」と「自社のWebサーバー」の間、「Webサーバー」と「データベース」の間、「一般ユーザー権限」と「管理者権限」の間などです。
脅威は、境界を越えるところに集中します。境界の外から来るデータは信頼できないため、境界を越える瞬間こそ検証・認証・認可・サニタイズを行うべき地点です。DFDを描いたら、まず信頼境界に印をつけ、その線を横切るデータフローを重点的に見ます。「この矢印は、信頼できない側から来ていないか?」——これが脅威発見の出発点です。
実務的なコツとして、信頼境界をまたぐデータフロー(矢印)の本数を数えてみてください。それが、あなたが最低限守るべき「入口」の数です。入口が多いほどアタックサーフェス(2.6)は広がります。境界をまたぐ矢印を1本減らせるなら、それは最も確実な防御になります。
2.3 STRIDE — 脅威を体系的に洗い出す
DFDで対象が見えたら、次は「何がうまくいかなくなり得るか」を洗い出します。ここで思いつきに頼ると必ず抜けが出ます。そこで、STRIDEという6分類のチェックリストを使い、各要素・各データフローに対して機械的に問いかけます。STRIDEは6つの脅威カテゴリの頭文字です。
| 頭字 | 脅威 | 内容 | 脅かすCIA/性質 | 望ましい対策(セキュリティ特性) |
|---|---|---|---|---|
| S | Spoofing(なりすまし) | 他人や他システムになりすます | 認証(Authentication) | 認証(本人確認) |
| T | Tampering(改ざん) | データやコードを不正に書き換える | 完全性(Integrity) | 完全性保護(署名・ハッシュ) |
| R | Repudiation(否認) | やった行為を「やっていない」と否定する | 否認防止(Non-repudiation) | 監査ログ・署名 |
| I | Information Disclosure(情報漏えい) | 見せてはいけない情報が漏れる | 機密性(Confidentiality) | 暗号化・アクセス制御 |
| D | Denial of Service(サービス妨害) | 正規利用者が使えなくなる | 可用性(Availability) | 冗長化・レート制限 |
| E | Elevation of Privilege(権限昇格) | 本来ない権限を手に入れる | 認可(Authorization) | 認可・最小権限 |
STRIDEの美点は、入門で学んだCIA・認証・認可ときれいに対応していることです。SはCIAでいう認証(なりすまし対策)、Tは完全性、Iは機密性、Dは可用性、Eは認可、Rは否認防止です。「この要素はSpoofingされ得るか?Tamperingは?…」と6問ずつ問いかけるだけで、CIAの全方向を漏れなく点検できます。
実務では、DFDの要素ごとに「効きやすいSTRIDE」が決まっていることを利用すると効率的です。たとえば外部エンティティは主にS(なりすまし)とR(否認)、データフローは主にT・I・D、データストアはT・I・D(場合によりR)、プロセスは6種すべてが対象になります。この対応を頭に入れておくと、洗い出しが速くなります。
2.4 実践 — シンプルなWebアプリを脅威モデリングする
具体例で通しでやってみましょう。題材は「利用者がブラウザからログインし、自分のプロフィールを閲覧・編集できる」ごく一般的なWebアプリです。構成は次のとおりとします。
[利用者(ブラウザ)] --- HTTPS ---> [Webアプリ(プロセス)] --- SQL ---> [DB(データストア)]
外部エンティティ プロセス データストア
信頼境界①: インターネット / アプリサーバー(利用者とWebアプリの間)
信頼境界②: アプリサーバー / データ層(WebアプリとDBの間)
まず信頼境界①(利用者→Webアプリ)に注目し、この境界をまたぐ「ログインリクエスト」というデータフローにSTRIDEを当てていきます。
| STRIDE | この境界で考えられる脅威の例 | 設計に織り込む対策 |
|---|---|---|
| S なりすまし | 他人のパスワードを推測・使い回しで奪ってログインする | 多要素認証、レート制限、パスワードハッシュ(入門コース第12章) |
| T 改ざん | 通信経路上でリクエストを書き換えられる(中間者攻撃) | TLSで経路を保護(第6章で深掘り) |
| R 否認 | 「私はログインしていない/変更していない」と主張される | 認証イベントと操作の監査ログを残す(第7章) |
| I 情報漏えい | エラー画面が内部情報を漏らす、セッションIDが盗まれる | 詳細エラーの秘匿、Cookieに HttpOnly / Secure |
| D サービス妨害 | 大量ログイン試行でサーバーが応答不能になる | レート制限、CAPTCHA、リソース上限 |
| E 権限昇格 | 一般利用者が他人や管理者のプロフィールを操作できる | すべての操作でサーバー側の認可チェック(第3章のIDOR対策) |
次に信頼境界②(Webアプリ→DB)を見ます。ここで代表的なのはT(SQLインジェクションによる改ざん)とI(情報漏えい)です。SQLインジェクション自体は入門コース第10章の既知の話ですが、脅威モデリングの価値は「どのデータフローにその脅威が乗るか」を設計図上で特定できる点にあります。対策(プレースホルダ、DBアカウントの最小権限)を、この矢印に対して明示的に割り当てます。
同じ脆弱性でも、直すタイミングによってコストは大きく変わります。設計段階なら図を1本描き直すだけ、実装段階ならコードの手戻り、リリース後なら本番改修・データ移行・場合によっては漏えい対応と、後工程になるほど費用は一桁ずつ跳ね上がると言われます。脅威モデリングは「まだ図しかない、いちばん安い段階」で弱点を見つける行為です。多くの重大インシデントは、実は設計レビューで気づけたはずの認可漏れや境界の見落としから生まれています。作る前の30分が、作った後の数か月を救います。
2.5 洗い出した脅威にどう対応するか
脅威をすべて潰そうとするとコストが無限に膨らみます。第1章の「リスク = 発生可能性 × 影響度」に立ち返り、優先順位をつけて対応方針を選びます。個々の脅威に対して取れる選択肢は、原則として次の4つです。
| 方針 | 意味 | 例 |
|---|---|---|
| 緩和(Mitigate) | 対策を打って発生可能性や影響度を下げる。最も一般的 | MFA導入、入力検証、暗号化 |
| 受容(Accept) | リスクが小さい/対策コストが見合わないので、理解した上で受け入れる | 社内限定・低影響な機能の軽微なリスク |
| 転嫁(Transfer) | リスクを第三者に移す | サイバー保険、決済をPCI準拠の外部事業者に委託 |
| 回避(Avoid) | リスクの源となる機能そのものをやめる/作らない | 不要な情報を「そもそも保持しない」 |
ありがちな誤りは「すべて緩和しなければ」と気負うことです。実務では、影響度の低い脅威を意識的に受容する判断も立派なセキュリティ設計です。大切なのは、受容したことを記録し、根拠を説明できる状態にしておくこと。監査や事故のとき、「知らなかった」のか「理解した上で受け入れた」のかは天と地ほど違います。
優先順位づけには、影響度と発生可能性で脅威をランク付けする簡易な方法(高・中・低のマトリクス)で十分に始められます。DREADのようなスコアリング手法もありますが、数字の精密さより「チームで合意した優先順位」を持つことが目的です。そして④「十分な仕事をしたか」を問い、モデルを設計変更のたびに更新します。
2.6 アタックサーフェスを減らす
あらゆる緩和策の中で、最も確実で費用対効果が高いのはアタックサーフェス(攻撃対象領域)を減らすことです。アタックサーフェスとは、攻撃者がシステムに触れられる入口の総体——公開ポート、APIエンドポイント、入力フォーム、有効な機能、付与された権限、稼働中のサービスなどの合計です。
ここで発想を逆転させます。脆弱性を1つずつ塞ぐ「もぐら叩き」ではなく、「そもそも叩くべき穴を減らす」のです。存在しない機能は攻撃されず、閉じているポートは突かれず、保持していないデータは漏れません。具体的には次のような打ち手があります。
- 使っていない機能・エンドポイント・管理画面を無効化・削除する
- 外部に公開する必要のないサービスは内部ネットワークに閉じる
- アカウントやプロセスに与える権限を最小限にする(最小権限、第3章)
- 不要な個人情報を「そもそも集めない・保持しない」(データ最小化)
- 使っていないソフトウェア・ライブラリ・ポートを止める
脅威モデリングの過程でDFDを見直すと、「この外部連携、本当に必要か?」「この管理APIをインターネットに晒す意味はあるか?」といった問いが自然に浮かびます。機能を1つ削る判断は、対策を1つ足す判断より強い——これがアタックサーフェス削減の考え方です。
「将来使うかもしれないから」と有効化したまま放置された機能・ポート・アカウントは、攻撃者にとって格好の入口になります。実際、侵害の多くは「使われていないが生きていた」経路から起きます。使わないものはデフォルトで閉じる・消す。必要になったときに開けるほうが、開けっ放しを閉じ忘れるより何倍も安全です。
まとめ
- 脅威モデリングは「①何を作るか ②何が起き得るか ③どう対処するか ④十分か」の4問を反復する営み
- DFDで対象を可視化し、信頼境界をまたぐデータフローに脅威が集中することを見抜く
- STRIDEの6分類はCIA・認証・認可ときれいに対応し、漏れのない洗い出しを助ける
- 洗い出した脅威は緩和・受容・転嫁・回避から選び、リスクの大きさで優先順位をつける
- 最も確実な緩和は、機能・入口・権限・保持データを削ってアタックサーフェスを減らすこと
練習問題
「利用者がファイルをアップロードし、他の利用者がダウンロードできる」共有ストレージ機能を新設します。この機能にSTRIDEを当て、異なるカテゴリの脅威を3つ挙げ、それぞれに対策を1つずつ示してください。
解答を見る
正解は複数あり得ますが、たとえば次のように整理できます。
- T(改ざん)/ I(情報漏えい):権限のない他人のファイルを閲覧・上書きできてしまう → すべてのダウンロード/上書きでサーバー側の認可チェックを行い、URLの推測(IDOR)で他人のファイルに到達できないようにする。
- E(権限昇格)/ Tampering:悪意あるファイル(実行可能スクリプトなど)をアップロードされ、サーバーやダウンロード側で実行される → 拡張子・MIMEの検証、実行権限を与えない保存、可能ならコンテンツの無害化やサンドボックス。
- D(サービス妨害):巨大ファイルや大量アップロードでストレージ・帯域を枯渇させられる → ファイルサイズ上限、レート制限、容量クォータ。
加えてI(情報漏えい)として、アップロードされたファイルが検索エンジンにインデックスされる/直リンクで誰でも取得できる、といった脅威も重要です。
ある機能の脅威を洗い出したところ、「発生可能性は非常に低く、起きても影響は軽微」と評価される脅威が見つかりました。この脅威に対して「受容(Accept)」を選ぶのは妥当でしょうか。妥当だとすれば、受容する際にやっておくべきことは何ですか。
解答を見る
妥当です。リスク = 発生可能性 × 影響度が小さく、緩和コストが見合わないなら、受容は合理的なセキュリティ判断です。ただし、次の2点を欠かしてはいけません。(1)受容したことと、その根拠(なぜ低リスクと判断したか)を記録する。(2)前提が変わったら見直す——利用者数や扱うデータの機密度が上がれば、同じ脅威でも影響度は跳ね上がります。「暗黙のうちに放置した」のではなく「理解して受け入れた」状態を、文書として残すことが専門家の仕事です。
あるチームが「登録時に、当面使う予定のない住所・生年月日・電話番号も念のため全部集めておこう」と提案しています。アタックサーフェスとリスクの観点から、この提案にどう助言しますか。
解答を見る
データ最小化の観点から反対、あるいは慎重な再検討を助言します。保持する個人情報が増えるほど、漏えい時の影響度(=リスク)が上がり、保護のコストも上がります。「そもそも保持しないデータは漏れない」——これはアタックサーフェス削減の最も強力な形です。使う目的が明確でない個人情報は集めない/保持しないことで、緩和策を積み増すより確実にリスクを下げられます。加えて、目的外の個人情報の収集・保持は、個人情報保護の観点でも問題になり得ます。必要になった時点で、目的を定めて集めるほうが健全です。