The previous lesson ended with an uncomfortable observation: POL-02 says third-party access "must be named, with MFA and just-in-time" and POL-04 says devices "must keep disk encryption active", but neither sentence protects anything on its own. Somebody has to configure the MFA, check that the 40 laptops really are encrypted, verify it periodically and leave a record that they verified it. That "somebody doing something checkable" is the control, the third vertex of the triangle you close here: the risk says what can happen, the policy says what we require, and the control is what makes it true. You will finish with the two classifications you have to master, Nimbus's control catalogue as a reusable artefact, the metrics that distinguish an implemented control from an effective one, and the traceability matrix that saves an audit.
Contents
- What exactly a control is and how it closes the triangle
- Classification by nature: administrative, technical and physical
- Classification by function: from preventive to compensating
- Why a risk needs controls from several functions
- Reference catalogues: CIS v8, ISO 27002 and NIST SP 800-53
- How a control is selected, and the cost everyone forgets
- Compensating controls: legitimate ones and excuses
- Nimbus's control catalogue
- Implemented is not effective: evidence, tests and metrics
- The risk → control → evidence traceability matrix
- Control drift: why controls degrade on their own
- What exactly a control is and how it closes the triangle
A security control is a specific measure, with an owner, that reduces the likelihood or the impact of a risk and whose operation can be checked. All three elements of that definition are equally mandatory: with no owner it is not maintained; if it reduces no identified risk it is decoration; and if it cannot be checked, you will never know whether it is still working.
flowchart LR
R["RISK (04-01)\nWhat can happen and how much it hurts.\nR-01, R-06..."]
P["POLICY (04-02)\nWhat we require and why.\nPOL-02 5.4.2"]
C["CONTROL (04-03)\nWhat is implemented and VERIFIED.\nC-03 just-in-time access"]
E["EVIDENCE\nLog, screenshot, report\nwith a date"]
R -->|"justifies"| P
P -->|"requires"| C
C -->|"reduces the residual of"| R
C -->|"produces"| E
E -->|"demonstrates to an audit (06-04)"| P
| Risk | Policy | Control | |
|---|---|---|---|
| Question it answers | What can happen? | What do we require? | What do we do and how do we prove it? |
| Document | Risk register | POL-NN | Control catalogue |
| Changes | When exposure changes | Every year | When the technology changes |
| If it is missing | You protect at random | The decision does not survive | Nothing that is written down happens |
And one point of vocabulary that avoids confusion: control, measure and safeguard are synonyms in practice. ISO 27002 says "control", CIS says "safeguard" and NIST says "control". What is worth distinguishing is a control from a tool: antivirus is a tool; "malware detected and contained on the endpoint, with the alert handled in under 4 hours" is a control. The tool without the process around it is not a control, it is a paid licence.
- Classification by nature: administrative, technical and physical
| Nature | What it is | Nimbus examples | Who maintains it |
|---|---|---|---|
| Administrative (organisational) | Rules, processes and decisions about people | POL-02; six-monthly access recertification; annual training; verification of payments through an alternative channel; supplier clauses | Marta, Sara |
| Technical (logical) | Configuration and software that enforces the rule | FIDO2 MFA; RLS in PostgreSQL; WHERE tenant_id; 120 s signed URLs; disk encryption; secret scanner in CI; immutable backups |
Lucía, Iván |
| Physical | Protection of the material environment | The lock on the Valencia office; a locked cabinet for the backup disk; a clear desk policy; secure document destruction | Lucía, Sara |
Three observations worth more than the table. The administrative ones are usually free and are the ones most often forgotten: of the 12 highest-return measures in 02-04, several of the zero-cost ones are administrative — the payment verification procedure, the quarterly review of third-party access or the written response plan. A technical control does not hold up without its administrative counterpart: installing MFA is technical, but deciding which accounts it is mandatory on, who authorises exceptions and who reviews coverage is administrative, and without that the coverage drops on its own with every new joiner. And Nimbus has little physical surface, not none: with half the staff remote, the relevant physical control is not the office door, but whether Iván's laptop is encrypted and locked in a café in Valencia.
- Classification by function: from preventive to compensating
This is the classification that genuinely changes decisions, because it describes at which moment of the incident the control acts.
| Function | When it acts | What it does | Nimbus example |
|---|---|---|---|
| Deterrent | Before | Discourages the attacker or the careless user | Session-recording notice on the bastion host; external e-mail banner; letting people know there is auditing |
| Preventive | Before | Stops it happening | FIDO2 MFA; closed security group; WHERE tenant_id; secrets manager; input validation |
| Detective | During or after | Discovers that it is happening or has happened | Alert on anomalous outbound volume; alert on administrative access outside the window; append-only audit table; monthly external scan |
| Corrective | After | Repairs the failure and removes the cause | Rotation of exposed credentials; patching to a deadline; revocation of tokens by kid; rebuilding the server |
| Recovery | After | Restores the service and the data | Restore from an immutable backup; failover to the secondary region; manual emergency procedure |
| Compensating | Permanent | Replaces a control that cannot be implemented | Cross-review of changes when there is no separation of duties |
Two points people get wrong. First: deterrent and preventive are not the same. A "CCTV in operation" sign deters; the lock prevents. In systems, the notice that the session is being recorded deters the consultancy's engineer from doing what they should not, but it does not stop them. Second: corrective and recovery are not the same either. The corrective removes the cause — you rotate the leaked credential; the recovery restores the state — you restore the database. Recovering without correcting leaves you restoring the same system over and over for the same attacker.
- Why a risk needs controls from several functions
If you only prevent, you do not find out when prevention fails. And prevention always fails eventually: that is the premise of the "assume breach" principle from 01-03. Applied to the ransomware incident in 02-06, the breakdown by function shows exactly where Nimbus's hole was:
| Function | Control that should have existed | Did it exist in 02-06? | What it would have changed |
|---|---|---|---|
| Deterrent | Session-recording notice when the consultancy connects | No | Little; the attacker was not the consultancy |
| Preventive | MFA on the A-19 access; secrets in a manager, not in .env |
No | Would have stopped the entry or cut off the escalation |
| Detective | Alert on access outside the window; alert on 1.2 TB of outbound traffic | No | Detection on day 0 or day 13 instead of day 20 |
| Corrective | Immediate credential rotation; session revocation | No, because nobody detected anything | Would have thrown the attacker out |
| Recovery | Immutable backups in a separate account, with a tested restore | No | Recovery in hours instead of weeks |
| Compensating | Cross-review of privileged access (there is only one Lucía) | No | Would have questioned the permanent access |
Nimbus had zero controls in five of the six functions, and that is the complete explanation of why an avoidable incident turned catastrophic. Notice the pattern: each function buys a different kind of time or harm. Prevention avoids the incident; detection reduces its duration — the variable that most determines the harm, according to the conclusion of 02-06; recovery decides whether the company survives. Hence the practical rule: every High or Critical band risk in the 04-01 register must have, as a minimum, one preventive control, one detective control and one recovery control. If, while filling in the catalogue, one of those three boxes is left empty for a Critical risk, you have found your next task with no further analysis.
- Reference catalogues: CIS v8, ISO 27002 and NIST SP 800-53
Using a catalogue rather than inventing controls has three advantages: you do not forget whole categories, the vocabulary matches that of your customers and auditors, and each control comes with its written rationale. The drawback is that none of them is designed for 38 people, so you have to select.
| Catalogue | What it is | When to use it |
|---|---|---|
| CIS Critical Security Controls v8 | 18 controls with ~153 safeguards, ordered by priority and grouped into implementation groups | The best option to start with in an SME: it tells you what to do first |
| ISO/IEC 27002:2022 | 93 controls across four themes (organisational, people, physical, technological) with implementation guidance | When you are pursuing ISO 27001 certification or a customer requires it |
| NIST SP 800-53 | More than 1,000 controls in 20 families, extremely exhaustive | US public procurement or heavily regulated environments. Excessive for Nimbus |
| Annex A of ISO/IEC 27001 | The reference list against which applicability is justified in a certification | Only if you are going to certify (the detail belongs to 06-02) |
The CIS implementation groups are the most useful contribution for an SME:
| Group | Profile | Safeguards | Applicability to Nimbus |
|---|---|---|---|
| IG1 | Small organisation, no dedicated security team. This is "essential cyber hygiene" | ~56 | The realistic and sufficient target for this year |
| IG2 | With a security team and sensitive data from several customers | +74 | A 2-3 year target, or sooner if a large customer requires it |
| IG3 | Exposed to advanced attackers | +23 | Not applicable |
For Nimbus to set itself complete IG1 is a defensible, measurable and achievable decision, and it sounds far better to a customer than "we have various measures". Its 18 controls, with the ones that apply to Nimbus highlighted: asset inventory (1) and software inventory (2), data protection (3), secure configuration (4), account management (5) and access management (6), vulnerability management (7), audit logs (8), e-mail and browser protections (9), malware defence (10), data recovery (11), network infrastructure management (12), monitoring (13), training and awareness (14), supplier management (15), software security (16), incident management (17) and penetration testing (18).
And a warning: the catalogue does not replace your risk assessment. CIS orders by what happens to most people; your register orders by what happens to you. Start from the risk and use the catalogue so you forget nothing, not the other way round.
- How a control is selected, and the cost everyone forgets
flowchart TB
R["1. Risk from the register (04-01)\nR-02 destruction of backups"] --> B["2. Look it up in the catalogue\nCIS 11 - Data recovery"]
B --> E["3. Assess EFFECTIVENESS\nhow much it reduces the residual\nand which function it acts on"]
E --> C["4. Calculate TOTAL COST\nlicence + implementation +\nANNUAL OPERATIONAL LOAD"]
C --> U["5. Impact on the user\nand on operations"]
U --> D["6. Dependencies\nwhat it needs in order to work"]
D --> S{"Residual < appetite\nat an acceptable cost?"}
S -->|"Yes"| I["Implement and add\nto the catalogue"]
S -->|"No"| A["Find an alternative,\ncompensate or ACCEPT\nformally (04-01)"]
Step 4 is where almost every SME goes wrong, because they only count the licence. The real cost of a control has four components:
| Component | Example: managed EDR at Nimbus |
|---|---|
| Acquisition | 9,600 €/year in licences |
| Implementation | 20 hours of Lucía's time to roll it out on 40 laptops |
| Recurring operational load | 2-4 hours a week handling alerts ≈ 150 h/year |
| Friction cost | False positives that block Iván's work |
Those 150 hours a year are a third of the 440 Lucía has available for security. That is the cost that sinks security projects in SMEs: not the money, but the fact that the person who was supposed to do the other eleven measures spends the year reading alerts. The honest comparison is not "9,600 € against 900 € for MFA", but "9,600 € plus a third of the team's capacity, against 900 € plus two hours a month". Hence the derived rule: prefer the control that, once implemented, consumes no time. MFA, closing a security group, making a bucket immutable or WHERE tenant_id are controls that work on their own. Manual log review or case-by-case approval consume attention for ever, and attention is Nimbus's scarcest resource.
- Compensating controls: legitimate ones and excuses
A compensating control replaces a required control that cannot be implemented, providing equivalent protection by another route. It is legitimate when the impossibility is real and documented, the alternative protection is comparable in effectiveness, it is approved at the right level with an expiry — it is an exception under 04-02 — and it is verified like any other control. The Nimbus case: separation of duties is impossible. The principle from 01-03 requires that whoever develops does not deploy to production unsupervised, and that whoever administers the systems is not the same person who reviews their own access. With a single systems administrator, that cannot be met: Lucía creates accounts, assigns them to herself, reviews the log and approves her own changes.
| Ideal control (impossible) | Compensating control adopted | Comparable effectiveness |
|---|---|---|
| A second systems person to review Lucía's changes | Marta reviews monthly the privileged change log, even though she is not technical: she can see what was done and when, and ask | Partial but real: it introduces a second pair of eyes |
| Approval by a third party of privileged access grants | Every privileged grant requires Marta's approval and is recorded | High |
| Technical segregation between development and deployment | Deployment only through CI, with no manual access to production, and mandatory code review by another person | High: the pipeline acts as the third party |
| Rotation of the administrator's duties | A retainer with an external supplier that audits the configuration once a year | Low, but it is what is viable |
And the contrast, because half the compensating controls you see in practice are excuses:
| Legitimate compensating control | Excuse in disguise |
|---|---|
| "We cannot patch this legacy system within 7 days because the manufacturer certifies it; we isolate it on its own network, restrict its access and monitor it with a specific alert, with a retirement date in 12 months" | "We cannot patch because it is a lot of work; we already have antivirus" |
| "We cannot use MFA on this automated integration; we use short-lived credentials with minimal scope and an alert if they are used from an unexpected IP" | "MFA annoys the team; we have long passwords" |
The difference is that the legitimate one names the specific impossibility, describes a specific protection and has a date; the excuse invokes an inconvenience and offers a generic control that already existed anyway.
- Nimbus's control catalogue
The module's second reusable artefact. Field template:
# TEMPLATE - control catalogue. One block per control.
- id: "C-NN" # stable identifier
control: "" # what it does, in one sentence
nature: "" # Administrative|Technical|Physical
function: [] # Deterrent|Preventive|Detective|Corrective|
# Recovery|Compensating (may be more than one)
risks: [] # ids from the risk register (04-01)
policy: "" # the 04-02 statement that requires it
cis_ig1: "" # equivalent CIS v8 safeguard
owner: "" # a PERSON
status: "" # Planned|Being implemented|Implemented|Degraded
evidence: "" # WHAT proves it works and where it is kept
verification: "" # HOW it is checked
frequency: "" # how often it is verified
last_verified: "YYYY-MM-DD"Four controls written out in full, one from each main function:
- id: C-01
control: "Phishing-resistant MFA (FIDO2) on every privileged account"
nature: Technical
function: [Preventive]
risks: [R-01, R-05]
policy: "POL-02 5.2.1"
cis_ig1: "6.3 / 6.4 - MFA on externally facing applications and admin access"
owner: Lucia
status: "Being implemented"
evidence: "Monthly report from the identity provider: accounts with and without MFA"
verification: "Compare the list of privileged accounts against the list with MFA active"
frequency: Monthly
last_verified: 2026-03-01
- id: C-08
control: "Alert on anomalous outbound volume from the cloud account"
nature: Technical
function: [Detective]
risks: [R-01, R-04]
policy: "POL-10 (incident response)"
cis_ig1: "8.2 / 13.x - log collection and review"
owner: Lucia
status: Planned
evidence: "Alert configuration + log of firings and of how they were handled"
verification: "Quarterly test injecting a test transfer"
frequency: Quarterly
last_verified: null # never verified: does not count as implemented
- id: C-14
control: "3-2-1-1-0 backups with an immutable copy in a separate account"
nature: Technical
function: [Recovery]
risks: [R-02, R-01]
policy: "POL-09"
cis_ig1: "11.2 / 11.3 - automated and protected backups"
owner: Lucia
status: "Being implemented"
evidence: "Restore test report with the real elapsed time measured (04-06)"
verification: "Full restore to an isolated environment and integrity check"
frequency: Quarterly
last_verified: 2026-02-20
- id: C-21
control: "Monthly review by Marta of the privileged change log"
nature: Administrative
function: [Detective, Compensating]
risks: [R-09]
policy: "POL-02 5.3.3"
cis_ig1: "5.x / 8.x - account management and log review"
owner: Marta
status: Implemented
evidence: "Short signed minute listing the anomalies reviewed"
verification: "Existence of the month's minute and of its follow-up"
frequency: Monthly
last_verified: 2026-03-05The rest of the catalogue, in summary form:
| id | Control | Nat. | Function | Risks | CIS IG1 | Owner | Status |
|---|---|---|---|---|---|---|---|
| C-02 | Mandatory authentication on PostgreSQL and nimbus_api/nimbus_reports roles |
T | Prev. | R-03 | 6.x | Lucía | Implemented |
| C-03 | Just-in-time third-party access, 8 h and automatic revocation | T+A | Prev. | R-01 | 6.x | Marta | Planned |
| C-04 | Closed security groups: no 0.0.0.0/0 except 443 |
T | Prev. | R-03, R-07 | 4.x, 12.x | Lucía | Being implemented |
| C-05 | WHERE tenant_id filter and RLS in PostgreSQL |
T | Prev. | R-04 | 3.3 | Iván | Implemented |
| C-06 | 120 s signed URLs for attachments | T | Prev. | R-04 | 3.3 | Iván | Implemented |
| C-07 | Append-only audit table with 12-month retention | T | Detect. | R-04, R-01 | 8.2 | Iván | Implemented |
| C-09 | Alert on administrative access outside the agreed window | T | Detect. | R-01 | 8.x | Lucía | Planned |
| C-10 | Monthly external scan of the exposed surface | T | Detect. | R-07, R-03 | 7.x | Lucía | Planned |
| C-11 | Disk encryption on the 40 laptops with key escrow | T | Prev. | R-08 | 3.6 | Lucía | Being implemented |
| C-12 | Secrets manager and blocking secret scanner in CI | T | Prev.+Detect. | R-06 | 16.x | Iván | Planned |
| C-13 | SPF -all, DKIM and DMARC p=reject + external e-mail banner |
T | Prev.+Deterr. | R-05 | 9.x | Lucía | Being implemented |
| C-15 | Verification of payments and identity through an alternative channel | A | Prev. | R-05 | 14.x | Sara | Implemented |
| C-16 | Patch management to a deadline: 7 days for criticals | A+T | Correct. | R-03, R-07 | 7.3, 7.4 | Lucía | Being implemented |
| C-17 | Documented operational and response runbooks | A | Recov. | R-09 | 17.x | Lucía | Being implemented |
| C-18 | Six-monthly recertification of privileged access | A | Detect.+Correct. | R-01, R-06 | 5.x, 6.x | Marta | Planned |
| C-19 | Daily backup replicated to a secondary region | T | Recov. | R-10, R-02 | 11.x | Lucía | Implemented |
| C-20 | Annual training and phishing simulation (06-05) | A | Prev.+Deterr. | R-05 | 14.x | Sara | Planned |
| C-22 | Quarterly review of third-party access and contracts (04-04) | A | Detect. | R-01 | 15.x | Marta | Planned |
Three readings of the catalogue as a whole, which is where its value lies. First: counting statuses, only 7 of the 22 controls are implemented, so any residual risk in the 04-01 register that assumes the other 15 is miscalculated — remember the rule from 04-01: the residual is scored against the verified state. Second: there are 8 controls with a detective function and only 2 implemented (C-07 and C-21), which is exactly the blindness that produced the 20 days in 02-06. Third: the administrative controls are almost all free and almost all "planned", which confirms the conclusion of 02-04 that Nimbus is not short of budget, it is short of allocated time.
- Implemented is not effective: evidence, tests and metrics
| Implemented control | Effective control | |
|---|---|---|
| What it means | It is configured | It is configured, covers its whole scope and is still working today |
| How you know | Somebody did it | There is dated evidence and a recent verification |
| Example | "We turned MFA on" | "100 % of the 14 privileged accounts have MFA, checked on 1 March" |
| Typical failure | Partial coverage that nobody measures | — |
The difference is not academic: MFA enabled on 9 of 14 privileged accounts does not reduce the risk by 64 %, it reduces it almost not at all, because the attacker will go for one of the remaining 5. Controls are measured by coverage, not by existence.
9.1 Evidence and tests
Evidence is something you can show and that has a date: the export of the list of accounts with MFA, the restore test report, the minute of the monthly review. A test is the deliberate exercise of checking that the control acts: injecting a large transfer to see whether C-08 fires, or genuinely restoring the database to see whether C-14 works and how long it takes. Hence the rule that sums up this section: a control that has never been tested is in "planned" status, whatever those responsible for it say, and that is why C-08 appears with last_verified: null.
9.2 Metrics: KPIs and KRIs
A KPI measures whether the control works; a KRI warns that the risk is growing. Nimbus's four minimum indicators:
| Indicator | Type | Formula | Target | Control |
|---|---|---|---|---|
| % of privileged accounts with MFA | KPI | with MFA / privileged | 100 % | C-01 |
| % of endpoints with an encrypted disk | KPI | encrypted / active laptops | ≥ 98 % | C-11 |
| Mean time to patch criticals | KRI | mean of (patch − publication) | ≤ 7 days | C-16 |
| Age of the last restore test | KRI | today − last successful test | ≤ 90 days | C-14 |
# control_metrics.py - Calculation of Nimbus's four minimum indicators
# from the inventory data. Fictitious data.
from datetime import date
TODAY = date(2026, 3, 15)
PRIV_ACCOUNTS = [ # (id, has_mfa)
("lucia", True), ("marta", True), ("ivan", True), ("ci-deploy", False),
("consultora-01", False), ("root-cloud", True), ("backup-svc", False),
]
LAPTOPS = [ # (id, encrypted, active)
*[(f"NB-{i:02d}", True, True) for i in range(1, 37)],
("NB-37", False, True), ("NB-38", False, True),
("NB-39", True, False), # decommissioned: does NOT count in the denominator
("NB-40", False, True),
]
CRITICAL_VULNS = [ # (cve, publication, patch_date)
("CVE-2026-1001", date(2026, 1, 10), date(2026, 1, 14)), # 4 days
("CVE-2026-1042", date(2026, 1, 28), date(2026, 2, 11)), # 14 days
("CVE-2026-1077", date(2026, 2, 20), date(2026, 2, 24)), # 4 days
]
LAST_SUCCESSFUL_RESTORE = date(2026, 2, 20)
def pct(part, total):
return 0.0 if total == 0 else round(part / total * 100, 1)
# KPI 1 - MFA coverage. Measured over ALL privileged accounts, including
# service accounts and third-party ones: those are the ones the attacker uses.
with_mfa = sum(1 for _, mfa in PRIV_ACCOUNTS if mfa)
kpi_mfa = pct(with_mfa, len(PRIV_ACCOUNTS))
# KPI 2 - encryption coverage. The denominator is the ACTIVE devices.
active = [d for d in LAPTOPS if d[2]]
encrypted = [d for d in active if d[1]]
kpi_encryption = pct(len(encrypted), len(active))
# KRI 1 - mean time to patch critical vulnerabilities.
days = [(patched - published).days for _, published, patched in CRITICAL_VULNS]
kri_patching = round(sum(days) / len(days), 1)
# KRI 2 - age of the last successful restore test.
kri_restore = (TODAY - LAST_SUCCESSFUL_RESTORE).days
def status_flag(value, target, higher_is_better):
ok = value >= target if higher_is_better else value <= target
return "OK" if ok else "OFF TARGET"
print(f"C-01 MFA on privileged accounts : {kpi_mfa:>5} % "
f"(target 100 %) {status_flag(kpi_mfa, 100, True)}")
print(f"C-11 Encrypted endpoints : {kpi_encryption:>5} % "
f"(target 98 %) {status_flag(kpi_encryption, 98, True)}")
print(f"C-16 Mean patch time (critical) : {kri_patching:>5} d "
f"(target 7 d) {status_flag(kri_patching, 7, False)}")
print(f"C-14 Age of last restore test : {kri_restore:>5} d "
f"(target 90 d) {status_flag(kri_restore, 90, False)}")C-01 MFA on privileged accounts : 57.1 % (target 100 %) OFF TARGET
C-11 Encrypted endpoints : 92.3 % (target 98 %) OFF TARGET
C-16 Mean patch time (critical) : 7.3 d (target 7 d) OFF TARGET
C-14 Age of last restore test : 23 d (target 90 d) OKThree details of the code that are measurement decisions, not programming ones. The encryption denominator excludes decommissioned devices, because including them flatters the indicator — and choosing the denominator is where almost every security metric gets falsified. MFA is measured including service and third-party accounts: it is precisely ci-deploy, consultora-01 and backup-svc that are missing, which is to say exactly the 02-06 vector. And patching uses the mean, which hides the 14-day case; on a real dashboard it is worth showing the 90th percentile or the worst case alongside it, because the attacker exploits the worst case, not the mean.
9.3 Verifying a detective control with SQL
The append-only audit table from the previous modules lets you check that C-07 is still recording what it should:
-- 1) Is the control still alive? An absence of events = a silent logging failure.
SELECT date_trunc('day', ts) AS day,
count(*) AS events,
count(DISTINCT user_id) AS users
FROM access_audit
WHERE ts >= now() - interval '14 days'
GROUP BY 1 ORDER BY 1;
-- A day with 0 events on a platform with 40 active clinics does NOT mean that
-- nothing happened: it means the log stopped writing.
-- 2) Exfiltration KRI: users requesting many URLs for distinct attachments.
SELECT user_id, tenant_id, count(DISTINCT attachment_id) AS attachments,
min(ts) AS date_from, max(ts) AS date_to
FROM access_audit
WHERE event = 'attachment.url_issued'
AND ts >= now() - interval '24 hours'
GROUP BY user_id, tenant_id
HAVING count(DISTINCT attachment_id) > 50 -- threshold calibrated on real usage
ORDER BY attachments DESC;
-- 3) Control coverage: which critical endpoints are NOT logging?
SELECT e.endpoint
FROM critical_endpoints e
LEFT JOIN (SELECT DISTINCT event FROM access_audit
WHERE ts >= now() - interval '30 days') a
ON a.event = e.expected_event
WHERE a.event IS NULL;The first query is the most important and the one almost nobody writes: watch the watchman. A detective control that stops emitting events fails in silence, and silence gets read as calm. The third measures the coverage of the control, which is the difference between implemented and effective applied to logging.
- The risk → control → evidence traceability matrix
| Risk | Band | Controls (P / D / R) | Evidence | Last verification | Gap |
|---|---|---|---|---|---|
| R-01 Ransomware via a third party | Critical | C-01, C-03 / C-08, C-09 / C-14 | MFA report; alert log; restore report | 2026-03-01 | C-03, C-08, C-09 planned |
| R-02 Destruction of backups | High | — / — / C-14, C-19 | Quarterly restore report | 2026-02-20 | No detective control |
| R-03 PostgreSQL exposed | Critical | C-02, C-04 / C-10 / — | Security group export; scan report | 2026-03-10 | No recovery control (acceptable) |
| R-04 Attachment leak | High | C-05, C-06 / C-07 / — | CI tests; SQL audit query | 2026-03-12 | — |
| R-05 BEC fraud | High | C-13, C-15 / — / — | DMARC report; signed procedure | 2026-02-28 | No detective or recovery control |
| R-06 Exposed secrets | Critical | C-12 / C-12 / — | Scanner output in CI | — | Never verified |
| R-08 Lost laptop | Medium | C-11 / — / — | Estate encryption report | 2026-03-15 | — |
| R-09 Single systems person | Medium | C-17 / C-21 / C-17 | Review minutes; runbooks | 2026-03-05 | — |
This table is what you show in an audit, and it is what saves it (06-04). Not because it impresses, but because it answers on one page the three questions any auditor or customer asks: which risks have you identified, what do you do about each one and how do you prove it. Read it as a diagnostic tool too. The "Gap" column fills itself in by applying the rule from section 4 — preventive, detective and recovery for every High or Critical risk — and produces the quarter's work list with no further discussion: R-02 has no way of finding out that the backups are being deleted, R-05 has no way of knowing that somebody has fallen for a fraud, and R-06 has a control nobody has ever tested.
- Control drift: why controls degrade on their own
A control implemented and verified today will not still be working a year from now if nobody looks at it. No attacker is needed: the company's normal activity is enough.
| Cause of drift | Nimbus example | Detection |
|---|---|---|
| Growth | Four people are hired and nobody enables MFA for them: coverage drops from 100 % to 78 % | Monthly coverage KPI |
| Technical change | The cluster is migrated and the new security group reopens 5432 | Monthly external scan (C-10) |
| Forgotten exception | A 90-day exception nobody revoked (the consultancy case) | Monthly review of the exceptions register |
| Staff turnover | Whoever reviewed the alerts leaves and nobody inherits the task | Named owner in the catalogue |
| Fatigue | The alert generates 40 false positives a day and gets silenced | KPI of alerts handled |
| Silent failure | The backup agent stops running and nobody receives an error | Query 1 in section 9.3 |
Conclusion number 2 of the case studies in 02-06 said that in almost every incident the control existed and did not work: Target had alerts, Equifax had traffic inspection, Colonial had a VPN. Drift is the mechanism by which that happens, and the antidote is the frequency field in the catalogue. A control with no verification frequency is not a control: it is a memory of having done something.
Common Mistakes and Tips
- Confusing a tool with a control. Buying an EDR is not having malware defence; it is having a licence. Tip: define each control by its observable outcome, not by the product.
- Implementing with no owner. Orphan controls are the first to drift. Tip: the
ownerfield is a person, and if there is no candidate, the control is not ready to be implemented. - Scoring the residual risk with unverified controls. This is the direct link to the equivalent mistake in 04-01. Tip:
status: Implementedrequires a datedlast_verified. - Accumulating only preventive controls. This is Nimbus's imbalance, with 8 detective controls of which only 2 are implemented, and the cause of the 20 days of blindness in 02-06. Tip: review the catalogue by function, not by risk.
- Forgetting the operational load. A control that consumes 150 hours a year is abandoned in month four and stays in the catalogue as implemented. Tip: include the recurring cost in the decision and prefer what works on its own.
- Metrics with a convenient denominator. Measuring encryption over "the laptops we manage" rather than over all of them is make-up. Tip: define the denominator before calculating the numerator, and write it down.
- Confusing completing the catalogue with being secure. Covering the whole of IG1 is excellent and does not mean your main risk is treated. Tip: the catalogue prevents oversights; the risk register sets priorities.
- Compensating controls with no expiry. A permanent compensating control is a permanent exception. Tip: apply the same rules as the exceptions register in 04-02.
Exercises
Exercise 1 — Classify and complete by function
For each control, state its nature and its main function, and say which risk from the 04-01 register it treats:
- A banner marking e-mails that come from outside.
- Restoring the database from the immutable backup.
- A six-monthly review in which each lead confirms their team's access.
- Automatically blocking a code merge if the scanner finds a secret.
- Immediate rotation of an API key published by mistake in the repository.
- An alert when an administrative account connects outside the 08:00-20:00 window.
Then take risk R-05 (BEC fraud) and propose the detective and recovery controls it is missing according to the matrix in section 10.
Exercise 2 — Deciding between two controls using total cost
Nimbus is torn between two investments to treat R-04 (attachment leak):
| Option A: commercial DLP | Option B: authorisation tests in CI + SQL alert | |
|---|---|---|
| Annual licence | 7,200 € | 0 € |
| Implementation | 15 h of Lucía's time | 40 h of Iván's time |
| Operational load | 3 h/week reviewing alerts | 1 h/month tuning thresholds |
| Estimated reduction of R-04's ALE (19,200 €) | 45 % | 60 % |
Calculate the total annual cost of each option valuing an internal hour at 35 €, calculate the ROSI of each with the method from 04-01 and recommend one. Also state which function each option covers and whether, with it, R-04 would meet the rule in section 4.
Exercise 3 — Diagnosing a catalogue
You review another company's control catalogue and find: 34 controls, all with status: Implemented; none with a last_verified; 28 preventive, 6 detective, 0 recovery; the owner of 30 of them is "IT"; and there are 4 compensating controls with no expiry, one of them justified with "the manufacturer does not support MFA". State what each symptom reveals, what you would ask to confirm it and in what order you would correct it.
Solutions
Exercise 1
| # | Nature | Function | Risk |
|---|---|---|---|
| 1 | Technical | Deterrent (it warns, it does not stop) | R-05 |
| 2 | Technical | Recovery | R-02, R-01 |
| 3 | Administrative | Detective and corrective (it detects the surplus permission and removes it) | R-01, R-06 |
| 4 | Technical | Preventive (it blocks before the secret reaches the branch) | R-06 |
| 5 | Technical + administrative | Corrective | R-06 |
| 6 | Technical | Detective | R-01 |
Note number 3: it is the classic example of a control with two functions, which is why the catalogue's function field is a list. And number 1: many people would classify it as preventive, but the banner stops nothing — the user can still click; its effect is to change behaviour, which is the definition of a deterrent.
R-05 is missing: a detective control — an automatic alert on any change to a supplier's or customer's bank details in the invoicing system, plus a monthly review by Sara of bank account changes — and a recovery one: a documented procedure for recovering a fraudulent transfer, with the bank's direct contact, the real claim deadline and the police report, all of it written before you need it. That last one costs nothing and is exactly the kind of control nobody has until the day they need it.
Exercise 2
Total annual cost:
- Option A: 7,200 € + (15 h × 35 €) = 7,725 € in the first year; recurring = 7,200 € + (3 h/week × 48 weeks × 35 €) = 7,200 + 5,040 = 12,240 €/year.
- Option B: (40 h × 35 €) = 1,400 € in the first year; recurring = (12 h × 35 €) = 420 €/year.
ROSI against the ALE of 19,200 €, using the recurring cost:
- A: saving = 19,200 × 0.45 = 8,640 €. ROSI = (8,640 − 12,240) / 12,240 × 100 = −29 %. The control costs more than it saves.
- B: saving = 19,200 × 0.60 = 11,520 €. ROSI = (11,520 − 420) / 420 × 100 = +2,643 %.
Recommendation: option B, and the margin is so large that no reasonable correction of the estimates changes it. Notice where the difference lies: not in the licence, but in option A's 3 hours a week, which add up to 5,040 € a year of Lucía's time — and, worse, 144 hours out of her 440 available. It is exactly the mistake in section 6.
Functions: option A is mainly detective (it sees data leaving and warns); option B is mixed, because the authorisation tests in CI are preventive and the SQL alert over the audit table is detective. With B, R-04 would have preventive (C-05, C-06 and the new tests) and detective (C-07 plus the alert), but it would still have no recovery control, and in a data leak the recovery is not restoring anything: it is the response and notification plan in 04-05. So the complete answer is "B, and you also have to write the notification procedure".
Exercise 3
| Symptom | What it reveals | Confirming question | Priority |
|---|---|---|---|
34 of 34 "Implemented" and none with last_verified |
The status is a statement of intent, not a fact. You cannot tell implemented from effective | "Show me the evidence for control number 12 dated this quarter" | 1 |
| 0 recovery controls | If an incident happens, nothing is in place. It is Nimbus's profile before 02-06 | "When was the last tested restore and how long did it take?" | 2 |
| Only 6 detective against 28 preventive | Blindness: when prevention fails, nobody will find out | "Which alert fired last and who handled it?" | 3 |
| Owner "IT" on 30 controls | Orphan controls, safe candidates for drift | "Who, by name, verified control 7 last time?" | 4 |
| 4 compensating controls with no expiry | Permanent exceptions dressed up as controls | "What retirement date does the system that does not support MFA have?" | 5 |
Order of correction: 1 → 2 → 3 → 4 → 5. First verify a sample, because until you know what is true everything else is speculation — and you will probably discover that several "implemented" controls do not exist. Then cover recovery, which is what decides whether the company survives an incident. Then detection, which reduces its duration. Then assign owners, without whom everything above will drift within a year. And finally, formalise the compensating controls with an expiry. On the one that says "the manufacturer does not support MFA": it may be legitimate, but only if it comes with short-lived credentials with minimal scope, an alert on anomalous use and a replacement date for the system; without that, it is the excuse from section 7.
Conclusion
You have closed the triangle. You know that a control is a specific measure, with an owner, that reduces likelihood or impact and whose operation can be checked, and that without all three elements at once what you have is decoration. You also know how to tell a control from a tool: antivirus is a licence; "malware contained with the alert handled in under 4 hours" is a control.
You have the two classifications. By nature — administrative, technical and physical — with the observation that the administrative ones are usually free, are the ones most often forgotten and are what holds the technical ones up. And by function — deterrent, preventive, detective, corrective, recovery and compensating — with the two distinctions almost everyone confuses: deterring is not preventing, and correcting the cause is not restoring the state. Hence the rule that reorganises Nimbus's work: every High or Critical risk needs at least one preventive, one detective and one recovery control, because each function buys something different — avoiding the incident, shortening its duration or surviving it — and because the breakdown of the 02-06 ransomware showed zero controls in five of the six functions.
You know the reference catalogues and what using one is for: CIS v8 with its implementation groups and IG1 as a realistic and sufficient target for Nimbus this year; ISO 27002 with its four themes when certification comes into play; NIST SP 800-53 as a disproportionate option for an SME. And the warning that goes with them: the catalogue prevents oversights, but it is your risk register that sets priorities. You know how to select a control weighing effectiveness, user impact, dependencies and above all total cost, including the recurring operational load that is what really sinks security projects in an SME: 150 hours of alerts a year are a third of Lucía's capacity. Hence the preference for controls that, once in place, work on their own. And you know when a compensating control is legitimate — real impossibility, comparable protection, approval with an expiry and verification — and when it is an excuse, with Nimbus's honest case: separation of duties is impossible with a single administrator, and it is compensated with Marta's monthly review, approval of privileged grants, deployment exclusively through CI and an annual external audit.
You take away Nimbus's control catalogue with its 22 entries mapped to CIS IG1, whose three whole-catalogue readings are worth more than any single entry: only 7 are implemented, of the 8 detective ones only 2 are, and the administrative ones are free and almost all still pending. And you take away the decisive distinction between an implemented control and an effective one, with its metrics calculated — 57 % MFA, 92 % encryption, 7.3 days to patch, 23 days since the last restore — with the three measurement decisions the code hides (the honest denominator, including the service accounts that are precisely the 02-06 vector, and the fact that the patching mean hides the worst case which is the one the attacker exploits), and with the SQL query that watches the watchman, because a detective control that stops emitting events fails in silence and silence reads as calm. The lesson closes with the risk → control → evidence traceability matrix, which is what you show and what saves an audit because it answers any auditor's three questions on one page, and with drift: an implemented control degrades on its own through growth, technical change, forgotten exceptions, turnover, fatigue or silent failure, and the only antidote is the verification frequency.
But go through the catalogue once more and you will see there are controls whose effectiveness does not depend on Nimbus. C-03 requires just-in-time access from a consultancy that has its own processes and its own security. C-19 replicates backups to a region belonging to a provider whose decisions nobody at Nimbus controls. The code the CI deploys drags in hundreds of dependencies written by strangers. And the vector of the incident in 02-06 was not a Nimbus failure: it was a breach at the consultancy that Nimbus never even got to hear about.
In the next lesson, Third-Party and Supply Chain Risk (04-04), you will see why the perimeter includes companies you do not control and why execution can be outsourced but responsibility never can: Nimbus's third-party map, the return of the consultancy from 02-06 with a full analysis of what should have existed and what it really costs, the supplier life cycle including the exit phase everybody forgets, a due diligence questionnaire proportionate to the size of the supplier, the essential contractual clauses, the shared responsibility model in the cloud and the software supply chain with SBOM and dependency pinning.
Fundamentals of Information Security Course
Module 1: Introduction to Information Security
- Basic Concepts of Information Security
- Types of Threats and Vulnerabilities
- Principles of Information Security
- Assets, Attack Surface and Threat Actors
Module 2: Cybersecurity
- Definition and Scope of Cybersecurity
- Types of Cyber Attacks
- Social Engineering and Phishing
- Protection Measures in Cybersecurity
- Identity, Authentication and Access Control
- Cybersecurity Incident Case Studies
Module 3: Cryptography
- Introduction to Cryptography
- Symmetric Cryptography
- Asymmetric Cryptography
- Hash Functions, HMAC and Password Storage
- Cryptographic Protocols
- Key Management, Certificates and PKI
- Applications of Cryptography
Module 4: Risk Management and Protection Measures
- Risk Assessment
- Security Policies
- Security Controls
- Third-Party and Supply Chain Risk
- Incident Response Plan
- Disaster Recovery and Business Continuity
Module 5: Security Tools and Techniques
- Vulnerability Analysis Tools
- Monitoring and Detection Techniques
- Penetration Testing
- Network Security
- Application Security
- System Hardening and Endpoint Security
- Cloud and Container Security
Module 6: Best Practices and Regulations
- Best Practices in Information Security
- Security Regulations and Standards
- Personal Data Protection and GDPR in Practice
- Compliance and Auditing
- Training and Awareness
- Ethics, Legal Aspects and Responsible Disclosure
