L'azione Bucket S3 non si applica a nessuna risorsa


124

Sto seguendo le istruzioni di questa risposta per generare la seguente politica del bucket S3:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

Ricevo il seguente errore:

L'azione non si applica a nessuna risorsa (s) nell'istruzione

Cosa mi manca dalla mia polizza?


1
Ho provato la soluzione nel link: stackoverflow.com/a/36551238/2786039 E ora funziona. Saluti
Vuong Nguyen

Risposte:


218

Dai documenti IAM, http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

Alcuni servizi non consentono di specificare azioni per singole risorse; invece, qualsiasi azione elencata nell'elemento Action o NotAction si applica a tutte le risorse in quel servizio. In questi casi, utilizzi il carattere jolly * nell'elemento Risorsa.

Con queste informazioni, la risorsa dovrebbe avere un valore come di seguito:

"Resource": "arn:aws:s3:::surplace-audio/*"

40
Non posso credere che questo non sia menzionato nella policy del bucket e / o nel generatore di policy!
Carles Alcolea

4
Sto usando * e dà ancora quell'errore. qualcuno potrebbe aiutarmi?
Yehuda Clinton,

@YehudaClinton, lavora per me. assicurati di aggiungere entrambi / *
RMati

74

La semplice rimozione s3:ListBucketdell'autorizzazione non era davvero una soluzione abbastanza buona per me, e probabilmente non lo è per molti altri.

Se desideri l' s3:ListBucketautorizzazione, devi solo avere il semplice arn del bucket (senza /*la fine) poiché questa autorizzazione si applica al bucket stesso e non agli elementi all'interno del bucket.

Come mostrato di seguito, devi avere l' s3:ListBucketautorizzazione come dichiarazione separata dalle autorizzazioni relative agli elementi all'interno del bucket come s3:GetObjecte s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

Concordato. Per alcune azioni, è necessaria l'autorizzazione ListBucket prima di poter eseguire GetObject, quindi questa risposta è più completa.
3cheesewheel il

2
Questo per me funziona e mette in evidenza solo quanto lavoro deve ancora fare AWS per guidare gli utenti a fare le cose di base.
Volvox

41

L'azione di errore non si applica a nessuna risorsa nell'istruzione

Significa semplicemente che l'azione (che hai scritto nella policy) non si applica alla risorsa. Stavo cercando di rendere pubblico il mio bucket in modo che chiunque possa eseguire il download dal mio bucket. Ho ricevuto un errore finché non ho rimosso ("s3: ListBucket") dalla mia dichiarazione.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

Poiché il bucket dell'elenco non si applica all'interno del bucket, quindi l'eliminazione di questa policy di azione ha funzionato correttamente.


Grazie, per me ha funzionato, rimuovendo "s3: ListBucket".
Paul Watson

14

Mi sono imbattuto in questo problema e ho trovato una soluzione più breve per coloro che desiderano avere ListBucket e GetObject nella stessa politica.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}

Sbagliato: Principalnon è consentito per la grammatica S3 Policy.
azec-pdx

Nessuna delle soluzioni di cui sopra ha funzionato per me, il preside non era valido o avrei ottenuto l'accesso negato.
Daniel il

Questo è corretto, la risorsa dovrebbe essere un array in questo caso e includere quelle 2 righe ... Vota.
Assil

4

Ho anche affrontato il problema simile durante la creazione del secchio

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

Ho cambiato il codice sopra in

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

aggiungi / * al nome del tuo bucket risolverà il problema

Qui il nome del mio bucket è mrt9949


Grazie!
Ho

4

Nel mio caso la soluzione a questo errore stava cercando di rimuovere alcune delle azioni che stavo applicando. Alcuni di essi non sono rilevanti o non possono funzionare con questa risorsa. In questo caso non mi consentirebbe di includere questi:

GetBucketAcl ListBucket ListBucketMultipartUploads


ListBucket mi ha preso! Grazie per questo
Quad64Bit

Per me, ha funzionato mantenendo solo getObjet
LittleTiger

0

Devi controllare il pattern dell'arn definito sotto il tag Resource per la Policy-

"Risorsa": "arn: aws: s3 ::: s3mybucketname / *"

Con l'aggiunta di "/ *" alla fine aiuterebbe a risolvere il problema se lo affronti anche dopo aver sbloccato la tua politica di accesso pubblico per il tuo bucket.


0
  • Vai ad Amazon S3 nella tua istanza.
  • Vai su Autorizzazioni -> scheda Accesso pubblico.
  • Seleziona Modifica e deseleziona Blocca tutti gli accessi pubblici e salva.
  • Vedrai il tag "Pubblico" nella scheda Autorizzazioni e nell'elenco di controllo degli accessi.

0

Puoi anche configurare ListBuckets per ogni cartella, in questo modo

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1521238702575",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::buckets.email/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[red]"
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": "/",
                    "s3:prefix": [
                        "",
                        "domain.co",
                        "domain.co/user"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "domain.co/user/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*"
        }
    ]
}

Queste regole vengono utilizzate insieme a SES per ricevere un'e-mail, ma consentono a un utente esterno di visualizzare i file che sono stati inseriti nel bucket da SES. Ho seguito le istruzioni da qui: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

Inoltre, è necessario specificare il prefisso come domain.co/user/WITH slash alla fine quando si utilizza l'SDK, altrimenti l'accesso verrà negato. spero che aiuti chiunque

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.