# IAM Roles in All Accounts ############################# # Default instance profile # # Basic profile to allow basic things resource "aws_iam_instance_profile" "default_instance_profile" { name = "msoc-default-instance-profile" role = aws_iam_role.default_instance_role.name } data "aws_iam_policy_document" "default_instance_role" { statement { sid = "AssumeRoleAnywhere" effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = [ "ec2.amazonaws.com", "ssm.amazonaws.com", ] } } } resource "aws_iam_role" "default_instance_role" { name = "msoc-default-instance-role" assume_role_policy = data.aws_iam_policy_document.default_instance_role.json } data "aws_iam_policy_document" "default_instance_policy_doc" { statement { effect = "Allow" actions = [ "ec2:DescribeTags" ] # tfsec:ignore:aws-iam-no-policy-wildcards - baseline this setting first. We use wildcards in policies resources = [ "*" ] } } resource "aws_iam_policy" "default_instance_policy" { name = "default_instance_tag_read" path = "/launchroles/" description = "This policy allows a EC2 server to read tags" policy = data.aws_iam_policy_document.default_instance_policy_doc.json } data "aws_iam_policy_document" "default_instance_policy_s3_binaries_doc" { statement { sid = "AccessTheBucketItself" effect = "Allow" resources = ["arn:${var.aws_partition}:s3:::${var.binaries_bucket}"] actions = [ "s3:ListBucket", "s3:GetBucketLocation", ] } statement { sid = "GetFromTheBucket" effect = "Allow" # tfsec:ignore:aws-iam-no-policy-wildcards - baseline this setting first. We use wildcards in policies resources = ["arn:${var.aws_partition}:s3:::${var.binaries_bucket}/*"] actions = [ "s3:GetObject", "s3:GetObjectAcl", ] } statement { sid = "UseTheKey" effect = "Allow" resources = [ "arn:${var.aws_partition}:kms:${var.aws_region}:${var.common_services_account}:${local.binaries_key}" ] actions = [ "kms:Decrypt", "kms:DescribeKey" ] } } resource "aws_iam_policy" "default_instance_policy_s3_binaries" { name = "default_instance_s3_binaries" path = "/launchroles/" description = "This policy allows a EC2 server to read from the s3 binaries bucket" policy = data.aws_iam_policy_document.default_instance_policy_s3_binaries_doc.json } resource "aws_iam_role_policy_attachment" "default_instance_AmazonEC2RoleforSSM" { role = aws_iam_role.default_instance_role.name policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AmazonEC2RoleforSSM" } resource "aws_iam_role_policy_attachment" "default_instance_default_policy_attach" { role = aws_iam_role.default_instance_role.name policy_arn = aws_iam_policy.default_instance_policy.arn } resource "aws_iam_role_policy_attachment" "default_instance_s3_policy_attach" { role = aws_iam_role.default_instance_role.name policy_arn = aws_iam_policy.default_instance_policy_s3_binaries.arn } resource "aws_iam_role_policy_attachment" "default_instance_cloudwatch_policy_attach" { role = aws_iam_role.default_instance_role.name policy_arn = aws_iam_policy.cloudwatch_events.arn } ########################## # cloudwatch events data "aws_iam_policy_document" "cloudwatch_events" { # checkov:skip=CKV_AWS_111: see tfsec ignore - we use wildcards statement { sid = "1" actions = [ "events:PutRule" ] # tfsec:ignore:aws-iam-no-policy-wildcards - baseline this setting first. We use wildcards in policies resources = ["*"] } } resource "aws_iam_policy" "cloudwatch_events" { name = "cloudwatch_events" description = "Creation of cloudwatch events" policy = data.aws_iam_policy_document.cloudwatch_events.json } ########################## # dlm_lifecycle # # 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 # Docs can be found here https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/snapshot-lifecycle.html # Chris Lynch 1/25/2019 resource "aws_iam_role" "dlm_lifecycle_role" { name = "dlm-lifecycle-role" assume_role_policy = <