Data minimization, least privilege and audit trails
coreintermediateA privacy-conscious architecture is built on a handful of controls that each answer a different question about the same underlying risk: data that exists and can be read is data that can leak, be subpoenaed, or be misused. Data minimization asks "do we need to collect or keep this field at all" — the cheapest privacy control is never having the data in the first place, because a field never collected cannot be breached. Least privilege asks "does this specific service or person need access to this specific field," and answers it by granting the narrowest access that lets the job get done, rather than broad access "just in case." Audit trails answer "who accessed or changed this record, and when" — not to prevent access, but to make every access accountable and reviewable after the fact, which is often a compliance requirement in its own right (e.g. who looked at a patient record). Retention and deletion (covered on their own in the prior section) bound how long the data problem exists at all. Encryption protects data both at rest and in transit so that a storage or network compromise does not automatically mean a data compromise. Access reviews are the recurring, deliberate check — quarterly, say — that current access grants still match current need, because access naturally accumulates over time (a role change, a project ending) and nobody's job is to notice and revoke it unless a review forces the question.
Think of it as
Think of a bank vault run well: it does not keep more cash on hand than the day's business requires (minimization), each teller has a key that opens only their own drawer, not the whole vault (least privilege), every door swipe is logged with a name and a timestamp (audit trail), and cash is inside a safe, not sitting on a counter, even inside the already-secured building (encryption at rest). None of that matters if nobody ever checks who still has a working key months after they changed roles — the access review is the manager walking the vault's access list every quarter and asking "does this person still need this key," which is the only mechanism that catches privilege that was correct when granted and has since gone stale.
What we're doing: Apply the six controls to one new field being added to a signup form.
- 3
- The correct outcome of the review is often "do not collect it yet" — data minimization is the control that gets applied before any of the other five even become relevant, because a field that does not exist has nothing to secure.
- 6
- Least privilege here is deliberately narrower than "the user-profile service can see it" — scoping access to the one service that has an actual need for the field, not the service that happens to already own the surrounding record.
Why this works: Most fields added "in case we need it later" never get the other five controls retrofitted once a real use case does appear, because by then the field is already collected, already replicated into backups and analytics exports, and already read by more services than the original use case required — minimization is cheapest exactly at the moment before collection starts, which is also the moment it is easiest to skip.
Granting a service broad table access because it is convenient, not because it needs it
Wrong
Better
What you see: A vulnerability in the order-status service (which only ever needed a shipping address) is later found to have exposed customers' payment details and full purchase history, because the service's database credential could read the entire customers table, not just the two columns it used.
Why: Column-level or row-level grants take more setup than a blanket table grant, so under time pressure teams default to the broad grant "since it is already joining on customer_id anyway" — the convenience is real, but it means every service's blast radius on compromise is the whole table rather than the columns it actually needed.
- Minimize — only collect what is needed
- Least privilege — narrowest access that works
- Audit trail — who accessed, when
- Retention — bounded lifetime
- Encryption — at rest and in transit
- Access review — recurring re-check
Six controls and the specific risk each one closes
Remember: Six controls close six different parts of the same risk: minimization (do not collect what is not needed), least privilege (narrowest access that works), audit trails (accountability after the fact), retention/deletion (bounded lifetime), encryption (protects against storage/network compromise), and access reviews (catch stale grants). None of them substitutes for another — a real privacy architecture runs all six together.
See also: transit vs at rest · secrets audit logs and key rotation · hot warm cold and retention policies

