Simulated portfolio. Everything here is a simulated case study using synthetic data about a fictional company. It is not client work, a real audit, a certification or an assurance opinion.
ASSURANCE: GRC, IT audit, technology risk

Case studies / ITGC audit

Simulated case study: fictional company (Northstar Financial Technologies), synthetic data, no real audit or client.

1. Risk-based IT general controls audit

16 tests over 15 of 33 controls produced 14 findings (6 High, 7 Medium, 1 Low). The headline is leaver access: 8 of 35 leaver accounts (22.9%) were not removed in time, and one of them logged in 6 days after the employee left.

Simulated. Simulated case study: fictional company (Northstar Financial Technologies), synthetic data, no real audit or client. Findings, people, vendors and metrics on this page are invented. Nothing here is a real audit result or an assurance opinion.
Diagram: Risk-based ITGC audit lifecycle
Six steps from scoping the audit to retesting remediation, with a limitation: 15 of 33 controls were tested.
Diagram: Control-testing workflow
Workflow used for each of the 16 control tests, from obtaining the extract to documenting the workpaper.

Why it matters to the business

The business context. Northstar, the fictional company, moves money for business customers. Its most important service, Business Payment Acceptance, is rated Critical, handles Restricted data and must recover within 4 hours with at most 1 hour of data loss. It depends on the Payments API, the Core Ledger and the AWS production account, three of the 5 systems in scope. Customers of a payments company are trusting its access and change controls without ever seeing them. This audit looks at those controls from the inside.

What is at stake. The risk register scores “Inappropriate or unremoved user access” (R-01: 20 out of 25 before controls, recorded residual 12), the highest of its 14 risks. Management's recorded residual score of 12 puts it in the band where the risk owner can accept it. The audit asks whether the controls behind that number really work. If a former employee's administrator account can still reach payment data, the recorded score is optimistic and the business is carrying more risk than it believes. Northstar's stated appetite is low for unauthorised access to Restricted data, and confirmed access after termination must be escalated to the Chief Risk Officer.

Who relies on the work. The Chief Risk Officer sponsors the audit and the Audit Committee receives the report. The IT Security Manager, Head of IT Operations, Head of Platform Engineering and Change Manager own the fixes. The Controller depends on the ledger's integrity. Each needs something different: assurance, a prioritised list of fixes, a date, and evidence that a customer or regulator would accept.

What the business needs from this work.

  • An honest answer about which controls work, backed by evidence, not a list of items marked passed.
  • Findings an owner can act on (what was found, what it was compared with, why it happened, why it matters, what to do) and a retest showing whether the fix held.
  • Clear limits, so that none of the 18 controls that were not tested is read as clean.

What this shows about how I work. It turns a control statement into a testable rule, proves a population is complete before relying on it, separates real exceptions from look-alikes, and refuses to count a fix that fails retest. Those are the habits that IT audit and GRC job postings ask for.

Scope and assumptions

  • Systems SYS-01 to SYS-05 (portal, payments API, core ledger, CI/CD, AWS production). Period 2026-01-01 to 2026-06-30; fieldwork 2026-07-13 to 2026-08-28; extracts dated 2026-07-15.
  • Criteria are the fictional policy parameters in one file (for example 2 business days for leaver removal, 90 days dormancy). They are invented for this exercise.
  • Independence: the audit team is fictionally independent of the systems audited (stated in the planning memo).
  • Out of scope: other systems, physical security and application business logic.

Approach

I rated 14 enterprise risks, mapped them to 33 controls and selected 15 for testing on risk, leaving 18 not tested with the reason recorded for each. For every test the population was completed first (does the extract agree to the source?), and the rule was then applied by script to every record rather than a sample, because the evidence was a complete system export. Exceptions were separated from near-misses that look odd but comply with the stated rule, and the near-misses were not reported. Tolerable deviation was 0% for leaver, privileged, developer-segregation and service-account-owner controls and 5% elsewhere.

Every finding states condition, criteria, cause, consequence and recommendation, and links to the test, the evidence and the exception records.

What is automated, and what is not

Automation here means scripts that run the same way every time on synthetic data. It is not a live connection to any real system. The table separates what a script does from what still needs judgement.

Automation in this case study (simulated, synthetic data)
What is automatedHowWhere in the repositoryWhat a person still does
All 16 control testsEach rule is code that checks every record in the population, so there is no sampling errorscripts/itgc_audit.py, itgc_config.pyChoosing which controls to test and why, and deciding what counts as an exception
Exceptions versus near-missesBoundary cases (for example, disabled on the last allowed day) are written into the rule and testedscripts/itgc_audit.pyJudging unusual cases the rule did not anticipate
Workpapers, findings and reports16 workpapers, 14 findings, four PDF reports and two workbooks are generated from the test resultsscripts/itgc_findings.py, generate_p1_reports.py, generate_p1_pdfs.pyAssessing cause, consequence and the recommendation, and the wording of the report
RetestThe same tests are re-run on new data and compared with the earlier resultscripts/itgc_audit.py, data/analysis/retest_evidence.csvDeciding whether a fix really worked and following up with management
Daily monitoring (demo)Three of the tests are re-run every day over a 31-day simulated feedsrc/ccm/Triaging alerts and deciding what to escalate

