AWS Compliance Controls

296 controls across AWS services, each with Terraform implementation examples, framework mappings, and audit guidance.

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. high effort 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. medium effort 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. ◆◆ 4 frameworks low effort 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. 1 framework medium effort 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. ◆◆◆ 16 frameworks low effort 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. ◆◆◆ 20 frameworks low effort 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. ◆◆◆ 12 frameworks medium effort 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. medium effort 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. 2 frameworks low effort compliance.tf module

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. ◆◆◆ 7 frameworks low effort compliance.tf module 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. 1 framework low effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. high effort compliance.tf module 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. low effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆◆ 7 frameworks low effort compliance.tf module 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. ◆◆ 3 frameworks low effort compliance.tf module 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. 2 frameworks low effort compliance.tf module 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. low effort compliance.tf module

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. ◆◆◆ 18 frameworks low effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 12 frameworks low effort compliance.tf module 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. ◆◆◆ 16 frameworks low effort compliance.tf module 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. ◆◆◆ 10 frameworks medium effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆◆ 18 frameworks high effort compliance.tf module 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. 2 frameworks high effort compliance.tf module 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. 1 framework medium effort compliance.tf module 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. 1 framework medium effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. ◆◆◆ 12 frameworks medium effort compliance.tf module 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. 1 framework medium effort compliance.tf module 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. medium effort compliance.tf module 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. low effort

