Comment utiliser les balises de stratégie IAM pour limiter le mode de création d'une instance EC2 ou d’un volume EBS ?

Dernière mise à jour : 11/11/2020

Je souhaite autoriser les utilisateurs ou groupes AWS Identity and Access Management (IAM) à lancer de nouvelles instances Amazon Elastic Compute Cloud (Amazon EC2). Je souhaite également autoriser les utilisateurs IAM à créer de nouveaux volumes Amazon Elastic Block Store (Amazon EBS), mais uniquement lorsqu'ils appliquent des balises spécifiques. Comment puis-je utiliser les conditions de stratégie IAM pour restreindre l'accès à la création de nouvelles ressources ?

Brève description

Vous pouvez spécifier des balises d’instances EC2 et les volumes EBS dans l’appel d’API qui crée les ressources. En utilisant ce principe, vous pouvez exiger des utilisateurs IAM qu'ils balisent des ressources spécifiques en appliquant des conditions à leur stratégie IAM. Les stratégies de l’exemple qui suit ne permettent pas aux utilisateurs de créer des groupes de sécurité ou des paires de clés. Les utilisateurs doivent donc sélectionner les groupes de sécurité et les paires de clés pré-existants.

Les exemples de stratégies IAM suivants permettent aux utilisateurs de :

  • Lancer les instances EC2 ayant des clés de balise et des valeurs correspondantes
  • Lancer les instances EC2 ayant au moins une balise et une valeur correspondantes
  • Lancer les instances EC2 ayant au moins une clé de balise correspondante
  • Lancer les instances EC2 ayant uniquement la liste spécifiée de balises

Solution

Lancer les instances EC2 ayant des clés de balise et des valeurs correspondantes

L’exemple de stratégie qui suit permet à l’utilisateur de lancer une instance EC2 et de créer un volume EBS uniquement si l’utilisateur applique toutes les balises définies dans la stratégie avec le qualificatif ForAllValues. Si l'utilisateur applique une balise qui n'est pas incluse dans la stratégie, l'action est refusée. Pour appliquer la reconnaissance de la casse, utilisez la condition aws:TagKeys.

Remarque : Modifiez key1 et value1 des les exemples de stratégie pour y inclure les balises et les valeurs s’appliquant à vos ressources.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowToDescribeAll",
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowRunInstances",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:*::image/*",
        "arn:aws:ec2:*::snapshot/*",
        "arn:aws:ec2:*:*:subnet/*",
        "arn:aws:ec2:*:*:network-interface/*",
        "arn:aws:ec2:*:*:security-group/*",
        "arn:aws:ec2:*:*:key-pair/*"
      ]
    },
    {
      "Sid": "AllowRunInstancesWithRestrictions",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVolume",
        "ec2:RunInstances"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/key1": "value1",
          "aws:RequestTag/key2": "value2"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": [
            "key1",
            "key2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreateTagsOnlyLaunching",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:CreateAction": [
            "RunInstances",
            "CreateVolume"
          ]
        }
      }
    }
  ]
}

Important : Pour réussir le lancement des instances EC2, cette stratégie doit inclure les clés et les valeurs de balise correspondantes. Si les paires clé/valeur ne correspondent pas, vous recevez l’erreur « Échec de lancement » ou un message d’échec d’API de type similaire.

Résultats de l’exemple

Clé/valeur Résultat
key1/value1 et key2/value2 autoriser
key1/value1 refuser
key1/value2 refuser
aucune clé ou valeur refuser

Lancer les instances EC2 ayant au moins une balise et une valeur correspondantes

Dans l'exemple suivant, remplacez le bloc de condition AllowRunInstancesWithRestrictions pour permettre à un utilisateur de lancer une instance EC2 et de créer des volumes EBS lorsqu'au moins une clé de balise est nommée key1 et que sa valeur est valeur1. Vous pouvez ajouter n'importe quel nombre de balises supplémentaires dans la requête RunInstances .

"Condition": {
  "StringEquals": {
    "aws:RequestTag/key1": "value1"
  },
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Résultats de l’exemple

Clé/valeur Résultat
key1/value1 et key2/value2 autoriser
key1/value1 autoriser

key1/value2

refuser
aucune clé ou valeur

refuser

Lancer les instances EC2 ayant au moins une clé de balise correspondante

Dans l'exemple de stratégie suivant, remplacez le bloc de condition AllowRunInstancesWithRestrictions pour permettre à un utilisateur de lancer une instance EC2 et de créer des volumes EBS lorsqu'au moins une clé de balise est nommée key1. Aucune valeur spécifique n'est requise pour la balise key1 et un nombre quelconque de balises supplémentaires peuvent être ajoutées dans la requête RunInstances .

"Condition": {
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Résultats de l’exemple

Clé/valeur Résultat
key1/value1 et key2/value2 autoriser
key1/value1 autoriser
key1/value2 autoriser
aucune clé ou valeur refuser

Lancer les instances EC2 ayant uniquement la liste spécifiée de balises

Dans l'exemple de stratégie suivant, remplacez le bloc de condition AllowRunInstancesWithRestrictions pour permettre à un utilisateur de lancer une instance EC2 et de créer des volumes EBS uniquement lorsque les clés de balise key1 et key2 sont fournies dans la requête. Aucune valeur spécifique n'est requise pour les clés de balise, et aucune balises supplémentaires ne peut être ajoutée dans la requête RunInstances.

"Condition": {
  "StringLike": {
      "aws:RequestTag/key1": "*",
      "aws:RequestTag/key2": "*"
  },
  "ForAllValues:StringEquals": {
    "aws:TagKeys": [
        "key1",
        "key2"
    ]
  }
}

Remarque : la condition StringLike est requise pour s'assurer que toutes les balises sont présentes.

Résultats de l’exemple

Clé/valeur Résultats
key1/AnyValue et key2/AnyValue Autoriser
key1/AnyValue

Refuser

key2/AnyValue Refuser
Pas de clés ou de valeurs Refuser
key1/AnyValue, key2/AnyValue, key3/AnyValue Refuser