Comment utiliser des caractères génériques avec refus explicite avec des éléments Principal au lieu d’éléments NotPrincipal dans une stratégie de compartiments Amazon S3 ?

Dernière mise à jour : 08/05/2019

Comment utiliser des caractères génériques avec refus explicite avec des éléments Principal au lieu d’éléments NotPrincipal dans une stratégie de compartiments Amazon Simple Storage Service (Amazon S3) ?

Brève description

Vous pouvez empêcher les entités AWS Identity and Access Management (IAM) d’accéder à vos compartiments Amazon S3 en spécifiant des autorisations dans une stratégie de compartiment qui utilise l’élément NotPrincipal et le refus explicite. Cependant, NotPrincipal ne prend pas en charge les caractères génériques.

Dans l’exemple de stratégie ci-dessous, vous devez répertorier le nom de session du rôle de chaque utilisateur et chaque ID d’instance qui endossera ce rôle :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": [
          "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app",
          "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/instanceID",
          "arn:aws:iam::444455556666:role/cross-account-read-only-role",
          "arn:aws:iam::444455556666:root"
        ]
      }
    }
  ]
}

Pour couvrir tous ces utilisateurs et instances, il vous faut un caractère générique dans l’instruction pour représenter le rôle endossé :

"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"

Toutefois, les caractères génériques ne sont pas pris en charge avec l’élément NotPrincipal.

Solution

Au lieu de NotPrincipal, utilisez Principal comme entité cible dans chaque bloc d’instructions, qui inclut la condition de chaque bloc d’autorisation.

Avant de commencer, vous devez disposer des ressources suivantes :

Dans cet exemple, les caractères génériques sont utilisés dans aws:userid pour inclure tous les noms transmis par le processus appelant (tels que l’ID de l’application, du service ou de l’instance) lors de l’appel pour obtenir des informations d’identification temporaires. Pour plus d’informations, consultez la section Informations disponibles dans toutes les demandes. Le compte racine est inclus pour empêcher le verrouillage :

Remarque : veillez à remplacer les exemples de noms par vos propres ID de rôles et noms de compartiments.

"Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }

StringNotLike dans le bloc de refus :

"Condition": {
                "StringNotLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }

Voici la stratégie complète :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket/*",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::myExampleBucket/*",
                "arn:aws:s3:::myExampleBucket"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        }
    ]
}