learn-data-access-control-with-phoebe / Leader session 1 of 6
Learn Data Access Control with Phoebe · Leader session 1 of 6

Who can see what, and who decided

Access control arrives on a leader's desk as a queue of requests and, once a year, as a question from an auditor. Both of those hide the actual decision. Tonight is the shape of that decision: the three separate failures a data estate can have, the fact that each one has a one-line fix that ruins another, and the uncomfortable finding that blocking too much does not reduce exposure but relocates it somewhere with no logging at all. By the end you will have rough numbers for your own estate and a name written next to your most sensitive table.

🟢 Foundational Data and analytics leaders Anyone who approves an access request 45 min
0-3 · Welcome 3-20 · Three counters that trade 20-40 · Build-along: your own three numbers 40-45 · Q&A
Part 0

How the leader track works

Six sessions, 45 minutes each, aimed at the person who approves access and then has to explain it. Tonight the three counters and where a denied request really goes. Session 2 is roles against attributes and why role lists sprawl. Session 3 is least privilege that people can actually work with, including break-glass and the friction budget. Session 4 is classification and what masking commits you to. Session 5 is proof an auditor accepts, which is not a screenshot. Session 6 is the operating model: who approves, who reviews, and the three numbers worth reporting monthly. The example throughout is saltbox.customers at Saltbox, a consumer lending startup, whose ten columns run from a plan name to a national ID number, across three regions and five jobs.

Live = presented in the 45 minutes Self-study = the full depth, after class 🔍 Every diagram zooms

★ What you walk out with tonight. Three counters instead of one, and the reason a single-number report can call the same estate excellent and dangerous depending on which number it picked. A working answer to the question an auditor opens with, which is not "is this secure" but "who decided". And your own rough figures for standing privileges, which is the counter that outlives everybody who requested it.

LiveThree counters, and why one of them is not "requests denied"3 min▶

Access gets discussed as though there were one failure, a leak, and one dial, tightness. There are three failures and they trade against each other.

  • A leak is somebody holding data they have no business seeing. It is the only one that reliably gets reported.
  • An over-block is somebody unable to do the job they were hired for. Nothing on the platform can see it.
  • A standing privilege is a grant nobody currently needs, sitting there waiting for a compromised login to make it interesting.

Requests denied is not one of them, and it is the metric most often put on a slide. A high denial rate can mean the design is holding, or it can mean five teams are queueing for something they should already have. The number cannot tell you which, so it cannot be improved deliberately.

Self-studyThe vocabulary an approver needs4 min▶
  • Role - the thing permissions are attached to. People hold roles; roles hold permissions. Permissions attached straight to a person are the exception that has to be justified.
  • Least privilege - each role holds what its job needs and nothing more. Easy to say, and the reason it is hard is that "its job" was never written down. Session 3.
  • Masking - a column returns a transformed value rather than the real one, so the row is still usable and the value is not readable. It is what lets a job proceed honestly instead of being blocked. Session 4.
  • Row filter - a rule that limits which rows a role sees at all, usually by region or ownership. Columns and rows are separate dimensions, and a design covering only columns will pass review and still leak.
  • Access review - the recurring exercise that finds standing privileges and takes them back. It is the only routine that reduces that counter, and it decays the moment it becomes a spreadsheet.
  • Exception role - a named role allowed to see a masked column in clear, with a written reason. A class of data with no exception role is a much stronger statement than a class with a vague one.
Part 1 · covers the three counters and their cheap fixes

Three failures, not one

10 min live

Each counter has a fix that takes it to zero in an afternoon, and each of those fixes drives another counter up. That is the whole reason to report all three: a policy set is good when the three are low at the same time, which is a design problem rather than a tightening exercise.

Three counters, and the cheap fix that wrecks a neighbour Each tile is a real failure, with a real person who notices it Leaks somebody holds data they have no business seeing seen by: an auditor, later Over-blocks somebody cannot do the job they were hired for seen by: nobody, on a platform Standing privileges a grant nobody needs now, left for a stolen login seen by: the access review wrecks over-blocks wrecks leaks empty today, back next week Cheap fix: deny everything takes leaks to zero Cheap fix: grant everything takes over-blocks to zero Cheap fix: a spreadsheet sweep takes standing to zero today One shared analyst role, scored over 150 real access requests: 109 leaks 0 over-blocks 30 standing privileges a leaks-only report calls this bad. Nothing else does.
🔍 Click to zoom - every cheap fix pushes a different counter up.
LiveLeaks: the only counter anybody reports3 min▶

