Skip to content
s1ns3nz0 | Known Unknowns
Go back

EKS Security Controls Implemented in the Cluster Design

8 min read
Internet
   ✕ Public EKS API disabled
   ✕ Public node IPs disabled

Private VPC
   ├─ Private EKS API
   ├─ System node group
   │    └─ VPC endpoints: ECR, KMS, EKS auth, Logs, S3
   ├─ Hoodi consensus/execution node groups
   │    └─ Restricted NAT egress: HTTPS + required P2P ports
   ├─ Private GitOps/CD runner
   └─ Vault / validator namespaces
        └─ Default-deny NetworkPolicies + scoped identities

Control Plane Access

ControlImplementationSecurity purpose
Private EKS endpointPrivate endpoint enabled.Kubernetes API accepts traffic only through private network paths.
No public EKS endpointPublic endpoint disabled.Eliminates direct internet API access.
Private cluster security groupAPI ingress is limited to approved node and private-runner security groups.Prevents arbitrary VPC resources from reaching the Kubernetes API.
Private operations pathSSM/private-runner architecture supports internal administration.Avoids publicly exposed administrator access.
EKS API loggingAPI, audit, authenticator, controller manager, and scheduler logs enabled.Records authentication and API mutation activity.
Log encryption and retentionKMS-backed CloudWatch logs retained for 365 days.Protects audit data and supports investigation.

Important exception

bootstrap_cluster_creator_admin_permissions = true

The initial creator has administrator access. This is useful for bootstrap but should not remain the ordinary administration model.

Authentication and Authorization

ControlImplementationSecurity purpose
EKS access configurationauthentication_mode = "API_AND_CONFIG_MAP"Supports EKS access entries and legacy aws-auth compatibility.
Dedicated access entriesNamed EKS principals are created for private GitOps and bootstrap workflows.Makes non-human cluster access explicit.
Namespace-scoped accessGitOps private runner uses AmazonEKSViewPolicy in argocd and node-operator-dast.Prevents workload changes or unrelated namespace reads.
Kubernetes group bindingThe runner uses a dedicated Kubernetes group for required custom-resource reads.Avoids broad cluster privileges.
Dedicated service accountsValidator client, signing fence, remote signer, database, Vault, and observability use separate identities.Limits blast radius.
Disabled automatic token mountsSensitive workloads disable automatic service-account token mounts.Reduces accidental Kubernetes API credential exposure.

Worker Node Security

ControlImplementationSecurity purpose
Private node IPsPublic IP assignment disabled.Nodes are not directly internet-addressable.
IMDSv2 enforcementhttp_tokens = "required"Blocks IMDSv1 credential retrieval.
Metadata hop limithttp_put_response_hop_limit = 1Reduces Pod-to-metadata credential theft paths.
Encrypted root volumesEBS encryption uses the baseline KMS key.Protects node-root data at rest.
Managed node groupsSeparate managed system, consensus, and execution groups.Supports controlled lifecycle management.
Controlled disruptionmax_unavailable = 1Limits simultaneous node loss during updates.
On-Demand capacitycapacity_type = "ON_DEMAND"Avoids Spot interruption risk.
Node IAM roleWorker, ECR read-only, and CNI permissions are assigned.Supports node operation without placing Vault/release permissions on every node.

Node Pool and Network Segmentation

Node poolIntended workloadNetwork model
SystemCore EKS/platform services and internal dependencies.Private VPC traffic plus S3 endpoint HTTPS; no general internet egress.
ConsensusHoodi consensus clients.Private VPC traffic plus limited HTTPS and consensus P2P ports through approved NAT.
ExecutionHoodi execution clients.Private VPC traffic plus limited HTTPS and execution P2P ports through approved NAT.

The system pool and Hoodi pools use different security groups. Blockchain peer-discovery requirements therefore do not automatically grant platform components internet egress.

Hoodi egress rules

VPC and AWS Service Access

ControlImplementationSecurity purpose
Deny-by-default VPC security groupDefault security group has no ingress or egress.Resources must explicitly opt into communication.
VPC interface endpointsPrivate endpoints for EC2, ECR API, ECR Docker, EKS auth, KMS, and CloudWatch Logs.Nodes reach AWS control services without broad internet routing.
S3 gateway endpointPrivate S3 service route.Supports ECR image-layer download paths.
Endpoint security groupHTTPS only from approved node and runner security groups.Prevents arbitrary VPC workloads from using sensitive endpoints.
VPC Flow LogsAll VPC traffic metadata is logged.Supports network investigation and egress review.
No baseline public networkingNo Internet Gateway, public subnet, or broad NAT is created by the baseline module.Keeps default deployment exposure low.

Kubernetes Network Isolation

