main.tf 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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://${var.hec_pub_ack}:8088"
  17. hec_token = var.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(var.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(var.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. resource "aws_s3_bucket" "aws-waf-logs-splunk" {
  40. bucket = "aws-waf-logs-splunk-${var.environment}-${var.account_name}"
  41. acl = "private"
  42. versioning { enabled = false }
  43. server_side_encryption_configuration {
  44. rule {
  45. apply_server_side_encryption_by_default {
  46. kms_master_key_id = aws_kms_key.aws-waf-logs-splunk.arn
  47. sse_algorithm = "aws:kms"
  48. }
  49. }
  50. }
  51. tags = merge(var.standard_tags, var.tags, { "Purpose" = "Failed events from AWS Kinesis" })
  52. }
  53. resource "aws_kms_key" "aws-waf-logs-splunk" {
  54. description = "KMS Key for Failed AWS Kinesis Transmission to the HEC"
  55. deletion_window_in_days = 10
  56. enable_key_rotation = true
  57. policy = data.aws_iam_policy_document.aws-waf-logs-splunk.json
  58. tags = merge(var.standard_tags, var.tags, { "Purpose" = "Failed events from AWS Kinesis" })
  59. }
  60. data "aws_iam_policy_document" "aws-waf-logs-splunk" {
  61. statement {
  62. sid = "AllowThisAccount"
  63. effect = "Allow"
  64. principals {
  65. identifiers = ["arn:${var.aws_partition}:iam::${var.aws_account_id}:root"]
  66. type = "AWS"
  67. }
  68. actions = [
  69. "kms:*"
  70. ]
  71. resources = ["*"]
  72. }
  73. statement {
  74. sid = "AllowKinesis"
  75. effect = "Allow"
  76. principals {
  77. identifiers = ["firehose.amazonaws.com"]
  78. type = "Service"
  79. }
  80. actions = [
  81. "kms:GenerateDataKey",
  82. "kms:Decrypt"
  83. ]
  84. resources = [ "*" ]
  85. }
  86. }
  87. resource "aws_iam_role" "aws-waf-logs-splunk" {
  88. name = "aws-waf-logs-splunk"
  89. path = "/aws_services/"
  90. assume_role_policy = <<EOF
  91. {
  92. "Version": "2012-10-17",
  93. "Statement": [
  94. {
  95. "Sid": "",
  96. "Effect": "Allow",
  97. "Principal": {
  98. "Service": "firehose.amazonaws.com"
  99. },
  100. "Action": "sts:AssumeRole"
  101. }
  102. ]
  103. }
  104. EOF
  105. tags = merge(var.standard_tags, var.tags)
  106. }
  107. resource "aws_iam_role_policy" "aws-waf-logs-splunk" {
  108. name = "aws-waf-logs-splunk"
  109. role = aws_iam_role.aws-waf-logs-splunk.id
  110. # From https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-splunk
  111. policy = <<-EOF
  112. {
  113. "Version": "2012-10-17",
  114. "Statement":
  115. [
  116. {
  117. "Effect": "Allow",
  118. "Action": [
  119. "s3:AbortMultipartUpload",
  120. "s3:GetBucketLocation",
  121. "s3:GetObject",
  122. "s3:ListBucket",
  123. "s3:ListBucketMultipartUploads",
  124. "s3:PutObject"
  125. ],
  126. "Resource": [
  127. "${aws_s3_bucket.aws-waf-logs-splunk.arn}",
  128. "${aws_s3_bucket.aws-waf-logs-splunk.arn}/*"
  129. ]
  130. },
  131. {
  132. "Effect": "Allow",
  133. "Action": [
  134. "kms:Decrypt",
  135. "kms:GenerateDataKey"
  136. ],
  137. "Resource": [
  138. "${aws_kms_key.aws-waf-logs-splunk.arn}"
  139. ],
  140. "Condition": {
  141. "StringEquals": {
  142. "kms:ViaService": "s3.${var.aws_region}.amazonaws.com"
  143. },
  144. "StringLike": {
  145. "kms:EncryptionContext:aws:s3:arn": "${aws_s3_bucket.aws-waf-logs-splunk.arn}/*"
  146. }
  147. }
  148. },
  149. {
  150. "Effect": "Allow",
  151. "Action": [
  152. "kinesis:DescribeStream",
  153. "kinesis:GetShardIterator",
  154. "kinesis:GetRecords",
  155. "kinesis:ListShards"
  156. ],
  157. "Resource": "${aws_kinesis_firehose_delivery_stream.aws-waf-logs-splunk.arn}"
  158. },
  159. {
  160. "Effect": "Allow",
  161. "Action": [
  162. "logs:PutLogEvents"
  163. ],
  164. "Resource": [
  165. "arn:${var.aws_partition}:logs:${var.aws_region}:${var.aws_account_id}:log-group:kinesis:*"
  166. ]
  167. }
  168. ]
  169. }
  170. EOF
  171. # Removed from above policy as I think it's unneeded
  172. # ,
  173. # {
  174. # "Effect": "Allow",
  175. # "Action": [
  176. # "lambda:InvokeFunction",
  177. # "lambda:GetFunctionConfiguration"
  178. # ],
  179. # "Resource": [
  180. # "arn:aws:lambda:region:account-id:function:function-name:function-version"
  181. # ]
  182. # }
  183. }