AWS Security Hub controls
Every Foundational Security Best Practices control we map to a fix, 361 controls across 55 AWS services. Each one links to the risk in plain English and a step-by-step remediation lesson.
Account · 1
- Account.1
No security contact is set for AWS to reach you
Fix it Set AWS account security contact information
ACM · 2
- ACM.1
Certificates are close to expiry
Fix it Manage and renew TLS certificates - ACM.2
An ACM RSA certificate uses a key shorter than 2048 bits
Fix it Manage and renew TLS certificates
APIGateway · 8
- APIGateway.1
REST/WebSocket API execution logging
Fix it Enable application and API logging - APIGateway.2
REST stages should use SSL certs for backend auth
Fix it Enforce TLS on APIs and search domains - APIGateway.4
API Gateway should be associated with a WAF web ACL
Fix it Protect APIs and edge with WAF - APIGateway.5
REST API cache data should be encrypted at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - APIGateway.8
Routes should specify an authorization type
Fix it Require authentication on data and API services - APIGateway.9
V2 stages should have access logging
Fix it Enable application and API logging - APIGateway.10
V2 integrations should use HTTPS for private connections
Fix it Enforce TLS on APIs and search domains - APIGateway.11
Domain names should use recommended security policies
Fix it Enforce TLS on APIs and search domains
AppSync · 2
- AppSync.2
AppSync should have field-level logging
Fix it Enable application and API logging - AppSync.5
An AppSync GraphQL API is authenticated with API keys
Fix it Require authentication on data and API services
Athena · 1
- Athena.4
Athena query access is not logged
Fix it Enable application and API logging
AutoScaling · 6
- AutoScaling.1
ASGs with an LB should use ELB health checks
Fix it Harden load balancers (ALB/NLB/CLB) - AutoScaling.2
A single-AZ Auto Scaling group is one outage from zero capacity
Fix it Deploy across multiple Availability Zones - AutoScaling.3
Launched instances still allow IMDSv1
Fix it Enforce IMDSv2 on EC2 - AutoScaling.5
A launch config gives ASG instances public IPs
Fix it Block public access to AWS resources - AutoScaling.6
ASGs should use multiple instance types/AZs
Fix it Deploy across multiple Availability Zones - AutoScaling.9
Deprecated launch configurations are still in use
Fix it Migrate ASGs from Launch Configurations to Launch Templates
Backup · 1
- Backup.1
Backup vault recovery points are not KMS-encrypted
Fix it Encrypt other services at rest (queues, streams, logs, ML)
CloudFormation · 2
- CloudFormation.3
Stacks can be deleted without termination protection
Fix it Enable deletion and termination protection - CloudFormation.4
Stacks deploy with user creds instead of a scoped role
Fix it Harden resource and service-role policies
CloudFront · 11
- CloudFront.1
No default root object, exposing the distribution listing
Fix it Protect CloudFront distributions and origins - CloudFront.3
Distributions should require encryption in transit
Fix it Protect CloudFront distributions and origins - CloudFront.5
Distributions should have logging enabled
Fix it Protect CloudFront distributions and origins - CloudFront.6
Distributions should have WAF enabled
Fix it Protect CloudFront distributions and origins - CloudFront.9
Distributions should encrypt traffic to custom origins
Fix it Protect CloudFront distributions and origins - CloudFront.10
No deprecated SSL protocols to custom origins
Fix it Protect CloudFront distributions and origins - CloudFront.12
A distribution points at a non-existent S3 origin (takeover risk)
Fix it Protect CloudFront distributions and origins - CloudFront.13
Distributions should use origin access control
Fix it Protect CloudFront distributions and origins - CloudFront.15
Distributions should use recommended TLS policy
Fix it Protect CloudFront distributions and origins - CloudFront.16
OAC for Lambda function URL origins
Fix it Protect CloudFront distributions and origins - CloudFront.17
Use trusted key groups for signed URLs/cookies
Fix it Protect CloudFront distributions and origins
CloudTrail · 8
- CloudTrail.1
No multi-Region trail captures read/write management events
Fix it Enable CloudTrail and API activity logging - CloudTrail.2
CloudTrail logs are not KMS-encrypted
Fix it Manage KMS encryption keys - CloudTrail.3
No CloudTrail trail is enabled at all
Fix it Enable CloudTrail and API activity logging - CloudTrail.4
CloudTrail log file validation should be enabled
Fix it Enable CloudTrail and API activity logging - CloudTrail.5
CloudTrail is not wired to CloudWatch for alerting
Fix it Enable CloudTrail and API activity logging - CloudTrail.6
The CloudTrail log bucket is publicly accessible
Fix it Block public access to AWS resources - CloudTrail.7
Enable access logging on the CloudTrail S3 bucket
Fix it Enable CloudTrail and API activity logging - CloudTrail.10
CloudTrail Lake stores should use customer-managed KMS
Fix it Manage KMS encryption keys
CodeBuild · 5
- CodeBuild.1
A CodeBuild Bitbucket URL contains embedded credentials
Fix it Rotate and remove stale IAM credentials - CodeBuild.2
CodeBuild env vars contain clear-text credentials
Fix it Rotate and remove stale IAM credentials - CodeBuild.3
CodeBuild S3 logs should be encrypted
Fix it Encrypt S3 object storage at rest - CodeBuild.4
Projects should have a logging configuration
Fix it Enable application and API logging - CodeBuild.7
Report group exports should be encrypted at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML)
Cognito · 5
- Cognito.1
Cognito threat protection is not enforced
Fix it Enable Cognito threat protection - Cognito.3
Cognito password policy is too weak
Fix it Rotate and remove stale IAM credentials - Cognito.4
Cognito threat protection is not enforced
Fix it Enable Cognito threat protection - Cognito.5
Cognito users can sign in without MFA
Fix it Enable MFA for root and IAM users - Cognito.6
A Cognito user pool can be deleted by accident
Fix it Enable deletion and termination protection
Config · 1
- Config.1
AWS Config is off, so most other controls cannot evaluate
Fix it Enable AWS security tooling (Config, Access Analyzer, SSM)
DataSync · 1
- DataSync.1
DataSync tasks should have logging enabled
Fix it Enable application and API logging
DMS · 9
- DMS.1
A DMS replication instance is publicly accessible
Fix it Block public access to AWS resources - DMS.6
DMS instances auto minor version upgrade
Fix it Keep software and engines patched - DMS.7
DMS target DB tasks should have logging
Fix it Enable application and API logging - DMS.8
DMS source DB tasks should have logging
Fix it Enable application and API logging - DMS.9
DMS endpoints should use SSL
Fix it Enforce TLS on database and cache connections - DMS.10
DMS Neptune endpoints should have IAM auth
Fix it Harden database auth, ports and access - DMS.11
DMS MongoDB endpoints should have auth
Fix it Require authentication on data and API services - DMS.12
DMS Redis endpoints should have TLS
Fix it Enforce TLS on database and cache connections - DMS.13
DMS replication instances should be Multi-AZ
Fix it Deploy across multiple Availability Zones
DocumentDB · 6
- DocumentDB.1
DocumentDB clusters should encrypt at rest
Fix it Encrypt AWS databases at rest - DocumentDB.2
DocumentDB adequate backup retention
Fix it Configure backups and retention - DocumentDB.3
A DocumentDB manual snapshot is public
Fix it Configure backups and retention - DocumentDB.4
DocumentDB clusters should export audit logs to CW
Fix it Harden database auth, ports and access - DocumentDB.5
DocumentDB clusters should have deletion protection
Fix it Enable deletion and termination protection - DocumentDB.6
DocumentDB clusters should encrypt in transit
Fix it Enforce TLS on database and cache connections
DynamoDB · 6
- DynamoDB.1
DynamoDB tables should auto-scale capacity
Fix it Make DynamoDB tables scale capacity with demand - DynamoDB.2
DynamoDB tables should have PITR
Fix it Configure backups and retention - DynamoDB.3
DAX clusters should be encrypted at rest
Fix it Encrypt AWS databases at rest - DynamoDB.4
DynamoDB tables should be in a backup plan
Fix it Configure backups and retention - DynamoDB.6
DynamoDB tables should have deletion protection
Fix it Enable deletion and termination protection - DynamoDB.7
DAX clusters should be encrypted in transit
Fix it Enforce TLS on database and cache connections
EC2 · 31
- EC2.1
An EBS snapshot is publicly restorable by any account
Fix it Configure backups and retention - EC2.2
Default security groups still allow traffic
Fix it Harden security groups and restrict ingress - EC2.3
Attached EBS volumes are not encrypted at rest
Fix it Encrypt EBS and EFS storage at rest - EC2.4
Long-stopped instances are abandoned attack surface
Fix it Remove long-stopped EC2 instances - EC2.6
No VPC flow logs, so there is no network audit trail
Fix it Enable VPC flow logs in every VPC - EC2.7
New EBS volumes are not encrypted by default
Fix it Encrypt EBS and EFS storage at rest - EC2.8
IMDSv1 lets an SSRF steal instance credentials
Fix it Enforce IMDSv2 on EC2 - EC2.9
Instances are directly reachable on public IPv4
Fix it Block public access to AWS resources - EC2.10
EC2 API traffic leaves the VPC over the internet
Fix it Move resources into private networks (VPC isolation) - EC2.13
SSH (port 22) is open to the entire internet
Fix it Harden security groups and restrict ingress - EC2.14
RDP (port 3389) is open to the entire internet
Fix it Harden security groups and restrict ingress - EC2.15
Subnets auto-assign public IPs to new instances
Fix it Block public access to AWS resources - EC2.17
Instances with multiple ENIs can bridge network boundaries
Fix it Move resources into private networks (VPC isolation) - EC2.18
Security groups open ports beyond what is authorised
Fix it Harden security groups and restrict ingress - EC2.19
Security groups expose SSH, RDP, or database ports to the world
Fix it Harden security groups and restrict ingress - EC2.20
Both Site-to-Site VPN tunnels should be up
Fix it Secure Site-to-Site VPN connections - EC2.21
NACLs should not allow ingress to ports 22/3389
Fix it Harden security groups and restrict ingress - EC2.23
A Transit Gateway auto-accepts any VPC attachment request
Fix it Disable insecure access modes and protocols - EC2.24
Paravirtual instance types should not be used
Fix it Keep software and engines patched - EC2.25
A launch template assigns public IPs to new instances
Fix it Block public access to AWS resources - EC2.51
Client VPN endpoints should log connections
Fix it Secure Site-to-Site VPN connections - EC2.55
VPC is missing an ECR API endpoint
Fix it Move resources into private networks (VPC isolation) - EC2.56
VPC is missing a Docker Registry endpoint
Fix it Move resources into private networks (VPC isolation) - EC2.57
VPC is missing a Systems Manager endpoint
Fix it Move resources into private networks (VPC isolation) - EC2.58
VPC is missing an Incident Manager Contacts endpoint
Fix it Move resources into private networks (VPC isolation) - EC2.60
VPC is missing an Incident Manager endpoint
Fix it Move resources into private networks (VPC isolation) - EC2.171
Site-to-site VPN tunnels are not logging
Fix it Secure Site-to-Site VPN connections - EC2.172
VPC Block Public Access is not enabled
Fix it Block public access to AWS resources - EC2.180
ENIs with source/dest check off can route around controls
Fix it Move resources into private networks (VPC isolation) - EC2.182
A public EBS snapshot exposes an entire disk
Fix it Configure backups and retention - EC2.183
VPN is using deprecated IKEv1
Fix it Secure Site-to-Site VPN connections
ECR · 3
- ECR.1
Container images are not scanned on push
Fix it Enable threat detection and vulnerability scanning - ECR.2
Mutable image tags can be swapped under you
Fix it Enable ECR tag immutability - ECR.3
ECR repos grow without lifecycle cleanup
Fix it Configure lifecycle and versioning policies
ECS · 13
- ECS.2
An ECS service auto-assigns public IPs to tasks
Fix it Block public access to AWS resources - ECS.3
A task definition shares the host PID namespace
Fix it Harden ECS container workloads - ECS.4
A container runs in privileged mode
Fix it Harden ECS container workloads - ECS.5
A container has a writable root filesystem
Fix it Harden ECS container workloads - ECS.8
Secrets are passed as plaintext container env vars
Fix it Harden ECS container workloads - ECS.9
A task definition has no logging configuration
Fix it Harden ECS container workloads - ECS.10
Fargate services should run latest platform version
Fix it Keep software and engines patched - ECS.12
ECS clusters should use Container Insights
Fix it Harden ECS container workloads - ECS.16
An ECS task set auto-assigns public IPs
Fix it Harden ECS container workloads - ECS.18
ECS task defs should encrypt EFS volumes in transit
Fix it Require TLS for storage and remaining services - ECS.19
Capacity providers managed termination protection
Fix it Enable deletion and termination protection - ECS.20
Linux containers should run as non-root users
Fix it Harden ECS container workloads - ECS.21
Windows containers should run as non-admin users
Fix it Harden ECS container workloads
EFS · 7
- EFS.1
EFS data is not encrypted at rest
Fix it Encrypt EBS and EFS storage at rest - EFS.2
EFS has no automatic backups
Fix it Configure backups and retention - EFS.3
EFS access points should enforce a root directory
Fix it Enforce a root directory on EFS access points - EFS.4
EFS access points should enforce a user identity
Fix it Enforce a user identity on EFS access points - EFS.6
Mount targets not in public-IP subnets
Fix it Block public access to AWS resources - EFS.7
EFS file systems should have automatic backups
Fix it Configure backups and retention - EFS.8
EFS file systems should be encrypted at rest
Fix it Encrypt EBS and EFS storage at rest
EKS · 5
- EKS.1
An EKS cluster API endpoint is public
Fix it Disable insecure access modes and protocols - EKS.2
An EKS cluster runs an unsupported Kubernetes version
Fix it Keep software and engines patched - EKS.3
EKS clusters should use encrypted K8s secrets
Fix it Manage secrets (rotation and hygiene) - EKS.8
EKS clusters should have audit logging
Fix it Enable cluster and search audit logging - EKS.9
An EKS node group runs an unsupported Kubernetes version
Fix it Keep software and engines patched
ElastiCache · 7
- ElastiCache.1
A Redis cluster has no automatic backups
Fix it Configure backups and retention - ElastiCache.2
ElastiCache is not auto-applying minor patches
Fix it Keep software and engines patched - ElastiCache.3
Replication groups should have auto-failover
Fix it Deploy across multiple Availability Zones - ElastiCache.4
Replication groups encrypted at rest
Fix it Encrypt AWS databases at rest - ElastiCache.5
Replication groups encrypted in transit
Fix it Enforce TLS on database and cache connections - ElastiCache.6
Redis replication groups should have AUTH
Fix it Require authentication on data and API services - ElastiCache.7
A cluster uses the default subnet group
Fix it Configure ElastiCache clusters with a custom subnet group
ElasticBeanstalk · 3
- ElasticBeanstalk.1
Environments should have enhanced health reporting
Fix it Enable enhanced health reporting on Elastic Beanstalk environments - ElasticBeanstalk.2
Managed platform updates are disabled
Fix it Keep software and engines patched - ElasticBeanstalk.3
Beanstalk logs are not streamed to CloudWatch
Fix it Stream Elastic Beanstalk logs to CloudWatch
ELB · 18
- ELB.1
ALB serves HTTP without redirecting to HTTPS
Fix it Enforce TLS on load balancer listeners - ELB.2
CLB SSL/HTTPS listeners should use ACM certs
Fix it Use ACM certificates on Classic Load Balancers - ELB.3
CLB listeners should use HTTPS/TLS termination
Fix it Enforce TLS on load balancer listeners - ELB.4
ALB accepts malformed HTTP headers
Fix it Harden load balancers (ALB/NLB/CLB) - ELB.5
Load balancers are not writing access logs
Fix it Enable network and edge logging (LB, WAF, firewall, DNS) - ELB.6
Load balancers can be deleted by accident
Fix it Enable deletion and termination protection - ELB.7
CLBs should have connection draining
Fix it Harden load balancers (ALB/NLB/CLB) - ELB.8
CLB SSL listeners should use strong policy
Fix it Enforce TLS on load balancer listeners - ELB.9
CLBs should have cross-zone balancing
Fix it Harden load balancers (ALB/NLB/CLB) - ELB.10
CLBs should span multiple AZs
Fix it Deploy across multiple Availability Zones - ELB.12
ALB desync mitigation mode
Fix it Harden load balancers (ALB/NLB/CLB) - ELB.13
A single-AZ load balancer is a data-plane single point of failure
Fix it Deploy across multiple Availability Zones - ELB.14
CLB desync mitigation mode
Fix it Harden load balancers (ALB/NLB/CLB) - ELB.16
ALBs should be associated with a WAF web ACL
Fix it Protect APIs and edge with WAF - ELB.17
TLS policy allows weak ciphers or TLS 1.0 to 1.1
Fix it Require TLS for storage and remaining services - ELB.18
A public listener exposes traffic over plain HTTP
Fix it Enforce TLS on load balancer listeners - ELB.21
Health-check probes ride unencrypted HTTP
Fix it Encrypt other services at rest (queues, streams, logs, ML) - ELB.22
Load-balancer-to-target traffic is not encrypted
Fix it Encrypt other services at rest (queues, streams, logs, ML)
ELBv2 · 1
- ELBv2.1
ALB serves HTTP without redirecting to HTTPS
Fix it Enforce TLS on load balancer listeners
EMR · 4
- EMR.1
An EMR primary node has a public IP
Fix it Block public access to AWS resources - EMR.2
EMR account-level block public access is off
Fix it Block public access to AWS resources - EMR.3
EMR security configs should encrypt at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - EMR.4
EMR security configs should encrypt in transit
Fix it Enforce TLS on database and cache connections
ES · 8
- ES.1
ES domains should encrypt at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - ES.2
A legacy Elasticsearch domain is publicly accessible
Fix it Move resources into private networks (VPC isolation) - ES.3
ES should encrypt node-to-node traffic
Fix it Encrypt other services at rest (queues, streams, logs, ML) - ES.4
ES error logging to CW should be enabled
Fix it Enable cluster and search audit logging - ES.5
ES domains should have audit logging
Fix it Enable cluster and search audit logging - ES.6
ES domains should have >= 3 data nodes
Fix it Deploy across multiple Availability Zones - ES.7
ES domains should have >= 3 dedicated master nodes
Fix it Deploy across multiple Availability Zones - ES.8
ES should use latest TLS policy
Fix it Enforce TLS on APIs and search domains
EventBridge · 2
- EventBridge.3
Custom event buses should have a resource policy
Fix it Harden resource and service-role policies - EventBridge.4
Global endpoints should have event replication
Fix it Enable event replication on EventBridge global endpoints
FSx · 3
- FSx.3
FSx for OpenZFS should be Multi-AZ
Fix it Deploy across multiple Availability Zones - FSx.4
FSx for NetApp ONTAP should be Multi-AZ
Fix it Deploy across multiple Availability Zones - FSx.5
FSx for Windows File Server should be Multi-AZ
Fix it Deploy across multiple Availability Zones
Glue · 2
- Glue.3
Glue ML transforms should be encrypted at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - Glue.4
Glue Spark jobs on supported versions
Fix it Keep software and engines patched
GuardDuty · 5
- GuardDuty.1
GuardDuty threat detection is not enabled
Fix it Enable threat detection and vulnerability scanning - GuardDuty.5
GuardDuty EKS audit log monitoring is off
Fix it Enable cluster and search audit logging - GuardDuty.10
GuardDuty S3 Protection is off
Fix it Enable threat detection and vulnerability scanning - GuardDuty.11
GuardDuty Runtime Monitoring is off
Fix it Enable threat detection and vulnerability scanning - GuardDuty.13
GuardDuty runtime monitoring is off for EC2
Fix it Enable threat detection and vulnerability scanning
IAM · 16
- IAM.1
A policy grants full "*" administrative privileges
Fix it Harden resource and service-role policies - IAM.2
Policies attached directly to users do not scale or audit cleanly
Fix it Enforce IAM least privilege - IAM.3
Long-lived access keys have not been rotated
Fix it Manage KMS encryption keys - IAM.4
The root user still has long-lived access keys
Fix it Disable insecure access modes and protocols - IAM.5
Console users without MFA are one phish from compromise
Fix it Enable MFA for root and IAM users - IAM.6
The root user is not protected by hardware MFA
Fix it Enable MFA for root and IAM users - IAM.7
The IAM password policy is too weak
Fix it Rotate and remove stale IAM credentials - IAM.8
Unused IAM keys and passwords are waiting to be leaked
Fix it Rotate and remove stale IAM credentials - IAM.9
The root user can sign in without MFA
Fix it Enable MFA for root and IAM users - IAM.10
IAM user password policies should be strong (PCI DSS)
Fix it Rotate and remove stale IAM credentials - IAM.19
MFA should be enabled for all IAM users
Fix it Enable MFA for root and IAM users - IAM.21
Wildcard permissions grant far more access than intended
Fix it Enforce IAM least privilege - IAM.22
IAM credentials unused for 45 days should be removed
Fix it Rotate and remove stale IAM credentials - IAM.26
Expired IAM-managed SSL/TLS certs should be removed
Fix it Manage and renew TLS certificates - IAM.27
Identities should not have AWSCloudShellFullAccess attached
Fix it Enforce IAM least privilege - IAM.28
No Access Analyzer is watching for unintended external access
Fix it Enable AWS security tooling (Config, Access Analyzer, SSM)
Inspector · 4
- Inspector.1
EC2 is not being scanned for vulnerabilities
Fix it Enable threat detection and vulnerability scanning - Inspector.2
Container images are not scanned by Inspector
Fix it Enable threat detection and vulnerability scanning - Inspector.3
Lambda code is not scanned by Inspector
Fix it Enable threat detection and vulnerability scanning - Inspector.4
Lambda is not fully covered by Inspector
Fix it Enable threat detection and vulnerability scanning
Kinesis · 2
- Kinesis.1
Kinesis streams should be encrypted at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - Kinesis.3
Kinesis streams should have adequate retention
Fix it Configure backups and retention
KMS · 5
- KMS.1
IAM policies should not allow decrypt on all KMS keys
Fix it Manage KMS encryption keys - KMS.2
Decrypt is granted on all KMS keys
Fix it Manage KMS encryption keys - KMS.3
A KMS key is scheduled for deletion and will take data with it
Fix it Manage KMS encryption keys - KMS.4
KMS key rotation should be enabled
Fix it Manage KMS encryption keys - KMS.5
A KMS key policy allows public access
Fix it Manage KMS encryption keys
Lambda · 4
- Lambda.1
A Lambda resource policy allows public invocation
Fix it Disable insecure access modes and protocols - Lambda.2
Lambdas run on deprecated, unpatched runtimes
Fix it Keep software and engines patched - Lambda.3
Lambda functions should be in a VPC
Fix it Move resources into private networks (VPC isolation) - Lambda.5
VPC Lambda functions should span multiple AZs
Fix it Deploy across multiple Availability Zones
Macie · 2
- Macie.1
Sensitive data in S3 is not being discovered
Fix it Enable threat detection and vulnerability scanning - Macie.2
Macie automated sensitive data discovery is off
Fix it Enable threat detection and vulnerability scanning
MSK · 5
- MSK.1
MSK should encrypt in transit among broker nodes
Fix it Enforce TLS on database and cache connections - MSK.3
MSK Connect connectors encrypted in transit
Fix it Enforce TLS on database and cache connections - MSK.4
An MSK cluster allows public access
Fix it Block public access to AWS resources - MSK.5
MSK connectors should have logging
Fix it Enable application and API logging - MSK.6
MSK clusters should disable unauthenticated access
Fix it Require authentication on data and API services
Neptune · 7
- Neptune.1
Neptune clusters should encrypt at rest
Fix it Encrypt AWS databases at rest - Neptune.2
Neptune clusters should export audit logs to CW
Fix it Harden database auth, ports and access - Neptune.3
A Neptune snapshot is shared publicly
Fix it Configure backups and retention - Neptune.5
Neptune clusters should have automated backups
Fix it Configure backups and retention - Neptune.6
Neptune snapshots should be encrypted at rest
Fix it Encrypt AWS databases at rest - Neptune.7
Neptune clusters should have IAM DB auth
Fix it Harden database auth, ports and access - Neptune.9
Neptune clusters should span multiple AZs
Fix it Deploy across multiple Availability Zones
NetworkFirewall · 8
- NetworkFirewall.1
Firewalls should span multiple AZs
Fix it Deploy across multiple Availability Zones - NetworkFirewall.2
Network Firewall logging should be enabled
Fix it Enable network and edge logging (LB, WAF, firewall, DNS) - NetworkFirewall.3
Policies should have >= 1 rule group
Fix it Protect APIs and edge with WAF - NetworkFirewall.4
Default stateless action (full packets)
Fix it Protect APIs and edge with WAF - NetworkFirewall.5
Default stateless action (fragmented)
Fix it Protect APIs and edge with WAF - NetworkFirewall.6
Stateless rule groups should not be empty
Fix it Protect APIs and edge with WAF - NetworkFirewall.9
Firewalls should have deletion protection
Fix it Protect APIs and edge with WAF - NetworkFirewall.10
Firewalls should have subnet change protection
Fix it Protect APIs and edge with WAF
Opensearch · 9
- Opensearch.1
OpenSearch domains should encrypt at rest
Fix it Encrypt AWS databases at rest - Opensearch.2
An OpenSearch domain is reachable from the public internet
Fix it Move resources into private networks (VPC isolation) - Opensearch.3
OpenSearch should encrypt node-to-node traffic
Fix it Encrypt AWS databases at rest - Opensearch.4
OpenSearch error logging to CW should be enabled
Fix it Enable database audit and log exports - Opensearch.5
OpenSearch domains should have audit logging
Fix it Enable database audit and log exports - Opensearch.6
OpenSearch domains should have >= 3 data nodes
Fix it Deploy across multiple Availability Zones - Opensearch.7
OpenSearch has no fine-grained access control
Fix it Harden database auth, ports and access - Opensearch.8
OpenSearch should use latest TLS policy
Fix it Enforce TLS on APIs and search domains - Opensearch.10
OpenSearch should have latest software update
Fix it Keep software and engines patched
RDS · 40
- RDS.1
An RDS snapshot is shared publicly
Fix it Configure backups and retention - RDS.2
An RDS instance is publicly accessible from the internet
Fix it Block public access to AWS resources - RDS.3
RDS DB instances should be encrypted at rest
Fix it Encrypt AWS databases at rest - RDS.4
RDS snapshots should be encrypted at rest
Fix it Encrypt AWS databases at rest - RDS.5
RDS DB instances should use multiple AZs
Fix it Deploy across multiple Availability Zones - RDS.6
RDS lacks enhanced monitoring
Fix it Enable RDS Enhanced Monitoring - RDS.7
RDS clusters should have deletion protection
Fix it Enable deletion and termination protection - RDS.8
RDS DB instances should have deletion protection
Fix it Enable deletion and termination protection - RDS.9
RDS engine logs are not shipped to CloudWatch
Fix it Enable database audit and log exports - RDS.10
RDS relies on long-lived database passwords
Fix it Harden database auth, ports and access - RDS.11
RDS instances should have automatic backups
Fix it Configure backups and retention - RDS.12
IAM auth should be configured for RDS clusters
Fix it Harden database auth, ports and access - RDS.13
RDS is not receiving automatic minor security patches
Fix it Keep software and engines patched - RDS.14
Aurora has no backtracking safety net
Fix it Enable Aurora MySQL backtracking - RDS.15
The RDS or Aurora cluster is single-AZ
Fix it Deploy across multiple Availability Zones - RDS.18
RDS sits in a public subnet reachable from the internet
Fix it Move resources into private networks (VPC isolation) - RDS.19
RDS cluster event notification subscriptions
Fix it Configure event notifications and subscriptions - RDS.20
RDS instance event notification subscriptions
Fix it Configure event notifications and subscriptions - RDS.21
RDS parameter-group event notifications
Fix it Configure event notifications and subscriptions - RDS.22
RDS security-group event notifications
Fix it Configure event notifications and subscriptions - RDS.23
RDS runs on a well-known default port
Fix it Harden security groups and restrict ingress - RDS.24
RDS uses a default admin username
Fix it Harden database auth, ports and access - RDS.25
RDS instances should use a custom admin username
Fix it Harden database auth, ports and access - RDS.26
RDS instances should be in a backup plan
Fix it Configure backups and retention - RDS.27
No alerts on RDS failovers or changes
Fix it Configure event notifications and subscriptions - RDS.34
Aurora MySQL clusters should export audit logs to CW
Fix it Harden database auth, ports and access - RDS.35
RDS clusters auto minor version upgrade
Fix it Keep software and engines patched - RDS.36
RDS MySQL accepts unencrypted connections
Fix it Enforce TLS on database and cache connections - RDS.37
Aurora PostgreSQL clusters should export logs to CW
Fix it Harden database auth, ports and access - RDS.38
RDS PostgreSQL should be encrypted in transit
Fix it Enforce TLS on database and cache connections - RDS.39
RDS MySQL should be encrypted in transit
Fix it Enforce TLS on database and cache connections - RDS.40
RDS SQL Server should export logs to CW
Fix it Enable application and API logging - RDS.41
RDS SQL Server should be encrypted in transit
Fix it Enforce TLS on database and cache connections - RDS.42
RDS MariaDB should export logs to CW
Fix it Enable application and API logging - RDS.43
RDS DB proxies should require TLS
Fix it Enforce TLS on database and cache connections - RDS.44
RDS MariaDB should be encrypted in transit
Fix it Enforce TLS on database and cache connections - RDS.45
Aurora MySQL audit logging is off
Fix it Enable database audit and log exports - RDS.46
An RDS instance sits in a public subnet with an internet route
Fix it Harden database auth, ports and access - RDS.50
RDS clusters should have adequate backup retention
Fix it Configure backups and retention - RDS.51
An Aurora MySQL global cluster runs an unsupported version
Fix it Keep software and engines patched
Redshift · 11
- Redshift.1
A Redshift cluster is publicly accessible
Fix it Block public access to AWS resources - Redshift.2
Connections to Redshift should be encrypted in transit
Fix it Enforce TLS on database and cache connections - Redshift.3
Redshift clusters should have automatic snapshots
Fix it Configure backups and retention - Redshift.4
Redshift clusters should have audit logging
Fix it Enable database audit and log exports - Redshift.6
Redshift should auto-upgrade major versions
Fix it Keep software and engines patched - Redshift.7
Redshift clusters should use enhanced VPC routing
Fix it Move resources into private networks (VPC isolation) - Redshift.8
Redshift should not use the default admin username
Fix it Harden database auth, ports and access - Redshift.10
Redshift clusters should be encrypted at rest
Fix it Encrypt AWS databases at rest - Redshift.15
Redshift accepts cluster-port traffic from anywhere
Fix it Harden security groups and restrict ingress - Redshift.16
Redshift subnet groups should span multiple AZs
Fix it Deploy across multiple Availability Zones - Redshift.18
Redshift clusters should have Multi-AZ enabled
Fix it Deploy across multiple Availability Zones
Route53 · 1
- Route53.2
DNS query logging is off
Fix it Enable network and edge logging (LB, WAF, firewall, DNS)
S3 · 17
- S3.1
Account-level S3 public access is not fully blocked
Fix it Block public access to AWS resources - S3.2
Public S3 buckets expose data to anyone on the internet
Fix it Block public access to AWS resources - S3.3
Buckets can be written to by anyone on the internet
Fix it Block public access to AWS resources - S3.5
S3 is accepting unencrypted HTTP requests
Fix it Require TLS for storage and remaining services - S3.6
Bucket policy grants broad access to other AWS accounts
Fix it Lock down S3 bucket policies that hand sensitive actions to other AWS accounts - S3.8
Buckets can still be made public; Block Public Access is off
Fix it Block public access to AWS resources - S3.9
No S3 access logs, so reads and writes go unaudited
Fix it Enable S3 access and object-level logging - S3.10
Versioned buckets should have lifecycle configurations
Fix it Configure lifecycle and versioning policies - S3.11
Buckets should have event notifications enabled
Fix it Configure event notifications and subscriptions - S3.12
ACLs should not be used to manage bucket access
Fix it Disable insecure access modes and protocols - S3.13
Buckets have no lifecycle rules and grow forever
Fix it Configure lifecycle and versioning policies - S3.15
Buckets should have Object Lock enabled
Fix it Enable Object Lock on S3 general purpose buckets - S3.17
Buckets should be encrypted at rest with KMS keys
Fix it Encrypt S3 object storage at rest - S3.19
An S3 access point can expose the bucket publicly
Fix it Block public access to AWS resources - S3.22
Buckets should log object-level write events
Fix it Enable S3 access and object-level logging - S3.23
Buckets should log object-level read events
Fix it Enable S3 access and object-level logging - S3.24
A Multi-Region Access Point can expose data publicly
Fix it Block public access to AWS resources
SageMaker · 16
- SageMaker.1
A SageMaker notebook has direct internet access
Fix it Harden SageMaker and ML workloads - SageMaker.2
A SageMaker notebook is not launched in a VPC
Fix it Harden SageMaker and ML workloads - SageMaker.3
Users have root access on a SageMaker notebook
Fix it Harden SageMaker and ML workloads - SageMaker.4
Endpoint variants should have > 1 instance
Fix it Harden SageMaker and ML workloads - SageMaker.5
Models should have network isolation enabled
Fix it Harden SageMaker and ML workloads - SageMaker.8
Notebook instances should run supported platforms
Fix it Harden SageMaker and ML workloads - SageMaker.9
Data quality jobs inter-container encryption
Fix it Harden SageMaker and ML workloads - SageMaker.10
Explainability jobs inter-container encryption
Fix it Harden SageMaker and ML workloads - SageMaker.11
Data quality jobs network isolation
Fix it Harden SageMaker and ML workloads - SageMaker.12
Model bias jobs network isolation
Fix it Harden SageMaker and ML workloads - SageMaker.13
Model quality jobs inter-container encryption
Fix it Harden SageMaker and ML workloads - SageMaker.14
Monitoring schedules network isolation
Fix it Harden SageMaker and ML workloads - SageMaker.15
Model bias jobs inter-container encryption
Fix it Harden SageMaker and ML workloads - SageMaker.16
Private registry for primary containers
Fix it Harden SageMaker and ML workloads - SageMaker.17
Feature group offline stores KMS encryption
Fix it Harden SageMaker and ML workloads - SageMaker.19
Private registry for multi-container pipelines
Fix it Harden SageMaker and ML workloads
SecretsManager · 4
- SecretsManager.1
Secrets are not rotated automatically
Fix it Manage secrets (rotation and hygiene) - SecretsManager.2
Rotation-configured secrets should rotate successfully
Fix it Manage secrets (rotation and hygiene) - SecretsManager.3
Stale unused secrets linger as a leak risk
Fix it Manage secrets (rotation and hygiene) - SecretsManager.4
Secrets lack a rotation schedule
Fix it Manage secrets (rotation and hygiene)
SNS · 1
- SNS.4
An SNS topic policy allows public access
Fix it Block public access to AWS resources
SQS · 2
- SQS.1
SQS messages are not encrypted at rest
Fix it Encrypt other services at rest (queues, streams, logs, ML) - SQS.3
An SQS queue policy allows public access
Fix it Block public access to AWS resources
SSM · 6
- SSM.1
Instances are not managed by Systems Manager, so no patching or audit
Fix it Enable AWS security tooling (Config, Access Analyzer, SSM) - SSM.2
Instances are missing security patches
Fix it Keep software and engines patched - SSM.3
SSM associations are non-compliant
Fix it Enable AWS security tooling (Config, Access Analyzer, SSM) - SSM.4
SSM documents can be shared publicly
Fix it Block public access to AWS resources - SSM.6
SSM Automation runs are not logged
Fix it Enable application and API logging - SSM.7
SSM documents can be shared publicly
Fix it Block public access to AWS resources
StepFunctions · 1
- StepFunctions.1
State machines should have logging on
Fix it Enable application and API logging
Transfer · 2
- Transfer.2
Transfer servers should not use FTP
Fix it Disable insecure access modes and protocols - Transfer.3
Transfer connectors should have logging
Fix it Enable application and API logging
WAF · 9
- WAF.1
WAF Classic global web ACL logging
Fix it Enable network and edge logging (LB, WAF, firewall, DNS) - WAF.2
WAF Classic regional rules should have a condition
Fix it Protect APIs and edge with WAF - WAF.3
WAF Classic regional rule groups should have a rule
Fix it Protect APIs and edge with WAF - WAF.4
WAF Classic regional web ACLs should have a rule
Fix it Protect APIs and edge with WAF - WAF.6
WAF Classic global rules should have a condition
Fix it Protect APIs and edge with WAF - WAF.7
WAF Classic global rule groups should have a rule
Fix it Protect APIs and edge with WAF - WAF.8
WAF Classic global web ACLs should have a rule
Fix it Protect APIs and edge with WAF - WAF.10
WAFv2 web ACLs should have a rule or rule group
Fix it Protect APIs and edge with WAF - WAF.11
WAFv2 web ACL logging should be enabled
Fix it Enable network and edge logging (LB, WAF, firewall, DNS)
WorkSpaces · 2
- WorkSpaces.1
WorkSpaces user volumes should be encrypted at rest
Fix it Encrypt EBS and EFS storage at rest - WorkSpaces.2
WorkSpaces root volumes should be encrypted at rest
Fix it Encrypt EBS and EFS storage at rest
Click a control ID for its in-depth page (361 controls covered), or “Fix it” for the full remediation lesson.