<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Risk Management on Deevnet IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/</link><description>Recent content in Risk Management on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/index.xml" rel="self" type="application/rss+xml"/><item><title>Vulnerability Management</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/vulnerability-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/vulnerability-management/</guid><description>&lt;h1 id="vulnerability-management">
 Vulnerability Management
 &lt;a class="anchor" href="#vulnerability-management">#&lt;/a>
&lt;/h1>
&lt;p>How Deevnet learns about vulnerabilities in what it runs, checks its own code before it reaches a
site, and decides when a patch goes in. Parts of this are practice today; parts are planned, and are
marked so.&lt;/p>
&lt;hr>
&lt;h2 id="knowing-what-is-running">
 Knowing what is running
 &lt;a class="anchor" href="#knowing-what-is-running">#&lt;/a>
&lt;/h2>
&lt;p>Vulnerability management starts with an inventory, and Deevnet&amp;rsquo;s is the code: every host, OS image,
container image and firmware version is declared in inventory or in an image factory, pinned by
version or tag. &amp;ldquo;Are we affected?&amp;rdquo; is answered by searching the repositories, not by surveying
hosts.&lt;/p></description></item><item><title>Security Controls</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/security-controls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/security-controls/</guid><description>&lt;h1 id="security-controls">
 Security Controls
 &lt;a class="anchor" href="#security-controls">#&lt;/a>
&lt;/h1>
&lt;p>The controls that bound what a mistake or a compromise can reach. Each is summarized here with the
record that decided or built it; the design itself lives in those records.&lt;/p>
&lt;hr>
&lt;h2 id="network-segmentation">
 Network segmentation
 &lt;a class="anchor" href="#network-segmentation">#&lt;/a>
&lt;/h2>
&lt;p>The site network is split into zones by trust — management, trusted, platform, storage, tenant
transit, IoT, IoT vendor and guest
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/network-segmentation/">Network Segmentation&lt;/a>).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Default deny between zones.&lt;/strong> The core router allows only the inter-zone flows that are
declared in inventory, and removes anything it did not declare
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/2026/0007-core-router-zone-policy/">CHG-0007&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Joining a network is not authorization.&lt;/strong> A device on the IoT network still needs a credential
for every service it uses
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/0020-direct-device-access-to-tenant-services/">ADR-0020&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Guest is internet-only&lt;/strong>; IoT reaches the broker and the internet, not tenant workloads or
management&lt;/li>
&lt;/ul>
&lt;h2 id="tenant-isolation">
 Tenant isolation
 &lt;a class="anchor" href="#tenant-isolation">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>A routing domain per tenant.&lt;/strong> Tenants are separated by VRF, not by a firewall rule — there is