What it is. A role can read a value that its job has no use for. Not a breach, not an incident, just capability sitting there. At Saltbox the clearest one is a contractor in APAC able to read EU customers' revenue, which nobody ever intended and nobody ever revoked.

Who notices. An auditor, a customer complaint, or a journalist. All three arrive after the fact, which is why the count feels abstract until the day it does not.

The cheap fix and what it wrecks. Deny everything and leaks are zero by tomorrow. Over-blocks then become the largest number in your estate and, because nothing measures them, you will not see them. You will see the consequences instead: a shared spreadsheet, a shared login, a data request queue nobody can clear.

LiveOver-blocks: the counter with no dashboard3 min▶

What it is. A person whose job requires a value and who cannot get it. Saltbox's support agents need name, email, phone and the support notes column for the two regions they cover. Take those away and there are exactly eight of these, one per column per region.

Who notices. The person, their manager, and the customer waiting on the ticket. Nobody in the platform team, and nobody in the access review, because a review reads grants and grants only record what was given.

The cheap fix and what it wrecks. Grant everything and over-blocks are zero by lunchtime. Leaks go straight back to where they started, along with every standing privilege you had cleared, and the policies you wrote stay defined and deployed while ceasing to constrain anybody.

The only detector for an over-block is a colleague. Ask three questions of support and operations: what can you not see, what do you do instead, and where does that copy live. The third answer is the one worth writing down.

LiveStanding privileges: the number that outlives everybody3 min▶

What it is. A column a role can read in clear that the written design does not mark clear for that role. That is the definition an access review uses, and it deliberately does not care whether anybody has actually read the column. Capability is the exposure; use is just evidence.

Who notices. The access review, and then whoever compromises an account. A standing privilege is the difference between one stolen login being an inconvenience and being an incident.

The cheap fix and what it wrecks. A one-off spreadsheet sweep takes the number to zero on the day of the sweep. It does not wreck another counter so much as wreck itself: by the following month the exceptions are back, because the process that creates them was untouched. This is the counter that needs a routine rather than an effort.

LiveWhat one shared role costs, counted4 min▶

Saltbox's opening state is the one almost every growing company has: a single shared analyst role that everybody in data holds, because it is the only role anybody trusts to work. Scored against the written design over 150 concrete access requests, that state produces 109 leaks, 0 over-blocks and 30 standing privileges.

The report you commissionedWhat it says about this estate
Leaks only109 findings. Unacceptable, tighten immediately
Over-blocks only0 findings. Everybody can do their job, no action needed
Standing privileges only30 findings. A revocation project, framed as housekeeping
All threeAn over-granted estate with nobody complaining, which is exactly why it stayed that way

The two single-number reports are both accurate and they recommend opposite actions. An over-blocks-only report on the most over-granted state in the ladder calls it perfect, and it is right: nobody is blocked. That is what a one-counter scoreboard buys you.

Self-studyWhy 150 requests and not a percentage4 min▶

The Saltbox figures come from evaluating every combination of five jobs, ten columns and three regions, which is 150 requests. Of those, 41 legitimately need a value in clear, 3 need it masked, and 106 have no business being answered at all.

  • Counts beat percentages in a room. "109 leaks" starts an argument about which ones. "27 percent non-compliant" starts an argument about the denominator, and the denominator is where a scoreboard goes to die.
  • The ground truth has to be written first. Every counter here is a comparison against a design that says, per job, which columns are needed in clear and which regions the job covers. Without that table there is no leak, only a disagreement.
  • Every request counts the same, which is wrong on purpose. A leaked plan name scores exactly like a leaked national ID. Weighting by sensitivity is the first improvement to make, and it reorders the middle of the ladder without rescuing either of the two popular over-corrections.
Part 2 · covers where denied data goes, and who decides

Why an over-block is not the safe direction to fail

7 min live

The comfortable assumption is that denying too much is the conservative error. It is not, because the work does not stop. A support agent who cannot see a phone number still has a ticket to close, so the number arrives by another route, and every alternative route has less logging, less masking and a wider audience than the warehouse you just locked down.

The request is denied. The work is not cancelled. One denied column, three routes it arrives by instead WAREHOUSE support agent asks for phone, EU region DENIED by policy the ticket is still open where it arrives instead logging audience Route 1: a colleague pastes it into a shared chat channel logging chat retention audience everyone in it Route 2: an analyst exports a spreadsheet, refreshed weekly logging none at all audience anyone with link Route 3: the team shares one login that still works logging one shared name audience all of the team Warehouse leak count: 0 for all three routes Exposure did not fall. It moved to systems with no masking, no owner. Saltbox: contact columns removed after an audit, then a weekly spreadsheet in a folder shared with a contractor. The warehouse reported zero leaks throughout.
🔍 Click to zoom - the leak counter stays at zero the whole way across.
LiveThe Saltbox detour, start to finish3 min▶