ControlImplementationSecurity purpose
VPC CNI enforcementenableNetworkPolicy = "true"Enables Kubernetes NetworkPolicy enforcement.
Default-deny policyIngress and egress default-deny policies use an empty Pod selector.Every Pod needs explicit network allowances.
DNS exceptionTCP/UDP 53 egress is allowed only to kube-system.Enables service discovery without broad egress.
Remote-signer policyOnly signing-fence Pods may connect to the signer on port 9000.Limits unauthorized signing requests.
Vault egress policyRemote signer may contact Vault only on TCP 8200.Prevents general Vault or internet reachability.
Namespace segmentationValidator, Vault, node-operator, observability, and DAST components are separated.Limits lateral movement between workload domains.

AWS Workload Identity

WorkloadIdentity designAllowed authority
EBS CSI controllerDedicated EKS Pod Identity association.EBS lifecycle and approved KMS operations.
VaultDedicated Pod Identity association.Vault KMS operations only.
GitOps private CD runnerDedicated CodeBuild IAM role and EKS access entry.Read-only EKS and approved ECR/chart access.
GitHub mirror workflowsGitHub OIDC role per mirror purpose/environment.Push to intended private ECR repositories.
Release workflowGitHub OIDC role bound to release environment.Scoped release artifact, KMS, and CodeBuild signer actions.

Secrets and Validator Protection

ControlImplementationSecurity purpose
Vault Kubernetes authService account, namespace, and Vault audience are bound.Limits token issuance to intended workloads.
Short-lived Vault tokensTypical TTL is five minutes; maximum TTL is ten minutes.Limits useful lifetime of stolen tokens.
No default Vault policytoken_no_default_policy = truePrevents unplanned default capabilities.
Set-scoped secret pathsSecret paths include validator-set-specific segments.Prevents cross-validator secret access.
Explicit Vault deniesMetadata, Transit, auth, and system paths are denied to signer identities.Blocks listing and Vault administration.
TLS/mTLS signer pathValidator client uses client certificate, private key, and CA bundle.Protects the signing channel.
Lease-based signing fenceExact Lease holder, client Pod UID, and IP are validated.Prevents duplicate or stale signing authority.

Workload Hardening

ControlImplementationSecurity purpose
Non-root executionrunAsNonRoot: true with explicit non-root IDs.Reduces container privilege.
No privilege escalationallowPrivilegeEscalation: falseLimits escalation through process privileges.
Dropped capabilitiescapabilities.drop: ["ALL"]Removes unnecessary kernel privileges.
Read-only root filesystemreadOnlyRootFilesystem: trueMakes persistence and tampering harder.
RuntimeDefault seccompseccompProfile.type: RuntimeDefaultReduces risky system-call exposure.
Resource limitsCPU and memory requests/limits defined.Reduces noisy-neighbor and exhaustion risks.
No host accessBaseline rejects host namespaces and hostPath volumes.Limits direct host-compromise paths.
Private digest-only imagesBaseline expects private ECR SHA-256 references.Prevents mutable or unreviewed runtime images.

Supply Chain and Deployment Controls

ControlImplementationSecurity purpose
Private ECR repositoriesPrivate copies of reviewed images and charts.Removes runtime dependence on public registry pulls.
Immutable image tagsECR tag mutability disabled.Prevents post-approval tag replacement.
Digest verificationMirror workflows compare source and ECR digests.Confirms copied content matches reviewed source.
Pinned GitHub ActionsActions use full commit SHAs.Reduces action tag-replacement risk.
Trusted PR evidence gateTrusted scanner/policy code is separate from PR checkout.Prevents PRs weakening their own checks.
Policy-as-codeRego/Conftest gates evaluate Terraform and manifests.Rejects defined insecure configurations before promotion.
Release signing pathBundle digest, provenance, SBOM, signature, and scan evidence are checked.Binds releases to reviewed source and artifacts.

Monitoring, Audit, and Recovery

ControlImplementationSecurity purpose
EKS control-plane logsAPI, audit, authenticator, scheduler, and controller logs.Detects access and configuration activity.
VPC Flow LogsAll VPC traffic metadata logged.Supports network investigation and egress review.
KMS-protected audit storageAudit/control-plane log groups use a dedicated key.Protects log confidentiality and integrity at rest.
Evidence retentionCI stores normalized non-secret policy evidence for 90 days.Retains review evidence without retaining secret candidates/raw logs.
Retained stateful volumesStateful workload volumes are preserved across scale/delete events.Supports recovery of expensive blockchain client state.
Temporary private operations hostOptional SSM-based private operations access.Provides a controlled internal recovery path.

Share this post:

Previous Post
Private ECR Delivery Architecture for Private EKS
Next Post
Private EKS Security Design Review