Comment la logique d'évaluation IAM fonctionne-t-elle en utilisant une stratégie Deny (Refuser) explicite avec plusieurs clés de condition ?

Dernière mise à jour : 20/08/2020

Je souhaite créer une politique de refus explicite AWS Identity and Access Management (IAM) qui limite la création d'instances Amazon Elastic Compute Cloud (Amazon EC2) et de volumes Amazon Elastic Block Store (Amazon EBS). Comment faut-il procéder ?

Brève description

Vous pouvez utiliser des balises de stratégie IAM pour restreindre le lancement des instances EC2 et des volumes EBS en utilisant les opérateurs de condition Allow (Autoriser) avec StringLike ou Deny (Refuser) avec des StringNotLike. Pour savoir comment utiliser les opérateurs de condition Allow avec StringLike, consultez Comment utiliser des balises de stratégie IAM pour restreindre la création d'une instance EC2 ou d'un volume EBS ?

Solution

Utilisez l'exemple de stratégie IAM suivant qui utilise Deny with StringNotLike pour restreindre la création d'instances EC2 et de volumes EBS.

Remarque : il est recommandé d'utiliser Deny avec StringNotLike pour empêcher l'accès privilégié accidentel.

Si votre stratégie comporte plusieurs opérateurs de condition ou plusieurs clés attachées à un seul opérateur de condition, les conditions sont évaluées à l'aide de la logique AND. Avec Deny et plusieurs valeurs de balise, chaque clé RequestTag doit être utilisée dans des instructions distinctes pour obtenir la même logique AND.

Remarque : la définition de toutes les valeurs de clé RequestTag dans une condition avec une stratégie Deny peut ne pas fonctionner normalement. En effet, l'action est autorisée jusqu'à ce que toutes les conditions soient remplies. Lorsque toutes les conditions sont remplies, l'action est refusée.

Notez les balises obligatoires suivantes :

  • La balise cost_center doit avoir une valeur non nulle.
  • L'instance EC2 possède une clé de balise nommée Production.
  • La balise identifier doit être une combinaison de cinq caractères.
  • La valeur de la balise env doit être sandbox, dev ou prod.
{
    "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": "AllowRunInstancesWithRestrictions1",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/cost_center": "?*"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions2",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "Production"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions3",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/identifier": "?????"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions4",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/env": [
                        "sandbox",
                        "dev",
                        "prod"
                    ]
                }
            }
        },
        {
            "Sid": "AllowRunInstances1",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        },
        {
            "Sid": "AllowCreateTagsOnRunInstance",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

Notez les valeurs d'application suivantes :

  • La valeur aws:TagKeys applique les vérifications de la sensibilité à la casse de Production.
  • La valeur ???? indique que la combinaison de cinq caractères peut être utilisée (les espaces de début ou de fin sont ignorés).
  • La valeur ?* indique qu'au moins un caractère est présent dans le champ de valeur afin que les instances EC2 ne puissent pas se lancer avec des valeurs de balise vides.