Re-run it. bash scripts/build_all.sh rebuilds everything from the synthetic data in 22 steps and runs 92 automated tests. The single script is named in each row.

See the continuous monitoring demo and the automation overview.

Results

12 of 16 tests concluded not operating effectively, 3 operating effectively with exceptions within tolerance, and 1 was inconclusive (backup restoration, where the completeness of the restore register could not be confirmed). Four tests also recorded a design deficiency. No test concluded with zero exceptions.

Because controls were selected by risk, these results do not describe the whole environment.

Project 1 control tests (simulated)
T-01NS-IAM-014085Operating effectively with exceptions (within tolerance)Workpaper
T-02NS-IAM-02358Not operating effectivelyWorkpaper
T-03NS-IAM-03132Not operating effectivelyWorkpaper
T-04NS-IAM-04108Not operating effectively; design deficiency notedWorkpaper
T-05NS-IAM-05144Not operating effectively; design deficiency notedWorkpaper
T-06NS-IAM-063964Operating effectively with exceptions (within tolerance)Workpaper
T-07NS-IAM-074133Not operating effectivelyWorkpaper
T-08NS-PAM-01192Not operating effectivelyWorkpaper
T-09NS-CHG-01775Not operating effectivelyWorkpaper
T-10NS-CHG-02775Not operating effectivelyWorkpaper
T-11NS-CHG-03914Not operating effectivelyWorkpaper
T-12NS-CHG-04143Not operating effectivelyWorkpaper
T-13NS-OPS-017275Operating effectively with exceptions (within tolerance)Workpaper
T-14NS-OPS-0283Inconclusive; design deficiency notedWorkpaper
T-15NS-OPS-0252Not operating effectivelyWorkpaper
T-16NS-LOG-02258Not operating effectively; design deficiency notedWorkpaper

Findings

Each row links to the test workpaper that supports it. F-13 is rated High provisionally: the evidence could not confirm that the restore register was complete, so the conclusion is inconclusive rather than failed.

Project 1 findings (simulated)
F-01Terminated employees retained active access to in-scope systemsHighOperating failurePartially remediatedRetested 2026-09-28: partially remediatedT-02
F-02Administrator access granted without documented approvalHighOperating failureRemediation in progressNot yet dueT-08
F-03Quarterly user access reviews were late, incomplete, not independent or ineffectiveHighOperating failure and design deficiencyOpenNot yet dueT-04
F-04Service accounts without a valid ownerMediumDesign deficiency and operating failureOpenNot yet dueT-05
F-05Multi-factor authentication not enabled on some human accounts, including an administratorHighOperating failure (isolated, but one Admin account)Closed (retested)Retested 2026-09-28: remediatedT-07
F-06Dormant and role-change access not removedMediumOperating failureRemediation in progressDormant accounts retested 2026-09-28: remediated; mover access not yet dueT-06, T-03
F-07Some access was granted before approval, or without an approval recordLowIsolated exceptionsRisk acceptedNot applicable (risk accepted)T-01
F-08Developers deployed their own changes to productionHighOperating failureOpenNot yet dueT-11
F-09Normal changes lacked test evidence, independent approval or prior approvalMediumOperating failureOpenNot yet dueT-09, T-10
F-10Emergency changes approved retrospectively after the 2-business-day limitMediumOperating failureOpenNot yet dueT-12
F-11Failed backups of the Payments API were not re-runMediumOperating failureOpenNot yet dueT-13
F-12Restoration tests were not evidenced or not successful, and the control has no minimum frequencyMediumDesign deficiency and operating failure (evidence)OpenNot yet dueT-15, T-14
F-13No restoration test recorded for the Core Ledger or Data Warehouse (inconclusive pending confirmation)HighEvidence insufficiency (not a confirmed control failure)Inconclusive: awaiting management confirmationNot yet dueT-14
F-14Weekly security alert reviews were missing, late, duplicated or lacked escalationMediumOperating failure and design deficiencyOpenNot yet dueT-16

Remediation and retest

On 2026-09-28 (simulated) I re-examined the same populations. Management reported three containment actions complete. Two passed (multi-factor authentication, and dormant and role-change access). The third, disabling the four remaining leaver accounts, did not pass: account A-0329 was still Active 227 days after termination. The dashboard therefore counts that action as not complete, even though management reported it done.

What management should do

  1. Disable the remaining leaver accounts now and establish who used account A-0132 (a Payments Console Admin account that logged in 6 days after the employee's termination). Under the fictional appetite statement, confirmed post-termination access escalates to the Chief Risk Officer.
  2. Automate deprovisioning from the HR feed and reconcile terminations to active accounts daily.
  3. Require a ticket reference before an Admin role can be assigned.

Uncertainty and limitations

  • The HR termination list supplied was partial, so further leaver exceptions may exist.
  • Approval tickets were checked for existence, not content; the ticketing system itself was not inspected.
  • Accounts created and deleted inside the period are not in the extract.
  • All records are synthetic. Seeded issues were designed in, so detection here shows the method works, not how common such failures are.

Downloads

Every file below is generated by this repository's scripts and listed in the download index.

Sources

  • S001: The NIST Cybersecurity Framework (CSF) 2.0 (NIST CSWP 29) (NIST), verified
  • S003: NIST AI Risk Management Framework (AI RMF 1.0) landing page (NIST), partially verified

See the full source register.

Control framework → · Dashboard