Learn with Phoebe Β· Data Ops & Security

Learn Data Access Control with Phoebe

Access goes wrong in three directions at once and most teams only count one of them. Somebody holds a column they have no business seeing. Somebody else cannot do the job they were hired for, so the data reaches them through a shared spreadsheet with no logging at all. And a third pile of grants sits there needed by nobody, waiting for one compromised account to make it interesting. This course builds the machinery that handles all three: role hierarchies, row access policies, column masking with honest exception roles, tokenisation, secrets, and an access review that a pipeline produces rather than a person. Session 8 scores the finished set against 150 concrete access requests, and then shows what a single ACCOUNTADMIN grant does to it.

14sessions, two tracks
150access requests on the bench
109leaks from one shared role
8over-blocks from the usual over-correction
45min per session

Leader track πŸ”‘ Β· six sessions, no SQL

For whoever approves access, signs the review and answers the auditor. What the three counters are, who decides, and what to report monthly.

Builder track πŸ”§ Β· eight sessions, one policy set

One table, saltbox.customers at Saltbox, locked down control by control. Session 8 scores the finished set request by request.

🧱 Builder session 1 · start here

Grants from first principles

Securable objects, ownership as a privilege, the six system roles, and the direction privileges inherit. Then the written access design everything else is scored against.

β–Ά Start here
🌳 Builder session 2

A role hierarchy that survives a reorg

Functional roles against access roles, the two-layer pattern, and why granting a role to a role is the operation most people get backwards.

πŸšͺ Builder session 3

Row-level security

Row access policies, mapping tables, CURRENT_ROLE against IS_ROLE_IN_SESSION, and the limitations worth knowing before you ship one.

🎭 Builder session 4

Column security and dynamic masking

Masking policies with exception roles, policy tags, and the evaluation order: the row policy runs first, and a column cannot carry both kinds at once.

πŸ” Builder session 5

Tokenisation and pseudonymisation

Surrogate keys that keep rows joinable, format-preserving tokens, and the re-identification risk that makes a quasi-identifier as good as a name.

πŸ—οΈ Builder session 6

Secrets, keys and service accounts

Key rotation, short-lived credentials, and the four places a warehouse password ends up in a repo. Nothing in a dbt profile, ever.

πŸ” Builder session 7

Access review as a pipeline

Query history against grants, the unused-privilege report, over-grant detection, and evidence an auditor accepts without a meeting.

πŸŽ›οΈ Builder session 8

The policy bench

150 requests, five personas, three counters. One ACCOUNTADMIN grant puts 109 leaks and 30 standing privileges straight back.

πŸ”’ the capstone
start here foundations hands-on advanced and capstone

Choose your path πŸ—ΊοΈ

Three doors into the same policy set. Both tracks start at their own session 1, because the written access design is what makes everything after it arguable.

πŸ’Ό I approve access and sign the review L1 β†’ L3 β†’ L5 β†’ L6 the three counters, the friction budget, the evidence, the operating model
πŸ”§ I hold the grants B1 β†’ B2 β†’ B3 β†’ B4 β†’ B8 the design, the roles, rows, columns, then score the set
🎯 Everything, in order L1 β†’ L2 β†’ L4 β†’ B1 β†’ B5 β†’ B6 β†’ B7 β†’ B8 from one shared role holding everything to zero leaks, zero over-blocks and zero standing privileges

Your passport 🎫

Clear all three quiz questions in a session and it gets stamped. Fourteen stamps across both tracks, and they live in this browser only.

What is real here 🧾

A course about proving who can see what should be exact about its own claims.

ClaimStatus
The 150 access requestsEvery combination of 5 personas, 10 columns and 3 regions. Of those, 41 legitimately need a value in clear, 3 need it masked and 106 have no business being answered
The ground truthA written access design: per job, which columns are needed in clear, which masked, and which regions the job covers. Visible in the widget, not hidden in an answer key
The evaluationA real policy engine. Row policies are applied before masking policies, column grants come from the role split, masking transforms what the grants allowed. All three counters are counted from what came back
The ladder: 109, 94, 70, 22, 3, 0 leaksComputed in the browser. The step from 70 to 22 is the role split, which also takes standing privileges from 17 to 1
Strip every PII column: 0 leaks, 8 over-blocksArithmetic. All 8 are the support agent, across name, email, phone and support_notes in both regions they cover
Grant ACCOUNTADMIN: 109 leaks, 30 standing privilegesArithmetic, and identical to the opening state. The policies are still defined and deployed; a role above the policy layer is not constrained by them
Nothing on the bench is modelledUnlike a simulator, there is no human behaviour to estimate here. Every number is a count of policy outcomes against a written design
Snowflake role and policy behaviourRead from the vendor documentation: the system roles and their purposes, ownership and managed access schemas, primary versus secondary roles with the CREATE exception, and that a row access policy is evaluated before any masking policy on the same object
RBAC compared with ABACFramed per NIST SP 800-162, which defines ABAC as evaluating attributes of subject, object, operation and environment against policy rather than assigning static roles
SaltboxA fictional consumer lending startup. The failure patterns are ordinary ones; the company is not real

The knowledge map 🧠

Both tracks at a glance - hover a session to spotlight its concepts, click any node to jump in.