Skip to content
Last updated: Sep 25, 2026

AWS Go-Live Gate — Options Assessment ​

OwnerClassificationVersionEffectiveNext reviewStatus
Sekhar PrakashInternal1.12026-09-052026-11-27Active

Purpose. For each open Part B item in the AWS Production Security Gate, this page assesses the AWS-native service options available to close it — with trade-offs, cost, and the relevant control/standard citation. It is an options analysis, not a register: finding detail, severity, and status remain authoritative in the findings register and the gate itself; this page is referenced from there and does not restate them.

Scope and method ​

Covers the four Part B gate items still open as of gate v1.2 (F-11, F-12, F-18, F-21/F-22) plus the WAF/Shield half of F-11. For each, AWS-native options are compared against AWS Well-Architected (Security Pillar), the AWS Security Reference Architecture, CIS AWS Foundations Benchmark, and AWS Foundational Security Best Practices (Security Hub control IDs cited where one exists. Grounded against the applied Terraform in fin-infra/aws/ as of 2026-09-05, not assumed from the gate text alone.

Two gaps surfaced during this assessment that are not yet findings — see New findings. A further twelve AWS topics were researched and found not to correspond to any gate item or tracked finding — see Researched, not gated below for the one-line summary, or the AWS Service Reference for full option/trade-off detail on each, plus Amazon Cognito (not currently in use).

F-11 — Detection baseline ​

OptionClosesTrade-offCost
CloudTrail — one org trail, Log Archive accountManagement-event audit trail (AWS SRA: centralize in Log Archive, not per-account trails)Free first copy/region. Scope data events to app_data only — never free, and account-wide data events dwarf management-event cost at fintech S3 volume$0 mgmt events + S3 storage
AWS Config (periodic mode)Not named in the gate text, but is Security Hub's evaluation engine underneath — most Security Hub controls do not fire without itPeriodic/daily recording scoped to security-relevant resource types (IAM, S3, SGs, RDS, KMS) rather than "all" bounds volume and cost$0.012/item (periodic) vs $0.003 (continuous, higher volume at churn)
Security Hub CSPM (CIS + FSBP standards)The scoring half of the detection baselineDepends on Config recording (above) for most controls~$3.75/mo per 1 EC2-equivalent resource unit
VPC Flow Logs → S3Named directly in F-11; no destination specified in the gate textS3 destination ≈48% cheaper than CloudWatch Logs for identical volume ($0.273/GB effective vs $0.53/GB); reserve CloudWatch only where live alarming on flow patterns is needed~$0.27/GB to S3

GuardDuty is already provisioned (gate status). CloudTrail, Config, and Security Hub remain the open items; Config is a silent prerequisite the gate text does not name.

Standards: CIS AWS Foundations Benchmark v5.0.0 §3.1 (CloudTrail.1) · Security Hub FSBP GuardDuty.1 / Config.1.

Edge protection (F-11, WAF & Shield) ​

OptionFitsTrade-offCost
ATP managed rule setDirectly relevant to F-41 (no brute-force protection on /auth/login) — checks login attempts against AWS's stolen-credential database, aggregates by IP + sessionResponse-inspection half (failure-rate tracking) only works on CloudFront, not ALB — a real limitation since blitz-api is ALB-only today$10/mo + $1,000/M requests (0–2M), falling to $50/M beyond 30M
Rate-based rule, JA3/JA4 aggregation keyUsable directly on ALB today; keys on TLS fingerprint instead of source IP — catches credential-stuffing botnets that rotate IPs but reuse the same client stackCheaper than ATP at low-to-moderate volume; reasonable first line before ATP's per-request tiers2 + 30 WCU per custom key
Shield Standard (already on)Automatic, free — covers common L3/L4 volumetric attacks on the ALB and the NAT Gateway's EIPNo L7 coverage, no cost-protection credits, no SRT access$0
Shield AdvancedAdds L7 detection, cost protection, 24/7 SRT$3,000/mo, 1-year commitment; not warranted at current traffic/threat profile$3,000/mo

Assessment: a rate-based rule keyed on JA3/JA4 is the near-term action — cheap, closes F-41's gap at the edge as defense-in-depth alongside whatever elysia-rate-limit work lands in blitz. ATP (CloudFront dependency) and Shield Advanced (cost, no current trigger) are not warranted yet.

F-12 — IAM scopes too broad ​

Confirmed live in fin-infra/aws/modules/iam/main.tf's ecs_execution_secrets policy: kms:Decrypt on Resource: "*".

OptionWhat it doesTrade-offCost
Scope kms:Decrypt to CMK ARNsDirect fix — replace Resource: "*" with the specific RDS/S3/Secrets CMK ARNs the task needsNone$0
IAM Access Analyzer — policy validation~100 best-practice checks including broad-resource warnings, run at write-time via console/CLI/APIDetection only; needs CI wiring to enforce$0
Policy generation from CloudTrailAnalyzes 90 days of real usage for a role, generates a scoped-down policy reflecting actual actions usedNeeds usage history to exist first$0
Unused-access analyzerContinuous flagging of granted-but-unused services/actions — catches drift after the initial fixBilled per role/user/month; detection only, no auto-remediationPer-principal/mo

Assessment: the direct fix is free and should land regardless of tooling choice. Layer policy validation into the Terraform CI path so this class of finding cannot recur silently, per fin-infra's existing "prefer a check that detects the whole class" principle.

F-18 — CMKs, RDS & S3 hardening ​

S3 — TLS-only policy & encryption. No bucket policy currently exists in modules/s3 at all.

OptionFitsTrade-offCost
aws:SecureTransport denyCloses the gate's "TLS-only policy" item directly (FSBP S3.5)Static policy statement; no legitimate client uses plain HTTP$0
Switch default encryption to SSE-KMSBoth buckets are SSE-S3 (AES256) today, not the KMS CMK the module already provisions — the CMK exists with a service-principal grant ready, referenced nowhereMust precede any "deny non-KMS PUT" policy — doing the policy first breaks uploads~$1/mo CMK, already paid
CloudTrail data events, scoped to app_dataCloses the gate's "access logs" item — AWS's own guidance names this, not server access logging, as the audit-grade option with identity attributionPaid per event, no free tier; scope to the one sensitive bucket$0.10/100k events

RDS — private, CMK-encrypted, rds.force_ssl on, Multi-AZ + deletion protection on production (mostly correct already). Two gaps found:

GapFixTrade-offCost
Master password held in Terraform stateRDS-native managed rotation (manage_master_user_password = true) — RDS owns the secret, rotates every 7 days, no Lambda to maintainMigrating an existing instance is a two-step Terraform operation with known provider friction; state does not retroactively scrub old plaintext versions — prove out on preprod first$0 extra
RDS IAM database authentication offShort-lived SigV4 tokens instead of a static passwordMarginal benefit here — pooled connection pattern is well under the 200 cps ceiling where IAM auth's real advantage appears; Secrets Manager rotation gets most of the same benefit with less app-side plumbing$0, + RDS Proxy if pooling gets tight

Standards: FSBP S3.5 (TLS-only) · FSBP S3.17 (KMS-required) · RDS.10 (IAM auth) — Security Hub CSPM.

F-21 / F-22 — Secrets, Identity Center, CI/CD ​

Secrets: Secrets Manager vs SSM Parameter Store. Secrets Manager is already the correct tool in use — 9 platform-wide secrets, none per-tenant, no sprawl risk today. Parameter Store Standard (free) is the right fit only for non-rotating config, which this repo does not currently need; Parameter Store has no native rotation, and AWS's own ECS guidance steers rotation needs to Secrets Manager. No change recommended.

Identity — closing the interim access pattern. Identity Center's Terraform destination state already exists in full (global/identity-center/main.tf — permission sets and group assignments defined); the only outstanding work is the Zoho SAML metadata exchange itself. This is the single highest-leverage closure item across the whole gate, since nothing else needs building. Two gaps in the interim sekhar-console bridge are worth closing on the same timeline: no MFA enforcement visible in IaC (verify whether this is console-only drift), and its assume-role trust is wildcarded across arn:aws:iam::*:role/OrganizationAccountAccessRole rather than pinned to the two known account IDs.

New findings, not yet registered ​

Two gaps surfaced from reading the applied Terraform directly, not from a code review — neither has a finding ID yet.

  • ECS security group opens ports 0–65535, not the actual service ports. The ecs security group's ingress rule (from_port = 0, to_port = 65535, scoped to the ALB SG and itself) lets the ALB — and any ECS task — reach any port on any container, not just each service's real 10001–10017/9999 listener. Not open to 0.0.0.0/0, so it fails on breadth-of-port rather than breadth-of-source. Free, one-line Terraform fix: narrow to the specific per-service ports already enumerated in services.tf. Maps to Security Hub EC2.18.
  • GitHub Actions OIDC trust is org-wide, not repo-scoped. The finaisse-github-actions role's trust condition is repo:finaisse-org/*:* — any repo under the org, any branch, any workflow. The role holds iam:PassRole for ECS and secretsmanager:GetSecretValue on all finaisse/* secrets, so a scratch/test repo added later under the same org inherits deploy-level trust with zero extra configuration. Scope sub to the specific deploying repos, and prefer GitHub Environments over branch names for anything touching production.

Researched, not gated ​

Researched during this assessment; none correspond to a gate item or tracked finding. Deferred, not dismissed — full option/trade-off detail for each is in the AWS Service Reference.

TopicWhy deferred
AWS Config (as a named gate item)Implicitly required by Security Hub, folded into F-11 above — not a separate action
Amazon DetectiveInvestigation tooling downstream of GuardDuty/Security Hub findings, not a compliance-gating control; defer until triage volume makes it painful
AWS Audit ManagerClosed to new customers since 2026-04-30 — moot regardless of priority. SOC 2/GDPR have no Config Conformance Pack equivalent; AWS's own FAQ points to third-party GRC tooling (Vanta/Drata) instead
S3 Object Lock (WORM)One-way, bucket-creation-time decision; needs a compliance/legal read on retention regulation before adoption, not an infra call alone
Amazon MacieStronger fit for unstructured PII/credential leakage than structured financial documents; if adopted, run scheduled on new-object deltas rather than continuous full-corpus scans
KMS key admin/user separationCurrently root + service-principal only, no RBAC split; moot until SSE-KMS is actually adopted on the S3 buckets (see F-18)
Presigned URL tenant scopingFundamentally an application/IAM-design correctness issue — AWS provides ABAC/session-tag primitives to enforce it, but cannot retroactively fix a wrong prefix computed in application code
SCP baseline gapsCurrent 6 SCPs cover region/IMDSv2/GuardDuty/CloudTrail/S3-encryption; nothing protects Config or Security Hub from tampering, and no SCP-level root-API restriction exists yet
AWS Network FirewallRedundant for ingress — WAF already covers HTTP semantics better. Earns its ~$576/mo fixed cost only if egress domain-allowlisting becomes a real requirement; cheaper interim step is tightening the ecs SG's wide-open egress rule
VPC endpointsS3 gateway endpoint is free and strictly beneficial — add unconditionally. Secrets Manager / CloudWatch Logs interface endpoints need a real traffic-volume check before their ~$15–30/mo each is justified
RDS pgAudit / Database Activity StreamsAlready named in logging-coverage (not enabled). DAS does not apply — it is Aurora-only for PostgreSQL. pgAudit is the real option: free, one parameter-group change plus reboot
ElastiCache transit encryptionNot named in any tracked finding. Blocked by blitz's Redis client using redis:// — but AWS's Dec-2022 graduated migration (preferred → required) means this is no longer an infra rebuild, only a staged application-side config change

Actions and owners ​

ActionFindingOwnerPriority
Scope kms:Decrypt (and other wildcard resources) to specific ARNsF-12SekharGate
Add aws:SecureTransport deny to both S3 bucket policiesF-18SekharGate
Switch S3 default encryption from SSE-S3 to the existing KMS CMKF-18SekharGate
Enable CloudTrail (org trail), Config, Security HubF-11SekharGate
Add a WAF rate-based rule keyed on JA3/JA4F-11SekharGate
Complete Zoho SAML metadata exchange for Identity CenterF-22SekharGate
Pin sekhar-console's assume-role trust to the two known account IDs; verify MFA enforcementF-22SekharGate
Narrow the ecs security group's ingress port range to actual service ports(new — see above)SekharFix now, file finding
Scope the GitHub Actions OIDC trust policy sub claim to specific repos(new — see above)SekharFix now, file finding
Migrate RDS master password to manage_master_user_passwordF-18SekharPost-gate

Revision history ​

VersionDateAuthorChange
1.02026-09-05Sekhar PrakashInitial options assessment for Part B (F-11, F-12, F-18, F-21/F-22), cross-referenced against the security register.
1.12026-09-05Sekhar PrakashLinked the new AWS Service Reference for full detail on researched, non-gated topics.

Finaisse Internal — Confidential. Not for external distribution.

Finaisse Internal — Confidential. Access-restricted; not for external distribution.