web-dev-qa-db-fra.com

Accès refusé lors de l'appel de l'opération PutObject avec une autorisation au niveau du compartiment

J'ai suivi l'exemple de http://docs.aws.Amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 pour savoir comment accorder à un utilisateur l'accès à un seul compartiment.

J'ai ensuite testé la configuration à l'aide du plugin W3 Total Cache Wordpress. Le test a échoué.

J'ai aussi essayé de reproduire le problème en utilisant 

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

et qui a échoué avec

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

Pourquoi ne puis-je pas télécharger dans mon seau?

31
Greg

Pour répondre à ma propre question:

L'exemple de stratégie a accordé l'accès à PutObject, mais j'ai également dû accorder l'accès à PutObjectAcl.

Je devais changer

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

de l'exemple à:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

Vous devez également vous assurer que votre compartiment est configuré pour que les clients définissent une liste de contrôle d'accès accessible au public en décochant ces deux cases:

 enter image description here

81
Greg

J'avais un problème similaire. Je n'utilisais pas les fichiers ACL, je n'avais donc pas besoin de s3:PutObjectAcl.

Dans mon cas, je faisais (dans Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

Au lieu de:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

Ce qui ajoute un /* à la fin de l'ARN du compartiment.

J'espère que cela t'aides.

12
movermeyer

Au cas où cela aiderait quelqu'un d'autre, dans mon cas, j'utilisais une clé CMK (cela fonctionnait très bien avec la clé aws/s3 par défaut)

Je devais entrer dans la définition de ma clé de chiffrement dans IAM et ajouter l'utilisateur programmatique connecté à boto3 à la liste des utilisateurs pouvant "utiliser cette clé pour chiffrer et déchiffrer des données depuis des applications et avec les services AWS intégrés à KMS".

3
PeskyGnat

Je venais de me cogner la tête contre un mur, essayant simplement de faire fonctionner les téléchargements S3 avec de gros fichiers. Initialement mon erreur était:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

Ensuite, j'ai essayé de copier un fichier plus petit et j'ai obtenu:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Je pouvais lister les objets correctement mais je ne pouvais rien faire d'autre même si j'avais les permissions s3:* dans ma stratégie de rôle J'ai finalement retravaillé la politique:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

Maintenant, je peux télécharger n'importe quel fichier. Remplacez my-bucket par votre nom de compartiment. J'espère que cela aidera quelqu'un d'autre à traverser ça.

1
Ken J

J'ai eu un problème similaire lors du téléchargement dans un compartiment S3 protégé avec le cryptage KWS ..__ J'ai une stratégie minimale qui permet l'ajout d'objets sous une clé s3 spécifique.

J'avais besoin d'ajouter les autorisations KMS suivantes à ma stratégie pour permettre au rôle de placer des objets dans le compartiment. (Peut-être un peu plus que strictement requis)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
1
Spangen