J'essaie d'appliquer différentes actions pour différents utilisateurs iam, via Terraform, à l'aide de AWS_IAM_POLICY_DOCUMENT Source de données. Prenons exemple comme exemple les KMS Key politique déclaration:

data "aws_iam_policy_document" "kms_key_policy" {
  statement {
    sid = "Allow use of the key"

    principals {
      type        = "AWS"
      identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
    }

    actions = [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ]
    resources = ["*"]
  }
}

Dans la politique ci-dessus, je veux restreindre les deux premiers actions à l'ARN2, mais garder l'Arn1 avec tous les actions qui sont à l'origine dans les actions bloquent. Bien sûr que je pouvais simplement ajouter une autre déclaration et séparer les deux logiques (comme indiqué ci-dessous) mais j'essayais de conserver toute la logique dans le même statement et d'éviter de répéter le code:

statement {
    sid = "Allow ARN1 use of the key"

    principals {
      type        = "AWS"
      identifiers = [ARN1]
    }

    actions = [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ]
    resources = ["*"]
  }
statement {
    sid = "Allow ARN2 use of the key"

    principals {
      type        = "AWS"
      identifiers = var.A == true ? [ARN2] : []
    }

    actions = [
        "kms:Encrypt",
        "kms:Decrypt"
    ]
    resources = ["*"]
  }

J'ai déjà essayé d'ajouter une condition similaire à celle qui est utilisée pour vérifier la présence d'ARN2 (dans le cas de Var A est définie) mais j'étais restreindre actions Arn1 avec l'ARN2 One (si ARN2 était présent), comme cela peut être observé ci-dessous:

actions = var.A == true ? ["kms:Encrypt", "kms:Decrypt"] : ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"]

Comment pourrais-je séparer le actions pour la différent principal identifiers arns à l'intérieur du même statement?

1
João Pacheco 24 mars 2021 à 04:58

1 réponse

Meilleure réponse

Ce que vous décrivez n'est pas possible, comme vous ne pouvez pas faire la liste des actions une fonction du capital lors de l'évaluation des politiques. Ce n'est pas une limitation de Terraform, mais comment ces déclarations AWS fonctionnent. Les conditionnels que vous écrivez ici sont évalués lorsque vous appliquez le code Terraform, non pendant l'évaluation des politiques.

Vous ne voulez jamais autoriser la même liste d'actions pour les deux principes, quelle que soit la valeur de var.A, vous aurez donc besoin de toujours avoir besoin d'au moins deux déclarations. J'espère que cela a du sens pour vous.

Je proposerais quelque chose comme ça:

statement {
  sid = "AllowEncryptDecrypt"
  principals {
    type        = "AWS"
    identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
  }
  actions = [
    "kms:Encrypt",
    "kms:Decrypt",
  ]
  resources = ["*"]
}

statement {
  sid = "AllowOtherKeyUse"
  principals {
    type        = "AWS"
    identifiers = [ARN1]
  }
  actions = [
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey",
  ]
  resources = ["*"]
}

Je dirais qu'il n'y a pas de réelle répétition ici, car il n'y a pas de chevauchement entre les listes d'actions.

2
Semafoor 24 mars 2021 à 03:05