Skip to the lesson
CivOps AI Academy · F19The IT Approval Package: Placement, Data Flows and the Documents IT Signs
0%

Chapter 1 · Their questions, in their language

What IT needs to see

IT rarely says no to a technology. It says no to a risk nobody can describe. The approval package describes yours completely: where the platform runs, what it connects to, which data it holds, who can reach it, and how it is changed and recovered. Built from what you made, it answers their questions before they ask.

25 min7 questionsShared responsibilityVendor evidence

By the end of this chapter you can

  • List the questions an IT or OT security team asks before approving a new system.
  • Explain shared responsibility on Vercel and Supabase: what the providers secure and what your company secures.
  • Gather the providers' assurance evidence: security reports and data processing terms.
  • Map your package to the frameworks your IT team already uses.

By now you have a working platform with access rules generated from one matrix, a proven security suite and a runbook. To IT, though, it is a new system arriving from outside their process. Their job is to know every system on the network and accept its risk on the company's behalf. Give them what they need in the form they use, and approval becomes a review instead of an argument.

The questions IT asks

IT asksWhat they are worried aboutPackage document
Where does it run, and who runs it?Unknown hosting; a single person holding the keysSystem description; account ownership (Session 1)
What does it connect to?A new path into the plant networkNetwork placement and data flows (chapter 2)
What data does it hold, and where?Sensitive data in the wrong place or countryData inventory and classification
Who can see and change what?Too much access; no record of who did whatAccess control statement from the matrix
How is it changed?Untested changes in productionChange control: the pipeline (Session 18)
Is it secure, and how do you know?Common web vulnerabilitiesSecurity test evidence: the OWASP suite (Session 17)
What happens when it breaks?No backups; nobody to callRunbook, backups and drill log (Session 18)

Shared responsibility

Running on Vercel and Supabase does not hand security to them. Both publish a shared responsibility model: they secure the infrastructure, the runtime and the database engine; you secure your accounts, your code, your access rules and your data [4][5]. IT will want to see that you know where the line is.

Shared responsibilityEight layers from accounts down to data centres. Your company secures accounts, data, access rules, application code; keys are shared; the providers secure the engine, runtime and hardware. LayerWho secures itAccounts, people and who may sign inYour companyTwo owners, two-step sign-in, leavers removedData and its classificationYour companyWhat is stored, for how long, who sees itAccess rules (row-level security)Your companyGenerated from the Role and Exposure MatrixApplication code and dependenciesYour companyReviewed changes, OWASP suite, updatesKeys and configurationSharedYou set and rotate; provider encryptsDatabase engine, backups, patchingProviderSupabase, per planHosting runtime, network, edgeProviderVercelData centres and hardwareProviderThe cloud providers underneath
Shared responsibility. The amber layers are yours. Each has a document in the package showing how you handle it.

Evidence from the providers

For the provider layers, IT accepts independent evidence rather than your word. Ask for it early; some reports need a signed non-disclosure agreement and a few days.

EvidenceWhat it showsWhere to get it
SOC 2 Type II reportAn independent auditor tested the provider's security controls over a period, usually a year [6]Vercel's and Supabase's security or trust pages [7][8]; some plans or an NDA may be required
Data processing agreement (DPA)How the provider handles your data, sub-processors and breach noticePublished legal pages for each provider [9][10]
RegionsWhich country the database and the app's servers run inYour Supabase project settings; your Vercel function region
Penetration test summaryAn outside firm attacked the serviceOn request, under NDA, if offered

Many IT teams send a security questionnaire, such as the Shared Assessments SIG [11] or the Cloud Security Alliance's CAIQ [12]. You answer for your layers; for the provider layers you attach their evidence. A complete package often replaces most of the questionnaire.

A worked example

An illustrative case, not a named plant. A 180-person plastics moulder: the plant manager sends IT a link to the platform and asks for approval. IT asks for a meeting, then sends a questionnaire of 140 questions, and three weeks pass. On the second attempt the same team sends the seven-part package below, the providers' SOC 2 reports and a one-page cover note mapping each part to NIST CSF functions. IT replies in four days with three questions, all answered in writing, and approves with one condition: a yearly re-review. The platform did not change between the two attempts; the evidence did.

Exercise · Find your IT team's checklist20 minutes

You need: Email or a call with your IT lead; your browser

You will learn what your own IT team needs before you build the package.

Outcome: Your IT team's own checklist, mapped to the package before you write a word of it.

Knowledge check

Who secures the access rules (row-level security) on a Supabase project?

