# main.tf — EKM compliance fixture # Produces zero EKM policy violations terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } provider "aws" { region = "ap-south-1" } # EKM-001 + EKM-002 — Rotation enabled, 30 day deletion window resource "aws_kms_key" "good_key" { description = "good key" customer_master_key_spec = "SYMMETRIC_DEFAULT" enable_key_rotation = true deletion_window_in_days = 30 } # EKM-003 — KMS permissions scoped to specific key resource "aws_iam_policy" "good_kms_policy" { name = "good-kms-policy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = ["kms:Decrypt"] Resource = "arn:aws:kms:ap-south-1:123456789012:key/mrk-1234abcd" }] }) } # EKM-004 — KMS key policy grants kms:* to root WITH a condition resource "aws_kms_key" "good_root_key" { description = "good root key" customer_master_key_spec = "SYMMETRIC_DEFAULT" enable_key_rotation = true deletion_window_in_days = 30 policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { AWS = "arn:aws:iam::123456789012:root" } Action = "kms:*" Resource = "*" Condition = { StringEquals = { "kms:CallerAccount" = "123456789012" } } }] }) } # EKM-005 — S3 encryption using KMS CMK resource "aws_s3_bucket" "good_bucket" { bucket = "good-ekm-bucket" } resource "aws_s3_bucket_server_side_encryption_configuration" "good_sse" { bucket = aws_s3_bucket.good_bucket.id rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = "arn:aws:kms:ap-south-1:123456789012:key/mrk-1234abcd" } bucket_key_enabled = true } } # STR passthrough — needed to avoid STR violations on the bucket resource "aws_s3_bucket_public_access_block" "good_pab" { bucket = aws_s3_bucket.good_bucket.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } resource "aws_s3_bucket_ownership_controls" "good_ownership" { bucket = aws_s3_bucket.good_bucket.id rule { object_ownership = "BucketOwnerEnforced" } } resource "aws_s3_bucket_policy" "good_policy" { bucket = aws_s3_bucket.good_bucket.id policy = jsonencode({ Version = "2012-10-17" Statement = [{ Sid = "DenyNonTLS" Effect = "Deny" Principal = "*" Action = "s3:*" Resource = [ "arn:aws:s3:::good-ekm-bucket", "arn:aws:s3:::good-ekm-bucket/*" ] Condition = { Bool = { "aws:SecureTransport" = "false" } } }] }) } # EKM-006 — EBS default encryption enabled with CMK resource "aws_ebs_encryption_by_default" "good_ebs" { enabled = true } resource "aws_ebs_default_kms_key" "good_ebs_kms" { key_arn = "arn:aws:kms:ap-south-1:123456789012:key/mrk-1234abcd" } # EKM-007 — Secret with rotation configured resource "aws_secretsmanager_secret" "good_secret" { name = "good-secret" } resource "aws_secretsmanager_secret_rotation" "good_rotation" { secret_id = aws_secretsmanager_secret.good_secret.name rotation_lambda_arn = "arn:aws:lambda:ap-south-1:123456789012:function:rotate-secret" rotation_rules { automatically_after_days = 60 } } # EKM-008 — Strong RSA key resource "aws_acm_certificate" "good_cert" { domain_name = "good.example.com" validation_method = "DNS" key_algorithm = "RSA_2048" }