AccessDenied per ListObjects per bucket S3 quando le autorizzazioni sono s3: *


134

Ricevo:

Si è verificato un errore (AccessDenied) durante la chiamata dell'operazione ListObjects: Accesso negato

Quando provo a ottenere la cartella dal mio bucket S3.

Usando questo comando:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Le autorizzazioni IAM per il bucket sono simili alle seguenti:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Cosa devo cambiare per poterlo fare copye lscon successo?


1
Nel mio caso, avevo configurato awsper un utente e l'ho usato all'interno di uno script bash chiamato cronjob da un altro utente, il che significa che la chiave di accesso e il token di accesso erano errati / non impostati. La mia soluzione era quella di inserire direttamente le credenziali ( AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEY) nel mio file di script bash come descritto qui .
Uwe Keim,

Risposte:


199

Hai dato il permesso di eseguire comandi su oggetti all'interno del bucket S3, ma non hai autorizzato a eseguire alcuna azione sul bucket stesso.

Modificare leggermente la vostra politica sarebbe simile a questo:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Tuttavia, ciò probabilmente dà più autorizzazioni di quelle necessarie. Seguire la migliore pratica di AWS IAM di concedere il privilegio minimo sarebbe simile a questa:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}

40
Questo è un elenco di azioni troppo ampio. Per i diritti di elenco e copia, cosa suggeriresti sono le azioni richieste.
dom farr,

6
@domfarr Stavo solo facendo il minimo possibile per adattare la politica dei PO per farlo funzionare per lui. Se hai una domanda specifica, dovresti pubblicarla come domanda separata su questo sito invece di taggarti su questa con commenti. Anche se dovrebbe essere davvero facile guardare l'elenco delle azioni S3 e costruire la politica che desideri.
Marco B,

4
Non stavo tag. OP ha richiesto ciò che era necessario per copia e ls. La mancanza di livello di bucket è stata inclusa, ma non hai modificato le azioni ... da qui il mio commento.
dom farr

1
Forse l'assegnazione diretta di un ruolo appropriato all'EC3 dovrebbe funzionare. :)
ChikuMiku,

6
Inoltre assicurati di non scrivere "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]come ho fatto io (cioè vuoi solo una barra prima del *) - mi ci sono volute 4 lunghe ore per rendermi conto che questo errore ha causato il listObjectsfallimento di tutte le mie chiamate ...
Dániel Kis-Nagy

35

Se si desidera copiare tutti gli oggetti bucket s3 utilizzando il comando "aws s3 cp s3: // bucket-name / data / all-data /. --Recursive" come menzionato, ecco una politica sicura e minima per farlo:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

La prima istruzione in questo criterio consente di elencare gli oggetti all'interno di una sottodirectory di un bucket specifico. La risorsa deve essere l'arn del bucket S3 e per limitare l'elenco a una sola sottodirectory in quel bucket è possibile modificare il valore "s3: prefisso".

La seconda istruzione in questo criterio consente di ottenere oggetti all'interno del bucket in una directory secondaria specifica. Ciò significa che qualsiasi cosa all'interno del percorso "s3: // bucket-name / data / all-data /" sarà in grado di copiare. Tieni presente che ciò non ti consente di copiare da percorsi principali come "s3: // bucket-name / data /".

Questa soluzione è specifica per limitare l'uso per i comandi della CLI AWS; se è necessario limitare l'accesso S3 tramite la console o l'API AWS, saranno necessari ulteriori criteri. Suggerisco di dare un'occhiata qui: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Un problema simile a questo può essere trovato qui che mi ha portato alla soluzione che sto dando. https://github.com/aws/aws-cli/issues/2408

Spero che questo ti aiuti!


1
In realtà, sembra che si può limitare ListBucketa una sottochiave: stackoverflow.com/a/35952877/89218
paleozogt

Grazie per avermelo fatto notare, lo proverò su alcuni dei miei progetti attuali!
Robert Smith,

Grazie. Non
avrei


Ho modificato la risposta per includere una condizione per limitare l'elenco degli oggetti che si trovano in una sottocartella specifica. Grazie per l'aiuto!
Robert Smith,