no route between them to filter (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/0001-tenant-network-fabric/">ADR-0001&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Every tenant-facing service is partitioned by the platform, not by the tenant.&lt;/strong> DNS updates are
bound to the tenant&amp;rsquo;s own zone by server-side key metadata; MQTT topics are prefixed by the API;
log partitions are selected by the proxy from routes the API wrote. A tenant cannot claim another
tenant&amp;rsquo;s identity in a payload&lt;/li>
&lt;li>&lt;strong>Tenants hold no substrate credential&lt;/strong> — one API token, nothing else
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/0015-tenant-onboarding-through-api/">ADR-0015&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h2 id="encryption">
 Encryption
 &lt;a class="anchor" href="#encryption">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>In transit&lt;/th>
 &lt;th>At rest&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>The Deevnet API&lt;/td>
 &lt;td>TLS, site CA&lt;/td>
 &lt;td>registry secrets in OpenBao&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>MQTT broker&lt;/td>
 &lt;td>TLS only; no plaintext listener&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Log store&lt;/td>
 &lt;td>TLS through an authenticating proxy&lt;/td>
 &lt;td>on the observability VM&amp;rsquo;s disk&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Substrate secrets&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>ansible-vault in the inventory; OpenBao for runtime secrets (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/0016-substrate-secrets-openbao/">ADR-0016&lt;/a>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Build secrets (the Proxmox token for Packer and the fabric)&lt;/td>
 &lt;td>TLS to OpenBao&lt;/td>
 &lt;td>OpenBao&amp;rsquo;s runtime copy; the inventory vault is authoritative. Never on disk on the Builder&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Terraform state store&lt;/td>
 &lt;td>&lt;strong>plain HTTP today&lt;/strong> — see the 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/risk-management/risk-register/">register&lt;/a>&lt;/td>
 &lt;td>on one disk&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wi-Fi&lt;/td>
 &lt;td>WPA2 with a per-tenant key (PPSK) on the IoT SSID&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The site runs its own certificate authority; clients trust &lt;code>site-ca.pem&lt;/code> rather than a public CA,
because nothing Deevnet serves is public.&lt;/p></description></item><item><title>Traceability</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/traceability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/traceability/</guid><description>&lt;h1 id="traceability">
 Traceability
 &lt;a class="anchor" href="#traceability">#&lt;/a>
&lt;/h1>
&lt;p>Every configuration choice in Deevnet should be explainable from records: &lt;strong>why&lt;/strong> it was decided,
&lt;strong>what&lt;/strong> was changed to make it so, and &lt;strong>what happened&lt;/strong> when it went wrong. Traceability is a risk
control — the risk it treats is a future operator (often the same person, months later) undoing a
deliberate choice because nothing said it was deliberate.&lt;/p>
&lt;hr>
&lt;h2 id="the-chain">
 The chain
 &lt;a class="anchor" href="#the-chain">#&lt;/a>
&lt;/h2>


&lt;script src="https://deevnet.github.io/deevnet-docs/deevnet-docs/mermaid.min.js">&lt;/script>

 &lt;script>mermaid.initialize({
 "flowchart": {
 "useMaxWidth":true
 },
 "theme": "default"
}
)&lt;/script>




&lt;pre class="mermaid">
graph LR
 A[ADR&lt;br>why] --> B[Change record&lt;br>what, and how to undo it] --> C[Pull requests&lt;br>the code]
 B --> D[Incident record&lt;br>what it cost, if it failed]
 D --> A
&lt;/pre>

&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Record&lt;/th>
 &lt;th>Answers&lt;/th>
 &lt;th>Numbered&lt;/th>
 &lt;th>Lives in&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>ADR&lt;/strong>&lt;/td>
 &lt;td>why this design, what else was considered, what it costs&lt;/td>
 &lt;td>&lt;code>ADR-NNNN&lt;/code>&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/">Decisions&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Change record&lt;/strong>&lt;/td>
 &lt;td>what was changed, the end state, the procedure, the undo, what actually happened&lt;/td>
 &lt;td>&lt;code>CHG-NNNN&lt;/code>, by year&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/changes/">Change Records&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Incident record&lt;/strong>&lt;/td>
 &lt;td>what broke, how it was found, why, what prevents a repeat&lt;/td>
 &lt;td>&lt;code>INC-NNNN&lt;/code>, by year&lt;/td>
 &lt;td>
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/incidents/">Incident Records&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Pull request&lt;/strong>&lt;/td>
 &lt;td>the exact code, reviewed and merged&lt;/td>
 &lt;td>per repository&lt;/td>
 &lt;td>GitHub&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="the-rules">
 The rules
 &lt;a class="anchor" href="#the-rules">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Every significant change has a record&lt;/strong>, opened before the change, closed with the outcome —
including what was &lt;em>not&lt;/em> tested (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/change-management/">Change Management&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Every incident has a record&lt;/strong>, even when the change that caused it already has one
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/incident-management/">Incident Management&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Records link both ways.&lt;/strong> A change names the ADR it implements and the PRs that carry it; an
incident names the change that caused it and the changes that fix it&lt;/li>
&lt;li>&lt;strong>Index pages are updated in the same commit&lt;/strong> as the record whose state changed, so the list and
the record never disagree&lt;/li>
&lt;li>&lt;strong>Numbers are never reused&lt;/strong>, and a superseded ADR stays, marked superseded, so the reasoning that
led to today is still readable&lt;/li>
&lt;li>&lt;strong>Standards and ADRs win over code.&lt;/strong> If a repository conflicts with them, the repository is the
defect&lt;/li>
&lt;/ul>
&lt;h2 id="using-it">
 Using it
 &lt;a class="anchor" href="#using-it">#&lt;/a>
&lt;/h2>
&lt;p>&amp;ldquo;Why does the router drop this?&amp;rdquo; → the rule is in inventory → its commit → the PR → the change
record → the ADR. If any link is missing, that is worth a follow-up, because the next person asking
will not have the context you have now.&lt;/p></description></item><item><title>Resiliency &amp; Limits</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/resiliency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/resiliency/</guid><description>&lt;h1 id="resiliency--limits">
 Resiliency &amp;amp; Limits
 &lt;a class="anchor" href="#resiliency--limits">#&lt;/a>
&lt;/h1>
&lt;p>This page is the resiliency half of 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/risk-management/">Risk Management&lt;/a>: the risks
Deevnet &lt;strong>accepts&lt;/strong> by running on the hardware it does, stated so the acceptance is deliberate. The
larger ones are also tracked in the 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/policies/risk-management/risk-register/">risk register&lt;/a>.&lt;/p>
&lt;p>The 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/">architecture&lt;/a> describes the platform as designed. This page describes what the
hardware underneath it cannot do.&lt;/p>
&lt;p>Both are true at once, and the second is the easier one to forget, because the first reads
like a datacenter: tenants, fabrics, authority boundaries, everything reproducible from code.
The 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/">design philosophy&lt;/a> already notes that Deevnet operates at a smaller
scale than the platforms it borrows from — but scale is not the interesting constraint.
&lt;strong>Resilience is.&lt;/strong> Deevnet runs on consumer hardware with no redundancy anywhere in the
critical path, and its recovery model is &lt;em>rebuild&lt;/em>, not &lt;em>failover&lt;/em>.&lt;/p></description></item><item><title>Risk Register</title><link>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/risk-register/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/policies/risk-management/risk-register/</guid><description>&lt;h1 id="risk-register">
 Risk Register
 &lt;a class="anchor" href="#risk-register">#&lt;/a>
&lt;/h1>
&lt;p>The known risks, how likely and how bad each is, how it is being treated, and the record that owns
it. An entry is added when a risk is identified — in an ADR, a change or an incident — and reviewed
when a related record changes state.&lt;/p>
&lt;p>&lt;strong>Likelihood&lt;/strong> and &lt;strong>impact&lt;/strong> are &lt;em>low / medium / high&lt;/em>. &lt;strong>Treatment&lt;/strong> is one of &lt;em>reduce&lt;/em>
(something is being done), &lt;em>accept&lt;/em> (deliberately lived with), &lt;em>avoid&lt;/em> (the design routes around
it) or &lt;em>transfer&lt;/em>.&lt;/p></description></item></channel></rss>