Comment utiliser des stratégies IAM pour autoriser un utilisateur à accéder à des dossiers spécifiques ?

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

Je souhaite utiliser des stratégies utilisateur IAM pour limiter l'accès à certains dossiers dans les compartiments Amazon S3.

Brève description

Vous pouvez utiliser les stratégies utilisateur AWS Identity and Access Management (IAM) pour définir qui peut accéder à des dossiers spécifiques dans vos compartiments Amazon Simple Storage Service (Amazon S3).

Résolution

Stratégie pour un seul utilisateur : cet exemple de stratégie permet à un utilisateur IAM d'afficher des dossiers spécifiques au premier niveau du compartiment, puis d'exécuter une action sur les objets dans les dossiers et sous-dossiers souhaités. Dans cet exemple, l'utilisateur IAM s'appelle David, et le compartiment s'appelle my-company et a la structure suivante :

/home/Adele/ /home/Bob/ /home/David/ /restricted/ /root-file.txt

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-company/home/David/*"]
   }
 ]
}

La console Amazon S3 utilise la barre oblique (/) comme caractère spécial pour afficher les objets dans les dossiers. Le préfixe (s3:prefix) et le délimiteur (s3:délimiter) permettent d'organiser et de parcourir les objets dans vos dossiers.

Stratégie pour plusieurs utilisateurs : dans certains cas, vous risquez de ne pas connaître le nom exact de la ressource lorsque vous écrivez la stratégie. Par exemple, vous voulez permettre à chaque utilisateur de disposer de ses propres objets dans un compartiment Amazon S3, comme dans l'exemple précédent. Cependant, au lieu de créer une stratégie distincte pour chaque utilisateur qui spécifie le nom utilisateur dans la ressource, vous pouvez créer une stratégie de groupe unique qui s'applique à tous les utilisateurs du groupe.

Pour ce faire, utilisez des variables de stratégie qui vous permettent de spécifier des espaces réservés dans une stratégie. Lorsque la stratégie est évaluée, ses variables sont remplacées par les valeurs de la demande proprement dite.

Cet exemple montre une stratégie pour un compartiment Amazon S3 qui utilise la variable ${aws:username} :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "home/"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "home/${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-company/home/${aws:username}/*"
            ]
        }
    ]
}

Remarque : Seule StringLike interprète l'astérisque (*) comme caractère générique. Ce n'est pas le cas de StringEquals. Pour plus d'informations, consultez Opérateurs de condition booléens.