Knowledge check

IT asks how they can trust the provider's data centre security. What do you give them?

Knowledge check

Which framework's six functions are Govern, Identify, Protect, Detect, Respond and Recover?

References

  1. NIST Cybersecurity Framework 2.0. https://www.nist.gov/cyberframework
  2. NIST SP 800-82 Rev. 3: Guide to Operational Technology (OT) Security. https://csrc.nist.gov/pubs/sp/800/82/r3/final
  3. ISA: ISA/IEC 62443 series of standards. https://www.isa.org/standards-and-publications/isa-standards/isa-iec-62443-series-of-standards
  4. Supabase Docs: Shared responsibility model. https://supabase.com/docs/guides/deployment/shared-responsibility-model
  5. Vercel Docs: Shared responsibility model. https://vercel.com/docs/security/shared-responsibility
  6. AICPA: SOC 2, controls at a service organization. https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2
  7. Vercel: Security. https://vercel.com/security
  8. Supabase: Security. https://supabase.com/security
  9. Vercel: Data Processing Addendum. https://vercel.com/legal/dpa
  10. Supabase: Data Processing Addendum. https://supabase.com/legal/dpa
  11. Shared Assessments: Standardized Information Gathering (SIG) questionnaire. https://sharedassessments.org/sig/
  12. Cloud Security Alliance: STAR registry and CAIQ. https://cloudsecurityalliance.org/star

Chapter 2 · Where it sits, what crosses each line

Network placement and data flows

IT's first question is whether the platform opens a path into the plant. With the design this course uses, it does not: every connection starts inside the company and goes out over HTTPS, and nothing on the internet can start a connection inward. This chapter turns that design into the network diagram, the firewall rules and the data flow diagram IT signs.

30 minOutbound 443 onlyNo inbound portsEvery flow checked with STRIDE

By the end of this chapter you can

  • Draw your platform's network placement on the Purdue levels, with the industrial DMZ.
  • Write the firewall rules the platform needs: a short allow list, everything else denied.
  • Draw a data flow diagram with trust boundaries and check each crossing with STRIDE.
  • Build a data inventory that classifies every table and states where it is stored.

Network placement

The platform has three kinds of users on the network: operator tablets on the plant Wi-Fi, office PCs and phones on the business network, and, if you planned one in Session 5B, a data connector that reads the historian. The connector belongs in the industrial DMZ (Purdue Level 3.5), the zone where every exchange between the plant and the outside stops, as in the CPwE reference design from F01 [1][2].

Network placementThe plant network holds PLCs, SCADA and operator tablets; the industrial DMZ holds a data connector; the business network holds office PCs; the cloud holds Vercel and Supabase. All connections start inside and go out over HTTPS on port 443. Plant (Levels 0–3)PLCs, SCADA, historianunchanged, no internetOperator tabletsown Wi-Fi zone, browser onlyIndustrial DMZ (Level 3.5)Data connectorreads the historian; sendssummaries outBusiness network (Level 4)Office PCs and phonesbrowser onlyCloud (company accounts)Vercelthe web app, HTTPS onlySupabasedatabase and sign-in, encryptedread443 outEvery arrow starts inside and goes out on HTTPS (port 443). No port is opened into the plant.
Network placement. All arrows point outward. The cloud never starts a connection into the plant or the DMZ.
  • Operator tablets are just browsers. They reach the Vercel address over HTTPS like any website. They need no access to PLCs, SCADA or the historian.
  • The data connector reads from the historian inside, and writes summaries out to Supabase over HTTPS, as a dedicated database role that may insert into one table and nothing else. If it has to connect to Postgres directly rather than through the HTTPS API, check Supabase's connection page: direct connections use IPv6 by default, while the connection pooler accepts IPv4 [3].
  • Nothing needs an inbound port. No VPN from the cloud, no port forwarding, no remote desktop into the plant. If someone proposes one, it is a separate approval.

Firewall rules: a short allow list

Default deny at the firewallThree allowed outbound HTTPS flows pass through the firewall: tablets and office PCs to the Vercel app, and the DMZ data connector to the Supabase API. Every inbound connection is refused. Firewall: default denyOperator tabletsVercel app443 outData connector (DMZ)Supabase API443 outOffice networkVercel app443 outanything inbound: refused
Default deny. Three outbound flows are allowed by name; everything else, and anything inbound, is refused.
#FromToPort and protocolWhy
1Plant Wi-Fi (operator tablets)Your platform's address on Vercel443 TCP, HTTPS, outboundOperators use the platform
2Office networkYour platform's address on Vercel443 TCP, HTTPS, outboundSupervisors and managers
3Data connector (IDMZ)Your Supabase project's address443 TCP, HTTPS, outboundSummaries from the historian
4Historian (Level 3)Data connector (IDMZ)The historian's read port, inbound to the DMZ onlyThe connector reads; it never writes back

