main.tf 7.5 KB

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