AWS Compliance Controls
296 controls across AWS services, each with Terraform implementation examples, framework mappings, and audit guidance.
No controls match the current filters.
Amazon API Gateway
API Gateway methods should require an authorizer Checks that every API Gateway REST API method has an authorization type other than NONE. Methods without an authorizer accept requests from any internet caller, bypassing identity checks and exposing backend integrations to unauthorized invocation. API Gateway methods should validate request parameters Checks that API Gateway REST API methods have request parameter validation active via a configured request validator. Any method without a validator, or with one that has validate_request_parameters set to false, is flagged as non-compliant. API Gateway REST API stages should have AWS X-Ray tracing enabled Checks whether AWS X-Ray active tracing is enabled on each API Gateway REST API stage. X-Ray tracing must be explicitly turned on per stage to collect request-level trace data for latency analysis and dependency mapping. API Gateway routes should require an authorization type Checks that every AWS API Gateway V2 HTTP API route has an explicit authorization type set to a non-NONE value. Acceptable values are AWS_IAM, CUSTOM, and JWT. Routes that omit this setting default to NONE, leaving the backend open to any caller without credentials. API Gateway stages should have cache encryption at rest enabled Checks that API Gateway REST API stages with caching enabled have encryption at rest turned on for the cache. The control fails if a stage's method settings do not set cache_data_encrypted to true, leaving cached API responses stored unencrypted. API Gateway stages should have logging enabled Checks that Amazon API Gateway REST API stages have logging enabled. The control validates that execution logging is configured at the stage level with a logging level other than OFF, and optionally that access logging is directed to a destination ARN. API Gateway stages should not use client SSL certificates Checks that Amazon API Gateway REST API stages do not have a client SSL certificate configured. API Gateway client certificates authenticate the gateway to a backend endpoint, not the caller to the API. A stage passes when client_certificate_id is not set. API Gateway V2 routes should require an authorizer Checks that every API Gateway V2 route has authorization_type set to JWT, AWS_IAM, or CUSTOM. Routes with authorization_type set to NONE or omitted entirely fail the control, leaving backend integrations open to unauthenticated callers. API Gateway V2 stages should have access logging configured Checks whether AWS API Gateway V2 stages have access logging configured. Applies to both HTTP and WebSocket API stage types. Fails when the stage has no access_log_settings block, or when destination_arn is empty or null, leaving request-level logging disabled.
Amazon AppStream 2.0
AppStream fleets should have default internet access disabled Checks that Amazon AppStream 2.0 fleets have default internet access disabled by evaluating the enable_default_internet_access attribute. Any fleet configured to grant direct internet access to streaming instances fails this control. AppStream fleets should have idle disconnect timeout set to 10 minutes or less Validates that Amazon AppStream 2.0 fleet resources have their idle disconnect timeout set to 600 seconds (10 minutes) or less. This controls how long a streaming session can remain idle before the user is automatically disconnected from the instance. AppStream fleets should have session disconnect timeout set to 5 minutes or less Validates that Amazon AppStream 2.0 fleet disconnect timeout is configured to 300 seconds (5 minutes) or less. When users disconnect from a streaming session, the instance remains active for this duration, consuming resources and maintaining an open session state. AppStream fleets should limit maximum user duration to 10 hours or less Validates that Amazon AppStream 2.0 fleet maximum user session duration (max_user_duration_in_seconds) is configured to no more than 36000 seconds (10 hours), limiting how long a single streaming session can run before AppStream forces termination.
Amazon Athena
Athena workgroups should be encrypted at rest Checks that each AWS Athena workgroup has encryption at rest configured for query results. The control fails when no encryption_configuration block exists or when the encryption_option argument is absent, leaving query result data unencrypted in S3. Athena workgroups should enforce configuration Verifies that each Amazon Athena workgroup has enforce_workgroup_configuration enabled, ensuring that workgroup-level settings for query result output location, encryption, and other options cannot be overridden by individual client-side query settings. Athena workgroups should have logging enabled Validates that each Amazon Athena workgroup has CloudWatch query metrics publishing enabled. The control inspects publish_cloudwatch_metrics_enabled inside the workgroup configuration block and fails when the argument is false or not explicitly set.
Amazon CloudFront
CloudFront distributions access logs should be enabled Checks whether each CloudFront distribution has access logging enabled. The check looks for a logging_config block with a non-empty bucket value pointing to an S3 destination. Distributions that omit this block or leave bucket empty fail. CloudFront distributions should have a default root object configured Validates that each AWS CloudFront distribution has a default root object configured, ensuring requests to the distribution root URL return a specific object rather than exposing the contents of the origin or returning an error. CloudFront distributions should have AWS WAF enabled Checks that every Amazon CloudFront distribution has an associated AWS WAF or AWS WAFv2 web ACL. The control fails when the distribution's web ACL association is empty, leaving edge traffic unfiltered by any WAF rule set. CloudFront distributions should have field level encryption enabled Checks whether AWS CloudFront distributions have field-level encryption enabled. The control fails if no field-level encryption configuration ID is associated with the distribution's default cache behavior or ordered cache behaviors. CloudFront distributions should have geo restriction enabled Checks that each Amazon CloudFront distribution has geographic restriction configured with a whitelist or blacklist rather than set to none. Geo restriction controls which countries can access content served through the distribution. CloudFront distributions should have latest TLS version Checks that CloudFront distributions set minimum_protocol_version to TLSv1.2_2021 in the viewer certificate block. Older values like TLSv1.1_2016 or TLSv1.2_2019 expose client connections to deprecated cipher suites and leave the door open for downgrade attacks. CloudFront distributions should require encryption in transit Validates that every AWS CloudFront distribution's default and ordered cache behaviors set ViewerProtocolPolicy to https-only or redirect-to-https, preventing any viewer from connecting to the distribution over unencrypted HTTP. CloudFront distributions should use custom SSL/TLS certificates Checks whether Amazon CloudFront distributions use a custom SSL/TLS certificate (from ACM or IAM) instead of the default CloudFront certificate. Distributions relying on the default *.cloudfront.net certificate fail this control. CloudFront distributions should use SNI to serve HTTPS requests Validates that CloudFront distributions using a custom SSL/TLS certificate are configured with SNI (Server Name Indication) as the SSL support method, not dedicated IP, ensuring HTTPS is served without unnecessary cost or legacy IP allocation overhead. CloudFront distributions should use the recommended TLS security policy Checks each CloudFront distribution's viewer certificate block for a minimum TLS security policy of TLSv1.2_2021 or higher, rejecting configurations that allow older protocol versions or weak cipher suites to be negotiated with connecting clients.
Amazon CloudWatch
CloudWatch alarms should have action enabled Verifies that AWS CloudWatch metric alarms have their actions enabled so that configured notifications, Auto Scaling policies, or EC2 actions actually fire when alarm state transitions occur. Alarms with disabled actions silently swallow threshold breaches. CloudWatch alarms should have an action configured Validates that each CloudWatch alarm has at least one action configured for the ALARM, INSUFFICIENT_DATA, or OK state, and that the actions_enabled flag is set to true. Alarms without actions generate no notifications and cannot trigger automated responses.
Amazon CloudWatch Logs
CloudWatch log groups should have retention period of at least 365 days Checks that every CloudWatch Logs log group has an explicit retention policy set to at least 365 days. Log groups with no retention setting, which defaults to indefinite, or any period shorter than 365 days fail this control. Log groups should have encryption at rest enabled Checks that each AWS CloudWatch Log Group has a KMS customer-managed key (CMK) associated for encryption at rest. CloudWatch Logs encrypts data with service-managed keys by default, but this control requires an explicit kms_key_id on the log group.
Amazon DocumentDB
DocumentDB clusters should have an adequate backup retention period Validates that each AWS DocumentDB cluster has a backup_retention_period of at least 7 days. Clusters with a retention period below 7 days fail. The default DocumentDB retention period is 1 day, which does not satisfy this control. DocumentDB clusters should have deletion protection enabled Checks that Amazon DocumentDB clusters have deletion protection enabled, preventing accidental or unauthorized deletion via the Console, CLI, or API until the flag is explicitly disabled. The deletion_protection attribute defaults to false when omitted. DocumentDB clusters should have encryption at rest enabled Checks that each AWS DocumentDB cluster has encryption at rest enabled via the StorageEncrypted property. Fails when a cluster stores data without server-side encryption, leaving database contents readable if underlying storage media is compromised. DocumentDB instance logging should be enabled Checks that AWS DocumentDB cluster instances have CloudWatch Logs exports enabled. Validates that at least one log type (audit or profiler) is configured for export, ensuring database activity is captured outside the cluster for independent analysis and retention.
Amazon DynamoDB
DynamoDB tables should have AWS KMS encryption enabled Checks that each AWS DynamoDB table uses a customer-visible AWS KMS key (AWS-managed aws/dynamodb or a customer-managed key) rather than relying on AWS-owned key encryption. Tables using only AWS-owned key encryption fail this control. DynamoDB tables should have deletion protection enabled Checks that every DynamoDB table has deletion_protection_enabled set to true, blocking table deletion via the Console, CLI, or API until protection is explicitly disabled. Any DeleteTable call is rejected until that precondition is met. DynamoDB tables should have encryption enabled Validates that each AWS DynamoDB table has server-side encryption at rest enabled. DynamoDB supports AWS-owned keys (default since 2018), AWS managed KMS keys, or customer managed KMS keys. This control checks that an explicit encryption configuration is present. DynamoDB tables should have point-in-time recovery enabled Validates that all AWS DynamoDB tables have point-in-time recovery (PITR) enabled, providing continuous backups with a 35-day rolling window. PITR allows restoration of table data to any second within that window, protecting against accidental writes or deletes.
Amazon DynamoDB Accelerator
DynamoDB Accelerator (DAX) clusters should be encrypted at rest Validates that each DynamoDB Accelerator (DAX) cluster has server-side encryption at rest enabled. The control fails if a DAX cluster lacks encryption at rest, meaning cached data stored on cluster nodes is unprotected on disk. DynamoDB Accelerator clusters should be encrypted in transit Checks that Amazon DynamoDB Accelerator (DAX) clusters have in-transit encryption enabled by verifying cluster_endpoint_encryption_type is set to TLS. The argument defaults to NONE, so any cluster that omits it deploys without encryption and fails this control.
Amazon EBS
Attached EBS volumes should have encryption enabled Checks that all EBS volumes currently attached to EC2 instances have encryption enabled. Unattached volumes are out of scope. The control evaluates the encrypted attribute on each aws_ebs_volume resource and fails any attached volume where encryption is not active. EBS snapshots should be encrypted Checks that every EBS snapshot has encryption enabled. Snapshots inherit encryption from the source EBS volume, so unencrypted volumes produce unencrypted snapshots. The control flags any snapshot where the encrypted attribute is false. EBS volumes should have encryption at rest enabled Checks that every AWS EBS volume has encryption at rest enabled. Volumes may be encrypted using AWS-managed keys or customer-managed KMS keys. Unencrypted volumes fail this control regardless of the data they contain or their attachment state.
Amazon EC2
EC2 instances should be in a VPC Validates that every EC2 instance runs inside a VPC by checking for a non-empty vpc_id attribute. EC2-Classic, retired by AWS in August 2022, lacked subnet isolation, private IP address space, and network ACLs, making it unsuitable for any regulated workload. EC2 instances should have attached EBS volumes marked for deletion on termination Checks that every EBS volume attached to an EC2 instance has DeleteOnTermination set to true in the block device mapping. Volumes missing this flag persist after instance termination, accruing storage charges and retaining data without the original access controls. EC2 instances should have detailed monitoring enabled Checks that each EC2 instance has detailed monitoring enabled via monitoring = true on aws_instance, or monitoring { enabled = true } inside aws_launch_template. Without it, instances report CloudWatch metrics at 5-minute intervals instead of 1-minute. EC2 instances should have EBS optimization enabled Checks that EC2 instances have EBS optimization enabled, providing dedicated throughput between the instance and its EBS volumes. Without it, EBS I/O and general network traffic compete for the same bandwidth, causing unpredictable latency under load. EC2 instances should have IAM profile attached Checks that every running AWS EC2 instance has an IAM instance profile attached. Instances without a profile cannot assume an IAM role, leaving developers to choose between hardcoded access keys or no AWS API access at all. EC2 instances should have termination protection enabled Checks that each EC2 instance has API termination protection enabled via the DisableApiTermination attribute. The control fails when an instance can be terminated directly via the API or Console without needing to disable a protection gate first. EC2 instances should not have a public IP address Checks that EC2 instances do not have a public IP address assigned, whether through direct association at launch, subnet default settings, or Elastic IP attachment. Instances should remain in private subnets behind load balancers or NAT gateways. EC2 instances should not use key pairs in running state Checks that running EC2 instances do not have an associated key pair. Instances with a key pair configured expose an SSH-based access path that may bypass centralized access controls. The control fails if a running instance has a non-null key pair name. EC2 instances should not use multiple ENIs Checks that each EC2 instance has exactly one Elastic Network Interface (ENI) or Elastic Fabric Adapter (EFA) attached. The control passes when a single network interface is present and fails when two or more are detected. EC2 instances should not use paravirtual instance types Checks that EC2 instances use HVM virtualization rather than paravirtual. The control fails when an instance's virtualizationType attribute is set to paravirtual, indicating use of a legacy virtualization method that lacks modern security and performance features. EC2 instances should use IAM instance roles for AWS resource access Checks that every EC2 instance has an IAM instance profile attached, ensuring AWS API access from instances uses temporary role credentials rather than long-lived access keys embedded in application code or configuration files. EC2 instances should use IMDSv2 Validates that EC2 instances enforce IMDSv2 by requiring session-based token authentication for all instance metadata requests, blocking unauthenticated IMDSv1 HTTP GET calls that expose IAM role credentials to SSRF-based theft. EC2 launch templates should not assign public IPs to network interfaces Checks that EC2 launch templates do not enable public IP assignment on any network interface. Fails when associate_public_ip_address is set to true in any network_interfaces block within an aws_launch_template resource. EC2 launch templates should use Instance Metadata Service Version 2 (IMDSv2) Checks that EC2 launch templates set HttpTokens to required in the metadata_options block, enforcing IMDSv2 session-token authentication for all metadata requests. Without it, instances accept unauthenticated IMDSv1 GET requests to 169.254.169.254. EC2 network interfaces should have source/destination checking enabled Verifies that source/destination checking remains enabled on user-managed EC2 elastic network interfaces (ENIs). The control fails when source_dest_check is disabled on ENIs of types: interface, efa, lambda, quicksight, branch, and aws_codestar_connections_managed.
Amazon ECR
ECR private repositories should have tag immutability configured Checks that private ECR repositories have tag immutability enabled. The policy confirms image_tag_mutability is set to "IMMUTABLE" on every aws_ecr_repository resource. Repositories with the default "MUTABLE" setting or no explicit argument fail. ECR repositories should have image scan on push enabled Checks that each AWS ECR repository has scan_on_push enabled in its image_scanning_configuration block. Repositories that omit the block or explicitly set the flag to false default to no automatic scanning and are flagged non-compliant.
Amazon ECS
ECS clusters should have container insights enabled Validates that Amazon ECS clusters have Container Insights enabled. Container Insights collects cluster-level and service-level metrics and logs into CloudWatch. The control fails if the containerInsights setting is absent or not explicitly set to enabled. ECS fargate services should run on the latest fargate platform version Checks that ECS Fargate services have platform_version set to the latest Fargate platform version. Services that specify an older explicit version string fail this control. Applies to both Linux and Windows Fargate platform version tracks. ECS services should not have public IP addresses assigned automatically Validates that AWS ECS services using awsvpc network mode do not have automatic public IP assignment enabled. The control fails when AssignPublicIp is set to ENABLED, which exposes container tasks directly to the internet. ECS task definitions should not share the host's process namespace Validates that AWS ECS task definitions do not set pid_mode to host, which gives containers full visibility into every process running on the underlying EC2 host, including other tasks and the ECS agent itself, collapsing the task-level process isolation boundary.
Amazon EFS
EFS access points should enforce a root directory Validates that AWS EFS access points specify a root_directory path other than /. When Path is /, the access point grants access to the entire file system instead of scoping users to a specific subdirectory, defeating the purpose of access point isolation. EFS access points should enforce a user identity Validates that every AWS EFS access point defines a POSIX user identity (uid and gid), forcing all NFS connections through that access point to run as the specified OS user and preventing clients from overriding file ownership or assuming root. EFS file systems should be encrypted with CMK Validates that every AWS Elastic File System (EFS) file system encrypts data at rest with a customer-managed KMS key (CMK). The AWS-managed aws/elasticfilesystem default key and unencrypted file systems both fail this control. EFS file systems should have encryption at rest enabled Checks that each AWS Elastic File System (EFS) file system has encryption at rest enabled. EFS encryption uses AWS KMS to encrypt data written to the file system, and the setting must be configured at creation time and cannot be changed afterward.
Amazon EKS
EKS clusters endpoint public access should be restricted Checks that Amazon EKS cluster API server endpoints do not have public access enabled. The control fails when endpoint_public_access is true, meaning the Kubernetes API server is reachable from the internet rather than restricted to VPC-internal traffic only. EKS clusters endpoint should restrict public access Validates that AWS EKS cluster API server endpoints do not allow unrestricted public access. Checks the cluster's vpc_config to confirm endpoint_public_access is disabled or that public_access_cidrs is scoped to specific IP ranges rather than 0.0.0.0/0. EKS clusters should be configured to have kubernetes secrets encrypted using KMS Validates that Amazon EKS clusters have an encryption configuration that uses an AWS KMS key to encrypt Kubernetes secrets. Without this, secrets stored in etcd (such as service account tokens and passwords) remain base64-encoded but not envelope-encrypted at rest. EKS clusters should have control plane audit logging enabled Validates that Amazon EKS clusters have control plane audit logging enabled by checking that the cluster's logging configuration includes the "audit" log type, ensuring Kubernetes API server audit events are sent to CloudWatch Logs for inspection and retention.
Amazon ElastiCache
ElastiCache clusters should not use the default subnet group Validates that ElastiCache clusters do not use the default subnet group. The control fails when the CacheSubnetGroupName attribute equals "default", indicating the cluster was launched without an explicit subnet group assignment. ElastiCache for Redis replication groups before version 6.0 should use Redis Auth Validates that ElastiCache for Redis replication groups running engine versions before 6.0 have Redis AUTH enabled by setting an authentication token. Groups without AUTH allow unauthenticated access to cached data over the network. ElastiCache for Redis replication groups should be encrypted at rest Checks that every ElastiCache for Redis replication group has encryption at rest enabled. The control fails when at_rest_encryption_enabled is false or absent, meaning cached data written to disk, including snapshots and AOF persistence files, is stored in plaintext. ElastiCache for Redis replication groups should be encrypted in transit Checks that each ElastiCache for Redis replication group has transit encryption enabled, ensuring data moving between nodes and between clients and the cluster is protected by TLS. Fails when transit_encryption_enabled is false or unset. ElastiCache for Redis replication groups should be encrypted with CMK Validates that each ElastiCache for Redis replication group has encryption at rest enabled via a customer-managed KMS key (CMK). Both at_rest_encryption_enabled and kms_key_id must be set; using the AWS-managed aws/elasticache key fails the control. ElastiCache for Redis replication groups should have automatic failover enabled Checks that every ElastiCache for Redis replication group has automatic_failover_enabled set to true, so ElastiCache can automatically promote a healthy replica to primary when the current primary node fails or becomes unreachable. ElastiCache Redis clusters should have automatic backups enabled with a retention period of 15 days or greater Validates that each ElastiCache Redis replication group or cluster has automatic daily backups enabled with a snapshot retention period of at least 15 days, giving operations teams a recovery window wide enough to catch delayed failures or silent data corruption.
Amazon EMR
EMR cluster Kerberos should be enabled Checks that AWS EMR clusters have Kerberos authentication enabled by verifying a Kerberos configuration is present. Kerberos provides ticket-based mutual authentication for cluster services and users, underpinning identity-based access control across Hadoop workloads. EMR clusters should have security configuration enabled Checks that each Amazon EMR cluster has a security configuration attached. A security configuration defines encryption at rest, encryption in transit, and authentication settings. The control fails if the EMR cluster's security_configuration attribute is empty or unset.
Amazon FSx
FSx for Lustre file systems should be configured to copy tags to backups Checks that Amazon FSx for Lustre file systems have copy_tags_to_backups set to true, ensuring that resource tags (cost allocation, ownership, data classification) automatically propagate to any backups created from the file system. FSx for NetApp ONTAP file systems should be configured for Multi-AZ deployment Checks that Amazon FSx for NetApp ONTAP file systems use a Multi-AZ deployment type. The control fails when a file system uses a Single-AZ deployment type such as SINGLE_AZ_1 or SINGLE_AZ_2 instead of MULTI_AZ_1 or MULTI_AZ_2. FSx for OpenZFS file systems should be configured for Multi-AZ deployment Checks that Amazon FSx for OpenZFS file systems are deployed in a Multi-AZ configuration. The control fails if deployment_type is SINGLE_AZ_1 or SINGLE_AZ_2. Both MULTI_AZ_1 and MULTI_AZ_2 satisfy the control; single-AZ variants do not. FSx for OpenZFS file systems should be configured to copy tags to backups and volumes Checks that Amazon FSx for OpenZFS file systems have copy_tags_to_backups and copy_tags_to_volumes enabled, ensuring that resource tags propagate automatically to all backups and child volumes created from the file system. FSx for Windows File Server file systems should be configured for Multi-AZ deployment Checks that Amazon FSx for Windows File Server file systems use a Multi-AZ deployment type (MULTI_AZ_1 or MULTI_AZ_2) instead of a single Availability Zone configuration, ensuring automatic failover capability across zones.
Amazon Kinesis Data Streams
Kinesis streams should be encrypted with CMK Validates that each Amazon Kinesis Data Stream has server-side encryption enabled using a customer-managed KMS key (CMK) rather than the default AWS-managed key or no encryption, giving operators full control over key policies and rotation. Kinesis streams should have an adequate data retention period Checks that Amazon Kinesis data streams have a data retention period of at least 168 hours (7 days). Streams with shorter retention periods fail. The 168-hour threshold is the Security Hub default but can be customized via a parameter. Kinesis streams should have server side encryption enabled Validates that each AWS Kinesis Data Stream has server-side encryption (SSE) enabled. The control checks that data records written to the stream are encrypted at rest using either an AWS-managed or customer-managed KMS key.
Amazon MQ
MQ brokers should have audit log streaming to CloudWatch enabled Checks that Amazon MQ ActiveMQ brokers have audit logging enabled and stream audit logs to CloudWatch Logs. The control fails when the audit argument in the logs block is false or absent from the aws_mq_broker resource. Applies to ActiveMQ brokers only. MQ brokers should have automatic minor version upgrade enabled Validates that Amazon MQ brokers have auto minor version upgrade enabled. AWS applies engine patches and bug fixes during the configured maintenance window automatically, keeping both ActiveMQ and RabbitMQ brokers current without manual upgrades. MQ brokers should restrict public access Validates that Amazon MQ brokers have publicly_accessible set to false. When true, Amazon MQ assigns a public IP to the broker, exposing the web console and wire-level AMQP, OpenWire, STOMP, and MQTT endpoints to the public internet.
Amazon MSK
MSK clusters should be encrypted in transit among broker nodes Validates that Amazon MSK clusters encrypt inter-broker communication using TLS. The control fails when plaintext communication is permitted between broker nodes within the cluster, leaving Kafka replication traffic unencrypted on the wire. MSK clusters should disable unauthenticated access Validates that Amazon MSK clusters do not permit unauthenticated client connections. The control fails when the unauthenticated flag within the cluster's client authentication configuration is set to true, allowing clients to connect without any identity verification. MSK clusters should have public access disabled Validates that Amazon MSK clusters do not have public access enabled on their broker nodes. The control fails when the cluster's broker connectivity is configured to provide public endpoints via Elastic IP addresses, exposing Apache Kafka brokers to the internet.
Amazon MSK Connect
MSK Connect connectors should be encrypted in transit Validates that Amazon MSK Connect connectors encrypt data in transit by requiring TLS for communication between the connector and the Apache Kafka cluster. The control fails when the connector's encryption in transit type is set to PLAINTEXT instead of TLS. MSK connectors should have logging enabled Checks that every Amazon MSK Connect connector has at least one log delivery destination configured. Fails when no destination (CloudWatch Logs, Firehose, or S3) is enabled in the connector's worker_log_delivery settings.
Amazon Neptune
Neptune DB clusters should be configured to copy tags to snapshots Checks that Amazon Neptune DB clusters have copy_tags_to_snapshot enabled so that all resource tags are automatically propagated to snapshots when they are created. The control fails if this setting is disabled or not configured. Neptune DB clusters should be encrypted at rest Checks that each Amazon Neptune DB cluster has encryption at rest enabled. The control fails when a Neptune cluster's storage is not encrypted, leaving graph database contents readable if physical media is compromised or snapshots are shared. Neptune DB clusters should have automated backups enabled Checks that each Amazon Neptune DB cluster has automated backups enabled with a backup retention period of at least 7 days. Fails if automated backups are disabled or the retention period is set to fewer than 7 days, including the AWS default of 1 day. Neptune DB clusters should have deletion protection enabled Checks that each Amazon Neptune DB cluster has deletion protection enabled. Without it, a single delete-db-cluster API call can permanently destroy the cluster. The control fails when deletion_protection is set to false or omitted from the resource definition. Neptune DB clusters should have IAM database authentication enabled Checks that each Amazon Neptune DB cluster has IAM database authentication enabled. The control fails when iam_database_authentication_enabled is false or omitted, leaving the cluster relying on native Neptune authentication with no IAM-based access control. Neptune DB clusters should publish audit logs to CloudWatch Logs Checks whether Amazon Neptune DB clusters export audit logs to Amazon CloudWatch Logs. The control fails when enable_cloudwatch_logs_exports on the aws_neptune_cluster resource does not include "audit", whether the argument is missing, empty, or omits that value.
Amazon OpenSearch Service
Elasticsearch domain error logging to CloudWatch Logs should be enabled Checks that Amazon Elasticsearch (OpenSearch) domains publish ES_APPLICATION_LOGS to a CloudWatch Logs log group. Without this, application-level errors, index mapping conflicts, and JVM issues have no durable log destination outside the cluster. Elasticsearch domain node-to-node encryption should be enabled Checks that AWS Elasticsearch Service domains have node-to-node encryption enabled. This setting enforces TLS 1.2 for all intra-cluster traffic between data nodes within the VPC, protecting index data, search queries, and cluster state from plaintext interception. Elasticsearch domain should send logs to CloudWatch Validates that AWS OpenSearch Service domains have at least one log publishing option enabled, sending index slow logs, search slow logs, application logs, or audit logs to CloudWatch Logs for centralized monitoring and analysis. Elasticsearch domains should be configured with at least three dedicated master nodes Checks that Amazon Elasticsearch (OpenSearch) domains have dedicated master nodes enabled with a count of three or more. Dedicated masters handle cluster state management independently of data nodes, maintaining quorum through a single master failure. Elasticsearch domains should have at least three data nodes Validates that Elasticsearch/OpenSearch domains have at least three data nodes and zone awareness enabled. Without both, the cluster cannot survive an Availability Zone failure without risking unassigned shards, split-brain, or complete unavailability. Elasticsearch domains should have audit logging enabled Verifies that Elasticsearch (OpenSearch) domains have audit logging enabled via the AUDIT_LOGS log publishing option, publishing to a CloudWatch Logs group. Fine-grained access control must also be active; domains missing either configuration fail this control. Elasticsearch domains should have cognito authentication enabled Checks that each AWS Elasticsearch (OpenSearch) domain has Amazon Cognito authentication enabled for Kibana or OpenSearch Dashboards. The control fails when the cognito_options block is absent or has enabled set to false. Elasticsearch domains should have internal user database enabled Checks that Amazon OpenSearch (Elasticsearch) domains have the internal user database enabled within fine-grained access control. Domains that rely solely on IAM or SAML without the internal user database are flagged as non-compliant. Elasticsearch domains should require TLS 1.2 for connections Validates that Amazon Elasticsearch (OpenSearch) domains enforce a minimum TLS security policy of Policy-Min-TLS-1-2-2019-07, ensuring all client connections negotiate TLS 1.2 or higher and reject older protocol versions. ES domain encryption at rest should be enabled Validates that Elasticsearch/OpenSearch domains have encryption at rest enabled. Domain indices, automated snapshots, logs, and swap files must be KMS-encrypted rather than stored in plaintext on the underlying EBS volumes and instance storage. ES domains should be in a VPC Checks whether AWS Elasticsearch Service domains are deployed inside a VPC by verifying that the vpc_options block is present and includes at least one subnet ID, rather than relying on a public endpoint exposed over the internet. OpenSearch domains internal user database should be disabled Validates that AWS OpenSearch domains have the internal user database disabled within advanced security options, requiring authentication through external identity providers such as IAM or SAML rather than locally stored usernames and passwords. OpenSearch domains node-to-node encryption should be enabled Checks that AWS OpenSearch Service domains have node-to-node encryption enabled, ensuring all inter-node traffic within the cluster is encrypted using TLS. Domains without this setting transmit data between nodes in plaintext over the internal network. OpenSearch domains should be in a VPC Validates that AWS OpenSearch domains are deployed inside a VPC by verifying VPC endpoint configuration is present. Domains without VPC placement expose public endpoints that are internet-reachable, constrained only by the domain's access policies. OpenSearch domains should have at least three data nodes Validates that Amazon OpenSearch Service domains have at least three data nodes with zone awareness enabled. This configuration lets the cluster survive an Availability Zone outage by redistributing shards across the remaining nodes automatically. OpenSearch domains should have audit logging enabled Checks that Amazon OpenSearch Service domains have audit logging enabled via log publishing options. Domains must publish audit logs (log_type AUDIT_LOGS) to a CloudWatch log group, which requires fine-grained access control to be active on the domain. OpenSearch domains should have Cognito authentication enabled for Kibana Checks that AWS OpenSearch domains have Amazon Cognito authentication enabled for Kibana (OpenSearch Dashboards). When enabled, Cognito handles user sign-up, sign-in, and access control rather than relying on open endpoints or IP-based access restrictions. OpenSearch domains should have encryption at rest enabled Checks whether AWS OpenSearch Service domains have encryption at rest enabled via the EncryptionAtRestOptions configuration. Passes when the Enabled flag is true, confirming that data in domain indices and automated snapshots is encrypted with AWS KMS keys. OpenSearch domains should have fine-grained access control enabled Checks that Amazon OpenSearch Service domains have fine-grained access control enabled via the advanced_security_options configuration. The control fails when advanced_security_options is absent or its enabled flag is false. OpenSearch domains should have logging to CloudWatch Logs enabled Checks that AWS OpenSearch Service domains have log publishing configured for at least one log type (index slow logs, search slow logs, ES application logs, or audit logs) to a CloudWatch Logs log group, with at least one publishing option actively enabled. OpenSearch domains should use HTTPS Validates that AWS OpenSearch domains enforce HTTPS for all connections and that the TLS security policy meets a minimum version of TLS 1.2. Domains permitting plaintext HTTP connections or configured with a policy that allows TLS 1.0 or 1.1 fail this control.
Amazon RDS
Aurora MySQL DB clusters should have audit logging enabled Checks whether Amazon Aurora MySQL DB clusters have audit logging enabled via the Advanced Auditing feature. The control fails if the cluster's parameter group does not have server_audit_logging set to 1 with audit events configured. Aurora PostgreSQL DB clusters should publish logs to CloudWatch Logs Checks that Aurora PostgreSQL DB clusters export postgresql logs to CloudWatch Logs by validating that enabled_cloudwatch_logs_exports includes the postgresql log type. Clusters with the parameter omitted, empty, or missing this log type fail. RDS Aurora clusters should have backtracking enabled Checks that Amazon Aurora DB clusters have backtracking enabled by verifying a non-zero backtrack_window is configured. Backtracking lets you rewind a cluster to a specific point in time without restoring from a snapshot, reducing recovery time. RDS clusters should have deletion protection enabled Checks that Amazon RDS DB clusters (including Aurora, Neptune, and DocumentDB) have deletion protection enabled. When deletion_protection is true, the cluster cannot be deleted through the API or console without first disabling the setting. RDS database clusters should use a custom administrator username Validates that AWS RDS database clusters do not use default administrator usernames such as "admin" or "postgres". The control fails when master_username matches a known engine default, meaning credentials were not customized at provisioning time. RDS database instances should use a custom administrator username Checks that AWS RDS database instances do not use default administrator usernames such as "admin", "postgres", or engine-specific defaults. Fails when the master username matches a known default value, indicating credentials were not customized at provisioning. RDS databases and clusters should not use a database engine default port Validates that Amazon RDS database instances and Aurora clusters are configured with a non-default port. Engine defaults targeted by automated scanners include 3306 for MySQL/MariaDB, 5432 for PostgreSQL, 1433 for SQL Server, and 1521 for Oracle. RDS DB clusters should be configured for multiple Availability Zones Checks whether RDS DB clusters are configured for high availability across multiple Availability Zones. Uses engine-appropriate signals: instance placement across AZs for Aurora clusters, and the MultiAZ flag for non-Aurora MySQL and PostgreSQL DB clusters. RDS DB clusters should be configured to copy tags to snapshots Checks that RDS DB clusters have copy_tags_to_snapshot enabled, ensuring resource tags propagate automatically to any snapshots the cluster creates. Snapshots inherit cost allocation, ownership, and compliance metadata without manual tagging. RDS DB clusters should be encrypted at rest Checks that each RDS DB cluster (Aurora) has encryption at rest enabled via the StorageEncrypted attribute. The control fails when an RDS DB cluster stores data without server-side encryption, leaving database contents readable on the underlying storage media. RDS DB clusters should be encrypted with CMK Validates that each RDS DB cluster has storage encryption enabled and uses a customer-managed KMS key (CMK) rather than the default AWS-managed RDS key. The control fails if storage_encrypted is false or if kms_key_id is absent or points to an AWS-managed key. RDS DB clusters should have automatic minor version upgrade enabled Validates that RDS database clusters have automatic minor version upgrade enabled. Fails when auto_minor_version_upgrade is set to false, leaving the cluster on a stale engine version that may carry known vulnerabilities or unpatched bugs. RDS DB clusters should have IAM authentication configured Validates that iam_database_authentication_enabled is set to true on aws_rds_cluster resources. Without this setting, clusters rely on native database passwords: static secrets with no automatic rotation and no integration with IAM access control. RDS DB instance automatic minor version upgrade should be enabled Checks that each RDS DB instance has auto_minor_version_upgrade set to true, ensuring the engine receives automatic minor version patches during the maintenance window. Instances with this flag disabled are non-compliant. RDS DB instance backup should be enabled Validates that each Amazon RDS DB instance has automated backups enabled by confirming the backup retention period is set to at least 1 day. Automated backups capture daily snapshots and retain transaction logs, enabling point-in-time recovery. RDS DB instance encryption at rest should be enabled Checks that each Amazon RDS DB instance has encryption at rest enabled. The control evaluates whether the storage_encrypted attribute is set to true, confirming that data written to the underlying EBS volumes is encrypted using AES-256. RDS DB instances and clusters should have enhanced monitoring enabled Checks that RDS DB instances and Aurora cluster instances have enhanced monitoring enabled with a non-zero monitoring interval. Enhanced monitoring collects OS-level metrics (CPU, memory, file system, disk I/O) via an agent running on the instance. RDS DB instances backup retention period should be greater than or equal to 7 Checks that every RDS DB instance has backup_retention_period set to 7 or more days. Instances with automated backups disabled (retention of 0) or any value from 1 to 6 days fail. Valid passing values range from 7 to 35 days. RDS DB instances should be configured to copy tags to snapshots Checks that each RDS DB instance has copy_tags_to_snapshot enabled so that every automated or manual snapshot inherits the instance's tags. This preserves cost allocation, ownership, and classification metadata on backup artifacts. RDS DB instances should be integrated with CloudWatch logs Checks that each RDS DB instance has at least one log type exported to CloudWatch Logs via the enabled_cloudwatch_logs_exports argument. Valid types vary by engine: MySQL and MariaDB support audit, error, general, and slowquery; PostgreSQL uses postgresql and upgrade. RDS DB instances should have deletion protection enabled Validates that each AWS RDS DB instance has the deletion_protection attribute set to true, preventing accidental or unauthorized deletion through the AWS Management Console, CLI, or API without first disabling the protection flag. RDS DB instances should have iam authentication enabled Validates that each AWS RDS DB instance has IAM database authentication enabled. When enabled, connections authenticate via short-lived IAM tokens generated with the rds-db:connect action rather than static passwords stored in application config. RDS DB instances should have logging enabled Checks that each Amazon RDS DB instance has at least one log type enabled for export to CloudWatch Logs. The specific log types vary by engine (e.g., audit, error, slowquery for MySQL; postgresql and upgrade for PostgreSQL). RDS DB instances should have multiple AZ enabled Checks that each Amazon RDS DB instance has Multi-AZ deployment enabled (multi_az = true). Multi-AZ provisions a synchronous standby replica in a separate Availability Zone and fails over automatically during planned maintenance, instance failure, or AZ disruption. RDS DB instances should not use public subnet Validates that RDS DB instances are not deployed into public subnets. A public subnet is defined by a route table entry pointing to an internet gateway. Placing a database in such a subnet weakens network segmentation and raises direct internet exposure risk. RDS DB instances should prohibit public access Checks that every aws_db_instance and aws_rds_cluster_instance has publicly_accessible set to false. When true, AWS assigns a public IP address and a DNS hostname resolving outside the VPC, exposing the database endpoint to the public internet. RDS for MariaDB DB instances should publish logs to CloudWatch Logs Checks whether RDS MariaDB instances are configured to publish logs to CloudWatch Logs. Supported log types are audit, error, general, and slowquery. Fails if enabled_cloudwatch_logs_exports is empty or absent on the aws_db_instance resource. RDS for PostgreSQL DB instances should publish logs to CloudWatch Logs Checks that Amazon RDS for PostgreSQL DB instances have CloudWatch Logs publishing enabled for the expected log types. Fails if the instance does not export the required log types (such as postgresql and upgrade) to CloudWatch Logs. RDS for SQL Server DB instances should publish logs to CloudWatch Logs Checks that Amazon RDS for Microsoft SQL Server DB instances have CloudWatch Logs publishing enabled. The control fails when no log types (such as error or agent) are configured for export to CloudWatch Logs via the instance's log export settings. RDS instances should be deployed in a VPC Checks whether each Amazon RDS instance is deployed in a VPC rather than the legacy EC2-Classic platform. Passes when the instance has an associated DB subnet group; fails when that association is absent or the instance has no VPC binding.
Amazon Redshift
Redshift cluster encryption in transit should be enabled Validates that Amazon Redshift clusters are configured with a parameter group that sets require_ssl to true, ensuring all SQL client connections use TLS/SSL encryption in transit rather than allowing unencrypted plaintext communication. Redshift clusters should be encrypted with CMK Validates that Amazon Redshift clusters are encrypted at rest using a customer-managed KMS key (CMK) rather than an AWS-managed default key or no encryption. Checks that both encryption is enabled and a specific CMK ARN is referenced. Redshift clusters should have audit logging and encryption enabled Validates that each AWS Redshift cluster has encryption at rest enabled and audit logging configured. Encryption protects stored data via KMS or HSM keys. Audit logging records connection attempts, user activity, and SQL queries against the cluster. Redshift clusters should have audit logging enabled Checks that Amazon Redshift clusters have audit logging enabled and, when a specific bucket name is provided, that the logging destination matches the expected S3 bucket. Clusters without audit logging or with a mismatched bucket fail the control. Redshift clusters should have automatic snapshots enabled Checks that AWS Redshift clusters have automated snapshots enabled and that the snapshot retention period is at least seven days. Clusters with automated snapshots disabled or a retention period below seven days fail this control. Redshift clusters should have automatic upgrades to major versions enabled Validates that AWS Redshift clusters have automatic major version upgrades enabled. When enabled, the cluster applies engine updates automatically during the configured maintenance window, without requiring operator intervention to initiate the upgrade. Redshift clusters should have enhanced VPC routing enabled Checks that Amazon Redshift clusters have enhanced VPC routing enabled. When enabled, all COPY and UNLOAD traffic between the cluster and data repositories is forced through the VPC, allowing use of VPC security groups, NACLs, VPC endpoints, and VPC flow logs. Redshift clusters should have KMS encryption enabled Validates that AWS Redshift clusters have encryption enabled using a customer-managed KMS key. The cluster must reference the designated KMS key ARN; using the default aws/redshift service key or no encryption at all fails this control. Redshift clusters should have Multi-AZ deployments enabled Checks that Amazon Redshift clusters have Multi-AZ deployments enabled. The control fails when a Redshift cluster operates in a single Availability Zone, meaning a zone-level failure causes a full cluster outage and data unavailability until recovery completes. Redshift clusters should have required maintenance settings Validates that AWS Redshift clusters have allow_version_upgrade set to true and automated_snapshot_retention_period greater than 7, ensuring clusters receive security patches and retain snapshots for adequate recovery windows. Redshift clusters should not use the default admin username Validates that AWS Redshift clusters do not use the default admin username "awsuser". The control fails if master_username is set to that default, meaning the cluster was provisioned without customizing the admin credential at cluster creation. Redshift clusters should not use the default database name Checks that Amazon Redshift clusters are not using the default database name "dev". The control fails when database_name is omitted or set to "dev" in the aws_redshift_cluster resource, indicating no custom name was set at deployment time. Redshift clusters should prohibit public access Validates that Amazon Redshift clusters have the publicly_accessible attribute set to false, preventing the cluster from receiving a public IP and becoming reachable from the internet. Without this, the cluster endpoint is resolvable and reachable outside the VPC.
Amazon Redshift Serverless
Redshift Serverless namespaces should export logs to CloudWatch Logs Checks that Amazon Redshift Serverless namespaces export both connection logs and user logs to CloudWatch Logs. Fails if either log type is absent from the namespace log export configuration. Both connectionlog and userlog must appear in log_exports. Redshift Serverless namespaces should not use the default admin username Checks that Amazon Redshift Serverless namespaces do not use the default admin username "admin". The control fails when admin_username is set to "admin", since default credentials are predictable and make brute-force and credential-stuffing attacks easier to execute. Redshift Serverless namespaces should not use the default database name Checks that Amazon Redshift Serverless namespaces do not use the default database name "dev". The control fails when the db_name attribute of an aws_redshiftserverless_namespace resource is left unset or explicitly set to "dev". Redshift Serverless workgroups should have enhanced VPC routing enabled Validates that Amazon Redshift Serverless workgroups have enhanced VPC routing enabled, ensuring COPY and UNLOAD traffic between the workgroup and data repositories flows through the VPC rather than over the public internet. Redshift Serverless workgroups should prohibit public access Validates that Amazon Redshift Serverless workgroups have the publiclyAccessible property set to false. The control fails when a workgroup allows public access, meaning its elastic network interfaces can receive a public IP address reachable from the internet.
Amazon Route 53
Route 53 domains auto renew should be enabled Checks that every Route 53 registered domain has auto-renew enabled, so registrations are automatically renewed before expiration. Prevents accidental domain loss and the downstream risk of an attacker registering the lapsed domain. Route 53 domains should have privacy protection enabled Checks that AWS Route 53 registered domains have WHOIS privacy protection enabled for admin, registrant, and technical contacts, preventing personal phone numbers, email addresses, and physical addresses from appearing in public WHOIS query results. Route 53 domains should have transfer lock enabled Checks that Route 53 registered domains have transfer lock enabled, preventing unauthorized or accidental transfers of domain ownership to another registrar. Evaluates the domain's transfer lock flag via the Route 53 Domains API.
Amazon S3
S3 access points should have block public access settings enabled Validates that every Amazon S3 access point has all four block public access settings enabled: block_public_acls, ignore_public_acls, block_public_policy, and restrict_public_buckets. The control fails if any of these settings is disabled or missing on an access point. S3 buckets should have cross-region replication enabled Validates that each S3 bucket has cross-region replication (CRR) configured. New object versions are automatically copied to a destination bucket in a different AWS region, supporting data availability and recovery time objectives when a regional disruption occurs. S3 buckets should have default encryption enabled Verifies that each AWS S3 bucket has a default server-side encryption configuration explicitly enabled, ensuring objects stored without a client-specified encryption method are automatically encrypted using SSE-S3 (AES-256) or SSE-KMS. S3 buckets should have default encryption enabled using KMS Checks that each S3 bucket has a default server-side encryption configuration using AWS KMS (SSE-KMS or DSSE-KMS) rather than Amazon S3 managed keys (SSE-S3). Buckets encrypted only with AES-256 (SSE-S3) or with no encryption configuration fail this control. S3 buckets should have event notifications enabled Checks that S3 buckets have event notifications configured via aws_s3_bucket_notification. Fails when no notification configuration exists, leaving object creates, deletes, and restores undetected by downstream consumers or automated response systems. S3 buckets should have lifecycle policies configured Checks that each AWS S3 bucket has at least one lifecycle configuration rule defined. Buckets without any lifecycle policy fail this control. Lifecycle rules govern object transitions between storage classes and permanent deletion after defined retention periods. S3 buckets should have logging enabled Checks that each S3 bucket has server access logging enabled, directing access log records to a designated target bucket. This validates that read and write requests to the bucket are recorded for security monitoring and forensic analysis. S3 buckets should have MFA delete enabled Checks that S3 buckets have MFA Delete enabled in their versioning configuration. MFA Delete requires the bucket owner to provide an MFA token before permanently deleting object versions or changing the bucket's versioning state. S3 buckets should have object lock enabled Validates that S3 buckets have Object Lock enabled, enforcing a WORM (Write Once Read Many) model that prevents objects from being deleted or overwritten for a defined retention period or indefinitely. Applies to both governance and compliance retention modes. S3 buckets should have object logging enabled Checks that S3 buckets have object-level logging enabled through CloudTrail data events. Object-level logging records individual API calls, including GetObject, PutObject, and DeleteObject, with caller identity, source IP, and timestamp captured for each access. S3 buckets should have policies that prohibit public access Validates that S3 bucket policies do not grant unrestricted public access. The control passes if the bucket policy restricts access to specific principals, federated users, service principals, IP addresses, or VPCs. Buckets with no policy attached also pass. S3 buckets should have static website hosting disabled Checks that S3 buckets do not have static website hosting enabled. Static website hosting exposes bucket contents via an HTTP endpoint and typically requires disabling block public access settings, creating a direct path to unintended data exposure. S3 buckets should have versioning enabled Checks that S3 bucket versioning is enabled, retaining multiple versions of each object in the bucket. When versioning is active, every PUT, POST, COPY, or DELETE generates a new version, allowing recovery from accidental overwrites or deletions. S3 buckets should not be accessible to all authenticated users Validates that S3 bucket ACLs do not grant any permissions (READ, WRITE, READ_ACP, WRITE_ACP, FULL_CONTROL) to the AuthenticatedUsers group, which includes every AWS-authenticated principal across all accounts, not just principals in your own organization. S3 buckets should not use ACLs for user access control Checks that S3 buckets do not use access control lists (ACLs) to manage user permissions. Buckets should rely on IAM and bucket policies instead, since ACLs are a legacy mechanism that cannot express conditions and offer limited auditability. S3 buckets should prohibit public read access Checks whether S3 buckets permit public read access via bucket policies, ACLs, or misconfigured Block Public Access settings. Fails any bucket where anonymous or unauthenticated principals can retrieve objects or list bucket contents. S3 buckets should prohibit public write access Validates that S3 buckets do not permit public write access through bucket ACLs, bucket policies, or missing S3 Block Public Access settings. Checks that no configuration path allows unauthenticated or anonymous principals to upload, modify, or delete objects. S3 buckets should restrict cross-account permissions Validates that each S3 bucket policy contains explicit Deny statements preventing cross-account principals from modifying bucket policies, object ACLs, or other permission-scoped actions. Without these statements, external accounts can weaken or remove access controls. S3 buckets with versioning enabled should have lifecycle policies configured Checks that S3 buckets with versioning enabled have at least one lifecycle configuration rule defined. Buckets with versioning but no lifecycle policy retain every object version indefinitely, leading to uncontrolled storage growth and cost. S3 Multi-Region Access Points should have block public access settings enabled Validates that Amazon S3 Multi-Region Access Points have all four block public access settings enabled: block_public_acls, block_public_policy, ignore_public_acls, and restrict_public_buckets. The control fails if any of these settings are disabled. S3 public access should be blocked at account level Validates that the AWS S3 account-level Public Access Block is enabled with all four settings (block_public_acls, ignore_public_acls, block_public_policy, restrict_public_buckets) set to true, preventing any bucket in the account from being made publicly accessible. S3 public access should be blocked at bucket level Checks that every S3 bucket has an aws_s3_bucket_public_access_block resource with all four settings enabled: block_public_acls, ignore_public_acls, block_public_policy, and restrict_public_buckets. Bucket-level only; account blocks are checked separately.
Amazon SageMaker
SageMaker endpoint configuration encryption should be enabled Checks that each SageMaker endpoint configuration specifies a customer-managed KMS key for encrypting data at rest on the storage volume attached to the ML compute instance hosting the endpoint. Fails if kms_key_arn is absent or empty. SageMaker endpoint production variants should have an initial instance count greater than 1 Checks that every production_variants block in an aws_sagemaker_endpoint_configuration sets initial_instance_count to 2 or higher. A single-instance variant has no redundancy; one failure takes the endpoint offline until a replacement launches. SageMaker models should be in a VPC Checks that Amazon SageMaker models are deployed with a VPC configuration specifying at least one subnet and one security group, ensuring inference containers run inside a customer-managed VPC rather than the default SageMaker-managed network. SageMaker models should have network isolation enabled Checks that Amazon SageMaker models have enable_network_isolation set to true. When enabled, the container runtime is blocked from initiating any outbound network connection, including to the internet and to AWS services outside the SageMaker platform channels. SageMaker notebook instance encryption should be enabled Checks that each Amazon SageMaker notebook instance has a KMS key configured for encryption at rest. The control fails when kms_key_id is omitted or empty on the notebook instance resource, leaving EBS volumes without explicit customer-managed key protection. SageMaker notebook instances root access should be disabled Checks that Amazon SageMaker notebook instances have root access disabled. With root access enabled, users gain full administrator privileges over the instance, allowing unrestricted modification of system files, packages, and security configurations. SageMaker notebook instances should be encrypted using CMK Checks that Amazon SageMaker notebook instance storage volumes are encrypted with a customer managed KMS key (CMK) rather than the default AWS managed key. Validates that the kms_key_id argument is explicitly set on the notebook instance resource. SageMaker notebook instances should be in a VPC Verifies that Amazon SageMaker notebook instances are launched within a VPC by confirming a subnet association exists. Notebook instances without VPC placement use direct internet connectivity, bypassing network-level access controls and traffic inspection. SageMaker notebook instances should not have direct internet access Validates that AWS SageMaker notebook instances have direct_internet_access set to "Disabled", forcing all notebook traffic through a VPC where security groups and VPC endpoints govern connectivity rather than an open internet path.
Amazon SQS
SQS queues should be encrypted with KMS CMK Checks that each SQS queue has server-side encryption configured with a KMS Customer Managed Key (CMK), not the default SSE-SQS managed encryption. Queues using AWS-owned keys or without an explicit kms_master_key_id set fail this control. SQS queues should have a dead-letter queue configured Validates that each Amazon SQS queue has a redrive policy pointing to a dead-letter queue (DLQ) with a defined maxReceiveCount. Queues without a DLQ keep retrying failed messages until retention expires, making failures harder to isolate and troubleshoot. SQS queues should have encryption at rest enabled Validates that each AWS SQS queue has server-side encryption enabled at rest, either through SQS-managed encryption (SSE-SQS) or a customer-managed KMS key (SSE-KMS). Queues with no encryption configuration fail the check.
Amazon VPC
EC2 VPC Block Public Access settings should block internet gateway traffic Validates that Amazon EC2 VPC Block Public Access (BPA) is enabled at the account level with InternetGatewayBlockMode set to block-bidirectional or block-ingress, preventing VPCs from routing traffic through internet gateways without explicit exclusions. EC2 VPN connections should have logging enabled Checks that every AWS Site-to-Site VPN connection has CloudWatch Logs enabled on both tunnels. The control fails when either tunnel1 or tunnel2 lacks CloudWatch log delivery, leaving VPN activity unmonitored across the connection. VPC endpoint services should have acceptance required enabled Checks that VPC endpoint services set acceptance_required = true. Any principal with endpoint creation permissions can connect immediately when this is unset. With it enabled, consumer requests enter pendingAcceptance and must be approved before traffic flows. VPC Security groups should only allow unrestricted incoming traffic for authorized ports Validates that VPC security groups only permit unrestricted inbound traffic (0.0.0.0/0 or ::/0) on explicitly authorized ports. By default, only TCP ports 80 and 443 are considered authorized. Any other port open to the entire internet fails the check. VPC security groups should restrict ingress from 0.0.0.0/0 or ::/0 to cassandra ports 7199 or 9160 or 8888 Checks that VPC security groups do not allow inbound traffic from 0.0.0.0/0 or ::/0 to Cassandra ports 7199 (JMX), 9160 (Thrift), or 8888 (native OpsCenter). Passes when no rule permits unrestricted internet access to these ports. VPC subnet auto assign public IP should be disabled Checks that VPC subnets do not have the auto-assign public IP address setting enabled. A subnet passes when map_public_ip_on_launch is false (the default). A subnet fails when instances launched into it automatically receive a public IPv4 address.
AWS AppSync
AppSync API caches should have encryption at rest enabled Checks that AWS AppSync GraphQL API caches have encryption at rest enabled. The control fails if an aws_appsync_api_cache resource exists without at-rest encryption, leaving cached query results exposed to unauthorized disk-level access. AppSync API caches should have encryption in transit enabled Checks that an AWS AppSync GraphQL API cache has encryption in transit enabled. The control fails if the API cache resource exists but does not enforce TLS for data moving between the AppSync resolver and the cache node. AppSync GraphQL APIs should have field-level logging enabled Checks that each AWS AppSync GraphQL API has field-level logging enabled. The control evaluates the field_log_level setting in the log_config block. A value of ERROR or ALL passes; NONE or a missing log_config block fails. AppSync GraphQL APIs should not use API key authentication Checks that AWS AppSync GraphQL APIs do not use API_KEY as an authentication type. The control fails if any AppSync GraphQL API has its primary or additional authentication provider configured with API key authentication.
AWS Certificate Manager
ACM certificates should have transparency logging enabled Validates that ACM certificates have Certificate Transparency (CT) logging enabled. All issued certificates are published to public CT logs, where misissued or fraudulently obtained certificates can be detected by domain owners and security researchers. ACM certificates should not use wildcard certificates Checks that AWS Certificate Manager certificates do not use wildcard domain names (e.g., *.example.com) in the primary domain or subject alternative names, requiring individual certificates per domain or subdomain instead. ACM RSA certificates should use a key length of at least 2,048 bits Checks that RSA certificates managed by AWS Certificate Manager use a key length of at least 2,048 bits. The control fails if an ACM-managed RSA certificate has a key length smaller than 2,048 bits, such as 1,024-bit RSA keys.
AWS CloudFormation
CloudFormation stacks should have notifications enabled Checks that each AWS CloudFormation stack has at least one SNS topic ARN configured in its notification settings, ensuring stack lifecycle events (create, update, delete, rollback) are published to subscribers for operational awareness. CloudFormation stacks should have rollback enabled Checks that AWS CloudFormation stacks have rollback enabled so that failed stack creation or update operations automatically revert to the last known good state, preventing partially provisioned or broken infrastructure from persisting in the environment.
AWS CloudTrail
CloudTrail trails should be integrated with CloudWatch logs Validates that each AWS CloudTrail trail is configured to deliver log events to a CloudWatch Logs log group, enabling centralized monitoring, metric filter creation, and real-time alerting on API activity across the account. CloudTrail trails should have at least one enabled trail present in a region Verifies that at least one AWS CloudTrail trail is enabled in the region. CloudTrail records API calls and console actions, providing an audit log of account activity needed for security analysis, resource change tracking, and compliance evidence. CloudTrail trails should have log file validation enabled Checks that each AWS CloudTrail trail has log file validation enabled. When active, CloudTrail delivers a digest file every hour containing SHA-256 hashes of the log files delivered in that period, allowing detection of any post-delivery modification or deletion. CloudTrail trails should have logs encrypted using a customer managed KMS key Checks that each AWS CloudTrail trail has a KMS Customer Managed Key (CMK) configured for log file server-side encryption. Trails using default SSE-S3 or no encryption fail this control because bucket-level access is sufficient to read log contents.
AWS CodeBuild
Codebuild Project Encryption At Rest Enabled CodeBuild projects should have artifact encryption enabled Checks that every AWS CodeBuild project has encryption enabled for all artifact outputs. Fails when the encryption_disabled flag is set to true on the primary artifact configuration or on any secondary artifact configuration. CodeBuild projects should have logging enabled Validates that every AWS CodeBuild project has at least one log destination enabled: either CloudWatch Logs or S3. The control fails when all configured log options within the project's logs_config have status set to DISABLED. CodeBuild projects should have S3 logs encrypted Validates that AWS CodeBuild projects have encryption enabled for S3 build logs. The control fails when the S3 logs configuration within a CodeBuild project explicitly disables encryption, leaving build output logs unprotected at rest in the destination bucket. CodeBuild projects should not have privileged mode enabled Checks that AWS CodeBuild project environments have privileged mode disabled. Privileged mode gives the build container access to all host devices, equivalent to docker run --privileged, significantly expanding the attack surface of the build environment. CodeBuild report group exports should be encrypted at rest Checks that AWS CodeBuild report group exports to Amazon S3 have encryption at rest enabled. The control fails if the report group S3 export configuration has encryption disabled, leaving test results and build artifacts unprotected in storage.
AWS Database Migration Service
DMS endpoints should use SSL Checks that AWS DMS endpoints have ssl_mode set to a value other than "none". Fails when ssl_mode is omitted or explicitly "none", leaving replication traffic unencrypted between the DMS replication instance and the source or target database. Dms Replication Instance Encryption Enabled
AWS DMS
DMS endpoints for MongoDB should have an authentication mechanism enabled Checks whether AWS DMS MongoDB endpoints have authentication configured. Fails when auth_type is absent, set to "no", or when the mongodb_settings block is omitted, leaving the replication connection open to unauthenticated access. DMS endpoints for Redis OSS should have TLS enabled Checks that AWS DMS endpoints configured with Redis OSS as the target or source engine have TLS enabled for the connection. The control fails if the redis_settings block does not specify ssl_security_protocol as ssl-encryption. DMS replication instances should have automatic minor version upgrade enabled Checks that AWS DMS replication instances have automatic minor version upgrade enabled. The control fails when the auto_minor_version_upgrade setting on a replication instance is disabled, leaving the instance on outdated engine versions. DMS replication instances should not be publicly accessible Checks that AWS DMS replication instances have publicly_accessible set to false, preventing the assignment of a public IP address and blocking direct internet access to instances that handle database migration traffic.
AWS Glue
Glue data catalog connection password encryption should be enabled Checks whether AWS Glue Data Catalog connection password encryption is enabled and a KMS key is configured to encrypt stored connection passwords. Evaluates the connection_password_encryption block within aws_glue_data_catalog_encryption_settings. Glue data catalog metadata encryption should be enabled Validates that AWS Glue Data Catalog encryption at rest is enabled for metadata. The control checks that catalog_encryption_mode is set to SSE-KMS rather than DISABLED, ensuring table definitions, partition info, and schema metadata are encrypted with a KMS key. Glue jobs bookmarks encryption should be enabled Validates that AWS Glue security configurations enable encryption for job bookmarks. Job bookmarks track ETL processing state, and this control checks that job_bookmarks_encryption_mode is set to CSE-KMS with a valid KMS key ARN. Glue jobs CloudWatch logs encryption should be enabled Checks that AWS Glue jobs reference a security configuration with CloudWatch logs encryption enabled. The control fails if no security configuration is attached or if cloud_watch_encryption_mode is set to DISABLED rather than SSE-KMS. Glue jobs S3 encryption should be enabled Validates that AWS Glue jobs reference a security configuration with S3 encryption enabled. The check confirms that the Glue security configuration's s3_encryption block uses SSE-S3 or SSE-KMS mode rather than DISABLED or absent entirely. Glue Spark jobs should run on supported versions of AWS Glue Checks that each AWS Glue Spark job has its glue_version set to 3.0 or higher. The control fails when a Glue job is configured with an earlier version such as 0.9, 1.0, or 2.0, which no longer receive updates or security patches from AWS.
AWS IAM
IAM password policies should expire passwords within 90 days or less Validates that the AWS account IAM password policy enforces password expiration within 90 days or fewer. Checks the max_password_age setting on the account-level password policy to confirm passwords do not remain valid indefinitely. IAM password policies should have minimum length set to 14 or greater Validates that the AWS IAM account password policy enforces a minimum password length of 14 characters or greater. This checks the minimum_password_length setting in the account-level password policy applied to all IAM users with console access. IAM password policies should have strong configurations Validates the aws_iam_account_password_policy resource for strong settings: reuse prevention set to 24 (the AWS maximum), minimum length of 14 or more, all four character-type requirements enabled, and a configured password expiration interval. IAM password policies should have strong configurations with minimum length of 8 or greater Validates the AWS account-level IAM password policy, confirming minimum_password_length is 8 or higher, with complexity attributes (lowercase, uppercase, numbers, symbols) explicitly enabled. AWS defaults without an explicit Terraform resource fail this control. IAM password policies should prevent password reuse Validates that the AWS account IAM password policy sets password_reuse_prevention to 24, ensuring users cannot reuse any of their last 24 passwords. The control fails if the value is less than 24 or if no password policy exists. IAM password policies should require at least one lowercase letter Validates that the AWS IAM account password policy requires at least one lowercase letter. Checks the require_lowercase_characters attribute on the aws_iam_account_password_policy resource and fails if the attribute is absent or explicitly set to false. IAM password policies should require at least one number Validates that the IAM account password policy has require_numbers set to true. Confirms the account-wide complexity rule is active, ensuring every IAM user with console access must include at least one digit (0-9) when creating or rotating a password. IAM password policies should require at least one symbol Validates that the AWS account-level IAM password policy requires at least one symbol character. Checks the require_symbols attribute on aws_iam_account_password_policy to confirm non-alphanumeric characters are mandatory for all IAM user passwords. IAM password policies should require at least one uppercase letter Validates that the AWS account IAM password policy requires at least one uppercase letter. This enforces character-set diversity in console passwords, reducing susceptibility to brute-force and dictionary attacks across all IAM users in the account.
AWS Lambda
Lambda functions CORS configuration should not allow all origins Checks that Lambda function URL CORS configurations do not set allow_origins to ["*"]. A wildcard lets any domain issue cross-origin browser requests to the function, bypassing domain-level access controls. The control fails when "*" appears in the origins list. Lambda functions should be configured with a dead-letter queue Checks that every AWS Lambda function has a dead-letter queue configured, targeting either an SQS queue or SNS topic. Without this, failed asynchronous invocations are silently discarded after retry exhaustion, leaving no record and no recovery path. Lambda functions should be in a VPC Checks that every AWS Lambda function is associated with at least one VPC subnet and security group via the vpc_config block, ensuring the function runs inside a Virtual Private Cloud rather than the default Lambda networking environment. Lambda functions should have concurrent execution limit configured Validates that each AWS Lambda function has a function-level concurrent execution limit configured via reserved_concurrent_executions. Functions without this setting can consume the entire account-level concurrency pool, starving other functions of capacity. Lambda functions should have encryption in transit enabled for environment variables Checks that every aws_lambda_function specifies a customer-managed KMS key via kms_key_arn to encrypt environment variables at rest. Without it, Lambda falls back to the AWS-managed default, leaving key rotation and access policies outside your control. Lambda functions should have logging config enabled Checks that every aws_lambda_function resource includes a logging_config block with an explicit log_format, directing invocation logs to a CloudWatch Log Group with configurable format and optional per-severity filtering for application and system logs. Lambda functions should restrict public URL Checks that AWS Lambda functions do not have a publicly accessible function URL. A Lambda function URL with authorization_type set to NONE allows unauthenticated invocation from the internet, potentially exposing application logic and sensitive data. Lambda functions should use latest runtimes Validates that AWS Lambda functions are configured with a supported runtime version from an approved list, including nodejs20.x, python3.12, ruby3.3, java21, dotnet8, and other current releases. Functions using deprecated or end-of-life runtimes fail this control. Lambda functions tracing should be enabled Validates that each AWS Lambda function has X-Ray tracing enabled. Functions must set tracing mode to Active so invocation traces are captured and forwarded to X-Ray, giving you visibility into request paths, downstream call latency, and error rates.
AWS Network Firewall
Network Firewall firewalls should have deletion protection enabled Checks that each AWS Network Firewall firewall has deletion protection enabled. The control fails when the deletion protection flag is disabled, meaning the firewall can be deleted in a single API call with no prerequisite step to disable protection first. Network Firewall firewalls should have subnet change protection enabled Checks whether Network Firewall firewalls have subnet change protection enabled, blocking unauthorized modifications to subnet associations. The control fails when subnet_change_protection is not explicitly set to true on the aws_networkfirewall_firewall resource. Network Firewall policies should have default stateless action set to drop or forward for fragmented packets Checks that the default stateless action for fragmented packets in an AWS Network Firewall policy is set to drop or forward to stateful rule groups, not pass. Policies that pass fragmented packets by default fail this control. Network Firewall policies should have default stateless action set to drop or forward for full packets Validates that AWS Network Firewall policy default stateless actions for full packets are set to drop or forward to the stateful rule engine, not pass. This prevents unfiltered traffic from bypassing inspection when no stateless rule explicitly matches a packet.
Elastic Load Balancing
Classic Load Balancers should have connection draining enabled Checks that Classic Load Balancers (CLBs) have connection draining enabled. When draining is off, in-flight requests to deregistered or unhealthy instances are dropped immediately. This control verifies connection_draining = true on every aws_elb resource. ELB application and classic load balancer logging should be enabled Checks that Application Load Balancers and Classic Load Balancers have access logging enabled, sending request-level log data to an S3 bucket. Each log entry includes client IP, latencies, request paths, and server responses. ELB application and network load balancer listeners should use secure protocols Validates that Application Load Balancer listeners are configured for HTTPS and Network Load Balancer listeners are configured for TLS, ensuring all traffic passing through the load balancer is encrypted in transit using a valid SSL/TLS certificate. ELB application and network load balancers should only use SSL or HTTPS listeners Validates that all Application Load Balancer and Network Load Balancer listeners are configured with HTTPS or TLS protocols and reference an ACM-provisioned certificate ARN, ensuring no listener accepts unencrypted client traffic at the load balancer boundary. ELB application and network load balancers should use recommended security policies Checks that HTTPS listeners on Application Load Balancers and TLS listeners on Network Load Balancers use a recommended security policy, ensuring strong cipher suites and modern TLS protocol versions protect data in transit. ELB application load balancer deletion protection should be enabled Checks that each AWS Application Load Balancer has deletion protection enabled. When enabled, the ALB cannot be deleted through the console, CLI, or API without first disabling this flag, preventing accidental removal of production traffic routing. ELB application load balancers should be configured to drop HTTP headers Validates that AWS Application Load Balancers have the drop_invalid_header_fields attribute enabled, causing the ALB to silently drop HTTP headers that do not conform to valid header field formatting rather than forwarding them to backend targets. ELB application load balancers should be configured with defensive or strictest desync mitigation mode Validates that each Application Load Balancer has desync mitigation mode set to "defensive" or "strictest". The weaker "monitor" mode logs ambiguous HTTP requests but still forwards them, leaving back-end targets exposed to request smuggling. ELB application load balancers should drop invalid HTTP headers Checks that each Application Load Balancer has drop_invalid_header_fields set to true, causing the ALB to silently discard HTTP requests with malformed or non-conforming header fields before routing traffic to any registered target. ELB classic load balancers should be configured with defensive or strictest desync mitigation mode Validates that AWS Classic Load Balancers have their desync mitigation mode set to "defensive" or "strictest" rather than "monitor", protecting against HTTP desync and request smuggling attacks that exploit parsing differences between frontend and backend servers. ELB classic load balancers should have cross-zone load balancing enabled Checks that Classic Elastic Load Balancers have cross-zone load balancing enabled, ensuring incoming traffic is distributed across registered instances in all enabled availability zones rather than being confined to the AZ that received the request. ELB classic load balancers should span multiple availability zones Validates that each Classic Load Balancer is configured to span at least two Availability Zones. The control fails when a CLB is associated with fewer than two AZs, indicating a single-AZ deployment with no fault-domain redundancy at the load balancer layer. ELB listeners should use approved SSL/TLS protocol versions Validates that ELB HTTPS and TLS listeners are configured with a security policy that enforces TLS 1.2 as the minimum protocol version, preventing clients from negotiating the deprecated TLS 1.0 and 1.1 versions at connection time. ELB load balancers should prohibit public access Checks that Application, Classic, and Network Load Balancers use an internal scheme rather than internet-facing. Public load balancers expose backend resources to untrusted internet traffic and widen the attack surface beyond what security groups alone can contain. ELB network load balancers should have TLS listener security policy configured Validates that each TLS listener on an AWS Network Load Balancer has an explicit security policy (ssl_policy) set, ensuring the NLB negotiates connections using approved cipher suites and TLS protocol versions rather than falling back to weak defaults.