Security Posture

secure-cloud-infrastructure · commit 7cc3a18 · generated 2026-10-18 23:03 UTC · workflow run
Passing
Passing

IaC misconfiguration scan

Checkov
414 passed, 0 failed, 14 accepted with justification
Passing

Policy as code

OPA / Conftest
525 checks passed, 0 violations, 0 warnings
Passing

Policy unit tests

opa test
17/17 tests passed
Passing

Secret scanning

Gitleaks
No secrets found in git history
Passing

Container image vulnerabilities (courier-dispatch:scan)

Trivy
0 fixable critical/high · 0 critical, 44 high, 63 medium, 62 low total
Passing

Software bill of materials

Syft (SPDX)
128 packages inventoried

Findings

Checkov: 414 passed, 0 failed, 14 accepted with justification
ResultCheckResourceDetail
ACCEPTEDCKV_AWS_260module.app.aws_vpc_security_group_ingress_rule.alb_http_redirectPort 80 only serves a 301 redirect to HTTPS (enforced by the http_redirect listener and the conftest listener policy).
ACCEPTEDCKV_AWS_394module.network.aws_availability_zones.availableOnly the first az_count zones (sorted by name) are used, so a newly added zone never changes the selection.
ACCEPTEDCKV_AWS_109module.baseline.aws_iam_policy_document.kmsThe account root statement is the AWS recommended default so the key can never become unmanageable.
ACCEPTEDCKV_AWS_111module.baseline.aws_iam_policy_document.kmsThis is a KMS key policy; "*" as resource means "this key" and service statements are scoped by conditions.
ACCEPTEDCKV_AWS_356module.baseline.aws_iam_policy_document.kmsSame as above: key policies must use "*" as the resource.
ACCEPTEDCKV2_AWS_62aws_s3_bucket.stateNo consumer for object events on the state bucket.
ACCEPTEDCKV2_AWS_62module.baseline.aws_s3_bucket.logsNo consumer for object events on the archive; alerting runs off CloudTrail and GuardDuty.
ACCEPTEDCKV2_AWS_3module.baseline.aws_guardduty_detector.thisSingle account deployment with no AWS Organization; the detector is enabled in the deployment region.
ACCEPTEDCKV_AWS_18aws_s3_bucket.stateState bucket access is captured by CloudTrail; a separate access log bucket adds cost without new signal.
ACCEPTEDCKV_AWS_18module.baseline.aws_s3_bucket.logsThis is the log archive itself; logging it into itself would loop. Access is captured by CloudTrail.
ACCEPTEDCKV2_AWS_64aws_kms_key.stateDefault key policy (account root) is intended for this single purpose key.
ACCEPTEDCKV_AWS_144aws_s3_bucket.stateState is versioned; cross region replication is an accepted cost tradeoff (docs/risk-register.md).
ACCEPTEDCKV_AWS_144module.baseline.aws_s3_bucket.logsCross region replication doubles storage cost; accepted risk for this environment, see docs/risk-register.md.
ACCEPTEDCKV2_AWS_61aws_s3_bucket.stateNoncurrent state versions are kept indefinitely on purpose for recovery.
opa test: 17/17 tests passed
ResultTest
PASStest_ecs_public_ip_denied
PASStest_weak_tls_policy_denied
PASStest_unencrypted_log_group_denied
PASStest_partial_public_access_block_denied
PASStest_mutable_unscanned_ecr_denied
PASStest_bucket_without_public_access_block_denied
PASStest_aes256_bucket_encryption_denied
PASStest_public_unencrypted_rds_denied
PASStest_kms_without_rotation_denied
PASStest_compliant_rds_allowed
PASStest_inline_rdp_open_to_world_denied
PASStest_ssh_open_to_world_denied
PASStest_https_open_to_world_allowed
PASStest_wildcard_iam_warns
PASStest_single_region_trail_denied
PASStest_public_subnet_auto_ip_denied
PASStest_http_listener_forwarding_denied
Trivy: 0 fixable critical/high · 0 critical, 44 high, 63 medium, 62 low total
SeverityIDPackageInstalledFixed in
HIGHCVE-2025-69720libncursesw66.5+20250216-2no fix yet
HIGHCVE-2025-69720libtinfo66.5+20250216-2no fix yet
HIGHCVE-2025-69720ncurses-base6.5+20250216-2no fix yet
HIGHCVE-2025-69720ncurses-bin6.5+20250216-2no fix yet
HIGHCVE-2026-16742libsystemd0257.13-1~deb13u1no fix yet
HIGHCVE-2026-16742libudev1257.13-1~deb13u1no fix yet
HIGHCVE-2026-54369libacl12.3.2-2+b1no fix yet
HIGHCVE-2026-76642bsdutils1:2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642libblkid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642liblastlog2-22.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642libmount12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642libsmartcols12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642libuuid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642login1:4.16.0-2+really2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642mount2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-76642util-linux2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408bsdutils1:2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408libblkid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408liblastlog2-22.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408libmount12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408libsmartcols12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408libuuid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408login1:4.16.0-2+really2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408mount2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78408util-linux2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409bsdutils1:2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409libblkid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409liblastlog2-22.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409libmount12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409libsmartcols12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409libuuid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409login1:4.16.0-2+really2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409mount2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78409util-linux2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410bsdutils1:2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410libblkid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410liblastlog2-22.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410libmount12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410libsmartcols12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410libuuid12.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410login1:4.16.0-2+really2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410mount2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-78410util-linux2.41.5-0+deb13u1no fix yet
HIGHCVE-2026-9538perl-base5.40.1-6+deb13u1no fix yet

Controls implemented

Encryption at restKMS CMK with rotation for S3, RDS, logs, ECR, SNS, Secrets Manager
Encryption in transitTLS 1.2+ listener policy, HTTP redirect, rds.force_ssl, TLS only bucket policy
Network isolationThree tier VPC, data subnets with no internet route, SG to SG rules, NACLs
Edge protectionAWS WAF managed rules, Log4j and SQLi rules, per IP rate limiting
Least privilegeSeparate task execution and task roles, secrets scoped by ARN, no ECS exec
Workload hardeningNon root user, read only root filesystem, all capabilities dropped
Audit loggingMulti region CloudTrail with validation, VPC flow logs, WAF and ALB logs
Threat detectionGuardDuty (S3 + Fargate runtime), Security Hub CIS v3 and AWS FSBP
Supply chainImages pinned by digest, signed with Sigstore cosign, SBOM attested
SecretsDB credentials generated and rotated by Secrets Manager, gitleaks on every push