iam.tf 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. # IAM Roles in All Accounts
  2. #############################
  3. # Default instance profile
  4. #
  5. # Basic profile to allow basic things
  6. resource "aws_iam_instance_profile" "default_instance_profile" {
  7. name = "msoc-default-instance-profile"
  8. role = aws_iam_role.default_instance_role.name
  9. }
  10. data "aws_iam_policy_document" "default_instance_role" {
  11. statement {
  12. sid = "AssumeRoleAnywhere"
  13. effect = "Allow"
  14. actions = ["sts:AssumeRole"]
  15. principals {
  16. type = "Service"
  17. identifiers = [
  18. "ec2.amazonaws.com",
  19. "ssm.amazonaws.com",
  20. ]
  21. }
  22. }
  23. }
  24. resource "aws_iam_role" "default_instance_role" {
  25. name = "msoc-default-instance-role"
  26. assume_role_policy = data.aws_iam_policy_document.default_instance_role.json
  27. }
  28. data "aws_iam_policy_document" "default_instance_policy_doc" {
  29. statement {
  30. effect = "Allow"
  31. actions = [
  32. "ec2:DescribeTags"
  33. ]
  34. resources = [
  35. "*"
  36. ]
  37. }
  38. }
  39. resource "aws_iam_policy" "default_instance_policy" {
  40. name = "default_instance_tag_read"
  41. path = "/launchroles/"
  42. description = "This policy allows a EC2 server to read tags"
  43. policy = data.aws_iam_policy_document.default_instance_policy_doc.json
  44. }
  45. data "aws_iam_policy_document" "default_instance_policy_s3_binaries_doc" {
  46. statement {
  47. sid = "AccessTheBucketItself"
  48. effect = "Allow"
  49. resources = ["arn:${var.aws_partition}:s3:::${var.binaries_bucket}"]
  50. actions = [
  51. "s3:ListBucket",
  52. "s3:GetBucketLocation",
  53. ]
  54. }
  55. statement {
  56. sid = "GetFromTheBucket"
  57. effect = "Allow"
  58. resources = ["arn:${var.aws_partition}:s3:::${var.binaries_bucket}/*"] #tfsec:ignore:aws-iam-no-policy-wildcards This is read-only access
  59. actions = [
  60. "s3:GetObject",
  61. "s3:GetObjectAcl",
  62. ]
  63. }
  64. statement {
  65. sid = "UseTheKey"
  66. effect = "Allow"
  67. resources = [
  68. "arn:${var.aws_partition}:kms:${var.aws_region}:${var.common_services_account}:${local.binaries_key}"
  69. ]
  70. actions = [
  71. "kms:Decrypt",
  72. "kms:DescribeKey"
  73. ]
  74. }
  75. }
  76. resource "aws_iam_policy" "default_instance_policy_s3_binaries" {
  77. name = "default_instance_s3_binaries"
  78. path = "/launchroles/"
  79. description = "This policy allows a EC2 server to read from the s3 binaries bucket"
  80. policy = data.aws_iam_policy_document.default_instance_policy_s3_binaries_doc.json
  81. }
  82. resource "aws_iam_role_policy_attachment" "default_instance_AmazonEC2RoleforSSM" {
  83. role = aws_iam_role.default_instance_role.name
  84. policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
  85. }
  86. resource "aws_iam_role_policy_attachment" "default_instance_default_policy_attach" {
  87. role = aws_iam_role.default_instance_role.name
  88. policy_arn = aws_iam_policy.default_instance_policy.arn
  89. }
  90. resource "aws_iam_role_policy_attachment" "default_instance_s3_policy_attach" {
  91. role = aws_iam_role.default_instance_role.name
  92. policy_arn = aws_iam_policy.default_instance_policy_s3_binaries.arn
  93. }
  94. resource "aws_iam_role_policy_attachment" "default_instance_cloudwatch_policy_attach" {
  95. role = aws_iam_role.default_instance_role.name
  96. policy_arn = aws_iam_policy.cloudwatch_events.arn
  97. }
  98. ##########################
  99. # cloudwatch events
  100. data "aws_iam_policy_document" "cloudwatch_events" {
  101. statement {
  102. sid = "1"
  103. actions = [
  104. "events:PutRule"
  105. ]
  106. resources = ["*"]
  107. }
  108. }
  109. resource "aws_iam_policy" "cloudwatch_events" {
  110. name = "cloudwatch_events"
  111. description = "Creation of cloudwatch events"
  112. policy = data.aws_iam_policy_document.cloudwatch_events.json
  113. }
  114. ##########################
  115. # dlm_lifecycle
  116. #
  117. # This is to setup the needed IAM role and premissions for the AWS feature Data Lifecycle Manager (DLM) lifecycle policy so we can have it do "backups" on our EBS
  118. # Docs can be found here https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/snapshot-lifecycle.html
  119. # Chris Lynch 1/25/2019
  120. resource "aws_iam_role" "dlm_lifecycle_role" {
  121. name = "dlm-lifecycle-role"
  122. assume_role_policy = <<EOF
  123. {
  124. "Version": "2012-10-17",
  125. "Statement": [
  126. {
  127. "Action": "sts:AssumeRole",
  128. "Principal": {
  129. "Service": "dlm.amazonaws.com"
  130. },
  131. "Effect": "Allow",
  132. "Sid": ""
  133. }
  134. ]
  135. }
  136. EOF
  137. }
  138. resource "aws_iam_role_policy" "dlm_lifecycle" {
  139. name = "dlm-lifecycle-policy"
  140. role = aws_iam_role.dlm_lifecycle_role.id
  141. policy = <<EOF
  142. {
  143. "Version": "2012-10-17",
  144. "Statement": [
  145. {
  146. "Effect": "Allow",
  147. "Action": [
  148. "ec2:CreateSnapshot",
  149. "ec2:DeleteSnapshot",
  150. "ec2:DescribeVolumes",
  151. "ec2:DescribeSnapshots",
  152. "ec2:DescribeImages",
  153. "ec2:DescribeInstances",
  154. "ec2:DescribeImageAttribute"
  155. ],
  156. "Resource": "*"
  157. },
  158. {
  159. "Effect": "Allow",
  160. "Action": [
  161. "ec2:CreateTags"
  162. ],
  163. "Resource": [
  164. "arn:${var.aws_partition}:ec2:*::snapshot/*",
  165. "arn:${var.aws_partition}:ec2:*::image/*"
  166. ]
  167. },
  168. {
  169. "Effect": "Allow",
  170. "Action": "ec2:DeleteSnapshot",
  171. "Resource": "arn:${var.aws_partition}:ec2:*::snapshot/*"
  172. },
  173. {
  174. "Effect": "Allow",
  175. "Action": [
  176. "ec2:ResetImageAttribute",
  177. "ec2:DeregisterImage",
  178. "ec2:CreateImage",
  179. "ec2:CopyImage",
  180. "ec2:ModifyImageAttribute"
  181. ],
  182. "Resource": "*"
  183. },
  184. {
  185. "Effect": "Allow",
  186. "Action": [
  187. "kms:ReEncrypt*",
  188. "kms:GenerateDataKey*",
  189. "kms:Encrypt",
  190. "kms:DescribeKey",
  191. "kms:Decrypt",
  192. "kms:Create*"
  193. ],
  194. "Resource": "*"
  195. }
  196. ]
  197. }
  198. EOF
  199. }
  200. ##########################
  201. # moose
  202. #
  203. # See https://docs.splunk.com/Documentation/AddOns/released/AWS/ConfigureAWSpermissions
  204. locals {
  205. trusted_principals_govcloud = [
  206. "arn:${var.aws_partition}:iam::${local.c2_account}:role/instance/moose-hf",
  207. "arn:${var.aws_partition}:iam::${local.c2_account}:user/instance/moose-hf"
  208. ]
  209. trusted_principals_commercial = [
  210. "arn:${var.aws_partition}:iam::${var.legacy_account}:role/splunk-aws-instance-role",
  211. "arn:${var.aws_partition}:iam::${local.c2_account}:user/instance/moose-hf",
  212. ]
  213. trusted_principals = var.aws_partition == "aws" ? local.trusted_principals_commercial : local.trusted_principals_govcloud
  214. }
  215. data "aws_iam_policy_document" "splunk_addon_for_aws_assume_role" {
  216. statement {
  217. sid = ""
  218. effect = "Allow"
  219. actions = ["sts:AssumeRole"]
  220. principals {
  221. type = "AWS"
  222. identifiers = local.trusted_principals
  223. }
  224. }
  225. }
  226. resource "aws_iam_role" "splunk_addon_for_aws" {
  227. name = "splunk-addon-for-aws"
  228. path = "/instance/"
  229. assume_role_policy = data.aws_iam_policy_document.splunk_addon_for_aws_assume_role.json
  230. }
  231. data "aws_iam_policy_document" "policy" {
  232. statement {
  233. sid = ""
  234. effect = "Allow"
  235. resources = ["*"]
  236. actions = [
  237. "sqs:GetQueueAttributes",
  238. "sqs:ListQueues",
  239. "sqs:ReceiveMessage",
  240. "sqs:GetQueueUrl",
  241. "sqs:SendMessage",
  242. "sqs:DeleteMessage",
  243. "s3:ListBucket",
  244. "s3:GetObject",
  245. "s3:GetBucketLocation",
  246. "s3:ListAllMyBuckets",
  247. "s3:GetBucketTagging",
  248. "s3:GetAccelerateConfiguration",
  249. "s3:GetBucketLogging",
  250. "s3:GetLifecycleConfiguration",
  251. "s3:GetBucketCORS",
  252. "config:DeliverConfigSnapshot",
  253. "config:DescribeConfigRules",
  254. "config:DescribeConfigRuleEvaluationStatus",
  255. "config:GetComplianceDetailsByConfigRule",
  256. "config:GetComplianceSummaryByConfigRule",
  257. "iam:GetUser",
  258. "iam:ListUsers",
  259. "iam:GetAccountPasswordPolicy",
  260. "iam:ListAccessKeys",
  261. "iam:GetAccessKeyLastUsed",
  262. "autoscaling:Describe*",
  263. "cloudwatch:Describe*",
  264. "cloudwatch:Get*",
  265. "cloudwatch:List*",
  266. "sns:Get*",
  267. "sns:List*",
  268. "sns:Publish",
  269. "logs:DescribeLogGroups",
  270. "logs:DescribeLogStreams",
  271. "logs:GetLogEvents",
  272. "ec2:DescribeInstances",
  273. "ec2:DescribeReservedInstances",
  274. "ec2:DescribeSnapshots",
  275. "ec2:DescribeRegions",
  276. "ec2:DescribeKeyPairs",
  277. "ec2:DescribeNetworkAcls",
  278. "ec2:DescribeSecurityGroups",
  279. "ec2:DescribeSubnets",
  280. "ec2:DescribeVolumes",
  281. "ec2:DescribeVpcs",
  282. "ec2:DescribeImages",
  283. "ec2:DescribeAddresses",
  284. "lambda:ListFunctions",
  285. "rds:DescribeDBInstances",
  286. "cloudfront:ListDistributions",
  287. "elasticloadbalancing:DescribeLoadBalancers",
  288. "elasticloadbalancing:DescribeInstanceHealth",
  289. "elasticloadbalancing:DescribeTags",
  290. "elasticloadbalancing:DescribeTargetGroups",
  291. "elasticloadbalancing:DescribeTargetHealth",
  292. "elasticloadbalancing:DescribeListeners",
  293. "inspector:Describe*",
  294. "inspector:List*",
  295. "kinesis:Get*",
  296. "kinesis:DescribeStream",
  297. "kinesis:ListStreams",
  298. "kms:Decrypt",
  299. "sts:AssumeRole",
  300. ]
  301. }
  302. }
  303. resource "aws_iam_role_policy" "splunk_addon_for_aws" {
  304. name = "splunk-addon-for-aws"
  305. role = aws_iam_role.splunk_addon_for_aws.id
  306. policy = data.aws_iam_policy_document.policy.json
  307. }