Every route on that diagram has one thing in common: none of them appear in the warehouse. The counter you are watching is measuring the one place the data is no longer going.

Real world

After an audit, Saltbox removed the contact columns from every role. Within a fortnight the support team had a shared spreadsheet, refreshed weekly by an analyst with broad access, sitting in a folder shared with a contractor. Nobody was malicious and nobody was even quiet about it: the workaround was discussed in the support standup. The warehouse reported zero leaks throughout, so the access review that year had nothing to report.

Read the sequence carefully, because the audit made things worse in three separate ways. The data left a system with masking for one with none. It went from a per-person grant to a folder membership nobody reviews. And the person now doing the refresh needs broader access than the support team ever had, because a weekly export has to read everything anybody might ask for.

LiveWho currently decides access at your company3 min▶

Ask five leaders who decides access and you get five different answers, all sincere. The honest answer in most companies is: whoever is fastest to ask. A request lands in a channel, somebody with the ability to help helps, and that grant is now permanent policy created by a person who was not deciding policy.

  • The platform engineer holds the ability, so they get asked. They have no way to know whether the job needs the column, so they default to yes on a busy day and no on a nervous one.
  • The requester's manager knows the job, and typically cannot see what the grant actually opens up. Approving "read access to the customers table" is approving all ten columns including the national ID.
  • Security or the DPO knows the sensitivity, and is usually consulted after the pattern is set, at which point their only available move is a blanket restriction.
  • Nobody holds the combination, which is the actual finding. The decision needs the job, the sensitivity and the mechanism in one head or one document.
LiveApproving access and designing it are different jobs4 min▶

Approving is answering a request somebody else framed. Designing is deciding, ahead of any request, which jobs need which columns in which regions, so that most requests never need a human at all. A queue of approvals is what a missing design looks like from the inside.

The tell is in the wording. An approval that names a person and a table has decided nothing that can be reviewed later, because there is no statement to check the grant against next year.

✗ An approval that cannot be reviewed Approved. Please give Priya read access to the customers table so she can finish the churn analysis. Thanks for the quick turnaround.
★ An approval an auditor can read back to you Job: data scientist. Regions: EU, UK, APAC. Needed in clear: region, plan, mrr. Needed masked: customer_id (pseudonym, joinable, not identifying). Explicitly not granted: name, email, phone, dob, national_id, support_notes. Reason on file: churn model, retention programme. Expires: 2026-12-31, then recertified or removed. Approver: head of data. Reviewer: security.

The second version is longer, and it is also reusable: it is a decision about the job, so the next data scientist inherits it instead of starting a new thread. That is the moment access stops being a queue.

Self-studyThe number that outlives the person who requested it4 min▶

Standing privileges behave differently from the other two counters, and the difference is worth understanding before you are asked to sign anything.

  • They accumulate without any decision. Nobody grants a standing privilege on purpose. It is what a legitimate grant becomes once the project ends, the person moves team, or the incident it was issued for is forgotten.
  • They survive people. A role keeps its permissions when its membership changes, so a grant issued for one analyst in 2024 is inherited by everybody who joins that role afterwards.
  • Nobody dares remove them. The reason a role list never shrinks is that no single person knows what breaks. That is a documentation problem being treated as a risk decision.
  • They are what turns one stolen login into an incident. The blast radius of a compromised account is exactly the set of permissions it holds, needed or not, so this counter is the one that determines how bad a bad day is.

Which is why the counter belongs on a monthly report next to the other two, with a date attached to each grant. Any grant older than the incident that caused it is a standing privilege with a nicer name.

Build-along

Your own three numbers, roughly

★ 20 min · everyone builds

Rough is the point. A number you can defend to one decimal place next quarter is worth less tonight than three numbers you can say out loud in the next leadership meeting. Pick your most sensitive table and work down the steps.

Name the table and its most sensitive column. One table, one column. If choosing takes more than a minute, that hesitation is itself the finding: nobody has ranked the estate, so every access decision is being made without a sense of what is at stake.

Count roughly how many roles can read that column in clear. You do not need a query; ask the platform team for a number, not a list. Then ask how many humans sit inside those roles. The gap between those two numbers is usually the surprise, because a role with 40 members reads as one line on a report.