Cloud services change their IP addresses, so write rules 1–3 by host name (most current firewalls support host-name rules) rather than by IP. On the Supabase side, network restrictions can limit direct database connections to the company's own public IP addresses, and SSL enforcement refuses unencrypted connections; switch both on and list them in the package [4][5].

The data flow diagram

A data flow diagram shows every place data is entered, stored and sent, and draws trust boundaries where data passes between zones you control differently. Every flow that crosses a boundary is checked against STRIDE (spoofing, tampering, repudiation, information disclosure, denial of service, elevation of privilege) [6][7].

Data flow diagramThree trust zones: plant (operator tablet, data connector), cloud (web app, sign-in, database) and development (GitHub, coding agent). Numbered flows cross the boundaries: entries, queries, summaries, pull requests and deploys. Plant and DMZCloud: company accountsDevelopmentOperatortabletDataconnectorWeb appVercelSign-inSupabase AuthDatabaseSupabase, row-level securityGitHubcode, CI, reviewsCoding agentno production keys1 entries2 queries3 summariespull requestdeployEvery flow that crosses a dashed boundary gets a STRIDE check and a line in the package
Data flow diagram. Three zones and their numbered flows. The coding agent sits in development and holds no production key.
FlowCrossesSTRIDE threat that matters mostControl in the platformProven by
1 Entries from the operator tabletPlant → cloudSpoofing: someone else enters under an operator's nameSign-in per person; sessions expire; row-level security by roleOWASP suite: authentication tests
2 Queries from the web appInside the cloudInformation disclosure: a supervisor reads another lineRow-level security generated from the matrixA test per role (Session 7)
3 Summaries from the connectorDMZ → cloudTampering: forged valuesA connector role that may only insert into one table; values clamped (Session 9)Clamp tests
Pull request and deployDevelopment → cloudElevation of privilege: an agent changes productionNo production keys for agents; branch protection; reviewPipeline exercise (Session 18)

The data inventory

List every table, what it holds, its classification and where it is stored. The migrations folder already lists the tables, so this is a generated document (chapter 3). The classification decides who may see a table and whether it may leave the site.

Data classificationFour levels from public to restricted. The platform keeps internal and confidential plant data under the matrix's roles and never stores restricted personal or financial identifiers. PublicProduct names, published addressesanyoneInternalDowntime, scrap counts, OEEsigned-in staffConfidentialRecipes, customer orders, costsroles in the matrixRestrictedNot stored: ID numbers, bank detailskept out of the platformClassify every table in the data inventory. The level decides who may see it and whether it may leave the site.
Data classification. Most plant data is internal or confidential. Restricted identifiers are kept out of the platform entirely.
Table (example)HoldsClassStoredKept for
downtime_eventsLine, start, end, reason, who entered itInternalSupabase, the project's region3 years
quality_checksMeasurements, limits, pass or fail, reviewerConfidentialSupabase, the project's regionAs your quality system requires
peopleName, work email, roleConfidential (personal data)Supabase Auth and one tableUntil the person leaves, then removed
audit_logWho did what, whenInternalSupabase, the project's region1 year or longer if required
Exercise · Draw your placement and flows35 minutes

You need: Paper or any drawing tool; your repository; your Supabase and Vercel settings

You will produce the two diagrams and two tables IT reads first.

Outcome: The network diagram, firewall table, data flow diagram and data inventory: the core of the package.

Knowledge check

Where should the data connector that reads the historian sit?

Knowledge check

Which firewall rule does the platform need into the plant network?

Knowledge check

A supervisor on Line 2 could read Line 3's records. In STRIDE terms, what is that?

References

  1. Cisco and Rockwell Automation: CPwE Industrial DMZ design (chapter 2). https://www.cisco.com/c/en/us/td/docs/solutions/Verticals/CPwE/3-5-1/IDMZ/DIG/CPwE_IDMZ_2_CVD/CPwE_IDMZ_2_Chap2.html
  2. NIST SP 800-82 Rev. 3: Guide to Operational Technology (OT) Security. https://csrc.nist.gov/pubs/sp/800/82/r3/final
  3. Supabase Docs: Connect to your database. https://supabase.com/docs/guides/database/connecting-to-postgres
  4. Supabase Docs: Network restrictions. https://supabase.com/docs/guides/platform/network-restrictions
  5. Supabase Docs: SSL enforcement. https://supabase.com/docs/guides/platform/ssl-enforcement
  6. OWASP Threat Modeling Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
  7. Microsoft Learn: Threat Modeling Tool threats (STRIDE). https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats

