config_bucket.tf 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # The centralized bucket for AWS config
  2. module "xdr_config_logging_bucket" {
  3. source = "../../thirdparty/terraform-aws-s3logging-bucket"
  4. bucket_name = "xdr-config-${var.environment}-access-logs"
  5. lifecycle_rules = [
  6. {
  7. id = "expire-old-logs"
  8. enabled = true
  9. prefix = ""
  10. expiration = 30
  11. noncurrent_version_expiration = 30
  12. abort_incomplete_multipart_upload_days = 7
  13. }
  14. ]
  15. tags = merge(local.standard_tags, var.tags)
  16. versioning_enabled = true
  17. }
  18. resource "aws_s3_bucket" "xdr_config_bucket" {
  19. bucket = "xdr-config-${var.environment}"
  20. tags = merge(local.standard_tags, var.tags)
  21. }
  22. resource "aws_s3_bucket_acl" "xdr_config_bucket" {
  23. bucket = aws_s3_bucket.xdr_config_bucket.id
  24. acl = "private"
  25. }
  26. resource "aws_s3_bucket_server_side_encryption_configuration" "xdr_config_bucket" {
  27. bucket = aws_s3_bucket.xdr_config_bucket.id
  28. rule {
  29. apply_server_side_encryption_by_default {
  30. sse_algorithm = "aws:kms"
  31. kms_master_key_id = aws_kms_key.config_encryption.arn
  32. }
  33. }
  34. }
  35. resource "aws_s3_bucket_logging" "xdr_config_bucket" {
  36. bucket = aws_s3_bucket.xdr_config_bucket.id
  37. target_bucket = module.xdr_config_logging_bucket.s3_bucket_name
  38. target_prefix = "${var.aws_account_id}-${var.aws_region}-awsconfig/"
  39. }
  40. resource "aws_s3_bucket_versioning" "xdr_config_bucket" {
  41. bucket = aws_s3_bucket.xdr_config_bucket.id
  42. versioning_configuration {
  43. status = "Enabled"
  44. }
  45. }
  46. resource "aws_s3_bucket_public_access_block" "awsconfig_bucket_block_public_access" {
  47. block_public_acls = true
  48. block_public_policy = true
  49. bucket = aws_s3_bucket.xdr_config_bucket.id
  50. ignore_public_acls = true
  51. restrict_public_buckets = true
  52. }
  53. data "aws_iam_policy_document" "awsconfig_bucket_policy" {
  54. statement {
  55. sid = "AWSConfigBucketPermissionsCheck"
  56. effect = "Allow"
  57. principals {
  58. type = "Service"
  59. identifiers = ["config.amazonaws.com"]
  60. }
  61. actions = ["s3:GetBucketAcl"]
  62. resources = [aws_s3_bucket.xdr_config_bucket.arn]
  63. }
  64. statement {
  65. sid = "AWSConfigBucketExistenceCheck"
  66. effect = "Allow"
  67. principals {
  68. type = "Service"
  69. identifiers = ["config.amazonaws.com"]
  70. }
  71. actions = ["s3:ListBucket"]
  72. resources = [aws_s3_bucket.xdr_config_bucket.arn]
  73. }
  74. statement {
  75. sid = "AWSConfigBucketDelivery"
  76. effect = "Allow"
  77. principals {
  78. type = "Service"
  79. identifiers = ["config.amazonaws.com"]
  80. }
  81. actions = ["s3:PutObject"]
  82. resources = ["${aws_s3_bucket.xdr_config_bucket.arn}/AWSLogs/*"]
  83. condition {
  84. test = "StringEquals"
  85. variable = "s3:x-amz-acl"
  86. values = ["bucket-owner-full-control"]
  87. }
  88. }
  89. }
  90. resource "aws_s3_bucket_policy" "awsconfig_bucket_policy" {
  91. bucket = aws_s3_bucket.xdr_config_bucket.id
  92. policy = data.aws_iam_policy_document.awsconfig_bucket_policy.json
  93. # Ordering bug, see https://github.com/terraform-providers/terraform-provider-aws/issues/7628
  94. depends_on = [aws_s3_bucket_public_access_block.awsconfig_bucket_block_public_access]
  95. }
  96. resource "aws_kms_key" "config_encryption" {
  97. description = "This key is used to encrypt AWS config"
  98. deletion_window_in_days = 30
  99. policy = data.aws_iam_policy_document.config_encryption_key_policy.json
  100. enable_key_rotation = true
  101. tags = merge(local.standard_tags, var.tags)
  102. }
  103. resource "aws_kms_alias" "config_encryption" {
  104. name = "alias/aws_config"
  105. target_key_id = aws_kms_key.config_encryption.key_id
  106. }
  107. data "aws_iam_policy_document" "config_encryption_key_policy" {
  108. statement {
  109. actions = ["kms:*"]
  110. effect = "Allow"
  111. resources = ["*"]
  112. principals {
  113. type = "AWS"
  114. identifiers = ["arn:${var.aws_partition}:iam::${var.aws_account_id}:root"]
  115. }
  116. }
  117. statement {
  118. actions = ["kms:GenerateDataKey*"]
  119. effect = "Allow"
  120. resources = ["*"]
  121. principals {
  122. type = "Service"
  123. identifiers = ["config.amazonaws.com"]
  124. }
  125. }
  126. statement {
  127. actions = [
  128. "kms:Encrypt*",
  129. "kms:Decrypt*",
  130. "kms:ReEncrypt*",
  131. "kms:GenerateDataKey*",
  132. "kms:Describe*",
  133. ]
  134. effect = "Allow"
  135. resources = ["*"]
  136. principals {
  137. type = "Service"
  138. identifiers = ["config.amazonaws.com"]
  139. }
  140. }
  141. statement {
  142. actions = ["kms:Describe*"]
  143. effect = "Allow"
  144. resources = ["*"]
  145. principals {
  146. type = "Service"
  147. identifiers = ["config.amazonaws.com"]
  148. }
  149. }
  150. }