8

Devi specificare Risorsa per il bucket tramite "arn: aws: 3 ::: bucketname" o "arn: aws: 3 ::: bucketname *". Quest'ultimo è preferito poiché consente manipolazioni anche sugli oggetti del secchio. Si noti che non c'è barra!

Elencare oggetti è un'operazione su Bucket. Pertanto, è richiesta l'azione "s3: ListBucket". L'aggiunta di un oggetto al bucket è un'operazione su Object. Pertanto, è necessaria l'azione "s3: PutObject". Certamente, potresti voler aggiungere altre azioni come richiesto.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

21
il problema arn:aws:s3:::bucketname*è che consente anche l'accesso aarn:aws:s3:::bucketname-with-suffix
Guss,

1
Come scritto, questa è una cattiva politica; non usarlo. Dovrebbe consentire s3: ListBucket contro arn: aws: s3 ::: bucketname e s3: PutObject contro arn: aws: s3 ::: bucketname / *
jarmod,

7

Non sono stato in grado di accedere a S3 perché

  • per prima cosa ho configurato l'accesso con chiave sull'istanza (era impossibile associare il ruolo dopo il lancio poi)
  • me ne sono dimenticato per qualche mese
  • ruolo associato all'istanza
  • provato ad accedere. La chiave configurata aveva una priorità maggiore rispetto al ruolo e l'accesso è stato negato perché all'utente non sono state concesse le autorizzazioni S3 necessarie.

Soluzione:, rm -rf .aws/credentialsquindi awsutilizza il ruolo.


1
Esatto stesso problema. Un sintomo di ciò sarà che un utente può accedere a cose che un altro utente non può accedere allo stesso nodo EC2.
Doc Kaos,

6

Ho riscontrato lo stesso errore durante l'utilizzo della politica come di seguito, anche se ho "s3: ListBucket" per l'operazione s3: ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Quindi l'ho corretto aggiungendo una riga "arn: aws: s3 ::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

4

Pensavo che l'errore fosse dovuto all'azione "s3: ListObjects" ma ho dovuto aggiungere l'azione "s3: ListBucket" per risolvere il problema "AccessDenied for ListObjects for S3 bucket"


4

Ho affrontato lo stesso problema. Ho appena aggiunto la configurazione delle credenziali:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

in "~ / .aws / credentials" + riavvia il terminale per il profilo predefinito.

Nel caso di profili multipli --profile esigenze arg da aggiungere:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

dove PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Ulteriori informazioni su come configurare credenziali e profili multipli sono disponibili qui


2

Ho provato quanto segue:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Questo mi ha dato l'errore:

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

Utilizzando questo modulo ha funzionato:

aws s3 ls {bucket name}

0

Sto aggiungendo una risposta nella stessa direzione della risposta accettata ma con piccole (importanti) differenze e aggiungendo ulteriori dettagli.

Considera la seguente configurazione:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

La politica concede l'accesso programmatico all'eliminazione e alla scrittura ed è divisa in due parti:
l' ListBucketazione fornisce autorizzazioni a livello di bucket e le altre PutObject/DeleteObjectazioni richiedono autorizzazioni per gli oggetti all'interno del bucket.

Il primo elemento Resource specifica arn:aws:s3:::<Bucket-Name>l' ListBucketazione in modo che le applicazioni possano elencare tutti gli oggetti nel bucket.

Il secondo elemento Resource specifica arn:aws:s3:::<Bucket-Name>/*le azioni PutObjecte DeletObject, in modo che le applicazioni possano scrivere o eliminare qualsiasi oggetto nel bucket.

La separazione in due diversi "arn" è importante per motivi di sicurezza al fine di specificare autorizzazioni dettagliate a livello di bucket e di oggetti.

Si noti che se avessi specificato solo GetObjectnel secondo blocco, ciò che accadrebbe è che in caso di accesso programmatico riceverei un errore del tipo:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.



-1

Ho avuto questo problema il mio requisito volevo consentire all'utente di scrivere su un percorso specifico

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

e il problema è stato risolto con questo cambiamento

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
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.