Accesso negato quando si chiama l'operazione PutObject con autorizzazione a livello di bucket


108

Ho seguito l'esempio su http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 per sapere come concedere a un utente l'accesso a un solo bucket.

Ho quindi testato la configurazione utilizzando il plug-in W3 Total Cache Wordpress. Il test è fallito.

Ho anche provato a riprodurre il problema usando

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

e questo ha fallito con

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

Perché non riesco a caricare nel mio bucket?

Risposte:


204

Per rispondere alla mia domanda:

La politica di esempio concedeva l'accesso a PutObject, ma dovevo anche concedere l'accesso a PutObjectAcl.

Ho dovuto cambiare

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

dall'esempio a:

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

Devi anche assicurarti che il tuo bucket sia configurato per i client per impostare un ACL accessibile al pubblico deselezionando queste due caselle:

inserisci qui la descrizione dell'immagine


2
Grazie! Non sono sicuro del motivo per cui la documentazione di Amazon è disattivata. Potresti voler includere anche "s3: AbortMultipartUpload" in modo che un caricamento interrotto possa essere cancellato correttamente.
Hashcut

campioni per le politiche S3 inseriti qui docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big

1
btw non funziona per me. Interazione boto3, anche con la politica di s3fullaccess ottengo "AccessDenied for PutObject"
E.Big

2
Nel mio caso funziona con AWS cli, ma non funziona con boto
Hardik Gajjar

3
Avevo accesso completo a S3 ma mancava il blocco di nuovi ACL pubblici e il caricamento di oggetti pubblici. Grazie!
the_ccalderon

37

Stavo avendo un problema simile. Non stavo usando la roba ACL, quindi non ne avevo bisogno s3:PutObjectAcl.

Nel mio caso, stavo facendo (in Serverless Framework YML):

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

Invece di:

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

Che aggiunge un /*ARN alla fine del bucket.

Spero che questo ti aiuti.


2
Avevo bisogno di quello con / *
cyrf

questo è stato il caso anche per me
Visualspark

10

Stavo solo sbattendo la testa contro un muro cercando di far funzionare i caricamenti S3 con file di grandi dimensioni. Inizialmente il mio errore era:

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

Quindi ho provato a copiare un file più piccolo e ho ottenuto:

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

Potevo elencare correttamente gli oggetti ma non potevo fare nient'altro anche se avevo le s3:*autorizzazioni nella mia policy Ruolo. Ho finito per rielaborare la politica in questo modo:

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

Ora sono in grado di caricare qualsiasi file. Sostituisci my-bucketcon il nome del tuo bucket. Spero che questo aiuti qualcun altro che sta affrontando questo.


2
Questo dà: Campo obbligatorio mancante Principal :(
Sameera K

2
Ricevo anche il seguente errore: Preside campo obbligatorio mancante
Karan Sharma

come si fa in yml
ichimaru

Attenzione: questo darà al tuo utente / ruolo IAM l'accesso per elencare le chiavi in ​​tutti i bucket. Utilizzare con attenzione; idealmente evitare di usare mai "Resource": "*".
Darian Moody

Aggiungi - "Principal": "*", - sotto "Effect": "Allow", per risolvere il problema con il campo obbligatorio mancante
meck373

9

Nel caso in cui questo aiutasse qualcun altro, nel mio caso, stavo usando una CMK (funzionava bene usando la chiave aws / s3 predefinita)

Ho dovuto entrare nella definizione della mia chiave di crittografia in IAM e aggiungere l'utente programmatico connesso a boto3 all'elenco di utenti che "possono utilizzare questa chiave per crittografare e decrittografare i dati dalle applicazioni e quando si utilizzano servizi AWS integrati con KMS".


Questo mi ha aiutato. Grazie! Stesso errore delle autorizzazioni, ma in realtà era la crittografia.
Vicente Rocha

6

Ho riscontrato un problema simile durante il caricamento su un bucket S3 protetto con crittografia KWS. Ho una politica minima che consente l'aggiunta di oggetti sotto una specifica chiave s3.

Avevo bisogno di aggiungere le seguenti autorizzazioni KMS alla mia policy per consentire al ruolo di inserire oggetti nel bucket. (Potrebbe essere leggermente superiore a quanto strettamente richiesto)

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

Eccezionale. Ho copiato le autorizzazioni dalla aws/s3chiave gestita predefinita a una policy IAM collegata a un ruolo (non nella policy KMS) e funziona bene. Le uniche azioni che mi servivano contro il KMS Arns erano: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Quindi solo i permessi S3 standard.
z0r

3

Ho ricevuto lo stesso messaggio di errore per un errore che ho fatto: assicurati di utilizzare un uri s3 corretto come: s3://my-bucket-name/

(Se my-bucket-name è alla radice del tuo aws s3 ovviamente)

Insisto su questo perché quando copi incollando il bucket s3 dal tuo browser ottieni qualcosa di simile https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Quindi ho commesso l'errore di usare s3://buckets/my-bucket-namewhich raises:

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


1

Per me stavo usando le chiavi di autenticazione scadute. Generati di nuovi e boom.


1

Simile a un post sopra, (tranne che stavo usando le credenziali di amministratore) per far funzionare i caricamenti S3 con file di grandi dimensioni 50M.

Inizialmente il mio errore era:

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

Ho cambiato multipart_threshold per essere al di sopra di 50M

aws configure set default.s3.multipart_threshold 64MB

e ho ottenuto:

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

Ho controllato le impostazioni di accesso pubblico del bucket e tutto era consentito. Quindi ho scoperto che l'accesso pubblico può essere bloccato a livello di account per tutti i bucket S3 :

S3 può bloccare ACL pubblico a livello di account


1

Se hai impostato l'accesso pubblico per il bucket e se non funziona ancora, modifica la policy del bucker e incolla quanto segue:

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

Ha funzionato per me, ho creato un nuovo bucket S3, l'ho reso completamente pubblico. È put_object scrivibile, ma fallisce quando si esegue put_object con l'opzione ACL =. Strano?
Doug F,

0

Se hai specificato la tua chiave KMS gestita dal cliente per la crittografia S3, devi fornire anche il flag --server-side-encryption aws:kms, ad esempio:

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

Se non aggiungi il flag, --server-side-encryption aws:kmsil cli visualizza un AccessDeniederrore


0

Sono stato in grado di risolvere il problema garantendo l'accesso s3 completo a Lambda dalle policy. Crea un nuovo ruolo per Lambda e allega la policy con accesso S3 completo.

Spero che questo ti aiuti.


0

Ho riscontrato lo stesso problema. Il mio bucket era privato e aveva la crittografia KMS. Sono stato in grado di risolvere questo problema inserendo autorizzazioni KMS aggiuntive nel ruolo. Il seguente elenco è il set minimo di ruoli necessari.

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

Riferimento: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.