cloud-audit 1.2.0__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/release.yml +26 -1
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CHANGELOG.md +53 -1
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CONTRIBUTING.md +17 -17
- cloud_audit-1.2.2/Makefile +30 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/PKG-INFO +5 -2
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/README.md +3 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/ROADMAP.md +3 -7
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/SECURITY.md +1 -1
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/mkdocs.yml +7 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/pyproject.toml +2 -2
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/cli.py +4 -4
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/config.py +3 -2
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/correlate.py +176 -4
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/models.py +29 -16
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/cloudtrail.py +9 -6
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/iam.py +16 -16
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/s3.py +9 -6
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/provider.py +28 -2
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/base.py +3 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/sarif.py +1 -1
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/templates/report.html.j2 +187 -71
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/scanner.py +18 -8
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/conftest.py +2 -7
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_config.py +24 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_correlate.py +140 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_scanner.py +3 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.cloud-audit.example.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/FUNDING.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/dependabot.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/ci.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/docs.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/example-scan.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.gitignore +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.mcp.json +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.pre-commit-hooks.yaml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CODEOWNERS +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CODE_OF_CONDUCT.md +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/Dockerfile +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/LICENSE +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/action.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/demo.gif +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/logo-nobg.png +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/logo.png +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/report-preview.png +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/social-preview.png +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/daily-scan-with-diff.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/github-actions.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/post-deploy-scan.yml +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/scripts/generate_demo_gif.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/scripts/generate_report_screenshot.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/__main__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/engine.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/frameworks/cis_aws_v3.json +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/frameworks/soc2_type2.json +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/cost_model.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/diff.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/mcp_server.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/account.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/cloudwatch.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/config_.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ec2.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ecs.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/efs.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/eip.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/guardduty.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/kms.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/lambda_.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/rds.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/secrets.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/securityhub.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ssm.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/vpc.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/py.typed +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/compliance_html.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/compliance_markdown.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/diff_markdown.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/html.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/markdown.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/__init__.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cis_checks.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cloudtrail.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cloudwatch.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_config.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ec2.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ecs.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_eip.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_guardduty.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_iam.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_kms.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_lambda.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_rds.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_s3.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_secrets.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ssm.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_vpc.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cli.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cli_scan.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cost_model.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_diff.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_html.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_markdown.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_mcp_server.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_models.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_provider.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_sarif.py +0 -0
- {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_soc2_framework.py +0 -0
|
@@ -6,7 +6,7 @@ on:
|
|
|
6
6
|
- "v*"
|
|
7
7
|
|
|
8
8
|
permissions:
|
|
9
|
-
contents:
|
|
9
|
+
contents: write
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
12
|
ci:
|
|
@@ -87,3 +87,28 @@ jobs:
|
|
|
87
87
|
push: true
|
|
88
88
|
tags: ${{ steps.meta.outputs.tags }}
|
|
89
89
|
labels: ${{ steps.meta.outputs.labels }}
|
|
90
|
+
|
|
91
|
+
github-release:
|
|
92
|
+
name: Create GitHub Release
|
|
93
|
+
needs: [build, publish, docker]
|
|
94
|
+
runs-on: ubuntu-latest
|
|
95
|
+
permissions:
|
|
96
|
+
contents: write
|
|
97
|
+
steps:
|
|
98
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
99
|
+
- name: Extract changelog for this version
|
|
100
|
+
id: changelog
|
|
101
|
+
run: |
|
|
102
|
+
VERSION="${GITHUB_REF#refs/tags/v}"
|
|
103
|
+
# Extract section between this version header and the next version header
|
|
104
|
+
awk "/^## \[${VERSION}\]/{flag=1; next} /^## \[/{flag=0} flag" CHANGELOG.md > release_notes.md
|
|
105
|
+
if [ ! -s release_notes.md ]; then
|
|
106
|
+
echo "Release v${VERSION}" > release_notes.md
|
|
107
|
+
fi
|
|
108
|
+
- name: Create GitHub Release
|
|
109
|
+
env:
|
|
110
|
+
GH_TOKEN: ${{ github.token }}
|
|
111
|
+
run: |
|
|
112
|
+
gh release create "${{ github.ref_name }}" \
|
|
113
|
+
--title "${{ github.ref_name }}" \
|
|
114
|
+
--notes-file release_notes.md
|
|
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.2.2] - 2026-04-01
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Parallel check execution via ThreadPoolExecutor for faster scans on large accounts
|
|
15
|
+
- Wildcard pattern support in suppressions (`aws-iam-*`, `arn:aws:*:*:*:role/deploy-*`)
|
|
16
|
+
- Debug logging in attack chain correlation engine for diagnosing collection failures
|
|
17
|
+
- Makefile with `make all` (lint + format + typecheck + test), `make test-cov`, `make security`
|
|
18
|
+
- `provider.client()` method with boto3 adaptive retry (max 5 attempts) and per-service client caching
|
|
19
|
+
- `_region_overlap()` helper for shared region-matching logic in attack chain rules
|
|
20
|
+
- 7 new tests for attack chains AC-25, AC-26, AC-27 and wildcard suppressions (345 total)
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- Thread-safe module-level caches in S3 and CloudTrail checks (threading.Lock)
|
|
25
|
+
- Cache reset abstracted into `BaseProvider.reset_caches()` (was hardcoded S3-only import)
|
|
26
|
+
- Scanner enforces canonical check_id from make_check metadata (single source of truth)
|
|
27
|
+
- `compute_summary()` optimized to single pass over findings (was 5+ iterations)
|
|
28
|
+
- IAM checks migrated to `provider.client()` for adaptive retry and client caching
|
|
29
|
+
- Demo command updated to show 80 checks (was 47)
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- SARIF `artifactLocation.uri` now uses valid relative URI format (`checks/{check_id}`)
|
|
34
|
+
- Progress bar no longer advances past 100% in interactive mode
|
|
35
|
+
- Documentation URL in pyproject.toml points to docs site instead of GitHub README
|
|
36
|
+
|
|
37
|
+
## [1.2.1] - 2026-04-01
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **Attack chain visualization** in HTML reports - interactive SVG graphs showing attack paths with node-and-edge diagrams, color-coded by resource type (compute, identity, network, storage), animated edges, and glow effects on entry/impact nodes
|
|
42
|
+
- `VizStep` model with `Literal` type validation for node types
|
|
43
|
+
- 3 new tests for viz_steps validation (structure, types, edge labels)
|
|
44
|
+
- `viz_steps` field on `AttackChain` model (backward compatible, defaults to empty list)
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- `VizStep.type` constrained to Literal type (internet, compute, identity, network, storage, finding, impact) with Pydantic validation
|
|
49
|
+
- Attack chain cards in HTML report now have header/graph/body layout instead of flat text
|
|
50
|
+
- Sub-labels in visualization truncated to 22 characters to prevent overflow
|
|
51
|
+
- ROADMAP.md merged duplicate v1.3.0 sections into single entry
|
|
52
|
+
- SOC 2 docs clarified Automated column includes partially automated criteria
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- Long resource IDs in visualization labels truncated to prevent SVG overflow
|
|
57
|
+
|
|
10
58
|
## [1.2.0] - 2026-04-01
|
|
11
59
|
|
|
12
60
|
### Added
|
|
@@ -353,7 +401,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
353
401
|
- Docker image support
|
|
354
402
|
- Rich terminal UI with progress bar and color-coded findings
|
|
355
403
|
|
|
356
|
-
[Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/v1.
|
|
404
|
+
[Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.2...HEAD
|
|
405
|
+
[1.2.2]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.1...v1.2.2
|
|
406
|
+
[1.2.1]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.0...v1.2.1
|
|
407
|
+
[1.2.0]: https://github.com/gebalamariusz/cloud-audit/compare/v1.1.0...v1.2.0
|
|
408
|
+
[1.1.0]: https://github.com/gebalamariusz/cloud-audit/compare/v1.0.1...v1.1.0
|
|
357
409
|
[1.0.1]: https://github.com/gebalamariusz/cloud-audit/compare/v1.0.0...v1.0.1
|
|
358
410
|
[1.0.0]: https://github.com/gebalamariusz/cloud-audit/compare/v0.9.1...v1.0.0
|
|
359
411
|
[0.9.1]: https://github.com/gebalamariusz/cloud-audit/compare/v0.9.0...v0.9.1
|
|
@@ -20,20 +20,21 @@ pip install -e ".[dev]"
|
|
|
20
20
|
|
|
21
21
|
## Code Quality Checks
|
|
22
22
|
|
|
23
|
-
Before submitting a PR,
|
|
23
|
+
Before submitting a PR, run all checks with one command:
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Format
|
|
30
|
-
ruff format --check src/ tests/
|
|
26
|
+
make all # runs lint + format-check + typecheck + test
|
|
27
|
+
```
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
mypy src/
|
|
29
|
+
Or individually:
|
|
34
30
|
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
```bash
|
|
32
|
+
make lint # ruff check src/ tests/
|
|
33
|
+
make format # ruff format src/ tests/
|
|
34
|
+
make typecheck # mypy src/
|
|
35
|
+
make test # pytest -v
|
|
36
|
+
make test-cov # pytest with coverage report
|
|
37
|
+
make security # pip-audit dependency scan
|
|
37
38
|
```
|
|
38
39
|
|
|
39
40
|
## Adding a New AWS Check
|
|
@@ -65,7 +66,7 @@ def check_cloudtrail_enabled(provider: AWSProvider) -> CheckResult:
|
|
|
65
66
|
check_name="CloudTrail enabled",
|
|
66
67
|
)
|
|
67
68
|
|
|
68
|
-
client = provider.
|
|
69
|
+
client = provider.client("cloudtrail") # adaptive retry + client caching
|
|
69
70
|
trails = client.describe_trails()["trailList"]
|
|
70
71
|
result.resources_scanned = len(trails)
|
|
71
72
|
|
|
@@ -74,13 +75,12 @@ def check_cloudtrail_enabled(provider: AWSProvider) -> CheckResult:
|
|
|
74
75
|
return result
|
|
75
76
|
|
|
76
77
|
|
|
77
|
-
def get_checks(provider: AWSProvider) -> list[
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
def get_checks(provider: AWSProvider) -> list[CheckFn]:
|
|
79
|
+
from cloud_audit.providers.base import make_check
|
|
80
|
+
from cloud_audit.models import Category
|
|
81
|
+
return [
|
|
82
|
+
make_check(check_cloudtrail_enabled, provider, check_id="aws-ct-001", category=Category.SECURITY),
|
|
80
83
|
]
|
|
81
|
-
for check in checks:
|
|
82
|
-
check.category = Category.SECURITY # type: ignore[attr-defined]
|
|
83
|
-
return checks
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
### 2. Register the module
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
.PHONY: install lint format format-check typecheck test test-cov security all clean
|
|
2
|
+
|
|
3
|
+
install:
|
|
4
|
+
pip install -e ".[dev]"
|
|
5
|
+
|
|
6
|
+
lint:
|
|
7
|
+
ruff check src/ tests/
|
|
8
|
+
|
|
9
|
+
format:
|
|
10
|
+
ruff format src/ tests/
|
|
11
|
+
|
|
12
|
+
format-check:
|
|
13
|
+
ruff format --check src/ tests/
|
|
14
|
+
|
|
15
|
+
typecheck:
|
|
16
|
+
mypy src/
|
|
17
|
+
|
|
18
|
+
test:
|
|
19
|
+
pytest -v --tb=short
|
|
20
|
+
|
|
21
|
+
test-cov:
|
|
22
|
+
pytest -v --tb=short --cov=cloud_audit --cov-report=term-missing --cov-report=html
|
|
23
|
+
|
|
24
|
+
security:
|
|
25
|
+
pip-audit --strict
|
|
26
|
+
|
|
27
|
+
all: lint format-check typecheck test
|
|
28
|
+
|
|
29
|
+
clean:
|
|
30
|
+
rm -rf .mypy_cache .pytest_cache .ruff_cache htmlcov .coverage dist build *.egg-info
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloud-audit
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Open-source AWS security scanner with CIS AWS v3.0 and SOC 2 Type II compliance, attack chains, breach cost estimation, and MCP server. 80 checks, 20 attack chain rules. Every finding includes CLI + Terraform remediation.
|
|
5
5
|
Project-URL: Homepage, https://github.com/gebalamariusz/cloud-audit
|
|
6
|
-
Project-URL: Documentation, https://
|
|
6
|
+
Project-URL: Documentation, https://haitmg.pl/cloud-audit/
|
|
7
7
|
Project-URL: Repository, https://github.com/gebalamariusz/cloud-audit
|
|
8
8
|
Project-URL: Issues, https://github.com/gebalamariusz/cloud-audit/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/gebalamariusz/cloud-audit/blob/main/CHANGELOG.md
|
|
@@ -281,6 +281,9 @@ suppressions:
|
|
|
281
281
|
reason: "Legacy VPC, migration planned for Q3"
|
|
282
282
|
accepted_by: "jane@example.com"
|
|
283
283
|
expires: "2026-09-30"
|
|
284
|
+
- check_id: "aws-cw-*"
|
|
285
|
+
reason: "CloudWatch alarms managed by separate team"
|
|
286
|
+
accepted_by: "ops@example.com"
|
|
284
287
|
```
|
|
285
288
|
|
|
286
289
|
</details>
|
|
@@ -235,6 +235,9 @@ suppressions:
|
|
|
235
235
|
reason: "Legacy VPC, migration planned for Q3"
|
|
236
236
|
accepted_by: "jane@example.com"
|
|
237
237
|
expires: "2026-09-30"
|
|
238
|
+
- check_id: "aws-cw-*"
|
|
239
|
+
reason: "CloudWatch alarms managed by separate team"
|
|
240
|
+
accepted_by: "ops@example.com"
|
|
238
241
|
```
|
|
239
242
|
|
|
240
243
|
</details>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Roadmap
|
|
2
2
|
|
|
3
|
-
> Current version: **v1.2.
|
|
3
|
+
> Current version: **v1.2.1** (April 2026)
|
|
4
4
|
|
|
5
5
|
## Completed
|
|
6
6
|
|
|
@@ -115,18 +115,14 @@
|
|
|
115
115
|
|
|
116
116
|
## What's Next
|
|
117
117
|
|
|
118
|
-
### v1.3.0 - Multi-Framework Compliance
|
|
118
|
+
### v1.3.0 - Multi-Framework Compliance & Intelligence
|
|
119
119
|
- **BSI C5:2020** compliance mapping (121 criteria -- zero open-source competition)
|
|
120
120
|
- **ISO 27001:2022** compliance mapping (93 Annex A controls)
|
|
121
121
|
- **HIPAA Security Rule** compliance mapping (36 implementation specifications)
|
|
122
122
|
- **NIS2 Directive** compliance mapping (~40 technical measures)
|
|
123
|
-
- Compliance report improvements based on feedback
|
|
124
|
-
|
|
125
|
-
### v1.3.0 - Automation & Intelligence
|
|
126
|
-
- **Terraform Drift Detection** -- compare scan results against tfstate to find security-relevant drift
|
|
127
123
|
- **Root Cause Grouping** -- "fix 1 setting, close 12 findings" for account-level misconfigurations
|
|
128
124
|
- **Historical Score Tracking** -- persistent score history with trends for Type II audits
|
|
129
|
-
-
|
|
125
|
+
- Compliance report improvements based on feedback
|
|
130
126
|
|
|
131
127
|
### v1.4.0 - Enterprise Ready
|
|
132
128
|
- **Multi-account scanning** -- AWS Organizations support, aggregate attack chains across accounts
|
|
@@ -30,6 +30,13 @@ theme:
|
|
|
30
30
|
icon:
|
|
31
31
|
repo: fontawesome/brands/github
|
|
32
32
|
|
|
33
|
+
extra:
|
|
34
|
+
social:
|
|
35
|
+
- icon: fontawesome/brands/github
|
|
36
|
+
link: https://github.com/gebalamariusz/cloud-audit
|
|
37
|
+
- icon: fontawesome/brands/python
|
|
38
|
+
link: https://pypi.org/project/cloud-audit/
|
|
39
|
+
|
|
33
40
|
markdown_extensions:
|
|
34
41
|
- admonition
|
|
35
42
|
- pymdownx.details
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cloud-audit"
|
|
7
|
-
version = "1.2.
|
|
7
|
+
version = "1.2.2"
|
|
8
8
|
description = "Open-source AWS security scanner with CIS AWS v3.0 and SOC 2 Type II compliance, attack chains, breach cost estimation, and MCP server. 80 checks, 20 attack chain rules. Every finding includes CLI + Terraform remediation."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -57,7 +57,7 @@ cloud-audit-mcp = "cloud_audit.mcp_server:main"
|
|
|
57
57
|
|
|
58
58
|
[project.urls]
|
|
59
59
|
Homepage = "https://github.com/gebalamariusz/cloud-audit"
|
|
60
|
-
Documentation = "https://
|
|
60
|
+
Documentation = "https://haitmg.pl/cloud-audit/"
|
|
61
61
|
Repository = "https://github.com/gebalamariusz/cloud-audit"
|
|
62
62
|
Issues = "https://github.com/gebalamariusz/cloud-audit/issues"
|
|
63
63
|
Changelog = "https://github.com/gebalamariusz/cloud-audit/blob/main/CHANGELOG.md"
|
|
@@ -793,15 +793,15 @@ def demo() -> None:
|
|
|
793
793
|
|
|
794
794
|
# Simulate progress bar
|
|
795
795
|
with Progress(
|
|
796
|
-
TextColumn("[bold]Running
|
|
796
|
+
TextColumn("[bold]Running 80 checks on AWS..."),
|
|
797
797
|
BarColumn(bar_width=40),
|
|
798
798
|
TextColumn("{task.completed}/{task.total}"),
|
|
799
799
|
TimeElapsedColumn(),
|
|
800
800
|
console=console,
|
|
801
801
|
) as progress:
|
|
802
|
-
task = progress.add_task("Scanning", total=
|
|
803
|
-
for _ in range(
|
|
804
|
-
time.sleep(0.
|
|
802
|
+
task = progress.add_task("Scanning", total=80)
|
|
803
|
+
for _ in range(80):
|
|
804
|
+
time.sleep(0.04)
|
|
805
805
|
progress.advance(task)
|
|
806
806
|
|
|
807
807
|
# Health score
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import fnmatch
|
|
5
6
|
from datetime import date
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any
|
|
@@ -36,11 +37,11 @@ class Suppression(BaseModel):
|
|
|
36
37
|
return (today or date.today()) > self.expires
|
|
37
38
|
|
|
38
39
|
def matches(self, check_id: str, resource_id: str) -> bool:
|
|
39
|
-
if
|
|
40
|
+
if not fnmatch.fnmatchcase(check_id, self.check_id):
|
|
40
41
|
return False
|
|
41
42
|
if self.resource_id is None:
|
|
42
43
|
return True
|
|
43
|
-
return
|
|
44
|
+
return fnmatch.fnmatchcase(resource_id, self.resource_id)
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
class CloudAuditConfig(BaseModel):
|