cluster_iam.tf 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. An IAM Role and Policies are used to permit
  3. EC2 instances to communicate with various AWS
  4. resources.
  5. */
  6. // IAM Role
  7. resource "aws_iam_role" "cluster" {
  8. name = "${var.cluster_name}-cluster"
  9. assume_role_policy = <<EOF
  10. {
  11. "Version": "2012-10-17",
  12. "Statement": [
  13. {
  14. "Effect": "Allow",
  15. "Principal": {"Service": "ec2.amazonaws.com"},
  16. "Action": "sts:AssumeRole"
  17. }
  18. ]
  19. }
  20. EOF
  21. }
  22. // IAM Profile
  23. resource "aws_iam_instance_profile" "cluster" {
  24. name = "${var.cluster_name}-cluster"
  25. role = aws_iam_role.cluster.name
  26. depends_on = [aws_iam_role_policy.cluster_s3]
  27. }
  28. // Policy to permit cluster to talk to S3 (Session recordings)
  29. resource "aws_iam_role_policy" "cluster_s3" {
  30. name = "${var.cluster_name}-cluster-s3"
  31. role = aws_iam_role.cluster.id
  32. policy = <<EOF
  33. {
  34. "Version": "2012-10-17",
  35. "Statement": [
  36. {
  37. "Effect": "Allow",
  38. "Action": [
  39. "s3:ListBucket",
  40. "s3:ListBucketVersions"
  41. ],
  42. "Resource": ["arn:aws:s3:::${aws_s3_bucket.storage.bucket}"]
  43. },
  44. {
  45. "Effect": "Allow",
  46. "Action": [
  47. "s3:PutObject",
  48. "s3:GetObject",
  49. "s3:GetObjectVersion"
  50. ],
  51. "Resource": ["arn:aws:s3:::${aws_s3_bucket.storage.bucket}/*"]
  52. }
  53. ]
  54. }
  55. EOF
  56. }
  57. // Policy to permit cluster to access SSM (Enterprise license handling)
  58. resource "aws_iam_role_policy" "cluster_ssm" {
  59. name = "${var.cluster_name}-cluster-ssm"
  60. role = aws_iam_role.cluster.id
  61. policy = <<EOF
  62. {
  63. "Version": "2012-10-17",
  64. "Statement": [
  65. {
  66. "Effect": "Allow",
  67. "Action": [
  68. "ssm:DescribeParameters",
  69. "ssm:GetParameters",
  70. "ssm:GetParametersByPath",
  71. "ssm:GetParameter",
  72. "ssm:PutParameter",
  73. "ssm:DeleteParameter"
  74. ],
  75. "Resource": "arn:aws:ssm:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:parameter/teleport/${var.cluster_name}/*"
  76. },
  77. {
  78. "Effect":"Allow",
  79. "Action":[
  80. "kms:Decrypt"
  81. ],
  82. "Resource":[
  83. "arn:aws:kms:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:key/${data.aws_kms_alias.ssm.target_key_id}"
  84. ]
  85. }
  86. ]
  87. }
  88. EOF
  89. }
  90. // Policy to permit cluster to access DynamoDB tables (Cluster state, events, and SSL)
  91. resource "aws_iam_role_policy" "cluster_dynamo" {
  92. name = "${var.cluster_name}-cluster-dynamo"
  93. role = aws_iam_role.cluster.id
  94. policy = <<EOF
  95. {
  96. "Version": "2012-10-17",
  97. "Statement": [
  98. {
  99. "Sid": "AllActionsOnTeleportDB",
  100. "Effect": "Allow",
  101. "Action": "dynamodb:*",
  102. "Resource": "arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/${aws_dynamodb_table.teleport.name}"
  103. },
  104. {
  105. "Sid": "AllActionsOnTeleportEventsDB",
  106. "Effect": "Allow",
  107. "Action": "dynamodb:*",
  108. "Resource": "arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/${aws_dynamodb_table.teleport_events.name}"
  109. },
  110. {
  111. "Sid": "AllActionsOnTeleportEventsIndexDB",
  112. "Effect": "Allow",
  113. "Action": "dynamodb:*",
  114. "Resource": "arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/${aws_dynamodb_table.teleport_events.name}/index/*"
  115. },
  116. {
  117. "Sid": "AllActionsOnTeleportStreamsDB",
  118. "Effect": "Allow",
  119. "Action": "dynamodb:*",
  120. "Resource": "arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/${aws_dynamodb_table.teleport.name}/stream/*"
  121. },
  122. {
  123. "Sid": "AllActionsOnLocks",
  124. "Effect": "Allow",
  125. "Action": "dynamodb:*",
  126. "Resource": "arn:aws:dynamodb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:table/${aws_dynamodb_table.teleport_locks.name}"
  127. }
  128. ]
  129. }
  130. EOF
  131. }
  132. // Policy to permit cluster to access Route53 (SSL)
  133. resource "aws_iam_role_policy" "cluster_route53" {
  134. name = "${var.cluster_name}-cluster-route53"
  135. role = aws_iam_role.cluster.id
  136. policy = <<EOF
  137. {
  138. "Version": "2012-10-17",
  139. "Id": "certbot-dns-route53 policy",
  140. "Statement": [
  141. {
  142. "Effect": "Allow",
  143. "Action": [
  144. "route53:ListHostedZones",
  145. "route53:GetChange"
  146. ],
  147. "Resource": [
  148. "*"
  149. ]
  150. },
  151. {
  152. "Effect" : "Allow",
  153. "Action" : [
  154. "route53:ChangeResourceRecordSets"
  155. ],
  156. "Resource" : [
  157. "arn:aws:route53:::hostedzone/${data.aws_route53_zone.cluster.zone_id}"
  158. ]
  159. }
  160. ]
  161. }
  162. EOF
  163. }