Obtention d'un accès refusé lors de l'appel de l'opération PutObject avec une autorisation au niveau du compartiment

108

J'ai suivi l'exemple sur 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 seau.

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

J'ai également 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 cela 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 importer dans mon bucket?

Greg
la source

Réponses:

204

Pour répondre à ma propre question:

L'exemple de politique accordait l'accès à PutObject, mais je devais également 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 ACL accessible au public en décochant ces deux cases:

entrez la description de l'image ici

Greg
la source
2
Je vous remercie! Je ne sais pas pourquoi la propre documentation d'Amazon est désactivée. Vous pouvez également inclure «s3: AbortMultipartUpload» afin qu'un téléchargement interrompu puisse être correctement effacé.
Hashcut
exemples de politiques S3 placés ici docs.aws.amazon.com/IAM/latest/UserGuide
...
1
btw ça ne marche pas pour moi. boto3 interaction, même avec la politique s3fullaccess Je reçois "AccessDenied for PutObject"
E.Big
2
Dans mon cas, cela fonctionne avec AWS cli, mais ce n'est pas wrokign avec boto
Hardik Gajjar
3
J'avais un accès complet à S3 mais il manquait les nouvelles ACL publiques et le téléchargement d'objets publics. Je vous remercie!
the_ccalderon
37

J'avais un problème similaire. Je n'utilisais pas les éléments ACL, donc je n'en avais pas besoin 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.

movermeyer
la source
2
J'avais besoin de celui avec / *
cyrf
c'était le cas pour moi aussi
Visualspark
10

Je me cognais la tête contre un mur en essayant simplement de faire fonctionner les téléchargements S3 avec des fichiers volumineux. Au départ, 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 pourrais bien lister les objets mais je ne pouvais rien faire d'autre même si j'avais des s3:*autorisations dans ma stratégie de rôle. J'ai fini par retravailler la politique en ceci:

{
    "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": "*"
        }
    ]
}

Je peux maintenant télécharger n'importe quel fichier. Remplacez-le my-bucketpar le nom de votre bucket. J'espère que cela aidera quelqu'un d'autre à traverser ça.

Ken J
la source
2
Cela donne: Champ obligatoire manquant Principal :(
Sameera K
2
Je reçois également l'erreur suivante: Champ obligatoire manquant Principal
Karan Sharma
comment faire cela en yml
ichimaru
Attention: cela donnera à votre utilisateur / rôle IAM un accès pour lister les clés dans tous les buckets. Utiliser avec précaution; idéalement éviter jamais d'utiliser "Resource": "*".
Darian Moody
Ajouter - "Principal": "*", - sous "Effet": "Autoriser", pour résoudre le problème avec le champ obligatoire manquant
meck373
9

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

J'ai dû entrer dans ma définition de clé de chiffrement dans IAM et ajouter l'utilisateur programmatique connecté à boto3 à la liste des utilisateurs qui "peuvent utiliser cette clé pour chiffrer et déchiffrer des données à partir d'applications et lors de l'utilisation de services AWS intégrés à KMS.".

PeskyGnat
la source
Cela m'a aidé. Merci! Même erreur que les permissions, mais c'était en fait le cryptage.
Vicente Rocha
6

J'ai eu un problème similaire lors du téléchargement dans un compartiment S3 protégé par le cryptage KWS. J'ai une politique 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 légèrement plus que ce qui est 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>/*"
            ]
        }
    ]
}
Spangen
la source
Impressionnant. J'ai copié les autorisations de la aws/s3clé gérée par défaut vers une stratégie IAM attachée à un rôle (pas dans la stratégie KMS), et cela fonctionne bien. Les seules actions que je avais besoin contre le KMS ARNs sont: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Ensuite, juste les autorisations S3 standard.
z0r
3

J'avais le même message d'erreur pour une erreur que j'ai faite: assurez-vous d'utiliser un uri s3 correct tel que: s3://my-bucket-name/

(Si my-bucket-name est à la racine de votre aws s3 évidemment)

J'insiste là-dessus parce que lorsque vous copiez le bucket s3 depuis votre navigateur, vous obtenez quelque chose comme https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

J'ai donc fait l'erreur d'utiliser s3://buckets/my-bucket-namece qui soulève:

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

amiabl
la source
1

Pour moi, j'utilisais des clés d'authentification expirées. Généré de nouveaux et boom.

Mark Jackson
la source
1

Similaire à un article ci-dessus (sauf que j'utilisais les informations d'identification d'administrateur) pour que les téléchargements S3 fonctionnent avec un gros fichier de 50 Mo.

Au départ, mon erreur était:

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

J'ai changé le multipart_threshold pour qu'il soit au-dessus des 50M

aws configure set default.s3.multipart_threshold 64MB

et j'ai eu:

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

J'ai vérifié les paramètres d'accès public du bucket et tout était autorisé. J'ai donc constaté que l'accès public peut être bloqué au niveau du compte pour tous les compartiments S3 :

S3 peut bloquer l'ACL publique au niveau du compte

dovka
la source
1

Si vous avez défini un accès public pour le bucket et s'il ne fonctionne toujours pas, modifiez la stratégie de bucker et collez ce qui suit:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}
Den Pat
la source
J'ai travaillé pour moi, j'ai créé un nouveau compartiment S3, je l'ai rendu entièrement public. Son put_object inscriptible, mais échoue lors de l'exécution de put_object w / ACL = option. Bizarre?
Doug F
0

Si vous avez spécifié votre propre clé KMS gérée par le client pour le chiffrement S3, vous devez également fournir l'indicateur --server-side-encryption aws:kms, par exemple:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

Si vous n'ajoutez pas le drapeau, --server-side-encryption aws:kmsle cli affiche une AccessDeniederreur

Benjamin Slabbert
la source
0

J'ai pu résoudre le problème en accordant un accès s3 complet à Lambda à partir des stratégies. Créez un nouveau rôle pour Lambda et attachez-y la stratégie avec un accès S3 complet.

J'espère que cela aidera.

bajaj profond
la source
0

J'ai rencontré le même problème. Mon compartiment était privé et avait un cryptage KMS. J'ai pu résoudre ce problème en ajoutant des autorisations KMS supplémentaires dans le rôle. La liste suivante est l'ensemble minimal de rôles nécessaires.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

Référence: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

Aditya Kar
la source