The previous lesson closed by pointing at what kept coming up as the GDPR was applied: the RoPA, contracts, the breach register, restore reports, documents dated before the incident. The Regulation calls that accountability, NIS2 calls it assessment of effectiveness, ISO 27001 calls it documented information and the customer calls it "send me the report". They are all asking for the same thing: being secure is not enough, you have to be able to demonstrate it. This lesson builds the system that makes that possible without costing three days of panic every time: what makes a piece of evidence valid, how it collects itself, how the traceability matrix we have been carrying since 04-03 is completed, how a real auditor behaves and what they ask when they request a sample, and how you respond to a finding without arguing or exaggerating.

Contents

  1. Being secure and being able to prove it are different things
  2. What evidence is and what makes it valid
  3. The traceability matrix, in its final form
  4. Automating evidence collection
  5. Types of audit: who does it and what is at stake
  6. The audit process, step by step
  7. How an auditor behaves and what they really ask
  8. Findings and the corrective action plan
  9. Internal auditing in a 38-person company
  10. Technical audit versus management audit
  11. Customer questionnaires as a de facto audit
  12. Compliance metrics and the two traps

  1. Being secure and being able to prove it are different things

Two organisations can have exactly the same real level of protection and get opposite results in front of a customer, an auditor or the AEPD. The difference is not security: it is the trail.

Proves little Proves well
Is secure The most frequent case in technical SMEs. Genuinely protected, it loses contracts, fails audits and in an enforcement file cannot evidence diligence The goal. Security exists and leaves a trail
Is not secure The honest starting point: there is work ahead and you know it The worst case of all: compliance theatre. A valid certificate and a real breach

Out of that table come the two statements that structure the lesson, and both must be held at once because each corrects the other's excess. Compliance without security is theatre: an ISO 27001 certificate over controls nobody verifies prevented none of the breaches in 02-06, and Equifax had a compliance programme with the patch unapplied. Security without evidence does not survive: not an audit, not a customer questionnaire, not a change of personnel, not an enforcement file where the weighing expressly values diligence; and it does not survive itself either, because with no record nobody knows whether the control still works, which is the thesis of 06-01. There is also a cost argument that usually convinces anyone who sees compliance as bureaucracy: evidence is cheaper if it is generated while doing the work than if it is reconstructed afterwards. Saving the output of the restore test costs zero minutes on the day the test is run, and costs half a day three months later, when you have to remember who did it, search the chat and write an after-the-fact report that is also worth less because it is not contemporaneous. Auditing is not expensive: reconstructing is expensive.


  1. What evidence is and what makes it valid

Evidence is any record that lets a reasonable third party conclude that a control exists and works: it is not an assertion, it is not a stray screenshot and it is not "we always do it". Five attributes, and if two are missing it is no longer evidence:

Attribute What it means How it breaks
Attributable; dated; intact You know who generated it and when, and it has not been altered since A PDF with no author; a screenshot with no clock and no metadata; an editable .docx in a shared folder
Reproducible; retained Another person, using the same procedure, would get the same result; and it survives for the required period "I looked and it was fine"; the e-mail of the employee who left; the chat purged after 90 days

Types of evidence and examples drawn from the whole course, fulfilling the promise made in 05-07: module 5 did not merely improve Nimbus's security, it kept generating exactly the material now needed.

Type What it proves Real example at Nimbus Origin
Approved document; exported configuration; system log That a decision exists and who took it; the real state of a system on a date; that something happened and who did it POL-02 and POL-04 with minutes and version; the A-02 bucket policy with public access blocked; the append-only audit table (C-07) 04-02, 05-02, 05-06
Tool report / third-party report An automated check; independent verification Output from trivy, prowler, lynis, pip-audit, checkov; the PT-2026-01 record and its retest 05-01, 05-03
Test result That the control works, not that it exists Restore report with measured RTO; screenshot of alert D-04 when tested 04-06, 05-02
Minutes; closed ticket; reviewed accesses That a review and a decision took place; that a process was followed end to end; effective recertification Signed monthly minutes for C-21; user onboarding with approver and profile; the half-yearly C-18 matrix 02-05, 04-03

Two criteria for choosing well. Always prefer evidence the machine generates on its own — an export, a log, a scanner's output — over evidence a person writes: the former is reproducible and hard to dress up. And the one that separates the good from the mediocre: the most valuable evidence is the evidence that shows the control detected something and it was corrected. A flawless restore report quarter after quarter looks suspicious; one that says "it worked, but it did not recreate the roles nimbus_api and nimbus_reports, corrected on 25/06 and re-verified" proves the test was real.


  1. The traceability matrix, in its final form

In 04-03 we sketched it as a control-management tool; here it reaches its definitive form, with the two columns that were missing — evidence and frequency — and with the mapping to requirements from 06-02. It is a single document that answers five questions: which risk am I covering, which rule requires it, what do I do, how do I prove it and who answers for it.