Amazon EKS

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. 1 framework medium effort 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. medium effort compliance.tf module 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. 1 framework high effort compliance.tf module 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. 1 framework high effort compliance.tf module 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. high effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆◆ 21 frameworks low effort compliance.tf module

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. high effort compliance.tf module 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. high effort compliance.tf module 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. high effort compliance.tf module 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. low effort compliance.tf module 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. high effort compliance.tf module

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. 1 framework low effort 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. 2 frameworks high effort 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. ◆◆ 3 frameworks low effort 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. 1 framework low effort 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. 2 frameworks low effort 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. ◆◆ 3 frameworks low effort

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. 1 framework low effort compliance.tf module 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. ◆◆◆ 17 frameworks high effort 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. ◆◆◆ 18 frameworks low effort 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. medium effort 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. medium effort 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. 2 frameworks medium effort 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. high effort 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. medium effort 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. 1 framework low effort 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. ◆◆◆ 17 frameworks medium effort 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. ◆◆◆ 18 frameworks high effort 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. high effort compliance.tf module 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. ◆◆◆ 9 frameworks high effort compliance.tf module 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. ◆◆◆ 7 frameworks high effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 8 frameworks medium effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 9 frameworks high effort compliance.tf module 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. ◆◆ 4 frameworks high effort compliance.tf module 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. ◆◆◆ 8 frameworks medium effort compliance.tf module 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. ◆◆◆ 8 frameworks low effort compliance.tf module

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. 2 frameworks medium effort compliance.tf module 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. low effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. 2 frameworks low effort compliance.tf module 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. 2 frameworks high effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. high effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. low effort compliance.tf module 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. 1 framework high effort compliance.tf module 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. high effort compliance.tf module 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. ◆◆ 3 frameworks low effort 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. ◆◆ 4 frameworks medium effort compliance.tf module 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. ◆◆◆ 10 frameworks low effort compliance.tf module 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. ◆◆◆ 21 frameworks low effort compliance.tf module 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. ◆◆◆ 22 frameworks high effort compliance.tf module 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. ◆◆◆ 12 frameworks low effort compliance.tf module 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. low effort compliance.tf module 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. low effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 14 frameworks low effort compliance.tf module 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. ◆◆◆ 9 frameworks medium effort compliance.tf module 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). ◆◆◆ 20 frameworks low effort compliance.tf module 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. ◆◆◆ 18 frameworks medium effort compliance.tf module 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. high effort compliance.tf module 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. ◆◆◆ 22 frameworks medium effort compliance.tf module 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. low effort compliance.tf module 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. low effort compliance.tf module 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. low effort compliance.tf module 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. medium effort compliance.tf module

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. ◆◆◆ 19 frameworks low effort compliance.tf module 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. high effort compliance.tf module 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. ◆◆◆ 23 frameworks medium effort compliance.tf module 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. ◆◆◆ 8 frameworks low effort compliance.tf module 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. ◆◆◆ 23 frameworks low effort compliance.tf module 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. 1 framework low effort compliance.tf module 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. ◆◆◆ 9 frameworks low effort compliance.tf module 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. ◆◆◆ 12 frameworks high effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 13 frameworks low effort compliance.tf module 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. 2 frameworks high effort compliance.tf module 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. 1 framework high effort compliance.tf module 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. ◆◆◆ 19 frameworks medium effort compliance.tf module

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. low effort 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. high effort 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". low effort 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. low effort 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. low effort

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. ◆◆ 3 frameworks low effort 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. ◆◆◆ 20 frameworks high effort compliance.tf module 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. ◆◆◆ 18 frameworks low effort compliance.tf module 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. ◆◆◆ 18 frameworks medium effort compliance.tf module 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. ◆◆◆ 6 frameworks medium effort compliance.tf module 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. ◆◆◆ 6 frameworks medium effort compliance.tf module 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. ◆◆◆ 24 frameworks low effort compliance.tf module 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. ◆◆◆ 6 frameworks high effort compliance.tf module 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. ◆◆◆ 13 frameworks high effort compliance.tf module 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. 1 framework medium effort 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. ◆◆◆ 16 frameworks medium effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 26 frameworks medium effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 6 frameworks medium effort compliance.tf module 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. ◆◆◆ 21 frameworks medium effort compliance.tf module 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. ◆◆◆ 24 frameworks low effort compliance.tf module 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. ◆◆ 4 frameworks high effort compliance.tf module 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. ◆◆◆ 13 frameworks medium effort compliance.tf module 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. low effort 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. ◆◆◆ 18 frameworks low effort compliance.tf module 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. ◆◆◆ 16 frameworks low effort compliance.tf module

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. ◆◆◆ 17 frameworks medium effort 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. low effort 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. high effort 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. low effort 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. ◆◆◆ 17 frameworks medium effort 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. ◆◆ 4 frameworks low effort 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. 1 framework medium effort 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. 1 framework medium effort 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. ◆◆◆ 20 frameworks high effort

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. high effort 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. low effort compliance.tf module 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. low effort 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. ◆◆◆ 9 frameworks medium effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 13 frameworks medium effort compliance.tf module

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. ◆◆◆ 5 frameworks low effort 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. ◆◆◆ 9 frameworks low effort 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. ◆◆◆ 5 frameworks low effort 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. ◆◆ 4 frameworks low effort 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. low effort

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. low effort 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. low effort 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. medium effort 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. medium effort 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. medium effort 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. medium effort

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. 1 framework low effort 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. ◆◆◆ 11 frameworks low effort 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. ◆◆◆ 20 frameworks low effort 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. low effort 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. ◆◆ 3 frameworks low effort 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. ◆◆◆ 7 frameworks low effort 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. ◆◆◆ 7 frameworks low effort 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. ◆◆◆ 7 frameworks low effort 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. ◆◆◆ 7 frameworks low effort

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. low effort compliance.tf module 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. ◆◆◆ 10 frameworks medium effort compliance.tf module 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. ◆◆◆ 18 frameworks high effort compliance.tf module 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. ◆◆◆ 9 frameworks medium effort compliance.tf module 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. medium effort compliance.tf module 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. low effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆ 3 frameworks medium effort compliance.tf module 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. low effort compliance.tf module

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. low effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆ 3 frameworks low effort compliance.tf module 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. ◆◆ 3 frameworks low effort compliance.tf module

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. low effort compliance.tf module 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. ◆◆◆ 22 frameworks low effort compliance.tf module 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. medium effort compliance.tf module 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. ◆◆◆ 15 frameworks medium effort compliance.tf module 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. low effort compliance.tf module 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. ◆◆◆ 14 frameworks low effort compliance.tf module 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. ◆◆◆ 12 frameworks low effort compliance.tf module 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. 2 frameworks low effort compliance.tf module 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. ◆◆◆ 12 frameworks low effort compliance.tf module 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. ◆◆ 3 frameworks low effort compliance.tf module 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. ◆◆◆ 13 frameworks low effort compliance.tf module 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. 2 frameworks medium effort compliance.tf module 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. 1 framework low effort compliance.tf module 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. high effort compliance.tf module 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. 1 framework low effort compliance.tf module