Portfolio project · IT audit & technology risk

Cloud Audit Workbench

Scanners find cloud misconfigurations. Auditors need those findings mapped to controls, explained in business terms, prioritized, and tracked across reviews. This tool is that layer.

The sample infrastructure is synthetic and intentionally insecure Terraform written for this project. The tool scans files locally and never connects to or modifies real cloud resources.

The problem

A scanner gives youAn auditor needs
CKV_AWS_24 FAILED aws_security_group.admin_accessWhich control failed: remote administrative access is restricted to approved networks
A rule titleThe business risk in plain language, and a recommendation
A severity, sometimes (open-source Checkov leaves it empty)A documented, explainable priority
A point-in-time listRemediation status across reviews: New, Resolved, Persisting
JSONA workpaper with scope, evidence and sign-off fields

How it works

InputCheckov / Prowler JSON ParseNormalize + dedupe MapControl domain PrioritizeDocumented rules TrackNew / Resolved / Persisting ReportExcel workpaper + memo

Every finding is normalized into one schema and given a stable ID built from tool, check and resource. File paths and line numbers are excluded, so the same issue is recognized in the next review even when the code moves.

An editable YAML file maps each check to one of six IT control domains, with a control objective, the business risk and a recommendation. Checks that have not been assessed go to Unmapped – requires review instead of being guessed. Framework references (CIS and similar) are shown only when the scanner supplies them; none are invented.

Results on the sample environment

Version 1 of the sample infrastructure was scanned, then version 2, in which about half the issues were fixed and one new issue was introduced while remediating. Output from Checkov 3.4.3:

51
Findings in v1
40
Findings in v2
13
Resolved
38
Persisting
2
New
Control domain (v2)HighMediumLowTotal
Logical Access & Identity91111
Network Security2204
Data Protection & Encryption1304
Logging & Monitoring3407
Backup & Resilience0606
Change & Configuration Management0325
Unmapped – requires review0303
Total1522340

An observation, as reported

Administrative ports open to the internet High

Control domain
Network Security
Criteria
Remote administrative access is restricted to approved networks and users.
Condition
2 checks failed on 1 resource: aws_security_group.admin_access (SSH port 22 and RDP port 3389 open to 0.0.0.0/0).
Risk
Remote login services can be reached by anyone on the internet, which invites automated password-guessing and exploitation attempts against servers.
Recommendation
Restrict SSH and RDP to a corporate IP range or bastion host, or replace direct access with AWS Systems Manager Session Manager.
Status
Persisting: open across 2 reviews.

Prioritization rules

  1. Baseline from scanner severity. If the scanner gives none, use the reviewer-set default in the control mapping.
  2. Data stores (buckets, databases, volumes) are raised one level.
  3. Public exposure (reachable from the internet) is High.
  4. Logging gaps are at least Medium.

Each finding records which rules applied, so every priority in the workpaper can be explained.

Screenshots

Overview tab showing summary metrics and a stacked bar chart of findings by control domain and priority
Overview: summary metrics and findings by control domain.
Run comparison tab listing new, resolved and persisting findings between v1 and v2
Run comparison: v1 to v2, with New, Resolved and Persisting findings.
Findings tab with filters and a table of findings including control domain, issue, condition and business risk
Findings: filterable table with control objective, condition, business risk and evidence.

Run it locally

The interactive app is a Streamlit (Python) application, so it runs locally rather than on this static page.

git clone https://github.com/oneDotpy/cloud-audit-workbench.git
cd cloud-audit-workbench
python3.11 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

python -m src.pipeline scan sample_infra/v1
python -m src.pipeline scan sample_infra/v2
python -m pytest
python -m streamlit run app.py

Limitations