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 asks | What they are worried about | Package document |
|---|---|---|
| Where does it run, and who runs it? | Unknown hosting; a single person holding the keys | System description; account ownership (Session 1) |
| What does it connect to? | A new path into the plant network | Network placement and data flows (chapter 2) |
| What data does it hold, and where? | Sensitive data in the wrong place or country | Data inventory and classification |
| Who can see and change what? | Too much access; no record of who did what | Access control statement from the matrix |
| How is it changed? | Untested changes in production | Change control: the pipeline (Session 18) |
| Is it secure, and how do you know? | Common web vulnerabilities | Security test evidence: the OWASP suite (Session 17) |
| What happens when it breaks? | No backups; nobody to call | Runbook, 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.
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.
| Evidence | What it shows | Where to get it |
|---|---|---|
| SOC 2 Type II report | An 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 notice | Published legal pages for each provider [9][10] |
| Regions | Which country the database and the app's servers run in | Your Supabase project settings; your Vercel function region |
| Penetration test summary | An outside firm attacked the service | On 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.
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
- NIST Cybersecurity Framework 2.0. https://www.nist.gov/cyberframework
- NIST SP 800-82 Rev. 3: Guide to Operational Technology (OT) Security. https://csrc.nist.gov/pubs/sp/800/82/r3/final
- ISA: ISA/IEC 62443 series of standards. https://www.isa.org/standards-and-publications/isa-standards/isa-iec-62443-series-of-standards
- Supabase Docs: Shared responsibility model. https://supabase.com/docs/guides/deployment/shared-responsibility-model
- Vercel Docs: Shared responsibility model. https://vercel.com/docs/security/shared-responsibility
- AICPA: SOC 2, controls at a service organization. https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2
- Vercel: Security. https://vercel.com/security
- Supabase: Security. https://supabase.com/security
- Vercel: Data Processing Addendum. https://vercel.com/legal/dpa
- Supabase: Data Processing Addendum. https://supabase.com/legal/dpa
- Shared Assessments: Standardized Information Gathering (SIG) questionnaire. https://sharedassessments.org/sig/
- 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].
- 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
| # | From | To | Port and protocol | Why |
|---|---|---|---|---|
| 1 | Plant Wi-Fi (operator tablets) | Your platform's address on Vercel | 443 TCP, HTTPS, outbound | Operators use the platform |
| 2 | Office network | Your platform's address on Vercel | 443 TCP, HTTPS, outbound | Supervisors and managers |
| 3 | Data connector (IDMZ) | Your Supabase project's address | 443 TCP, HTTPS, outbound | Summaries from the historian |
| 4 | Historian (Level 3) | Data connector (IDMZ) | The historian's read port, inbound to the DMZ only | The 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].
| Flow | Crosses | STRIDE threat that matters most | Control in the platform | Proven by |
|---|---|---|---|---|
| 1 Entries from the operator tablet | Plant → cloud | Spoofing: someone else enters under an operator's name | Sign-in per person; sessions expire; row-level security by role | OWASP suite: authentication tests |
| 2 Queries from the web app | Inside the cloud | Information disclosure: a supervisor reads another line | Row-level security generated from the matrix | A test per role (Session 7) |
| 3 Summaries from the connector | DMZ → cloud | Tampering: forged values | A connector role that may only insert into one table; values clamped (Session 9) | Clamp tests |
| Pull request and deploy | Development → cloud | Elevation of privilege: an agent changes production | No production keys for agents; branch protection; review | Pipeline 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.
| Table (example) | Holds | Class | Stored | Kept for |
|---|---|---|---|---|
| downtime_events | Line, start, end, reason, who entered it | Internal | Supabase, the project's region | 3 years |
| quality_checks | Measurements, limits, pass or fail, reviewer | Confidential | Supabase, the project's region | As your quality system requires |
| people | Name, work email, role | Confidential (personal data) | Supabase Auth and one table | Until the person leaves, then removed |
| audit_log | Who did what, when | Internal | Supabase, the project's region | 1 year or longer if required |
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
- 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
- NIST SP 800-82 Rev. 3: Guide to Operational Technology (OT) Security. https://csrc.nist.gov/pubs/sp/800/82/r3/final
- Supabase Docs: Connect to your database. https://supabase.com/docs/guides/database/connecting-to-postgres
- Supabase Docs: Network restrictions. https://supabase.com/docs/guides/platform/network-restrictions
- Supabase Docs: SSL enforcement. https://supabase.com/docs/guides/platform/ssl-enforcement
- OWASP Threat Modeling Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
- 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
| Document | Contents | CSF 2.0 function | Source |
|---|---|---|---|
| 0 Cover note (one page) | What the platform does, who owns it, the decision you are asking for, open items | Govern | Written by you |
| 1 System description | Purpose, users, accounts and owners, regions, providers | Govern, Identify | README, Session 1 accounts |
| 2 Network placement and data flows | Placement diagram, firewall rules, data flow diagram with STRIDE table | Protect | Chapter 2; environment variable names |
| 3 Data inventory and classification | Every table, its class, where stored, how long kept | Identify | supabase/migrations |
| 4 Access control statement | Roles, what each sees and does, default deny, how leavers are removed | Protect | The Role and Exposure Matrix |
| 5 Change and deployment control | Branch rules, CI checks, review, rollback | Protect | Branch rules and workflows |
| 6 Security test evidence | Latest OWASP suite and clamp results, dependency and secret scanning | Detect | CI results |
| 7 Operations and recovery | Runbook, RPO and RTO, backup plan, drill log, incident contacts | Respond, Recover | docs/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].
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
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.
// 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
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.
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
- 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
- GitHub Docs: Creating diagrams (Mermaid). https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-diagrams
- NIST SP 800-37 Rev. 2: Risk Management Framework for Information Systems and Organizations. https://csrc.nist.gov/pubs/sp/800/37/r2/final
- 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
Your result
CivOps AI Academy
The IT Approval Package: Placement, Data Flows and the Documents IT Signs
Element F19 complete · Learner
Your LMS records this completion. For the CivOps Foundation certificate, finish the Foundation Course at https://civops.io/learn.