Sign in
Menu
Start free trial
Annex J: CIS AWS

CIS AWS controls built into your Terraform modules. Enforced before apply.

Level 1 and Level 2 Benchmark recommendations for AWS: identity, storage, logging and networking. The modules enforce these controls before apply and list the Benchmark section each one maps to, where the catalog names one.

Modules enforce 18 of 26 CIS AWS controls in the catalog. Of the 16 that cite a CIS AWS clause, they enforce 12. The controls they do not enforce stay with your team, with monitoring, alerting, access reviews and penetration testing.

No credit card or AWS account needed to start. By Anton Babenko, maintainer of terraform-aws-modules, more than 2 billion provisions.

Annex J: CIS AWS

Framework
CIS AWS Foundations Benchmark v6.0.0
For
Your team, on Terraform
J.1

Scope for CIS AWS

The CIS Benchmark is a prescriptive baseline when no industry mandate applies. Many teams start here and map up to SOC 2 or NIST when audits come.

J.1.1

Covers

  • Infrastructure controls on AWS resources that map to CIS AWS Foundations Benchmark v6.0.0 sections, by section in J.3.
  • terraform-aws-modules through the CIS AWS framework host or your org endpoint, and resources written by hand outside modules once your team switches to the compliance.tf provider.
J.1.2

Stays with your team

  • Network monitoring and VPC flow log analysis.
  • Malware defense and endpoint protection.
  • Data recovery testing and validation.
  • Security awareness and skills training.
  • Audit log monitoring and alerting.
  • Account and identity management policies.
  • Penetration testing and vulnerability assessments.
  • Resources outside compliance.tf module coverage, and every control J.4 lists as Mapped: 4 with a CIS AWS clause and 4 without one.
J.2

The source line

Point a module at the CIS AWS framework host. Same inputs and outputs, no state migration. Terraform 1.0 or later.

-  source  = "terraform-aws-modules/s3-bucket/aws"
+  source  = "cis.compliance.tf/terraform-aws-modules/s3-bucket/aws"
   version = "~> 5.0"

With an org endpoint, the source names your org host instead, and CIS AWScomes from your org's configuration.

J.3

Enforced and mapped, by section

Of the 16 CIS AWS controls in the documented catalog that cite a clause, modules enforce 12. A control appears once under each section it maps to.

3 Storage8 of 8
2 Identity and Access Management1 of 3
4 Logging1 of 3
6 Networking2 of 2

The catalog maps 10 more controls to CIS AWS without naming a clause, 6 of them enforced. They are listed apart at the end of J.4 and left out of these counts.

Every row is a control your auditor can look up.

Filter the register, or search by control name or clause, for example 3.2.

16 of 16 shown

Each control links to its public docs page.

Enforced
Modules set this control before anything is deployed.
Mapped
Documented on its docs page, not set by modules. Your team owns it.
J.4

Control register

ControlStatusCIS AWS clauses
Attached EBS volumes should have encryption enabledEnforced6 Networking
EC2 instances should have IAM profile attachedEnforced2 Identity and Access Management
EC2 instances should use IMDSv2Enforced6 Networking
EFS file systems should have encryption at rest enabledEnforced3 Storage, 3.3 Elastic File System (EFS)
KMS CMK rotation should be enabledEnforced4 Logging
RDS DB clusters should be configured for multiple Availability ZonesEnforced3 Storage
RDS DB instance automatic minor version upgrade should be enabledEnforced3 Storage, 3.2 Relational Database Service (RDS)
RDS DB instance encryption at rest should be enabledEnforced3 Storage, 3.2 Relational Database Service (RDS)
RDS DB instances should have multiple AZ enabledEnforced3 Storage, 3.2 Relational Database Service (RDS)
RDS DB instances should prohibit public accessEnforced3.2 Relational Database Service (RDS)
S3 buckets should have MFA delete enabledEnforced3 Storage, 3.1 Simple Storage Service (S3)
S3 buckets should prohibit public write accessEnforced3 Storage
CloudTrail trails should have logs encrypted using a customer managed KMS keyMapped4 Logging
CloudTrail trails should have log file validation enabledMapped4 Logging
IAM password policies should have minimum length set to 14 or greaterMapped2 Identity and Access Management
IAM password policies should prevent password reuseMapped2 Identity and Access Management

Clause IDs for the auditor. Your stack stays as it is.

Compliance.tf works alongside your scanners, plan policy, CSPM and GRC tool. It sets the controls in the modules and lists the clause each one is there for.

J.5

Evidence

J.5.1

What compliance.tf gives your auditor

  • The CIS AWS clause IDs behind each enforced setting, with stable control IDs and public docs pages.
  • The config snapshot bound to each environment, and the per-action audit log of promotions between environments.
J.5.2

What comes from your AWS account and GRC tool

Evidence of what actually runs comes from your own account, for example AWS Config and your CSPM. Your GRC tool keeps tracking policies and audit workflows.

J.6

Plans for CIS AWS

CIS AWS is in the 30-day trial and in Full Access, $1,000 a year on AWS Marketplace, with every other framework in the catalog. Schedule of fees.

J.7

Questions about CIS AWS

J.7.1

Which CIS Benchmark version is supported?

Compliance.tf maps controls to CIS AWS Benchmark v6.0.0, the latest version. We also maintain mappings for v5.0 and v1.4.0 for teams that reference older benchmark versions. The module registry subdomain cis.compliance.tf serves the v6.0.0 mappings by default; use cisv140.compliance.tf for v1.4.0-specific modules.

J.7.2

Does this cover Level 1 and Level 2?

Yes, compliance.tf enforces Level 1 (essential security) and Level 2 (defense-in-depth) recommendations that map to resource configuration. Some Level 2 recommendations are operational (monitoring review processes, log analysis) and remain your team's responsibility.

J.7.3

Can I adopt this gradually, or is it all-or-nothing?

Fully incremental. Start with one module in one environment. Your existing modules continue working untouched. If you use Terragrunt or Terramate to orchestrate your runs, nothing changes - you're only swapping the module source line. There is no global policy agent to deploy, no wrapper binary, no sidecar. Each module source line is independent.

J.7.4

What if we want to switch back?

Each module keeps the inputs and outputs of its terraform-aws-modules counterpart and needs no state migration, so switching back is the same source line change in reverse.