main.tf 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. data "aws_vpc" "this" {
  2. id = var.vpc_id
  3. }
  4. data "aws_prefix_list" "private_s3" {
  5. filter {
  6. name = "prefix-list-name"
  7. values = [ "com.amazonaws.*.s3" ]
  8. }
  9. }
  10. locals {
  11. vpc_name = lookup(data.aws_vpc.this.tags, "Name", data.aws_vpc.this.cidr_block)
  12. }
  13. resource "aws_security_group" "security_group" {
  14. name = "typical-host"
  15. description = "Required typical-host SG for VPC ${local.vpc_name} (${var.vpc_id})"
  16. vpc_id = var.vpc_id
  17. tags = merge(var.tags, { "Name" = "typical-host", "vpc_name" = local.vpc_name })
  18. }
  19. ## Ingress
  20. resource "aws_security_group_rule" "scanner_access" {
  21. security_group_id = aws_security_group.security_group.id
  22. type = "ingress"
  23. description = "Full Access from Security Scanners"
  24. from_port = 0
  25. to_port = 0
  26. protocol = -1
  27. cidr_blocks = var.cidr_map["scanners"]
  28. count = length(var.cidr_map["scanners"]) > 0 ? 1 : 0
  29. }
  30. resource "aws_security_group_rule" "ssh_access" {
  31. security_group_id = aws_security_group.security_group.id
  32. type = "ingress"
  33. description = "SSH Access"
  34. from_port = 22
  35. to_port = 22
  36. protocol = "tcp"
  37. # Convert to a set to remove duplicates
  38. cidr_blocks = toset(concat(var.cidr_map["bastions"], var.cidr_map["vpns"]))
  39. count = length(toset(concat(var.cidr_map["bastions"], var.cidr_map["vpns"]))) > 0 ? 1 : 0
  40. }
  41. resource "aws_security_group_rule" "ping_inbound" {
  42. security_group_id = aws_security_group.security_group.id
  43. type = "ingress"
  44. description = "Inbound Pings"
  45. from_port = -1
  46. to_port = -1
  47. protocol = "icmp"
  48. cidr_blocks = [ "10.0.0.0/8" ]
  49. }
  50. ## Outbound:
  51. resource "aws_security_group_rule" "ping_outbound" {
  52. security_group_id = aws_security_group.security_group.id
  53. type = "egress"
  54. description = "Outbound Pings"
  55. from_port = -1
  56. to_port = -1
  57. protocol = "icmp"
  58. cidr_blocks = [ "0.0.0.0/0" ]
  59. }
  60. resource "aws_security_group_rule" "dns_access_tcp" {
  61. security_group_id = aws_security_group.security_group.id
  62. type = "egress"
  63. description = "Outbound TCP DNS"
  64. from_port = 53
  65. to_port = 53
  66. protocol = "tcp"
  67. cidr_blocks = var.cidr_map["dns"]
  68. count = length(var.cidr_map["dns"]) > 0 ? 1 : 0
  69. }
  70. resource "aws_security_group_rule" "dns_access_udp" {
  71. security_group_id = aws_security_group.security_group.id
  72. type = "egress"
  73. description = "Outbound UDP DNS"
  74. from_port = 53
  75. to_port = 53
  76. protocol = "udp"
  77. cidr_blocks = var.cidr_map["dns"]
  78. count = length(var.cidr_map["dns"]) > 0 ? 1 : 0
  79. }
  80. resource "aws_security_group_rule" "outbound_to_salt_masters" {
  81. security_group_id = aws_security_group.security_group.id
  82. type = "egress"
  83. description = "Connect to Salt Masters"
  84. from_port = 4505
  85. to_port = 4506
  86. protocol = "tcp"
  87. cidr_blocks = var.cidr_map["salt"]
  88. count = length(var.cidr_map["salt"]) > 0 ? 1 : 0
  89. }
  90. resource "aws_security_group_rule" "outbound_to_web_servers_80" {
  91. security_group_id = aws_security_group.security_group.id
  92. type = "egress"
  93. description = "Connect to Repo Servers"
  94. from_port = 80
  95. to_port = 80
  96. protocol = "tcp"
  97. cidr_blocks = var.cidr_map["web"]
  98. count = length(var.cidr_map["web"]) > 0 ? 1 : 0
  99. }
  100. resource "aws_security_group_rule" "outbound_to_web_servers_443" {
  101. security_group_id = aws_security_group.security_group.id
  102. type = "egress"
  103. description = "Connect to Repo Servers"
  104. from_port = 443
  105. to_port = 443
  106. protocol = "tcp"
  107. cidr_blocks = var.cidr_map["web"]
  108. count = length(var.cidr_map["web"]) > 0 ? 1 : 0
  109. }
  110. # Systems need to be able to access vpc endpoints on 80/443
  111. resource "aws_security_group_rule" "outbound_to_local_vpc_80" {
  112. security_group_id = aws_security_group.security_group.id
  113. type = "egress"
  114. description = "Connect to VPC Endpoints"
  115. from_port = 80
  116. to_port = 80
  117. protocol = "tcp"
  118. source_security_group_id = var.aws_endpoints_sg
  119. }
  120. resource "aws_security_group_rule" "outbound_to_local_vpc_443" {
  121. security_group_id = aws_security_group.security_group.id
  122. type = "egress"
  123. description = "Connect to VPC Endpoints"
  124. from_port = 443
  125. to_port = 443
  126. protocol = "tcp"
  127. source_security_group_id = var.aws_endpoints_sg
  128. }
  129. resource "aws_security_group_rule" "outbound_to_mailrelay_25" {
  130. security_group_id = aws_security_group.security_group.id
  131. type = "egress"
  132. description = "Outbound Email to mailrelay"
  133. from_port = 25
  134. to_port = 25
  135. protocol = "tcp"
  136. cidr_blocks = var.cidr_map["smtp"]
  137. count = length(var.cidr_map["smtp"]) > 0 ? 1 : 0
  138. }
  139. resource "aws_security_group_rule" "outbound_to_ec2_s3_endpoint" {
  140. security_group_id = aws_security_group.security_group.id
  141. type = "egress"
  142. description = "Outbound to S3 endpoint"
  143. from_port = 443
  144. to_port = 443
  145. protocol = "tcp"
  146. prefix_list_ids = [ data.aws_prefix_list.private_s3.id ]
  147. count = length([ data.aws_prefix_list.private_s3.id ]) > 0 ? 1 : 0 # todo: handle case of no s3 prefix list
  148. }
  149. resource "aws_security_group_rule" "outbound_to_sensu" {
  150. security_group_id = aws_security_group.security_group.id
  151. type = "egress"
  152. description = "Monitoring Outbound"
  153. from_port = 8081
  154. to_port = 8081
  155. protocol = "tcp"
  156. cidr_blocks = var.cidr_map["monitoring"]
  157. count = length(var.cidr_map["monitoring"]) > 0 ? 1 : 0
  158. }
  159. resource "aws_security_group_rule" "outbound_to_moose_s2s" {
  160. security_group_id = aws_security_group.security_group.id
  161. type = "egress"
  162. description = "Splunk UF outbound to Moose Indexers"
  163. from_port = 9997
  164. to_port = 9998
  165. protocol = "tcp"
  166. cidr_blocks = var.cidr_map["moose"]
  167. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  168. }
  169. resource "aws_security_group_rule" "outbound_to_moose_idxc" {
  170. security_group_id = aws_security_group.security_group.id
  171. type = "egress"
  172. description = "Outbound IDXC Discovery to MOOSE"
  173. from_port = 8089
  174. to_port = 8089
  175. protocol = "tcp"
  176. cidr_blocks = var.cidr_map["moose"]
  177. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  178. }
  179. resource "aws_security_group_rule" "outbound_to_moose_hec" {
  180. security_group_id = aws_security_group.security_group.id
  181. type = "egress"
  182. description = "Connect to HEC"
  183. from_port = 8088
  184. to_port = 8088
  185. protocol = "tcp"
  186. cidr_blocks = var.cidr_map["moose"]
  187. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  188. }