Count who currently cannot do their job. This one cannot be counted from the platform at all, so estimate it: how many people in support, operations or finance are waiting on somebody else to look something up for them. Write the estimate down even though it is soft, because a missing number gets treated as a zero.

Count the grants that predate anybody's memory. Ask for the oldest ten grants on the table with the dates they were made, and see how many have a reason anybody can still state. That count is your standing privileges, and it is the one that will keep growing while you are not looking at it.

Ask two operations colleagues the three questions. What can you not see, what do you do instead, and where does that copy live. Do this as a conversation and not a form, because the honest answer to the third question is mildly embarrassing and a form will get you a blank.

Name the decider for that table. One human being, by name, who owns the answer to "who should be able to see this". If you cannot name one, you have found tonight's real deliverable: not a policy, a name. Sessions 3 to 6 all assume that name exists.

Write the three numbers where they will be seen again. Not in a slide for one meeting. In whatever document your leadership team already reads monthly, next to the numbers you cannot avoid reporting. A security figure reported only when somebody asks is a figure that gets worse quietly.

Homework

Before session 2

30 min
  1. Finish the three counts for one table and put a date on each one, so next month is a comparison rather than a fresh estimate.
  2. Have the over-block conversation with two more colleagues, in different teams. Collect the workarounds, not the complaints. Each workaround is a copy of your data with an owner you have never met.
  3. Ask for the list of roles that can read your chosen table, with the number of humans in each. Bring it to session 2, because the shape of that list is the whole subject of the next session.
  4. Find the single role with the most members. Write down what it is for, in one sentence, without using the word "general".
  5. Write the name of the decider for your most sensitive table, and send that person a one-line message telling them. A decider who does not know they are the decider is not one.
Check yourself

Three questions

One shared analyst role scores 109 leaks, 0 over-blocks and 30 standing privileges. What would an over-blocks-only report conclude?

It calls the most over-granted state in the whole ladder perfect, and it is not wrong: nobody is blocked. A leaks-only report on the same estate calls it bad. Both are accurate, both are single numbers, and they recommend opposite actions.

An audit removes the contact columns from every role. Leaks fall to zero. Why is that not the conservative outcome?

Exposure moves rather than disappearing. At Saltbox it became a weekly spreadsheet in a folder shared with a contractor, while the warehouse reported zero leaks and the access review had nothing to look at.

Which of these is a standing privilege?

Capability is the exposure, and use is only evidence. This is the definition an access review works from, and it is why the number survives long after the person who asked for the grant has changed team or left.

Sources covered

What tonight maps to

✓ The three counters, and why each cheap fix wrecks another Leaks, over-blocks and standing privileges defined separately, with who notices each one and the one-line fix that drives another up.
✓ Why an over-block is not a safe failure The work does not stop, so exposure relocates. The three routes and the logging and audience of each, measured against a warehouse still reporting zero.
✓ Where denied data actually goes The Saltbox detour end to end, including the point that the person doing the weekly export needs broader access than the blocked team ever had.
✓ Approving access against designing it Who decides today, why nobody holds job, sensitivity and mechanism at once, and the approval wording that is still checkable a year later.
◐ RBAC compared with ABAC, and role sprawl Named tonight only as the mechanism behind the shared role. Session 2 does the comparison and the organisational causes properly.
◐ Least privilege, classification and masking Sessions 3 and 4. Tonight establishes only that a masked value is what lets a job proceed instead of being blocked.
◐ Evidence for an auditor, and the operating model Sessions 5 and 6, including recertification and the monthly report the three counters belong in.
· Data protection law and consent Not covered by design. What the law requires is a separate discipline; this is the machinery that carries out a decision once it has been made.
· Identity providers, SSO and MFA Not covered by design. Authentication sits upstream of every control here; all of this begins after a session already exists.

Session 1 cheat sheet

Three countersLeaks, over-blocks, standing privileges. Report all three or you are reporting none.
Every fix has a costDeny everything, grant everything, sweep once. Each takes one counter to zero and pushes another up.
One shared role109 leaks, 0 over-blocks, 30 standing privileges across 150 requests.
One number liesA leaks-only report calls that estate bad. An over-blocks-only report calls it perfect.
Over-blocks are invisibleNo platform can see them. The only detector is a colleague you asked.
Denied data still travelsChat, a spreadsheet, a shared login. Less logging, wider audience, no owner.
Standing privilegesA column a role can read in clear that the design does not mark clear for it.
Approving is not designingA queue of approvals is what a missing design looks like from the inside.