Threat model diagrams

STRIDE, generated from architecture you already drew.

Threat modelling stalls because it is treated as a separate artefact requiring a separate workshop. It is far cheaper when it reads the architecture diagram you already have: trust boundaries and data flows are exactly the inputs STRIDE needs.

When to use these

When not to

Common mistakes

A threat model with no trust boundaries produces nothing useful. The boundary is what makes a flow interesting. If every element is inside one boundary, the model has not been drawn yet.

Treat the generated register as a starting point that you argue with, not an answer. The value is in the threats you reject with a reason.

The 2 templates

Threat Model — Web App.puml

Browser, API, database: the shape most systems actually are.

Threat Model — Web App: rendered example
Show the source
@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
!include <threat/ThreatModel>

LAYOUT_TOP_DOWN()
hide stereotype
skinparam LegendFontColor #334155
skinparam LegendBackgroundColor #F8FAFC
skinparam LegendBorderColor #CBD5E1

AddBoundaryTag("zone_saas", $bgColor="#F3E5F5", $fontColor="#4A148C", $borderColor="#6A1B9A", $borderStyle="dashed", $legendText="Contracted SaaS — outside our perimeter")
AddBoundaryTag("zone_app", $bgColor="#DBEAFE", $fontColor="#1E3A8A", $borderColor="#2563EB", $borderStyle="solid", $legendText="Our cloud account — application")
AddBoundaryTag("zone_data", $bgColor="#FEF3C7", $fontColor="#78350F", $borderColor="#D97706", $borderStyle="solid", $legendText="Our cloud account — restricted services")

title Customer portal — trust boundaries (C2)

Person(user, "Customer", "Zone 1 — public internet")

TrustBoundary(edge, "Zone 2 — Contracted SaaS", "low", $tags="zone_saas") {
  Container_Ext(waf, "CDN / WAF", "Cloudflare", "Edge filtering, TLS termination and rate limiting")
  System_Ext(mail, "Email Provider", "Delivers transactional notifications")
}

TrustBoundary(dmz, "Zone 3 — Product application", "medium", $tags="zone_app") {

The rest of this template, and how to use it

Threat Model — AWS.puml

Cloud-hosted, with the boundaries a VPC and IAM imply.

Threat Model — AWS: rendered example
Show the source
@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
!include <threat/ThreatModel>

LAYOUT_TOP_DOWN()
hide stereotype
skinparam LegendFontColor #334155
skinparam LegendBackgroundColor #F8FAFC
skinparam LegendBorderColor #CBD5E1

AddBoundaryTag("zone_edge", $bgColor="#F3E5F5", $fontColor="#4A148C", $borderColor="#6A1B9A", $borderStyle="solid", $legendText="Our AWS account — public entry points")
AddBoundaryTag("zone_app", $bgColor="#DBEAFE", $fontColor="#1E3A8A", $borderColor="#2563EB", $borderStyle="solid", $legendText="Our AWS account — application runtime")
AddBoundaryTag("zone_data", $bgColor="#FEF3C7", $fontColor="#78350F", $borderColor="#D97706", $borderStyle="solid", $legendText="Our AWS account — protected data services")

title AWS data platform — trust boundaries (C2)

Person(analyst, "Analyst", "Zone 1 — public internet; submits customer datasets")

TrustBoundary(edge, "Zone 2 — Managed edge", "low", $tags="zone_edge") {
  Container(cdn, "Portal Delivery", "Amazon CloudFront", "Serves the portal and routes /api requests", $tags="internet_facing")
  Container(gateway, "Submission API", "Amazon API Gateway", "Validates OIDC tokens and request schemas", $tags="internet_facing+authn_oauth2")
}

TrustBoundary(app, "Zone 3 — Application runtime", "medium", $tags="zone_app") {

The rest of this template, and how to use it

Render these offline

Every template here ships in Gnomon and renders on your machine, with no account and no diagram uploads. The browser editor is free and needs no install.

Get GnomonOpen the browser editor

Analytics cookies (optional)

May we use Google Analytics to understand visits, product links and feature use? If you accept, Google receives usage and device information, including your IP address, and sets analytics cookies. We do not send your documents, filenames or account details. Advertising features are disabled.

Analytics is off until you accept. Your choice is saved on this browser for 180 days using necessary local storage. You can change it at any time in Analytics preferences. Closing this message rejects analytics. Read our privacy policy.