Gnomon › Templates › Threat model diagramsThreat 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 Any design review where data crosses a trust boundary. Before a security review, so the conversation starts from a register rather than a blank page. When you need a repeatable answer to "what did we consider?" When not to As a substitute for a penetration test. Modelling finds design flaws, not implementation ones. 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 Browser, API, database: the shape most systems actually are.
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
Cloud-hosted, with the boundaries a VPC and IAM imply.
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 Gnomon Open 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 .
Accept analytics Reject analytics