Project: CloudSecure Assessment Platform Author: CloudSecure Contributors Started: 2025-01-23 Current Sprint: Deployed & Operational Last Deployment: 2026-03-05 (Region: eu-west-1)
| Sprint | Status | Progress |
|---|---|---|
| Sprint 1: Foundation | ✅ Complete | 100% |
| Sprint 2: Core Assessment | ✅ Complete | 100% |
| Sprint 3: Analysis Modules | ✅ Complete | 100% |
| Sprint 4: Prowler Integration | ✅ Complete | 100% |
| Sprint 5: AI & Reports | ✅ Complete | 100% |
| Sprint 6: Polish | ✅ Complete | 100% |
| Post-Sprint: CLI & Distribution | ✅ Complete | 100% |
- Python CLI tool (
pip install cloudsecure) with SigV4-signed API calls - PyPI packaging with
pyproject.toml, GitHub Actions publish workflow -
install.sh— curl-downloadable CLI installer -
deploy.sh— interactive deployment with--upgradeand--setup-roleflags -
destroy.sh— interactive teardown with multi-layer confirmation - Makefile with build, deploy, test, lint targets
-
.env.exampleconfiguration template - Prowler made optional (
SKIP_PROWLER=true,skipProwlerCDK context) - Runtime
--scopefiltering for targeted assessments - CLI v0.2.0: scope filtering, improved error messages
- Bug fixes: DynamoDB Decimal serialization, presigned URL SigV4, reportS3Key persistence, format validation
- Initialize git repository with branch strategy (main/test/dev)
- Create CDK TypeScript project structure
- Create Python project structure for lambdas
- Set up pyproject.toml with dependencies
- Create KMS key construct
- Create S3 bucket with encryption and lifecycle
- Create DynamoDB assessments table
- Create DynamoDB findings table
- Create DynamoDB context table (CRF entities)
- Add GSI for accountId-index, severity-index, entityType-index
- Create API Gateway REST API
- Configure IAM authorization
- Add POST /assessments endpoint (stub)
- Add GET /assessments/{id} endpoint (stub)
- Add GET /assessments/{id}/report endpoint (stub)
- Add CRF context endpoints (/customers/{id}/context)
- Implement models.py (Assessment, Finding, Pydantic schemas)
- Implement crf_models.py (CRF context entities)
- Implement aws_client.py (STS AssumeRole helper)
- Create CI/CD workflow
- Add CDK synth validation
- Add Python linting (Ruff, Black)
- Create deploy workflow for dev/test/main
- Create shared Python module structure
- Implement models.py (Pydantic schemas)
- Implement aws_client.py (STS helper)
- Implement validate_role Lambda
- Implement discovery_module Lambda
- Create Step Functions state machine
- Implement ValidateRole state
- Implement Discovery state
- Add error handling states
- Connect API Gateway to Step Functions
- Implement start_assessment Lambda (POST /assessments)
- Implement get_assessment Lambda (GET /assessments/{id})
- Implement list_assessments Lambda (GET /assessments)
- Implement get_report Lambda (GET /assessments/{id}/report)
- Set up pytest with moto
- Write unit tests for shared modules (38 tests, 93% coverage)
- Write unit tests for Lambda handlers
- Configure LocalStack for integration tests
- Detect unused credentials (>90 days)
- Detect users without MFA
- Detect overprivileged roles/users
- Detect wildcard trust policies
- Check root account (MFA, access keys)
- Check password policy
- Detect permissive security groups (0.0.0.0/0)
- Detect public-facing EC2 instances
- Check VPC Flow Logs enablement
- Check default VPC usage
- Detect public buckets (ACL/policy)
- Check encryption status
- Check access logging
- Check versioning
- Check account-level public access block
- Detect unencrypted EBS volumes
- Check EBS default encryption
- Detect unencrypted RDS instances
- Detect publicly accessible RDS
- Detect unencrypted EFS file systems
- Check trail configuration (multi-region, logging)
- Check log file validation
- Check KMS encryption
- Detect root account usage (90 days)
- Check CloudWatch metric filters
- Add parallel branches to Step Functions
- Implement findings normalization (base analyzer class)
- Implement aggregate findings Lambda
- Write unit tests for analyzers
- Create Dockerfile for Prowler Lambda
- Configure ECR repository
- Build and push container image (manual pre-build to ECR)
- Test container locally
- Implement prowler_scanner Lambda
- Configure CIS AWS 1.4 checks (subset of critical checks)
- Parse Prowler JSON output (JSON lines format)
- Normalize findings to standard schema
- Created placeholder Lambda (returns empty findings when container build disabled)
- Add Prowler state to Step Functions (parallel with other analyzers)
- Handle 15-minute timeout (14 min Prowler + 1 min buffer)
- Write integration tests
Note: Prowler 5.17.0 now active. Container pre-built and pushed to ECR, deployed as DockerImageFunction. All 7 analyzers (IAM, Network, S3, Encryption, CloudTrail, Native Services, Prowler) are fully operational.
- Implement aggregate_findings Lambda (Sprint 3)
- Deduplicate findings
- Calculate severity distribution
- Prepare findings summary for AI
- Configure Bedrock access (IAM policy)
- Implement finding correlation prompt
- Implement executive summary prompt
- Implement remediation guidance prompt
- Calculate risk scores (weighted by severity)
- Create WeasyPrint Lambda layer (PDF - future)
- Design HTML report template (Jinja2)
- Implement PDF generation (future)
- Implement JSON export
- Implement CSV export
- Generate pre-signed URLs
- Pull SecurityHub findings (if enabled)
- Pull GuardDuty findings (if enabled)
- Pull Config compliance (if enabled)
- Handle disabled services gracefully
- Finalize CloudFormation template
- Finalize Terraform module
- Write onboarding documentation (Terraform README)
- API documentation
- User guide
- Operations runbook
- Security review
- Penetration testing
- Fix identified issues
- Re-enabled Prowler Scanner after fixing Prowler 5.x compatibility issues
- Upgraded from Prowler 4.x to 5.17.0
- Fixed handler.py for Prowler 5.x CLI changes:
- Removed
--complianceoption (mutually exclusive with--checksin v5.x) - Changed
--filter-regionto space-separated arguments (not comma-separated) - Updated output format from
jsontojson-ocsf
- Removed
- Updated JSON parsing to handle OCSF array format (Prowler 5.x outputs JSON arrays, not JSON lines)
- Changed lambda-stack.ts from placeholder Lambda to
DockerImageFunctionusing pre-built ECR image - Added
chmod 644to Dockerfile for Lambda runtime permissions - Test assessment detected 47 Prowler security findings
- Successfully deployed to AWS (eu-west-1)
- Fixed Prowler container build issues by creating placeholder Lambda
- Fixed validate_role Lambda: removed unsupported
MaxResultsfromdescribe_regions - Added
analyzersmodule to Lambda shared layer - Fixed Native Service Puller: store findings in DynamoDB to avoid Step Functions 256KB limit
- Added
jinja2package to Lambda layer for HTML report generation - Created API Gateway CloudWatch Logs IAM role
- First successful assessment completed with 64 findings (Risk Score: 22/LOW)
- Reports generated: HTML, JSON (4MB), CSV with pre-signed S3 URLs
- Implemented Native Service Puller Lambda for AWS security services
- Pulls from SecurityHub, GuardDuty, AWS Config (with graceful handling if not enabled)
- Created CloudFormation onboarding template with ExternalId security
- Created Terraform module with variables, outputs, and README documentation
- Onboarding templates include ReadOnlyAccess, SecurityAudit, and custom security policies
- Added Native Service Puller to parallel analyzer branch in Step Functions
- All 6 sprints complete - full assessment pipeline implemented
- Implemented AI Synthesis Lambda with Amazon Bedrock (Claude 3 Haiku)
- Created intelligent prompts for executive summary, key findings, patterns, remediation
- Implemented risk score calculation (weighted by severity)
- Created Report Generator Lambda with HTML, JSON, CSV exports
- Designed professional HTML report template with Jinja2
- Added pre-signed S3 URLs for secure report download
- Extended Step Functions workflow with AI synthesis and report generation
- Full assessment pipeline now: Validate -> Discover -> Analyze (parallel) -> Aggregate -> AI Synthesis -> Generate Reports
- Implemented Prowler Scanner Lambda as container image
- Created Dockerfile with AWS CLI v2 and Prowler 4.x
- Created ECR repository with lifecycle rules (keep 5 images)
- Implemented handler with cross-account role assumption
- Configured subset of CIS AWS 1.4 critical checks for faster execution
- Added JSON lines output parsing and CloudSecure finding normalization
- Integrated Prowler into Step Functions parallel analyzer branch
- Set 15-minute timeout with 3GB memory and 1GB ephemeral storage
- Implemented 5 security analyzers (IAM, Network, S3, Encryption, CloudTrail)
- Created base analyzer class with common functionality
- Implemented aggregate findings Lambda for collecting results
- Updated Step Functions with parallel analyzer execution
- All analyzers run concurrently for faster assessment
- CIS AWS 1.4 compliance mappings added to findings
- Implemented API Lambda handlers (start, get, list, report)
- Connected API Gateway to Step Functions via Lambda integration
- Updated API Stack with Lambda integrations (replaced mock integrations)
- Full end-to-end assessment flow now functional
- Implemented validate_role Lambda handler
- Implemented discovery_module Lambda handler
- Created Lambda Stack (CDK) with shared layer
- Created Orchestration Stack with Step Functions state machine
- Added unit tests for shared modules (38 tests, 93% coverage)
- Updated CDK app with Lambda and Orchestration stacks
- Created project specification
- Created implementation plan
- Set up README.md, CLAUDE.md, IMPLEMENTATION.md
- Initialized git repository with dev/test/main branches
- Created Storage Stack (DynamoDB tables, S3, KMS)
- Created API Stack (API Gateway with IAM auth)
- Created shared Python modules (models, crf_models, aws_client)
- Set up CI/CD pipeline
Date: 2026-01-23
| Metric | Value |
|---|---|
| Risk Score | 22 (LOW) |
| Total Findings | 64 |
| Critical | 0 |
| High | 2 |
| Medium | 2 |
| Low | 60 |
- [HIGH] No CloudTrail trail logging management events
- [HIGH] Root account used 43 times in last 90 days
Reports generated in HTML, JSON, and CSV formats via pre-signed S3 URLs.
- Prowler: Lambda Container Image (Prowler 5.17.0) - Pre-built to ECR, deployed as DockerImageFunction
- Compliance: CIS AWS 1.4 first, others later
- Multi-Account: Phase 2 (single-account first)
- Testing: moto (unit) + LocalStack (integration)
- Lambda Layer: Uses Docker to build packages with correct Linux (manylinux2014_x86_64) binaries
Prowler Container Build: Docker I/O errors during CDK deploy - using placeholder LambdaRESOLVED (2026-01-23): Pre-built container to ECR, updated to DockerImageFunction
- Prowler execution time may exceed Lambda limits
- Bedrock token costs need monitoring
- WeasyPrint packaging complexity
Instance-level threat assessment via SSM. Extends CloudSecure from account posture to live instance analysis.
- Spec:
docs/features/instance-scan-spec.md - CLI:
cloudsecure scan --instance i-0abc123 --account 123456789012 - Modes:
live(production, attack vector analysis) /forensic(isolated, incident investigation) - Access: SSM RunCommand (agentless, no SSH)
- AI: Bedrock analyzes system state and identifies how an attacker would exploit it
| Sprint | Scope |
|---|---|
| Sprint 7 | MVP: Tier 1 system inventory, Amazon Linux, JSON report |
| Sprint 8 | Web app analysis, Ubuntu, HTML reports, forensic mode |
| Sprint 9 | Threat indicators, CVE matching, batch scan, all distros |
- Prowler Container: Disabled DockerImageFunction, created placeholder Lambda
- EC2 API Fix: Removed unsupported
MaxResultsparameter fromdescribe_regions - Lambda Layer: Added
analyzersmodule to shared layer - Step Functions Limit: Modified Native Service Puller to store findings in DynamoDB (avoid 256KB state limit)
- Jinja2: Added to Lambda layer for HTML report generation
- API Gateway: Created CloudWatch Logs role for API Gateway account settings