noqqe » blog | sammelsurium | photos | projects | about

AWS IAM

2020-09-30 @ AWS

IAM verwaltet die ACLs innerhalb AWS Komponenten, Benutzern und Services

Terraform natives Policy Document

Je nach Möglichkeit sollte man einen Terraform data Provider benutzen um die Policies abzubilden. Der eingebettete JSON Weg ist ziemlich hässlich und wird mittels EOF Multiline String nicht schöner!

data "aws_iam_policy_document" "acme-lambda-policy" {

  statement {
    actions = [
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:ListBucketVersions",
      "s3:ListMultipartUploadParts",
      "s3:PutObject",
      "s3:GetObject",
      "s3:DeleteObject",
      "s3:GetObjectVersion",
      "s3:DeleteObjectVersion",
      "s3:PutObjectAcl",
      "s3:GetObjectAcl",
    ]

    resources = [
      "${var.s3_lambda_bucket}/*",
      var.s3_lambda_bucket,
    ]

    effect = "Allow"
  }

  statement {
    actions   = ["kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"]
    resources = [var.kms_key_arn]
    effect    = "Allow"
  }

  statement {
    effect    = "Allow"
    resources = ["*"]
    actions = [
      "logs:CreateLogGroup",
      "logs:CreateLogStream",
      "logs:PutLogEvents"
    ]
  }

}

Dieses Policy Document enthält mehrere Statements und kann via einer Policy Resource verwendet werden

resource "aws_iam_policy" "acme-lambda-policy" {
  name        = "${var.environment}-acme-lambda-policy"
  path        = "/"
  policy      = data.aws_iam_policy_document.acme-lambda-policy.json
}

Assume

… Todo…

User Generierung mit Access Tokens

Nachdem ich immer wieder danach Suche, hier kurz dokumentiert.

Ein programmatischer User mit Access ID und Secret Key der Zugriff auf bestimmte eingebettete Policies hat. Zum Beispiel Upload in einen S3 Bucket.

data "aws_iam_policy_document" "acme-deployment" {
 statement {
   actions   = [...]
   resources = [...]
   effect    = "Allow"
 }
}

resource "aws_iam_user_policy" "deployment" {
 name   = "${aws_iam_user.deployment.name}-policy"
 user   = aws_iam_user.deployment.name
 policy = data.aws_iam_policy_document.acme-deployment.json
}

resource "aws_iam_user" "deployment" {
 name          = "${var.environment}-acme-deployment"
 force_destroy = "true"
}

resource "aws_iam_access_key" "deployment" {
 user = aws_iam_user.deployment.name
}