Chapter 3 · A package that cannot drift

Generate it from what you built

A hand-written approval document is out of date the week after it is signed. Yours is generated from the repository: the matrix becomes the access statement, the migrations become the data inventory, the workflows become change control. A check in CI regenerates it on every pull request, so what IT approved and what runs can never quietly part.

25 min7 documentsGenerated, then reviewedDrift blocks the merge

By the end of this chapter you can

  • Assemble the seven documents of the IT approval package and the cover note.
  • Brief your coding agent to generate the package from the repository, with no secrets in it.
  • Add a drift check to CI so a change to data, flows or access cannot merge without updating the package.
  • Run the sign-off: questions in writing, risks accepted by name, re-review triggers agreed.

What goes in the package

The package mapSeven sources in the repository, from the Role and Exposure Matrix to the vendor list, each generating one document of the IT approval package. What you built (in the repository)What IT reads (docs/it-package)Role and Exposure MatrixAccess control statementsupabase/migrationsData inventory and classificationEnvironment variable names,vercel.jsonNetwork placement and data flowsBranch rules and workflowsChange and deployment controlOWASP suite and clamp results (CI)Security test evidencedocs/runbook.md and drill logOperations and recoverypackage.json, vendor listThird-party and supplier riskGeneratoragent + script
The package map. Each document has one source of truth in the repository, so it is generated, not written.
DocumentContentsCSF 2.0 functionSource
0 Cover note (one page)What the platform does, who owns it, the decision you are asking for, open itemsGovernWritten by you
1 System descriptionPurpose, users, accounts and owners, regions, providersGovern, IdentifyREADME, Session 1 accounts
2 Network placement and data flowsPlacement diagram, firewall rules, data flow diagram with STRIDE tableProtectChapter 2; environment variable names
3 Data inventory and classificationEvery table, its class, where stored, how long keptIdentifysupabase/migrations
4 Access control statementRoles, what each sees and does, default deny, how leavers are removedProtectThe Role and Exposure Matrix
5 Change and deployment controlBranch rules, CI checks, review, rollbackProtectBranch rules and workflows
6 Security test evidenceLatest OWASP suite and clamp results, dependency and secret scanningDetectCI results
7 Operations and recoveryRunbook, RPO and RTO, backup plan, drill log, incident contactsRespond, Recoverdocs/runbook.md

The third column labels each document with the NIST CSF 2.0 function it answers, so IT can file it [4]. The structure follows the familiar shape of a system security plan, the document US federal systems use to describe a system and its controls before approval [1]. You do not need the federal detail; IT will recognise the shape.

Generate it

Your coding agent can read the repository and write the first draft of documents 1–7 in an hour. You check every line against the platform, because the package is a statement your company makes to its own IT team. Keep the diagrams as text (GitHub draws Mermaid diagrams inside Markdown files), so a change to a flow shows up as a change to a line [2].

A brief to your coding agent: generate the package
Write docs/it-package/ from this repository, one Markdown file per document:
1-system.md, 2-network-and-flows.md, 3-data-inventory.md, 4-access.md, 5-change-control.md, 6-security-evidence.md,
7-operations.md. Sources: README; supabase/migrations (every table, its columns, a proposed classification for me
to confirm); the Role and Exposure Matrix file (roles, screens, data sets); .github/workflows and the branch rules;
the latest CI results; docs/runbook.md. Draw the network placement and data flow diagram as Mermaid.
Name environment variables, never their values. Mark anything you are unsure of as TO CONFIRM.
Plain language for an IT reviewer. Open a pull request.

Keep it true: the drift check

The drift checkA pull request triggers CI to regenerate the package and compare it with the signed copy. If they match the check is green; if not, the merge is blocked until the package is updated and IT sees the difference. A pull requestadds table scrap_photosCI regeneratesdata inventory, flows,accessComparewith the signed packageSame: greenthe package still matchesDifferent: redupdate the package; IT sees thediffThe package cannot quietly drift from the platform: a mismatch blocks the merge
The drift check. A pull request that adds a table, a role or an outside connection cannot merge until the package says so too.

