main.tf 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. resource "aws_kinesis_firehose_delivery_stream" "aws-waf-logs-splunk" {
  2. name = "aws-waf-logs-splunk"
  3. destination = "splunk"
  4. server_side_encryption {
  5. enabled = true
  6. }
  7. s3_configuration {
  8. role_arn = aws_iam_role.aws-waf-logs-splunk.arn
  9. bucket_arn = aws_s3_bucket.aws-waf-logs-splunk.arn
  10. buffer_size = 10
  11. buffer_interval = 400
  12. compression_format = "GZIP"
  13. kms_key_arn = aws_kms_key.aws-waf-logs-splunk.arn
  14. }
  15. splunk_configuration {
  16. hec_endpoint = "https://${local.hec_pub_ack}:8088"
  17. hec_token = local.aws_waf_logs_hec_token
  18. hec_acknowledgment_timeout = 600
  19. hec_endpoint_type = "Raw"
  20. s3_backup_mode = "FailedEventsOnly"
  21. cloudwatch_logging_options {
  22. enabled = true
  23. log_group_name = "kinesis"
  24. log_stream_name = "aws-waf-logs-splunk"
  25. }
  26. }
  27. tags = merge(local.standard_tags, var.tags)
  28. }
  29. resource "aws_cloudwatch_log_group" "kinesis" {
  30. name = "kinesis"
  31. retention_in_days = 7
  32. kms_key_id = var.cloudtrail_key_arn
  33. tags = merge(local.standard_tags, var.tags)
  34. }
  35. resource "aws_cloudwatch_log_stream" "kinesis" {
  36. name = "aws-waf-logs-splunk"
  37. log_group_name = aws_cloudwatch_log_group.kinesis.name
  38. }
  39. # tfsec:ignore:aws-s3-enable-bucket-logging Don't log the logs
  40. resource "aws_s3_bucket" "aws-waf-logs-splunk" {
  41. bucket = "aws-waf-logs-splunk-${var.environment}-${var.account_name}"
  42. tags = merge(local.standard_tags, var.tags, { "Purpose" = "Failed events from AWS Kinesis" })
  43. }
  44. resource "aws_s3_bucket_acl" "s3_acl_aws-waf-logs-splunk" {
  45. bucket = aws_s3_bucket.aws-waf-logs-splunk.id
  46. acl = "private"
  47. }
  48. # tfsec:ignore:aws-s3-enable-versioning No versioning on logging buckets
  49. resource "aws_s3_bucket_versioning" "s3_version_aws-waf-logs-splunk" {
  50. bucket = aws_s3_bucket.aws-waf-logs-splunk.id
  51. versioning_configuration {
  52. status = "Suspended"
  53. }
  54. }
  55. resource "aws_s3_bucket_server_side_encryption_configuration" "s3_sse_aws-waf-logs-splunk" {
  56. bucket = aws_s3_bucket.aws-waf-logs-splunk.id
  57. rule {
  58. apply_server_side_encryption_by_default {
  59. kms_master_key_id = aws_kms_key.aws-waf-logs-splunk.arn
  60. sse_algorithm = "aws:kms"
  61. }
  62. }
  63. }
  64. resource "aws_s3_bucket_public_access_block" "aws-waf-logs-splunk" {
  65. bucket = aws_s3_bucket.aws-waf-logs-splunk.id
  66. block_public_acls = true
  67. block_public_policy = true
  68. ignore_public_acls = true
  69. restrict_public_buckets = true
  70. }
  71. resource "aws_kms_key" "aws-waf-logs-splunk" {
  72. description = "KMS Key for Failed AWS Kinesis Transmission to the HEC"
  73. deletion_window_in_days = 10
  74. enable_key_rotation = true
  75. policy = data.aws_iam_policy_document.aws-waf-logs-splunk.json
  76. tags = merge(local.standard_tags, var.tags, { "Purpose" = "Failed events from AWS Kinesis" })
  77. }
  78. data "aws_iam_policy_document" "aws-waf-logs-splunk" {
  79. statement {
  80. sid = "AllowThisAccount"
  81. effect = "Allow"
  82. principals {
  83. identifiers = ["arn:${var.aws_partition}:iam::${var.aws_account_id}:root"]
  84. type = "AWS"
  85. }
  86. actions = [
  87. "kms:*"
  88. ]
  89. resources = ["*"]
  90. }
  91. statement {
  92. sid = "AllowKinesis"
  93. effect = "Allow"
  94. principals {
  95. identifiers = ["firehose.amazonaws.com"]
  96. type = "Service"
  97. }
  98. actions = [
  99. "kms:GenerateDataKey",
  100. "kms:Decrypt"
  101. ]
  102. resources = ["*"]
  103. }
  104. }
  105. resource "aws_iam_role" "aws-waf-logs-splunk" {
  106. name = "aws-waf-logs-splunk"
  107. path = "/aws_services/"
  108. assume_role_policy = <<EOF
  109. {
  110. "Version": "2012-10-17",
  111. "Statement": [
  112. {
  113. "Sid": "",
  114. "Effect": "Allow",
  115. "Principal": {
  116. "Service": "firehose.amazonaws.com"
  117. },
  118. "Action": "sts:AssumeRole"
  119. }
  120. ]
  121. }
  122. EOF
  123. tags = merge(local.standard_tags, var.tags)
  124. }
  125. resource "aws_iam_role_policy" "aws-waf-logs-splunk" {
  126. name = "aws-waf-logs-splunk"
  127. role = aws_iam_role.aws-waf-logs-splunk.id
  128. # From https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-splunk
  129. policy = <<-EOF
  130. {
  131. "Version": "2012-10-17",
  132. "Statement":
  133. [
  134. {
  135. "Effect": "Allow",
  136. "Action": [
  137. "s3:AbortMultipartUpload",
  138. "s3:GetBucketLocation",
  139. "s3:GetObject",
  140. "s3:ListBucket",
  141. "s3:ListBucketMultipartUploads",
  142. "s3:PutObject"
  143. ],
  144. "Resource": [
  145. "${aws_s3_bucket.aws-waf-logs-splunk.arn}",
  146. "${aws_s3_bucket.aws-waf-logs-splunk.arn}/*"
  147. ]
  148. },
  149. {
  150. "Effect": "Allow",
  151. "Action": [
  152. "kms:Decrypt",
  153. "kms:GenerateDataKey"
  154. ],
  155. "Resource": [
  156. "${aws_kms_key.aws-waf-logs-splunk.arn}"
  157. ],
  158. "Condition": {
  159. "StringEquals": {
  160. "kms:ViaService": "s3.${var.aws_region}.amazonaws.com"
  161. },
  162. "StringLike": {
  163. "kms:EncryptionContext:aws:s3:arn": "${aws_s3_bucket.aws-waf-logs-splunk.arn}/*"
  164. }
  165. }
  166. },
  167. {
  168. "Effect": "Allow",
  169. "Action": [
  170. "kinesis:DescribeStream",
  171. "kinesis:GetShardIterator",
  172. "kinesis:GetRecords",
  173. "kinesis:ListShards"
  174. ],
  175. "Resource": "${aws_kinesis_firehose_delivery_stream.aws-waf-logs-splunk.arn}"
  176. },
  177. {
  178. "Effect": "Allow",
  179. "Action": [
  180. "logs:PutLogEvents"
  181. ],
  182. "Resource": [
  183. "arn:${var.aws_partition}:logs:${var.aws_region}:${var.aws_account_id}:log-group:kinesis:*"
  184. ]
  185. }
  186. ]
  187. }
  188. EOF
  189. # Removed from above policy as I think it's unneeded
  190. # ,
  191. # {
  192. # "Effect": "Allow",
  193. # "Action": [
  194. # "lambda:InvokeFunction",
  195. # "lambda:GetFunctionConfiguration"
  196. # ],
  197. # "Resource": [
  198. # "arn:aws:lambda:region:account-id:function:function-name:function-version"
  199. # ]
  200. # }
  201. }
  202. //AWS Provider outdated arguments <4.4.0
  203. /*resource "aws_s3_bucket" "aws-waf-logs-splunk" {
  204. bucket = "aws-waf-logs-splunk-${var.environment}-${var.account_name}"
  205. acl = "private"
  206. versioning { enabled = false }
  207. server_side_encryption_configuration {
  208. rule {
  209. apply_server_side_encryption_by_default {
  210. kms_master_key_id = aws_kms_key.aws-waf-logs-splunk.arn
  211. sse_algorithm = "aws:kms"
  212. }
  213. }
  214. }
  215. tags = merge(local.standard_tags, var.tags, { "Purpose" = "Failed events from AWS Kinesis" })
  216. }
  217. */