deploy/test-environments/modules/aws/cloudtrail/main.tf (148 lines of code) (raw):

locals { s3_bucket_name = "tf-test-envs-cloudtrail-logs" common_tags = { division = "${var.division}" org = "${var.org}" team = "${var.team}" project = "${var.project}" owner = "${var.owner}" } } resource "aws_s3_bucket" "cloudtrail" { bucket = var.s3_bucket_name force_destroy = true tags = local.common_tags } resource "aws_kms_key" "cloudtrail" { description = "KMS key for CloudTrail logs encryption" policy = jsonencode({ Version = "2012-10-17", Id = "key-default-1", Statement : [ { Sid = "Enable IAM User Permissions", Effect = "Allow", Principal = { AWS = "arn:aws:iam::${var.aws_account_id}:root" }, Action = "kms:*", Resource = "*" }, { Sid = "Allow CloudTrail to encrypt logs", Effect = "Allow", Principal = { Service = "cloudtrail.amazonaws.com" }, Action = [ "kms:GenerateDataKey*", "kms:Decrypt" ], Resource = "*", Condition = { StringLike = { "kms:EncryptionContext:aws:cloudtrail:arn" = "arn:aws:cloudtrail:*:${var.aws_account_id}:trail/*" } } }, { Sid = "Allow CloudTrail to describe key", Effect = "Allow", Principal = { Service = "cloudtrail.amazonaws.com" }, Action = "kms:DescribeKey", Resource = "*" } ] }) tags = local.common_tags } resource "aws_kms_alias" "cloudtrail" { name = "alias/${var.kms_alias_name}" target_key_id = aws_kms_key.cloudtrail.id } resource "aws_cloudtrail" "main" { name = var.cloudtrail_name s3_bucket_name = aws_s3_bucket.cloudtrail.bucket include_global_service_events = true is_multi_region_trail = true enable_log_file_validation = true kms_key_id = aws_kms_key.cloudtrail.arn insight_selector { insight_type = "ApiCallRateInsight" } insight_selector { insight_type = "ApiErrorRateInsight" } advanced_event_selector { name = "Log management events" field_selector { field = "eventCategory" equals = ["Management"] } } advanced_event_selector { name = "AWS App Config" field_selector { field = "eventCategory" equals = ["Data"] } field_selector { field = "resources.type" equals = ["AWS::AppConfig::Configuration"] } } advanced_event_selector { name = "S3 Object Data" field_selector { field = "eventCategory" equals = ["Data"] } field_selector { field = "resources.type" equals = ["AWS::S3::Object"] } } advanced_event_selector { name = "DynamoDB Table Data" field_selector { field = "eventCategory" equals = ["Data"] } field_selector { field = "resources.type" equals = ["AWS::DynamoDB::Table"] } } tags = local.common_tags } resource "aws_s3_bucket_policy" "cloudtrail" { bucket = aws_s3_bucket.cloudtrail.bucket policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = { Service = "cloudtrail.amazonaws.com" } Action = "s3:GetBucketAcl" Resource = "arn:aws:s3:::${aws_s3_bucket.cloudtrail.bucket}" }, { Effect = "Allow" Principal = { Service = "cloudtrail.amazonaws.com" } Action = "s3:PutObject" Resource = "arn:aws:s3:::${aws_s3_bucket.cloudtrail.bucket}/AWSLogs/${var.aws_account_id}/*" Condition = { StringEquals = { "s3:x-amz-acl" = "bucket-owner-full-control" } } } ] }) }