Direct answer
A requirement such as "restrict access to sensitive data" is a goal, not a control. First write a control objective (a plain statement of the outcome a set of controls must achieve), then pick controls (specific activities or technical mechanisms that each reduce part of the risk), then give each control its own test. There is no fixed number of controls: it takes as many as it needs to close every way the objective could fail. For the example below, seven, of which only some are technical: C2, C4 and C6 are technical mechanisms (software or network settings), C3 is a mix of a technical permission and a human approval, and C1, C5 and C7 are mostly procedural (people following a process). A requirement usually needs both kinds, because a technical control with no process to keep it accurate decays.
Step 1: Turn the requirement into an objective
Requirement: "restrict access to sensitive data". Objective (illustrative): Only authenticated, authorized people and services can read or change customer personal data in the production database, access is removed when no longer needed, and inappropriate access is detected. Good objectives say who, what, and what failure looks like, so they can be tested.
Step 2: Ask how the objective could fail, then add a control for each gap
| # | Control | Type | What it covers |
|---|
| C1 | Inventory and classify data stores holding customer personal data | Preventive | You cannot restrict what you have not found |
| C2 | Single sign-on with multi-factor authentication for database and admin access | Preventive | Proves who is asking |
| C3 | Role-based access granted only after manager approval, least privilege (minimum access needed for the job) | Preventive | Only the right people get in |
| C4 | Database in a private network with no public endpoint | Preventive | Removes a path around C2 and C3 |
| C5 | Quarterly review of who holds access, by the data owner | Detective | Catches access that accumulated over time |
| C6 | Access logging with an alert on bulk exports | Detective | Notices misuse that got past C1 to C5 |
| C7 | Access removed within one business day of someone leaving or changing role | Corrective | Closes stale access found by C5 or HR events |
Preventive controls stop the event, detective controls notice it after the fact, corrective controls fix what was found. Count check: 7 rows, C1 to C7.
Step 3: Many-to-many mapping
One objective maps to many controls (here, all seven), and one control can serve many objectives. C2 also supports an objective like "administrative actions are attributable to a person". Keep this mapping in a control matrix (a table linking each control to its objective, risk, owner, and requirement), so a change to one control shows what it affects. One filled-in row (illustrative): C5 | Quarterly review of who holds access | objective: only authorized people can read customer personal data | risk: access accumulates after role changes | type: detective | control owner (the person accountable for the control working): Head of Platform | data owner (the person who decides who may use the data): Director of Customer Data | requirement: the client contract's access clause | evidence (the records that prove the control ran): the signed review sheet for each quarter, with the removal tickets it raised.
Step 4: Test each control two ways
Design test: if the control operates exactly as written, would it meet its part of the objective? Operating test: did it actually run, consistently, over the period? When a control runs many times, you cannot check every run, so you take a sample: a small set of items drawn from the population, which is every occurrence of the control in the period. For example (illustrative), if 240 access grants were made in the quarter, the population is those 240 grants, and a test plan might pick 25 at random (so no one chooses only the tidy ones) and trace each to its approval. The size and method come from your test plan or auditor.
| Control | Design test | Operating test |
|---|
| C1 | Does the process cover all environments? | Compare the inventory with a cloud-account scan for unlisted stores |
| C2 | Is MFA enforced by policy, not optional? | Inspect the identity-provider setting; try a login without MFA on a test account |
| C3 | Does the approval step block access until approved? | Sample access grants and trace each to an approval |
| C4 | Is there any public route in the network rules? | Inspect current network configuration and run an external reachability check |
| C5 | Is the reviewer independent of the people reviewed, with a deadline? | Inspect each quarter's review evidence (open the signed review sheet, check the reviewer was not reviewing their own access, and check that each account marked for removal has a closed removal ticket) |
| C6 | Do thresholds fit normal export sizes? | Trigger a test export and confirm the alert and its response |
| C7 | Is the leaver list tied to HR records? | If 12 people left in the period, test all 12 (a population this small needs no sampling) and compare each person's HR leaving date with the date their access was removed; the control needs removal within one business day |
Trade-offs and pitfalls
- Stopping at C2 and C3 is the common weak answer: nothing then detects access that drifts over time.
- A control with no test is an assumption. Automated controls (C2, C4) are cheap to re-test; manual ones (C3, C5, C7) need samples and evidence.
- More controls is not better. Each one costs owner time, so drop a control whose risk another already covers.
- A framework or auditor may require specific controls; where it does, take their list as a floor and ask them to confirm.