main.tf 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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" "github_access_ssh" {
  61. security_group_id = aws_security_group.security_group.id
  62. type = "egress"
  63. description = "Outbound GitHub"
  64. from_port = 22
  65. to_port = 22
  66. protocol = "tcp"
  67. cidr_blocks = var.cidr_map["vpc-public"]
  68. count = length(var.cidr_map["vpc-public"]) > 0 ? 1 : 0
  69. }
  70. resource "aws_security_group_rule" "github_access_http" {
  71. security_group_id = aws_security_group.security_group.id
  72. type = "egress"
  73. description = "Outbound GitHub"
  74. from_port = 80
  75. to_port = 80
  76. protocol = "tcp"
  77. cidr_blocks = var.cidr_map["vpc-public"]
  78. count = length(var.cidr_map["vpc-public"]) > 0 ? 1 : 0
  79. }
  80. resource "aws_security_group_rule" "github_access_https" {
  81. security_group_id = aws_security_group.security_group.id
  82. type = "egress"
  83. description = "Outbound GitHub"
  84. from_port = 443
  85. to_port = 443
  86. protocol = "tcp"
  87. cidr_blocks = var.cidr_map["vpc-public"]
  88. count = length(var.cidr_map["vpc-public"]) > 0 ? 1 : 0
  89. }
  90. resource "aws_security_group_rule" "dns_access_tcp" {
  91. security_group_id = aws_security_group.security_group.id
  92. type = "egress"
  93. description = "Outbound TCP DNS"
  94. from_port = 53
  95. to_port = 53
  96. protocol = "tcp"
  97. cidr_blocks = var.cidr_map["dns"]
  98. count = length(var.cidr_map["dns"]) > 0 ? 1 : 0
  99. }
  100. resource "aws_security_group_rule" "dns_access_udp" {
  101. security_group_id = aws_security_group.security_group.id
  102. type = "egress"
  103. description = "Outbound UDP DNS"
  104. from_port = 53
  105. to_port = 53
  106. protocol = "udp"
  107. cidr_blocks = var.cidr_map["dns"]
  108. count = length(var.cidr_map["dns"]) > 0 ? 1 : 0
  109. }
  110. resource "aws_security_group_rule" "outbound_to_salt_masters" {
  111. security_group_id = aws_security_group.security_group.id
  112. type = "egress"
  113. description = "Connect to Salt Masters"
  114. from_port = 4505
  115. to_port = 4506
  116. protocol = "tcp"
  117. cidr_blocks = var.cidr_map["salt"]
  118. count = length(var.cidr_map["salt"]) > 0 ? 1 : 0
  119. }
  120. resource "aws_security_group_rule" "outbound_to_web_servers_80" {
  121. security_group_id = aws_security_group.security_group.id
  122. type = "egress"
  123. description = "Connect to Repo Servers"
  124. from_port = 80
  125. to_port = 80
  126. protocol = "tcp"
  127. cidr_blocks = var.cidr_map["web"]
  128. count = length(var.cidr_map["web"]) > 0 ? 1 : 0
  129. }
  130. resource "aws_security_group_rule" "outbound_to_web_servers_443" {
  131. security_group_id = aws_security_group.security_group.id
  132. type = "egress"
  133. description = "Connect to Repo Servers"
  134. from_port = 443
  135. to_port = 443
  136. protocol = "tcp"
  137. cidr_blocks = var.cidr_map["web"]
  138. count = length(var.cidr_map["web"]) > 0 ? 1 : 0
  139. }
  140. # Systems need to be able to access vpc endpoints on 80/443
  141. resource "aws_security_group_rule" "outbound_to_local_vpc_80" {
  142. security_group_id = aws_security_group.security_group.id
  143. type = "egress"
  144. description = "Connect to VPC Endpoints"
  145. from_port = 80
  146. to_port = 80
  147. protocol = "tcp"
  148. source_security_group_id = var.aws_endpoints_sg
  149. }
  150. resource "aws_security_group_rule" "outbound_to_local_vpc_443" {
  151. security_group_id = aws_security_group.security_group.id
  152. type = "egress"
  153. description = "Connect to VPC Endpoints"
  154. from_port = 443
  155. to_port = 443
  156. protocol = "tcp"
  157. source_security_group_id = var.aws_endpoints_sg
  158. }
  159. resource "aws_security_group_rule" "outbound_to_mailrelay_25" {
  160. security_group_id = aws_security_group.security_group.id
  161. type = "egress"
  162. description = "Outbound Email to mailrelay"
  163. from_port = 25
  164. to_port = 25
  165. protocol = "tcp"
  166. cidr_blocks = var.cidr_map["vpc-system-services"]
  167. count = length(var.cidr_map["vpc-system-services"]) > 0 ? 1 : 0
  168. }
  169. resource "aws_security_group_rule" "outbound_to_ec2_s3_endpoint" {
  170. security_group_id = aws_security_group.security_group.id
  171. type = "egress"
  172. description = "Outbound to S3 endpoint"
  173. from_port = 443
  174. to_port = 443
  175. protocol = "tcp"
  176. prefix_list_ids = [ data.aws_prefix_list.private_s3.id ]
  177. count = length([ data.aws_prefix_list.private_s3.id ]) > 0 ? 1 : 0 # todo: handle case of no s3 prefix list
  178. }
  179. resource "aws_security_group_rule" "outbound_to_sensu" {
  180. security_group_id = aws_security_group.security_group.id
  181. type = "egress"
  182. description = "Monitoring Outbound"
  183. from_port = 8081
  184. to_port = 8081
  185. protocol = "tcp"
  186. cidr_blocks = var.cidr_map["monitoring"]
  187. count = length(var.cidr_map["monitoring"]) > 0 ? 1 : 0
  188. }
  189. resource "aws_security_group_rule" "outbound_to_moose_s2s" {
  190. security_group_id = aws_security_group.security_group.id
  191. type = "egress"
  192. description = "Splunk UF outbound to Moose Indexers"
  193. from_port = 9997
  194. to_port = 9998
  195. protocol = "tcp"
  196. cidr_blocks = var.cidr_map["moose"]
  197. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  198. }
  199. resource "aws_security_group_rule" "outbound_to_moose_idxc" {
  200. security_group_id = aws_security_group.security_group.id
  201. type = "egress"
  202. description = "Outbound IDXC Discovery to MOOSE"
  203. from_port = 8089
  204. to_port = 8089
  205. protocol = "tcp"
  206. cidr_blocks = var.cidr_map["moose"]
  207. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  208. }
  209. resource "aws_security_group_rule" "outbound_to_moose_hec" {
  210. security_group_id = aws_security_group.security_group.id
  211. type = "egress"
  212. description = "Connect to HEC"
  213. from_port = 8088
  214. to_port = 8088
  215. protocol = "tcp"
  216. cidr_blocks = var.cidr_map["moose"]
  217. count = length(var.cidr_map["moose"]) > 0 ? 1 : 0
  218. }