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.
Files changed (116) hide show
  1. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/release.yml +26 -1
  2. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CHANGELOG.md +53 -1
  3. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CONTRIBUTING.md +17 -17
  4. cloud_audit-1.2.2/Makefile +30 -0
  5. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/PKG-INFO +5 -2
  6. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/README.md +3 -0
  7. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/ROADMAP.md +3 -7
  8. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/SECURITY.md +1 -1
  9. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/mkdocs.yml +7 -0
  10. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/pyproject.toml +2 -2
  11. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/cli.py +4 -4
  12. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/config.py +3 -2
  13. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/correlate.py +176 -4
  14. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/models.py +29 -16
  15. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/cloudtrail.py +9 -6
  16. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/iam.py +16 -16
  17. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/s3.py +9 -6
  18. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/provider.py +28 -2
  19. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/base.py +3 -0
  20. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/sarif.py +1 -1
  21. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/templates/report.html.j2 +187 -71
  22. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/scanner.py +18 -8
  23. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/conftest.py +2 -7
  24. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_config.py +24 -0
  25. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_correlate.py +140 -0
  26. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_scanner.py +3 -0
  27. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.cloud-audit.example.yml +0 -0
  28. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/FUNDING.yml +0 -0
  29. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/dependabot.yml +0 -0
  33. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/ci.yml +0 -0
  34. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/docs.yml +0 -0
  35. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.github/workflows/example-scan.yml +0 -0
  36. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.gitignore +0 -0
  37. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.mcp.json +0 -0
  38. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/.pre-commit-hooks.yaml +0 -0
  39. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CODEOWNERS +0 -0
  40. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/CODE_OF_CONDUCT.md +0 -0
  41. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/Dockerfile +0 -0
  42. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/LICENSE +0 -0
  43. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/action.yml +0 -0
  44. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/demo.gif +0 -0
  45. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/logo-nobg.png +0 -0
  46. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/logo.png +0 -0
  47. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/report-preview.png +0 -0
  48. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/assets/social-preview.png +0 -0
  49. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/daily-scan-with-diff.yml +0 -0
  50. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/github-actions.yml +0 -0
  51. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/examples/post-deploy-scan.yml +0 -0
  52. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/scripts/generate_demo_gif.py +0 -0
  53. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/scripts/generate_report_screenshot.py +0 -0
  54. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/__init__.py +0 -0
  55. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/__main__.py +0 -0
  56. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/__init__.py +0 -0
  57. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/engine.py +0 -0
  58. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/frameworks/cis_aws_v3.json +0 -0
  59. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/compliance/frameworks/soc2_type2.json +0 -0
  60. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/cost_model.py +0 -0
  61. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/diff.py +0 -0
  62. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/mcp_server.py +0 -0
  63. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/__init__.py +0 -0
  64. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/__init__.py +0 -0
  65. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/__init__.py +0 -0
  66. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/account.py +0 -0
  67. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/cloudwatch.py +0 -0
  68. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/config_.py +0 -0
  69. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ec2.py +0 -0
  70. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ecs.py +0 -0
  71. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/efs.py +0 -0
  72. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/eip.py +0 -0
  73. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/guardduty.py +0 -0
  74. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/kms.py +0 -0
  75. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/lambda_.py +0 -0
  76. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/rds.py +0 -0
  77. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/secrets.py +0 -0
  78. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/securityhub.py +0 -0
  79. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/ssm.py +0 -0
  80. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/providers/aws/checks/vpc.py +0 -0
  81. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/py.typed +0 -0
  82. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/__init__.py +0 -0
  83. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/compliance_html.py +0 -0
  84. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/compliance_markdown.py +0 -0
  85. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/diff_markdown.py +0 -0
  86. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/html.py +0 -0
  87. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/src/cloud_audit/reports/markdown.py +0 -0
  88. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/__init__.py +0 -0
  89. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/__init__.py +0 -0
  90. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cis_checks.py +0 -0
  91. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cloudtrail.py +0 -0
  92. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_cloudwatch.py +0 -0
  93. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_config.py +0 -0
  94. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ec2.py +0 -0
  95. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ecs.py +0 -0
  96. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_eip.py +0 -0
  97. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_guardduty.py +0 -0
  98. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_iam.py +0 -0
  99. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_kms.py +0 -0
  100. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_lambda.py +0 -0
  101. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_rds.py +0 -0
  102. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_s3.py +0 -0
  103. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_secrets.py +0 -0
  104. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_ssm.py +0 -0
  105. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/aws/test_vpc.py +0 -0
  106. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cli.py +0 -0
  107. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cli_scan.py +0 -0
  108. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_cost_model.py +0 -0
  109. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_diff.py +0 -0
  110. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_html.py +0 -0
  111. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_markdown.py +0 -0
  112. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_mcp_server.py +0 -0
  113. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_models.py +0 -0
  114. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_provider.py +0 -0
  115. {cloud_audit-1.2.0 → cloud_audit-1.2.2}/tests/test_sarif.py +0 -0
  116. {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: read
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.0.1...HEAD
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, make sure all checks pass:
23
+ Before submitting a PR, run all checks with one command:
24
24
 
25
25
  ```bash
26
- # Lint
27
- ruff check src/ tests/
28
-
29
- # Format
30
- ruff format --check src/ tests/
26
+ make all # runs lint + format-check + typecheck + test
27
+ ```
31
28
 
32
- # Type check
33
- mypy src/
29
+ Or individually:
34
30
 
35
- # Tests
36
- pytest -v
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.session.client("cloudtrail")
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[partial[CheckResult]]:
78
- checks = [
79
- partial(check_cloudtrail_enabled, provider),
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.0
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://github.com/gebalamariusz/cloud-audit#readme
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.0** (April 2026)
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
- - **More attack chain rules** -- expand based on community feedback and new attack research
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
@@ -6,7 +6,7 @@
6
6
  |---------|-----------|
7
7
  | 1.2.x | Yes |
8
8
  | 1.1.x | Yes |
9
- | 1.0.x | Yes |
9
+ | < 1.1 | No |
10
10
  | < 1.0 | No |
11
11
 
12
12
  ## Reporting a Vulnerability
@@ -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.0"
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://github.com/gebalamariusz/cloud-audit#readme"
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 47 checks on AWS..."),
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=47)
803
- for _ in range(47):
804
- time.sleep(0.08)
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 self.check_id != check_id:
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 self.resource_id == resource_id
44
+ return fnmatch.fnmatchcase(resource_id, self.resource_id)
44
45
 
45
46
 
46
47
  class CloudAuditConfig(BaseModel):