Forge is a production-oriented platform baseline for teams running containerized services on AWS. This guide explains the security controls that are implemented today, the risks that are intentionally accepted, and the controls that remain the responsibility of each client team.
This document is public and meant for architecture review, procurement review, and security review. User login and token lifecycle details live in USER_AUTHENTICATION.md. Service identity and service-level authorization details live in SERVICE_AUTHENTICATION.md.
Forge provisions and operates infrastructure inside AWS accounts owned by the client organization. The platform ships opinionated defaults for network topology, identity, workload runtime, and CI access patterns.
Forge is not a managed SaaS control plane. Client teams retain operational ownership of the AWS account, service code, data classification, key management decisions, and any controls required by their regulatory framework.
Forge follows a single-tenant deployment model. Each client environment is isolated in the client-owned AWS account boundary.
Forge baseline assumptions:
Forge baseline non-assumptions:
Forge applies these principles by default:
Progressive hardening means teams can layer stronger transport, key management, and policy controls without redesigning application-level identity and authorization logic.
No repository-authored baseline IAM policy or construct intentionally grants Action: "*", and wildcard resource usage is explicitly documented and constrained.
Forge uses explicit trust boundaries:
Forge deploys a dedicated VPC per environment with:
restrictDefaultSecurityGroup: true to avoid permissive default security group behaviorTraffic between network zones is controlled through explicit security group rules. Reject-only VPC flow logs are enabled and retained for one year to support operational and forensic review.
Current ingress posture is explicit and narrow:
443 and TCP 80 from the internet.The current internal ALB path uses HTTP (80) for service-to-service calls. Identity and authorization remain enforced at the application layer through JWT validation and service authorization checks. HTTPS on the internal path is an available hardening step and is documented as part of the edge and origin roadmap in ADR-0022.
Baseline implication: confidentiality of internal service traffic is not guaranteed by default transport settings and should be hardened for environments with stricter compliance or threat requirements.
Baseline traffic expectation: internal HTTP carries authenticated application payloads and is not designed as a transport channel for long-lived plaintext credentials. Client teams remain responsible for payload classification and required transport hardening for their risk profile.
Regional AWS WAF is attached to the public ALB with:
Host allowlist validation is intentionally treated as hygiene and traffic-shaping control, not cryptographic origin proof. A determined client can still present an allowed Host header. The target future posture is CloudFront in front of ALB with stronger origin verification controls, as recorded in ADR-0022.
WAF provides best-effort edge filtering, not strong origin authentication.
Forge separates human and workload identity:
@AllowedServicesThe platform does not rely on a trusted internal network assumption for service authorization. Services validate token identity and claims on each protected request.
IAM policies in infrastructure code are scoped to specific actions and resource sets wherever AWS APIs support resource-level constraints. Examples include:
Forge avoids broad wildcard permissions for administrative access. Current wildcard usage is limited to AWS API patterns that require wildcard resources or predictable suffix matching:
ecr:GetAuthorizationToken uses Resource: "*" because AWS requires account-level token retrieval.Resource: "*" because SES actions in use are account-scoped.No Action: "*" or administrator-style privilege grants are part of the baseline platform constructs.
Forge stores application runtime-sensitive values in AWS Secrets Manager and AWS Systems Manager Parameter Store. ECS task and execution roles receive read access only for the secret paths and parameters required for runtime behavior.
GitHub repository and environment secrets are used for CI and CD workflow execution, bootstrap operations, and external integration credentials. GitHub secrets are never consumed directly by ECS runtime workloads and are not the system of record for application runtime secret retrieval.
Credential categories include:
Secret rotation is partially automated. The platform currently records explicit cdk-nag suppressions for selected secrets that do not have automatic rotation attached. Teams with stricter compliance requirements should enable managed rotation policies and key lifecycle controls per environment.
Encryption at rest posture in the baseline:
S3_MANAGED) and SSL enforcement.Client hardening option: customer-managed KMS keys are supported as a configuration override per environment but are not required for baseline operation.
Encryption in transit posture in the baseline:
Current baseline runtime posture:
USER 1000)Current repository posture on privileged runtime flags:
Security interpretation:
Future hardening options for stricter environments:
Forge uses GitHub Actions OpenID Connect (OIDC) for AWS role assumption. The trust policy constrains issuer, audience, and subject pattern so only approved workflow identities can assume the deployment role.
GitHub workflow permissions are scoped for deployment tasks:
The platform does not require long-lived AWS access keys in GitHub for routine deployments once OIDC bootstrap is complete.
The baseline reduces credential supply chain risk by replacing long-lived CI cloud credentials with constrained, auditable OIDC role assumption.
Platform logging controls currently implemented:
Organization-level controls expected outside baseline platform constructs:
Platform logging supports operational observability. Audit-grade retention, aggregation, and cross-system correlation are delegated to client environment configuration.
Forge documents security trade-offs so clients can evaluate fit by risk profile.
Current deliberate boundaries include:
These boundaries are intentional design choices, not accidental gaps, and are documented through architecture decision records in architecture/ADRs.md. The platform supports incremental adoption of stronger controls based on client maturity and threat model.
Forge baseline does not:
Forge provides a strong baseline. Client teams should still implement:
Security posture evolves through ADR-driven changes. Existing ADRs record concrete migration paths for stronger edge and origin controls. Teams can adopt those controls incrementally without redesigning core service architecture.
For the platform architecture context behind these decisions, review the ADR index in architecture/ADRs.md.
This matrix summarizes security-relevant platform controls and maturity state for architecture and procurement review.
Status meaning:
| Control | Status | Notes |
|---|---|---|
Least-privilege IAM (no Action: "*") |
Implemented | Repository-authored baseline enforced; wildcard exceptions are bounded and documented. |
| OIDC-based CI and CD deployment identity | Implemented | GitHub Actions role assumption uses constrained OIDC trust, not long-lived AWS keys. |
| Public edge protection (WAF and public ALB) | Implemented | WAF host filtering, rate limiting, and geo controls at public edge. |
| Internal service authentication and authorization | Implemented | Application-layer JWT validation and service authorization controls are active. |
| Runtime isolation and container non-root baseline | Implemented | Fargate private-subnet deployment with non-root container runtime baseline. |
| Internal traffic encryption (HTTPS and mTLS for service-to-service) | Extensible | Transport hardening available through client-owned code and infrastructure extension. |
| Customer-managed KMS key strategy | Extensible | Supported through client-owned key management and infrastructure extension. |
| ALB access logging baseline | Planned | Tracked as roadmap security enhancement. |
| CloudTrail baseline guidance and enforcement pattern | Planned | Tracked as roadmap security enhancement. |
| SIEM integration reference pattern | Planned | Tracked as roadmap security enhancement. |
Audit date: 2026-04-27
Audit scope: repository-authored IAM policy code in infra/src constructs and IAM utilities.
Method note: this inventory is derived from repository-level static analysis and should be revalidated as part of platform release review.
Action: "*" or NotAction.infra/src/lib/construct/forge-github-role-construct.tsactions: ['ecr:GetAuthorizationToken'], resources: ['*']infra/src/lib/utils/iam-utils.tsactions: ['ecr:GetAuthorizationToken'], resources: ['*']infra/src/lib/construct/forge-ecs-task-role-construct.tsactions: ['ses:GetAccountSendingEnabled', 'ses:SendEmail', 'ses:SendRawEmail'], resources: ['*']infra/src/lib/construct/cognito/forge-cognito-gha-policy-construct.tsactions: ['secretsmanager:GetSecretValue'], resources: ['arn:aws:secretsmanager:<region>:<account>:secret:forge/cognito/*']infra/src/lib/construct/forge-ecs-task-role-construct.tsAny new IAM wildcard usage must include one of the following:
Each case should include an inline rationale and corresponding cdk-nag suppression reason where applicable.