Comment permettre à l'utilisateur de télécharger des fichiers dans le compartiment S3, sans écraser ni supprimer?

19

J'ai la stratégie IAM suivante pour un utilisateur

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

L'objectif est de permettre à l'utilisateur de télécharger des fichiers dans le compartiment, mais pas d'écraser ou de supprimer. C'est pour la sauvegarde. J'ai commencé avec ListBucketet PutObject, mais j'ai ajouté *car cela ne fonctionnait pas. Ne *permet même pas à l'utilisateur de télécharger des fichiers, tout simplement Access Denied.

Lorsque j'essaie le simulateur, il revient Denied - Implicitly denied (no matching statements found).pour ListBucket, ce qui semble étrange puisque je l'ai implicitement autorisé.

J'ai essayé Cyberduck et 3Hub en tant que clients S3.

Une idée de ce qui ne va pas?

Znarkus
la source

Réponses:

25

Lors de la création de stratégies Amazon IAM pour Amazon S3 , vous devez être conscient de la différence entre les opérations sur le service (par exemple ListAllMyBuckets ), les opérations sur les compartiments (par exemple ListBucket ) et les opérations sur les objets (par exemple GetObject ).

En particulier, la Resourcespécification de votre politique doit adresser les entités cibles appropriées selon les modèles suivants (voir par exemple les différents exemples de politiques pour Amazon S3 ):

  • Opérations sur service - arn:aws:s3:::*
  • Opérations sur godets - arn:aws:s3:::<bucket>
  • Opérations sur les objets - arn:aws:s3:::<bucket>/<object>

Solution

Vous rencontrez Access Denied, car vous avez spécifié une ressource au niveau du compartiment pour PutObject, qui nécessite une spécification de ressource au niveau de l'objet comme arn:aws:s3:::<bucket>/*- en conséquence, la stratégie suivante doit couvrir votre exemple d'utilisation:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
Steffen Opel
la source
1
Incroyable, cela a fonctionné parfaitement. Je vous remercie! Ce sidn'est donc pas nécessaire?
Znarkus
1
Selon Sid , c'est un identifiant facultatif que vous fournissez pour la déclaration de politique , qui doit être unique dans une politique . Étant donné que cela semble bien fonctionner sans (mais voir ci-dessous), j'ai tendance à le supprimer ici pour plus de brièveté et lors de la version des politiques, mais ne vous embêtez pas lors de la génération automatique de politiques par exemple - cependant, comme indiqué dans la note suivante : Certains services AWS (par exemple, Amazon SQS ou Amazon SNS) peut nécessiter cet élément [...] .
Steffen Opel
3
OP dit qu'il veut "laisser l'utilisateur télécharger des fichiers dans le compartiment, mais pas écraser ou supprimer", mais cette politique accorde PutObject, ce qui permet de remplacer les objets, non? Je pense qu'il n'y a aucun moyen de séparer cela.
Xiong Chiamiov
2
@XiongChiamiov - l'action S3 "PutObject" implique en effet l'écrasement, c'est simplement comment S3 fonctionne par défaut. Si vous avez besoin d'une protection contre la suppression accidentelle, vous souhaiterez peut-être étudier l' utilisation de la gestion des versions pour préserver, récupérer et restaurer chaque version de chaque objet stocké dans votre compartiment Amazon S3. - cela vous permet de récupérer facilement à la fois des actions utilisateur involontaires et des défaillances des applications .
Steffen Opel
4
Oui, le versioning vous donne la possibilité de récupérer des objets qui ont été écrasés (mais vous devez découvrir qu'ils l'ont été, puis aller le faire). Quoi qu'il en soit, -1 car il ne fournit pas de réponse précise à la question.
Xiong Chiamiov