Risk Requirement Policy Control Evidence Owner Freq. Last verif.
R-01 Ransomware via a third party GDPR 32.1.b · NIS2 21.2.j · ISO A (identities) POL-02 5.2.1 C-01 FIDO2 MFA Monthly SSO report: privileged accounts with and without MFA Lucía Monthly 2026-07-01
R-01 NIS2 21.2.d · ISO A (suppliers) POL-08 6.2 C-03 Just-in-time 8 h (A-19) Session log + authorised requests Lucía Qtly 2026-09-30
R-02 Destruction of backups GDPR 32.1.c · NIS2 21.2.c POL-09 5.4 C-14 Tested immutable backups Restore report with measured RTO and hash Lucía Qtly 2026-06-18
R-04 Attachment leak GDPR 32.1.b · ISO A (development) POL-07 C-05/C-06 RLS + signed URLs Authorisation tests in CI + SQL audit query Iván Every release 2026-07-22
R-05 BEC fraud GDPR 32.4 · CIS 9.x POL-04 C-13 SPF/DKIM/DMARC p=reject Aggregate DMARC report + DNS zone screenshot Lucía Monthly 2026-07-01
R-06 Secrets / R-08 Laptop ISO A (development) · GDPR 32.1.a POL-07, POL-06 C-12 gitleaks · C-11 Disk encryption CI output and block history; MDM report Iván, Lucía Cont./monthly 2026-07-22
R-09 Single person ISO A (organisational) POL-01 C-17/C-21 Runbooks + monthly review Versioned runbooks + signed minutes Marta Monthly 2026-07-03
All GDPR 32.1.d · NIS2 21.2.f POL-01 Independent annual verification PT-2026-01 report + retest report Marta Annual 2026-09-20

And its version as data, which allows reports to be generated, expiries to be spotted and the dashboard to be fed with no manual work:

# traceability.yml - one entry per control. Lives in the repo, reviewed in PRs.
- control: C-14
  title: "3-2-1-1-0 backups with an immutable copy in a separate account"
  risks: [R-02, R-01]
  requirements: ["GDPR 32.1.c", "NIS2 21.2.c", "ISO 27001 A (backups)", "CIS 11.2/11.3"]
  policy: "POL-09 5.4"
  owner: Lucia
  status: Implemented
  verification: {method: "Full restore into an isolated environment with
                 integrity verification", frequency_days: 90,
                 last: 2026-06-18,
                 result: "PASS - RTO measured 3h12m against a 4h objective"}
  evidence: {id: EV-C14-2026Q2, type: "Test report", retention_months: 24,
             location: "evidence/2026/Q2/EV-C14-2026Q2.pdf", sha256: "e3b0..."}
  open_findings: []          # AC-2026-011 closed on 2026-06-25

Why keeping it up to date is cheaper than reconstructing it, with a sum Marta can take into a meeting: maintaining it costs around 10 minutes per control per quarter — note the date, link the evidence, close the finding — some 15 hours a year for 22 controls; reconstructing it for an audit or an urgent customer costs 40-60 hours of Marta's and Lucía's time over three days, with incomplete material because some evidence no longer exists: the log rotated, the chat was purged, the person left. And what is reconstructed afterwards is worth less to an auditor precisely because it is not contemporaneous. The up-to-date matrix costs a third and is worth twice as much. One implementation detail changes the outcome: it lives in the repository, not in a spreadsheet on somebody's desktop, with version control, pull request review and a weekly script that flags the controls whose last verification has passed its frequency_days.


  1. Automating evidence collection

The rule that makes everything above sustainable: if a piece of evidence has to be remembered, it will not be generated. A good part of it can be extracted on its own:

Evidence Automatable? How
MFA coverage; estate encryption; bucket and network configuration Yes Identity provider and MDM APIs or an osquery query; prowler or terraform show
Vulnerabilities, dependencies, authorisation tests and baseline Yes trivy and pip-audit reports, CI output per release, weekly lynis and ansible --check --diff
Reviewed accesses; restore test Partial The export and the execution are automatic; the review, the signature and the validation are not
Management review minutes; approval of a policy No Human decisions: you automate the reminder, never the minutes

The boundary is sharp and worth respecting: you automate what is a verifiable fact; you do not automate what is a judgement or a decision. Pretending otherwise produces script-generated minutes that no auditor accepts and that, worse, mean nobody reviews anything. A collector that seals what it gathers:

#!/usr/bin/env bash
# collect-evidence.sh - 1st of each month, from CI.
set -euo pipefail
PERIOD="$(date +%Y-%m)"; DEST="evidence/${PERIOD}"; mkdir -p "$DEST"
sso-cli users list --privileged --format json > "$DEST/C-01_mfa.json"     # C-01
nmap -sT -Pn -oX "$DEST/C-10_scan.xml" "$EXTERNAL_TARGET" >/dev/null      # C-10
terraform -chdir=infra show -json > "$DEST/C-04_infra.json"               # C-04
mdm-cli devices --fields hostname,encrypted,recovery_key_escrowed --format csv \
    > "$DEST/C-11_encryption.csv"                                         # C-11
trivy image --format json "$PROD_IMAGE" > "$DEST/C-16_trivy.json"         # C-16
pip-audit --format json > "$DEST/C-16_pip_audit.json"                     # C-16
psql "$DB_URL" -f queries/audit.sql --csv > "$DEST/C-07_audit.csv"        # C-07

