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

  1. What exactly a control is and how it closes the triangle
  2. Classification by nature: administrative, technical and physical
  3. Classification by function: from preventive to compensating
  4. Why a risk needs controls from several functions
  5. Reference catalogues: CIS v8, ISO 27002 and NIST SP 800-53
  6. How a control is selected, and the cost everyone forgets
  7. Compensating controls: legitimate ones and excuses
  8. Nimbus's control catalogue
  9. Implemented is not effective: evidence, tests and metrics
  10. The risk → control → evidence traceability matrix
  11. Control drift: why controls degrade on their own

  1. 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.


  1. 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.


  1. 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.


  1. 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.


  1. 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.


  1. 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.


  1. 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.


  1. 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-05

The 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.


  1. 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)     OK

Three 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.


  1. 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.


  1. 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 owner field 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: Implemented requires a dated last_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:

  1. A banner marking e-mails that come from outside.
  2. Restoring the database from the immutable backup.
  3. A six-monthly review in which each lead confirms their team's access.
  4. Automatically blocking a code merge if the scanner finds a secret.
  5. Immediate rotation of an API key published by mistake in the repository.
  6. 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

Module 2: Cybersecurity

Module 3: Cryptography

Module 4: Risk Management and Protection Measures

Module 5: Security Tools and Techniques

Module 6: Best Practices and Regulations

Module 7: Final Project

© Copyright 2026. All rights reserved