A small script regenerates the parts of the package that come straight from code, the table list, the roles and the outside hosts the code calls, and compares them with the committed package. Run it in CI next to the OWASP suite.

Node.js: a drift check for the data inventory
// scripts/package-drift.mjs: fails when the data inventory no longer lists every table the migrations create.
import { readFileSync, readdirSync } from "node:fs";
const sql = readdirSync("supabase/migrations").map((f) => readFileSync(`supabase/migrations/${f}`, "utf8")).join("\n");
const created = new Set([...sql.matchAll(/create table (?:if not exists )?(?:public\.)?"?(\w+)"?/gi)].map((m) => m[1].toLowerCase()));
const dropped = new Set([...sql.matchAll(/drop table (?:if exists )?(?:public\.)?"?(\w+)"?/gi)].map((m) => m[1].toLowerCase()));
const tables = [...created].filter((t) => !dropped.has(t));
const inventory = readFileSync("docs/it-package/3-data-inventory.md", "utf8").toLowerCase();
const missing = tables.filter((t) => !inventory.includes(`| ${t} |`));
if (missing.length) { console.error("Not in the data inventory:", missing.join(", ")); process.exit(1); }
console.log(`Data inventory lists all ${tables.length} tables.`);

Add the same kind of check for roles (every role in the matrix appears in the access statement) and for outside hosts (every host the code calls appears in the flows document). Each check is a few lines; together they mean the package is re-reviewed exactly when it needs to be, and never otherwise.

The sign-off

The approval cycleGenerate the package, IT reviews it, questions are answered and changes made until none remain, then risks are accepted by name. A new flow, vendor, kind of data, placement change or a year passing reopens it. Generatepackage from the repoIT reviewsagainst their checklistQuestionsanswered in writingChangesthrough the pipelineSign-offrisks accepted by nameuntil no questions remainRe-review when:A new data flow or vendorA new kind of dataA change in network placementOnce a year regardless
The approval cycle. Questions and answers go in writing, so the record shows what was asked and what was decided.

Approval is a decision by a named person to accept the remaining risk on the company's behalf. NIST's risk management framework calls it authorisation, and expects it to be revisited when the system or its risks change [3]. Make that explicit:

  • Open items and exceptions are listed in the cover note with an owner and a date (for example, "Plant Wi-Fi for tablets is not yet separated from Level 2: IT, by 30 November").
  • Risks accepted are named, with the person accepting them.
  • Re-review triggers are agreed: a new data flow or vendor, a new kind of data, a change of network placement, or a year passing.
  • The signed version is a tagged commit in the repository, so anyone can see exactly what was approved.
Exercise · Generate, check and send the package45 minutes

You need: Your coding agent, your repository, chapter 2's diagrams and tables, your IT lead's checklist

You will produce the package, prove it matches the platform and send it for review.

Outcome: An IT approval package generated from the platform, protected by a drift check, and in IT's hands.

Knowledge check

Why is the package generated from the repository rather than written by hand?

Knowledge check

A pull request adds a table for photos of scrapped parts. The drift check fails. What is the right response?

Knowledge check

What does the approval's sign-off record?

References

  1. NIST SP 800-18 Rev. 1: Guide for Developing Security Plans for Federal Information Systems. https://csrc.nist.gov/pubs/sp/800/18/r1/final
  2. GitHub Docs: Creating diagrams (Mermaid). https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-diagrams
  3. NIST SP 800-37 Rev. 2: Risk Management Framework for Information Systems and Organizations. https://csrc.nist.gov/pubs/sp/800/37/r2/final
  4. NIST Cybersecurity Framework 2.0. https://www.nist.gov/cyberframework

Chapter 4 · 12 questions · 80% passes

Final assessment

Twelve questions across the element. Score 80% (10 of 12) to pass. Your LMS records your score and each answer; you can review the chapters and try again.

15 min12 questions≈ 15 minutesRetake allowed

Choose one answer for each question, then submit. You will see the right answer and why for every question.

1. IT usually refuses a new system because of:
2. In the shared responsibility model, which layer is the provider's?
3. What independent evidence covers a provider's own security controls?
4. Which connection does the course's design open into the plant network?
5. Why write firewall rules for cloud services by host name?
6. Where does the historian data connector belong?
7. What does a trust boundary on a data flow diagram tell you?
8. Forged values sent by a compromised connector are which STRIDE threat?
9. Which data should the platform never store?
10. Which repository source generates the access control statement?
11. A pull request adds an outside service the code calls. What should happen?
12. How is the approved version of the package identified?