( cd "$DEST" && sha256sum ./* > MANIFEST.sha256 )     # INTEGRITY
date -u +"%Y-%m-%dT%H:%M:%SZ" > "$DEST/COLLECTED_AT.txt"
cosign sign-blob --key "$COSIGN_KEY" --output-signature "$DEST/MANIFEST.sig" \
    "$DEST/MANIFEST.sha256"                           # ATTRIBUTION (03-06)
aws s3 sync "$DEST" "s3://nimbus-evidencias/${PERIOD}/" \
    --only-show-errors                                # RETENTION (05-07)

echo "[+] Period ${PERIOD}: collected, sealed and stored"
echo "[!] PENDING HUMAN ACTION: C-21 minutes (Marta) and alert closure"

Three design decisions make this count as evidence rather than a heap of files. The hash manifest gives integrity: anyone can check that the file has not changed. The signature gives non-repudiable attribution, using the same infrastructure as 03-06 and 05-07. And immutable storage with Object Lock stops anybody — an attacker erasing traces, or somebody in a hurry before an audit — from altering the history. Notice too that the script ends by saying what it cannot do: it is the best way of making sure the human part is not forgotten. The effect on the audit is what matters: when the auditor asks for "the evidence for the encryption control over the last twelve months", the answer is not a three-day search, it is a directory with twelve dated, signed and verifiable folders.


  1. Types of audit: who does it and what is at stake

Type Who does it What it looks for What is at stake Frequency at Nimbus
Self-assessment Yourself The real state before anybody else sees it Nothing formal; the cheapest and most useful Half-yearly
Internal Somebody in-house who does not execute what is audited Conformity with your own policies and the chosen framework Internal credibility; required by ISO 27001 (9.2) Annual
Customer The customer or a third party they engage That the supplier does what was agreed The contract On demand, 1-3 a year
Certification; regulatory An accredited body; an authority (the AEPD, NIS2) Conformity with the standard; legal compliance The certificate; a fine or an order to stop Stages 1+2 and an annual surveillance audit; only if there is a complaint

Three management observations that save grief. The self-assessment has the highest return and is the one almost nobody does: finding a gap yourself costs the fix; having an auditor find it costs the fix and explaining why you did not know. The customer audit is the most frequent and the worst prepared for: it arrives with two weeks' notice, it is carried out by somebody who does not know your architecture and the renewal is at stake, so you prepare for it beforehand, with the pack from section 11. And the regulatory audit is not prepared for: you arrive prepared, because when the AEPD writes the margin is days and only what already existed and was dated counts.


  1. The audit process, step by step

flowchart TD
    A["1. PLAN AND SCOPE\nWhich systems, period and framework.\nWhat is EXCLUDED and why.\nAgreed in writing"] --> B["2. OPENING MEETING\nSchedule, contacts,\nlogistics. The tone is set here"]
    B --> C["3. DOCUMENT REVIEW\nPolicies, SoA, matrix,\nrisks, contracts"]
    C --> D["4. INTERVIEWS\nWith whoever EXECUTES, not only whoever\nmanages. Cross-checked against the writing"]
    D --> E["5. TESTING AND SAMPLING\nA sample is requested and the trail\nis followed. The core of it all"]
    E --> F["6. FINDINGS + 7. CLOSING\nPreliminary, cross-checked with the\nauditee. The closing meeting is the moment\nto supply evidence, not to argue"]
    F --> H["8. REPORT\nClassified findings, scope,\nmethod, samples and conclusion"]
    H --> I["9. ACTION PLAN\nRoot cause, owner, deadline and\nEFFECTIVENESS VERIFICATION"]
    I -. "follow-up" .-> A

Two points decide the outcome. The scope (step 1) is the most important decision and the least discussed: it defines what is audited and, above all, what is left out. Too narrow and the report is useless to the customer who asked for it; too broad and it drives up the cost and guarantees irrelevant findings. Nimbus should ask for a scope covering the production SaaS platform and the processes that sustain it, excluding in writing anything that does not touch customer data. And sampling (step 5) is where you see whether the system is real: the auditor does not review all 22 controls to the same depth, they pick a few and chase them to the end. That is why a system that works withstands any sample, and a dressed-up one falls apart at the second question.


  1. How an auditor behaves and what they really ask

The biggest misunderstanding about audits is believing they consist of reviewing documents. A competent auditor does the opposite: they take a written assertion, ask for a specific sample and follow the trail to the end, looking for the point where the paper and reality diverge. Two simulated interviews, with what the auditor is checking in each question.

7.1 Interview with Lucía (systems)

AUDITOR: POL-02 requires phishing-resistant MFA on privileged access.
         Show me the last five administrative account grants and their approval.
LUCIA:   [Filters the ticketing system by "Onboarding - systems profile": five
         tickets with requester, approver, profile and execution date.]
   -> Checks: the process exists, leaves a trail and can be QUERIED live. If you
      had to search the chat, the finding would already be written.

AUDITOR: And how do I know that ALL privileged accounts have MFA, not these five?
LUCIA:   Monthly report from the identity provider: eight privileged accounts,
         eight with MFA. Twelve months of history, with a signed hash manifest.
   -> Checks: THE WHOLE POPULATION versus a sample. The difference between
      "these cases went well" and "the control covers the universe".

AUDITOR: In the February report I see 7 of 8. What happened?
LUCIA:   An account created on the 27th without MFA until 2 March: issue
         AC-2026-004, cause - account created outside the flow due to urgency -
         and the fix: the SSO no longer allows an account without a second factor.
   -> Checks: THE BEST THING THAT CAN HAPPEN IN AN AUDIT. A failure detected by
      the system itself, with a root cause and a verified fix. It is NOT a
      finding: it is proof that the control works.

AUDITOR: Your policy says 7 days to patch criticals. Give me the last month.
LUCIA:   Four criticals: three in 2, 3 and 5 days. The fourth, 11 days, on the
         legacy A-22, recorded as an exception with justification, expiry and
         compensation: A-22 is isolated and holds no customer data.
   -> Checks: HONESTY ABOUT THE DEVIATION. Saying "always within 7 days" and
      having the auditor find the 11-day one is worth infinitely less.

7.2 Interview with Iván (development)

AUDITOR: How do you guarantee that one customer cannot see another's data?
IVAN:    Three layers: centralised authorisation with current_tenant, which stops
         the identifier arriving as a parameter; RLS in PostgreSQL as a safety
         net; and authorisation tests in CI.
AUDITOR: Show me the test that would fail if somebody broke it.
IVAN:    [The test creates two tenants, authenticates as A, requests a resource
         of B and expects a 404. Shows its run in the latest pipeline.]
AUDITOR: Delete it and make it pass: I want to see the CI go red.
IVAN:    [Comments out the tenant check; the pipeline fails.]
   -> Checks: the assertion has an EXECUTABLE artefact behind it and the control
      is EFFECTIVE. "We check it in code review" is an assertion; a test you can
      break in front of the auditor is evidence.

AUDITOR: PT-2026-01 reported an IDOR in reports. How do I know it is closed?
IVAN:    The retest report with the finding verified, the commit that fixes it
         and a regression test that reproduces the exact case from the report.
   -> Checks: CLOSING THE LOOP. A finding with no retest is not closed.

AUDITOR: Who can deploy to production? And if the pipeline is down?
IVAN:    Nobody by hand: only the pipeline on the main branch, with an approved
         review and CODEOWNERS requiring a second reviewer on authentication and
         authorisation. For emergencies there is a documented procedure: Lucia
         executes it, Marta approves it and it triggers a post-hoc review. It has
         been used twice this year; here they are.
   -> Checks: THE ALTERNATIVE PATH. Controls are not bypassed on the main road
      but through the back door: the auditor always asks about the exception.

What these two interviews teach transfers to any audit: the auditor is not looking for perfection, they are looking for coherence between what is written, what people say and what the system shows; the incoherence is the finding. And an organisation that acknowledges its deviations with the record and the correction scores better than one that claims to have none and is contradicted by its own log.


  1. Findings and the corrective action plan

Type of finding What it means Consequence Example at Nimbus
Major nonconformity Total absence of a requirement, or a systemic failure Blocks certification until corrected and verified No risk analysis exists; no internal audit has been carried out; access control does not cover a system in scope
Minor nonconformity An isolated failure that does not compromise the system An action plan with a deadline; not blocking Two of twelve sets of minutes unsigned; an exception with no expiry
Observation / improvement A latent risk or a worrying trend; or the auditor's suggestion No formal obligation; worth attending to "Dependence on a single person may affect the continuity of the ISMS"

How to respond to a finding. There are two ways of doing it badly and one of doing it well. Arguing — trying to convince the auditor it is not a finding — wastes time and credibility unless there is a documentable factual error, and it sometimes triggers a deeper review. Overreacting — accepting everything and promising to fix it next week — produces actions still open at follow-up, and an unfulfilled corrective action is worse than the original finding because it calls the whole system into question. The right approach is to understand exactly what the finding is, repeating it in your own words until the auditor confirms; to supply the evidence that perhaps was not found if it exists and is dated; to accept what is true; and to commit to a fix with a root cause, an owner and a realistic deadline.

Corrective action template:

# AC-2026-023 - Corrective action
Source: 2026 internal audit · Minor NC 03 · Opened 2026-10-14
Owner: Lucia · Deadline: 2026-11-30

1. FINDING (verbatim). "Twelve sets of monthly minutes for the review of
   privileged changes (C-21) were reviewed. Two (April and August) are not
   recorded as signed or dated, so it cannot be evidenced that the review took
   place."
2. IMMEDIATE CORRECTION. No minutes will be signed retroactively: the absence is
   documented and the control is strengthened going forward.
3. ROOT CAUSE (five whys). They are unsigned because nobody produced the minutes;
   the minutes were not produced because it was a manual document; it was manual
   because the control was defined with no tooling support; and that happened
   because defining controls was prioritised over instrumenting them. **Root
   cause: the administrative controls were designed without deciding which
   artefact would evidence them or who would produce it.**
4. CORRECTIVE ACTION (the cause, not the symptom). a) The minutes become a
   recurring ticket with a template, generated on the 1st, owned by Marta:
   **closing the ticket IS the minutes** - period, anomalies, decisions and date.
   b) An alert if it is still open on the 10th. c) Review the other 8
   administrative controls so each has an evidence artefact (this prevents
   recurrence).
5. EFFECTIVENESS VERIFICATION - WITHOUT THIS IT IS NOT CLOSED. 2027-02-01, three
   cycles later. Criterion: the Nov/Dec/Jan tickets exist, closed on time and
   with the minimum content. Verified by: Marta. Result: [pending].
6. CLOSURE. IN PROGRESS, until step 5 returns PASS.

The two elements that mark out a real action plan are 3 and 5. Without a root cause you fix the symptom and the finding reappears next year under another name — signing two overdue sets of minutes would have changed nothing. And without an effectiveness verification on a future date, the action is declared closed on the day it is implemented, exactly when you still do not know whether it works. It is the logic of 04-05 and 05-03: no retest, no closure.


  1. Internal auditing in a 38-person company

ISO 27001 requires it (clause 9.2) and NIS2 pushes in the same direction, but its value predates any rule: it is the only way to know where you stand before somebody from outside tells you. The apparent obstacle is independence, and the minimum viable version is enough: whoever audits does not audit what they execute. With five people there are enough combinations:

Area audited Executed by Audited by
Access control and infrastructure Lucía Marta, with a prepared script
Secure development, CI and supplier management Iván / Marta Lucía; and an external consultant for what Marta approves
Data processing and rights; support and access to customer data Sara / Marta; Rubén An external consultant or the DPO; Iván

When no independence is possible — Marta auditing processes she approves herself — the honest solution is to buy two days of external auditor a year (1,500-2,500 €) for that part and declare it in the report: hiding the lack of independence is a finding, declaring it is an acceptable scope limitation.

# Internal Audit Programme 2027 - Nimbus Reservas, S.L.
Approved by Marta (CTO) on 2026-12-15 · Framework: ISO 27001 + CIS v8 IG1

1. OBJECTIVE AND SCOPE. Verify that C-01...C-22 are implemented, operate
   effectively and generate the evidence declared in the traceability matrix.
   Scope: production SaaS platform, development and support processes.
   Justified exclusion: HR administration (audited by the payroll bureau).
2. CRITERIA. POL-01...POL-11 · controls · CIS v8 IG1 · regulatory map (06-02).
3. SCHEDULE. Feb - access and infrastructure (C-01,03,04,11,18), Marta audits
   Lucia, 6 h. May - development and CI (C-05,06,07,12), Lucia audits Ivan, 6 h.
   Sep - suppliers, contracts and data (C-22, art. 28), external auditor with
   Marta and Sara, 12 h. Nov - backups, continuity and response (C-14,17,19),
   Ivan audits Lucia, 6 h.
4. METHOD. Document review · interview with the executor · **sampling following
   the complete trail** · effective testing of the control wherever possible
   (inject an alert, run a restore, break a test).
5. SAMPLING AND OUTPUTS. At least 5 items per control if the population exceeds
   20; the whole population if smaller. **The sample is chosen by the auditor,
   not by the auditee.** Report per cycle · corrective actions with root cause
   and effectiveness verification · annual report for management.

And the report template, deliberately short:

# Internal Audit Report - Cycle Feb/2027
Area: access and infrastructure · Auditor: Marta · Auditee: Lucia
2027-02-09 to 2027-02-11 · 6 h · Controls C-01, C-03, C-04, C-11, C-18
Criteria: POL-02, POL-06, POL-08, CIS v8 (5, 6, 12). Method: document review,
interview, sampling of 5 items and effective testing of C-03.
SUMMARY: 4 conforming · 1 minor nonconformity · 2 observations · 0 major.
| Id | Type | Control | Description | Action |
|---|---|---|---|---|
| NC-01 | Minor | C-18 | The September recertification was carried out, but there is no record of the effective withdrawal of 2 accesses marked for revocation | AC-2027-002 |
| OB-01 | Observ. | C-03 | Just-in-time works, but revocation depends on a single timer with no failure alert | AC-2027-003 |
| OB-02 | Observ. | C-11 | 1 machine out of 41 with encryption unverified (recent joiner) | Fixed during the audit |

POSITIVE ASPECTS (documented: they sustain the programme). C-03 tested live: the
access was revoked at exactly 8 h. Twelve months of evidence, signed and
verifiable in under 2 minutes.
CONCLUSION. The system operates effectively in the area audited. NC-01 does not
compromise the whole, but it affects a critical risk (R-01) and must be closed
before 2027-04-30.
Signed: Marta (auditor) · Received: Lucia (auditee) · 2027-02-11

The positive aspects section is not a courtesy: an audit programme that only produces bad news stops being welcome, and then people start preparing the photograph instead of showing reality.


  1. Technical audit versus management audit

They are constantly confused, and confusing them leads to believing you are covered when you are not.

Technical audit Management audit
Question Is this configuration correct and is it exploitable? Does the process exist, is it followed and is it demonstrated?
Object and examples Systems, code and configuration: pentest (05-03), prowler, lynis, code review Policies, processes and decisions: ISO 27001, ENS, internal audit, customer questionnaire
Finds / does not find An open bucket, an IDOR, obsolete TLS; it does not see that the policy does not exist or that nobody reviews anything That nobody has reviewed access for 14 months; it does not see the exploitable IDOR in production

Both are necessary because they fail in different places. Pentest PT-2026-01 found the residual IDOR, which no management audit would have seen; and a management audit found that two accesses marked for revocation were still active, which no pentest would have looked at. A system can be immaculately configured and have nobody to maintain it; and it can have an exemplary ISMS on top of vulnerable infrastructure. An important clarification: the pentest of 05-03 is evidence, not an audit. It attests to the requirement of "regular verification of effectiveness" — article 32.1.d of the GDPR, clause 9 of ISO 27001 — which is why it appears in the last row of the matrix in section 3. Presenting it as a conformity audit is a mistake auditors spot immediately and one that exposes what the pentest does not look at: governance, contracts, training, records and decisions.


  1. Customer questionnaires as a de facto audit

In 06-02 we saw how to answer them honestly; here, how to industrialise them, because they are the most frequent audit an SME undergoes and the one that scales worst: the first costs 20 hours and the fifth should cost 3. The reusable security pack, maintained by Marta and reviewed every six months:

# security-pack/index.yml - package delivered to customers under NDA
version: "2026.3"
reviewed: 2026-10-01
next_review: 2027-04-01
owner: Marta

public:    # no NDA: privacy policy and legal notice, 2-page security factsheet,
           # sub-processors and locations (art. 28), security.txt and VDP (06-06)
under_nda:
  - "Architecture and data flows (no IPs, no host names)"
  - "Control matrix C-01..C-22 with status and verification frequency"
  - "Executive summary of pentest PT-2026-01 + retest confirmation"
  - "Latest restore test (measured RTO/RPO) · BIA summary"
  - "Internal audit report · breach notification procedure"
  - "Processor contract (model)"

never_shared:
  - "Full pentest report with step-by-step reproduction"
  - "Diagrams with IPs, host names or exact versions"
  - "Raw configuration, firewall rules, infrastructure as code"
  - "Unredacted logs (they contain other customers' data)"
  reason: "It means handing over an attack map, and it may breach the
           confidentiality owed to other customers"

faq_approved_answers: "security-pack/faq.md"   # 90 standard questions

The answer bank (faq.md) is what produces the saving: each question answered once, with its approved wording, its associated evidence and its review date. When a new questionnaire arrives, 80 % is answered by copying. Maintenance rule: every new answer goes into the bank the same day, or the saving never arrives. And a negotiating tip that saves weeks: when a customer sends 90 questions clearly designed for a supplier of a different size, offering the pack up front and asking what remains unanswered usually reduces it to ten specific questions; it is faster for both sides and it conveys maturity.


  1. Compliance metrics and the two traps

The status of each control is classified into four values, and the strict definition matters more than the metric: implemented (it exists, it operates and it has been verified within its frequency), partial (it exists but does not cover the whole population, or its verification has expired), not implemented (decided but not operating) and not applicable (justified in writing, with a business reason).

#!/usr/bin/env python3
"""Compliance status from traceability.yml. Runs in CI."""
from datetime import date
import yaml

TODAY = date(2026, 11, 1); controls = yaml.safe_load(open("traceability.yml"))
def effective_status(c):
    """A control verified past its deadline does NOT count as implemented."""
    if c["status"] != "Implemented":
        return c["status"]                          # Partial/Not impl./Not appl.
    last, freq = c["verification"]["last"], c["verification"]["frequency_days"]
    if last is None: return "Partial"               # never verified
    return "Implemented" if (TODAY - last).days <= freq else "Partial"

summary, expired = {}, []
for c in controls:
    s = effective_status(c)
    summary[s] = summary.get(s, 0) + 1
    if s == "Partial" and c["status"] == "Implemented":
        u = c["verification"]["last"]
        expired.append((c["control"], (TODAY-u).days if u else None, c["owner"]))

applicable = sum(v for k, v in summary.items() if k != "Not applicable")
implemented = summary.get("Implemented", 0); print(f"COMPLIANCE STATUS - {TODAY}\n" + "-" * 60)
for k in ("Implemented", "Partial", "Not implemented", "Not applicable"):
    print(f"  {k:<16}: {summary.get(k, 0):>3}")
print(f"  Effective coverage: {round(100*implemented/applicable, 1)} % of "
      f"{applicable} applicable")
for cid, days, owner in expired:
    print(f"  EXPIRED {cid}: {days} days -> {owner} (counts as PARTIAL)")
COMPLIANCE STATUS - 2026-11-01
------------------------------------------------------------
  Implemented : 17    Partial : 3    Not implemented : 1    Not applicable : 1
  Effective coverage: 81.0 % of 21 applicable
  EXPIRED C-08: 137 days -> Lucia (counts as PARTIAL)
  EXPIRED C-18: 198 days -> Marta (counts as PARTIAL)

What matters is not the percentage: it is the degradation rule. A control verified outside its frequency automatically stops counting as implemented, without anyone having to decide it, so the number falls on its own when the work is abandoned instead of freezing at the 100 % of the day it was declared finished. It is the thesis of 06-01 turned into arithmetic. And the two traps that ruin a compliance programme, both subtle because they look like productivity: Auditing only what is easy to evidence. The controls that produce a nice report — encryption, MFA, patching — always get audited; the ones that do not — the quality of the access review, whether anyone really looks at the alerts, whether the runbook holds up under pressure — are taken on trust. The result is a green dashboard with the worst-covered risks precisely where there is no focus. Antidote: include at least one "hard" control in every cycle and genuinely test it — inject an alert and time the response, ask somebody to run a runbook unaided. Optimising for the audit instead of for the risk. It is the classic degeneration: you pick the control that will look good in the report, you tune the scope to exclude what is awkward, you massage a deadline. Every step is defensible on its own and the whole produces a certificate over a company that is not protected. Antidote: always keep two separate indicators, published together — compliance coverage (this section) and residual risk (04-01). When the first rises and the second does not fall, something is being optimised for the photograph.


Common Mistakes and Tips

  • Confusing having a control with being able to prove it. The backups exist, but with no dated restore report you do not comply with 32.1.c or 32.1.d and, to an auditor, they do not exist. And do not reconstruct evidence before the audit: it costs three times as much, comes out incomplete, is not contemporaneous and an experienced auditor spots it from the suspicious uniformity of the documents.
  • Evidence in ephemeral tools. Chat gets purged, e-mail leaves with the person, the spreadsheet on the desktop disappears: evidence lives in a repository with a declared retention. Closing actions on the day they are implemented and fixing the symptom. With no effectiveness verification on a future date the action is deferred, not closed; and with no root cause the finding comes back under another name. Arguing with the auditor, absent a documentable error, loses credibility and earns a deeper review. And do not hand a customer the full pentest report: it is an attack map; you hand over the executive summary and the retest confirmation, under confidentiality.
  • Tip: store the evidence on the day you do the work. It costs zero minutes then and half a day three months later. It is the one rule in this lesson that, applied on its own, already pays for it.
  • Tip: audit yourself first, and document what worked too. Finding a gap of your own costs the fix; having a third party find it costs the fix and explaining why you did not know. And a report that only brings bad news stops being welcome: then people prepare the photograph instead of showing reality.

Exercises

Exercise 1 — Turning assertions into evidence

Marta has written four assertions to answer a customer: (1) "all our employees receive security training"; (2) "we periodically review who has access to customer data"; (3) "our backups are immutable and tested"; (4) "we detect anomalous access to our customers' data". For each one, state what specific evidence would back it up, whether it is automatable or requires human judgement, how often it must be generated and what question an auditor would ask to put it to the test.

Exercise 2 — A finding and its corrective action

At the September internal audit, the external auditor asks for a sample of the consultancy's (A-19) access requests over the last quarter. They find eleven logged sessions but only seven requests with prior authorisation: the other four were executed and logged, with no trace of who authorised them. Lucía explains that they were urgent weekend incidents and that she authorised them verbally. Classify the finding justifying the type, draft the complete corrective action with the six sections of the template, and explain why "from now on Lucía will send a confirmation e-mail" would be insufficient.

Exercise 3 — Designing the internal audit cycle that hurts most

Nimbus can only devote 6 hours to one internal audit cycle, and Marta wants it to be the one that yields the most information about real risk, not the one that produces the shiniest report. Choose the area, say which controls you would audit, how you would genuinely test each one (not by reviewing documents), what sample you would request and what you would expect to find. Justify why that area and not another.

Solutions

Exercise 1

Assertion Specific evidence Automatable? Frequency Auditor's question
1. Training A named register with date, content and proof of completion (not merely of despatch); signed acceptance of POL-04; versioned material Partial: the register yes; the quality and the effect, no Continuous + quarterly report "Give me the complete list and each person's last training. And what about the three who joined in September?"
2. Access review A half-yearly matrix with the starting list, a decision per access, the withdrawals executed and the date, signed by Marta Partial: the export yes; the decision and the signature, no Half-yearly (C-18) "Show me the accesses that were decided to be withdrawn and prove to me that they no longer exist"
3. Backups A restore report with measured RTO, hash and row count; Object Lock exported; a failed deletion attempt returning AccessDenied Partial: the execution and the configuration yes; the validation, no Quarterly (C-14) "When was the last restore and how long did it take? Have you tried deleting a backup to see whether you can?"
4. Detection The D-01…D-12 catalogue with its definitions; a record of firings and their closure; and above all a periodic injection test with a screenshot of the alert and its timestamp Mostly yes: definition, firings and the test Continuous + quarterly test "Show me the last time this alert fired and what was done. If it has never fired, how do you know it works?"

The cross-cutting lesson: all four assertions are true in many companies and none of them is demonstrable without the artefact in the second column. And in three of the four the auditor's question points at the same place: not at the control existing, but at its having been tested and at the hard sample — the new employee, the withdrawn access, the alert that never fired — being covered too. The fourth is the most fragile: a detection catalogue that has never fired is indistinguishable from one that does not work.

Exercise 2

Classification: MINOR nonconformity, with an argument for treating it as major. It is minor because the control exists, it is defined in POL-08 6.2.3, it is applied in 7 of 11 cases and the rest were logged, so there is no systemic failure. The argument for raising it is serious: it affects R-01, the worst-scoring risk, and the exact vector of the 02-06 incident was uncontrolled access by this very consultancy; a rigorous auditor could argue that a control failing 36 % of the time on the critical risk is not operating. The right response is not to argue about the classification, but to treat it with the seriousness of a major one.

# AC-2026-031 - Corrective action
Source: internal audit Sept/2026 · Minor NC 01 · Risk R-01
Opened 2026-09-30 · Owner: Marta · Deadline: 2026-11-15

1. FINDING. "Of 11 access sessions by the external supplier (A-19) in the
   quarter, 4 were executed with no recorded prior request or authorisation,
   breaching POL-08 6.2.3. The sessions do appear in the technical log."
2. IMMEDIATE CORRECTION. The 4 sessions are cross-checked against the incidents
   of those dates: genuine and necessary interventions, with no improper
   activity. Marta authorises them retrospectively with reasons, **recording
   that this is a regularisation and not a prior authorisation**.
3. ROOT CAUSE. They are missing because they happened at the weekend; they were
   not authorised because the flow required a ticket that could only be approved
   in working hours; it was bypassed because **the system allowed access to be
   granted without prior authorisation** - a procedural control, not a technical
   one; and it was procedural because when C-03 was designed the easy part was
   instrumented (8 h expiry) and the hard part was not. **Root cause: there is no
   authorised path for emergencies and the control is not enforced by the system,
   so urgency routes around it.**
4. CORRECTIVE ACTION. a) **Technically mandatory authorisation**: A-19 is granted
   only through the automated flow, with no manual route. b) **A legitimate 24x7
   emergency path**: approval from a mobile by two approvers (Marta, Ivan as
   deputy), 15 min SLA; the reason for bypassing is removed. c) **Break-glass**
   if neither responds: access with an immediate alert to both and a mandatory
   review within 24 h, flagged as exceptional. d) **Detection**: an S1 alert
   (D-03) on any A-19 session without authorisation, so it is known in minutes
   and not nine months later. e) **Contract**: no intervention without a prior
   request will be billable.
5. EFFECTIVENESS VERIFICATION. 2027-01-15, two quarters later. Criterion: 100 %
   of sessions with recorded prior authorisation, D-03 with no unjustified
   firings and at least one use of the emergency path within SLA (failing that,
   a drill). Verified by: external auditor. 6. CLOSURE. IN PROGRESS.

Why "Lucía will send a confirmation e-mail" is insufficient, and the reasoning holds for almost any finding: (1) it does not attack the root cause — the problem is not that Lucía forgets to write, it is that there is no authorised path for emergencies and the system permits the shortcut; (2) it keeps the control procedural, that is, dependent on one person's memory under pressure on a Sunday night, which is exactly when memory fails (06-01); (3) Lucía cannot be the one who authorises her own access: that is not authorisation, it is self-service, and it removes the separation of duties that gives the control its meaning; (4) it adds no detection, so the next deviation would again be discovered nine months later in another audit; and (5) it produces no structured evidence, just a stray e-mail in a mailbox, which is exactly the kind of ephemeral evidence this lesson warns against. The general rule: if the corrective action depends on somebody remembering, it is not a corrective action.

Exercise 3

Area chosen: detection and response (C-07, C-08, C-09, C-17 and detections D-01…D-12). And the justification is what organises the whole exercise: it is the area where the distance between what is documented and what is real is systematically greatest. Access or encryption policies are easy to verify and are usually fine; by contrast, a twelve-detection catalogue written in a document and an immaculate runbook can coexist perfectly well with an inability to see an attacker for twenty days. That is exactly what happened in 02-06, and it is the area no customer questionnaire knows how to assess.

How I would genuinely test each control, in 6 hours:

Control Real test (not documentary) Time What it proves
D-04 Bulk access to the bucket Download 600 test objects from A-02 and time it until the on-call mobile rings 45 min That the alert exists, fires and reaches a human: three possible failures, and only one of them is visible in a document
D-03/D-08 Credential outside the window; logging disabled Simulate an A-19 session on a Saturday; disable logging on a non-critical resource 1 h The control that failed on day 0 of 02-06; and the alert no attacker wants to exist
C-07 Append-only audit log Run UPDATE and DELETE with the nimbus_api role and capture the error; verify the integrity chain 45 min That "append-only" is real and not a naming convention
C-17 / RB-01 Runbook Ask Iván, who did not write it, to run the containment runbook without Lucía's help, against a stopwatch 2 h What a runbook is really worth: that somebody else can follow it
Real MTTD and closure Review the alerts of the last 90 days — how many were closed, in what time, how many with no comment — and write the report 1.5 h Whether the daily review exists or is aspirational

The sample I would request, and the criterion is that the auditor chooses it, not the auditee: the last 10 alerts of any severity — not the ones Lucía proposes — following each one through to closure, and every S1 of the half-year. What I would expect to find, being realistic about an SME: that two or three detections have never been tested and one does not fire — a badly calibrated threshold, a change in log format, an expired collector credential — which is the most likely and most valuable finding; that low-severity alerts are closed with no comment, which makes it impossible to distinguish "reviewed and dismissed" from "ignored"; that the runbook has gaps of tacit knowledge — where a credential lives, who to call, which exact command — a finding that attacks R-09 directly and that no document review would have produced; and that the real MTTD is worse than the declared one, because the declared figure is calculated on the incidents that were detected and not on the ones detected late. Why this cycle and not another. A cycle on policies would produce a tidy report with two cosmetic observations and no new information. This one produces uncomfortable findings about the critical risk — the blindness that cost 20 days in 02-06 — it tests controls instead of reading them, and along the way it validates the work of module 5 under real conditions. It also has a side effect that on its own justifies the 6 hours: by the end, Iván knows how to run the runbook, so the audit has not only measured risk R-09, it has reduced it.


Conclusion

You have learned to separate two things that get confused at an expensive price: being secure and being able to prove it. With the two statements that must be held at once — compliance without security is theatre and security without evidence does not survive an audit, a customer, a change of personnel or itself — and with the economic argument that convinces anyone who sees this as bureaucracy: evidence is cheaper if it is generated while doing the work than if it is reconstructed afterwards; auditing is not expensive, reconstructing is expensive. You know what evidence is and what makes it valid: attributable, dated, intact, reproducible and retained, with the table of types and its examples drawn from the whole course — POL-02 approved, the A-02 bucket policy exported, the C-07 audit table, the outputs of trivy, prowler and lynis, the restore report with measured RTO, the PT-2026-01 record and its retest, the signed C-21 minutes, the closed onboarding ticket, the recertification matrix — fulfilling 05-07's promise that module 5 would keep generating exactly the material now needed. With the two selection criteria: prefer evidence the machine generates on its own, and remember that the most valuable evidence is the evidence that shows the control detected something and it was corrected.

You have the traceability matrix in its final form, with risk, requirement, policy, control, evidence, owner, frequency and last verification, as a table and as yaml that lives in the repository and is reviewed in pull requests; with the sum that justifies it to management: 15 hours a year to maintain it versus 40-60 to reconstruct it, and with incomplete material at that because the log rotated and the person left. You know how to automate collection with a collector that exports, seals with hashes, signs and stores in immutable storage, respecting the right boundary — you automate the verifiable fact, not the judgement — and ending with the list of what only a person can do.

You can distinguish the five types of audit and what is at stake in each, you know the full nine-step process with the two points where the outcome is decided — the scope and the sampling — and above all you know how a real auditor behaves: they do not review documents, they take an assertion, ask for a sample and follow the trail, looking for the incoherence between what is written, what people say and what the system shows. The two simulated interviews have taught you the questions that matter — the whole population versus a sample, the alternative emergency path, "delete it and make it pass" — and the most counter-intuitive lesson: acknowledging a deviation with its record and its correction scores better than claiming there are none.

You can classify findings — major, minor, observation, opportunity — respond without arguing or overreacting, and draft a corrective action plan whose two decisive sections are the root cause analysis and the effectiveness verification on a future date: without the first the finding comes back under another name, and without the second the action is declared closed exactly when you still do not know whether it works. You can set up internal auditing in a 38-person company with the minimum viable independence — whoever audits does not execute — and by buying two days of external auditor where there is none, with its annual programme and its report that also documents what worked, because a programme that only brings bad news stops being welcome. You can distinguish the technical audit from the management audit, you know they fail in different places and why the pentest is evidence, not an audit. And you know how to industrialise customer questionnaires with a three-tier pack — public, under confidentiality, and what is never handed over, because the full pentest report is an attack map. You close with the status-by-control dashboard and its automatic degradation rule, and with the two traps: auditing only what is easy to evidence and optimising for the audit instead of for the risk, whose antidote is publishing compliance and residual risk together.

And now notice a pattern that runs through this entire lesson. In the interview, Lucía knew where everything was. Iván could break a test to prove that CI reacts. The February alert was detected because somebody looked at the report. The out-of-flow account creation happened because a person was in a hurry on a Sunday. The runbook fails not because it is badly written, but because only one person knows what is not written in it. Behind every control, every piece of evidence and every finding there is a person who does or does not do something, and no traceability matrix corrects that. In Training and Awareness (06-05) we work on the factor that remains the main vector and also the best defence: why the objective is not that people know but that they do and above all that they report, how to design a programme that fits into an SME's real available time, how to run ethical phishing simulations and which metrics to read in them — the report rate above the click rate — and why blaming the person who falls for it destroys exactly the early detection we have spent the whole course trying to build.

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