Cosa causa l'accesso negato quando si utilizza aws cli per scaricare da Amazon S3?


57

Sto davvero andando in giro in AWS cercando di capire cosa mi sto perdendo qui. Mi piacerebbe farlo in modo che un utente IAM possa scaricare file da un bucket S3 - senza solo rendere i file totalmente pubblici - ma mi viene negato l'accesso. Se qualcuno riesce a individuare ciò che è fuori, sarò entusiasta.

Quello che ho fatto finora:

  • Creato un utente chiamato my-user (per esempio)
  • Generato chiavi di accesso per l'utente e inserirle in ~ / .aws su un'istanza EC2
  • Ho creato una politica bucket che speravo conceda l'accesso per il mio utente
  • Ho eseguito il comando aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Politica della benna:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

Il risultato è A client error (AccessDenied) occurred: Access Deniedanche se posso scaricare usando lo stesso comando e le chiavi di accesso predefinite (account root?).

Ho provato anche ad aggiungere una politica utente. Anche se non so perché sarebbe necessario, ho pensato che non avrebbe fatto male, quindi l'ho attaccato al mio utente.

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

Stessi risultati

Risposte:


39

Anch'io stavo lottando con questo, ma ho trovato una risposta qui https://stackoverflow.com/a/17162973/1750869 che mi ha aiutato a risolvere questo problema. Ripubblicare la risposta di seguito.


Non devi aprire le autorizzazioni a tutti. Utilizzare i criteri Bucket seguenti sull'origine e sulla destinazione per copiare da un bucket in un account a un altro utilizzando un utente IAM

Benna da cui copiare - SourceBucket

Benna da copiare in: DestinationBucket

ID account AWS sorgente - XXXX – XXXX-XXXX

Utente IAM di origine - src – iam-user

La politica di seguito indica - l'utente IAM - XXXX – XXXX-XXXX: src – iam-user ha s3: ListBucket e s3: i privilegi di GetObject su SourceBucket / * e s3: ListBucket e s3: i privilegi PutObject su DestinationBucket / *

Su SourceBucket la politica dovrebbe essere come:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

Sul DestinationBucket la politica dovrebbe essere:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

il comando da eseguire è s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1


1
Oh mio Dio, sei il mio eroe. Mi mancava solo l'autorizzazione ListBucket a livello di bucket. Non so ancora perché ho bisogno del secchio per estrarre un oggetto da esso, ma va bene. Forse è solo una stranezza di usare il comando aws?
Josh Gagnon,

Sì, è piuttosto strano. Penseresti che avere una sola politica di s3: * (per quanto incerto possa essere) sarebbe sufficiente per i test di integrità.
Sergio,

fml, 2 giorni sprecati per quel permesso di ListBucket. buona cattura
Chaqke

Ho trascorso molto tempo .. Questa era la risposta necessaria. ListBucket - bucketname, GetObject - bucketname / *
rsmoorthy

12

Quando ho riscontrato lo stesso problema, ho scoperto che AWS richiedeva l'attivazione della crittografia lato server. Quindi il seguente comando ha funzionato correttamente per me:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256

3
Grazie! Nel mio caso era --sse aws:kmsusare il bucket "default" ...
Michael Yoo,

Se si utilizza una chiave KMS non predefinita, è necessario passare anche quella: --sse-kms-key-id 0123-abc-etc tuttavia, la parte che non è chiara è che per utilizzare la propria chiave KMS è necessario disporre dell'autorizzazione IAM kms:GenerateDataKeyo l'accesso verrà comunque negato.
digarok,

La domanda è su Download .. stai effettuando un caricamento su un S3 crittografato, quindi il requisito per la chiave.
Ilhicas,

4

Non consiglierei l'opzione "Qualsiasi utente AWS autenticato" menzionato da James.

In questo modo si aggiunge un ACL a livello di bucket che consente a qualsiasi account AWS (non solo agli utenti IAM) di elencare / eliminare / modificare-acls per quel bucket.

cioè pubblica lettura / scrittura per chiunque abbia un account aws.


Hai provato questo? Avevo l'impressione che l'account AWS in realtà significhi qualsiasi entità all'interno della mia organizzazione, ad esempio un utente, un'istanza EC2, un ruolo IAM, ma non qualcuno di un altro account. Potrei sbagliarmi e modificherò il mio contributo e controllerò rapidamente i miei bucket in questo caso. Grazie.
James Dunmore,

1
Sì. L'utente autorizzato "Utente autenticato" negli ACL S3 indica tutti gli account AWS. Fa rispettare le richieste firmate, ma niente di più. Ecco un riferimento: link
Andrew

3

Sono riuscito a risolvere questo problema senza dover scrivere politiche: dalla console S3 (interfaccia utente Web) ho selezionato il bucket e nella scheda delle autorizzazioni ho scelto "Qualsiasi utente AWS autenticato" e ho assegnato il ticket a tutte le caselle.

AGGIORNAMENTO: come sottolineato nei commenti "Qualsiasi utente AWS autenticato" non è solo utenti nel tuo account, è tutto utente autenticato AWS, ti preghiamo di usare con cautela


Immagino che stia creando una politica per te. Spuntando tutte le caselle otterrai ListBucket, ecc. E altro.
Josh Gagnon

Sono sicuro che lo è - so solo che scrivere le politiche può essere una seccatura, quelle caselle di spunta potrebbero darti un po 'di più ma una bella soluzione rapida
James Dunmore

2

Anche se i criteri IAM sono impostati correttamente, è comunque possibile che si verifichi un errore come An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denieddovuto ai requisiti MFA (Autenticazione a più fattori) sulle proprie credenziali. Questi possono prenderti alla sprovvista perché se hai già effettuato l'accesso alla console AWS sembrerà che le tue credenziali funzionino correttamente e il messaggio di errore negato dal permesso di aws cli non sia particolarmente utile.

Ci sono già alcune buone istruzioni su come configurare MFA con aws cli:

Fondamentalmente, devi ottenere l'indirizzo del tuo dispositivo MFA e inviarlo con il codice dal tuo dispositivo per ottenere un token temporaneo.


Mi hai salvato la giornata fratello!
shintaroid,

Sì, questo è il motivo! Perché AWS non ha mostrato questo motivo nell'output?
tommy.qichang,

0

Sono semplicemente andato sull'interfaccia utente Web e ho fatto clic sul bucket, quindi sono andato alle autorizzazioni e quindi sono andato alla politica. Quando l'ho aperto ho appena fatto clic su Elimina. L'ho fatto perché penso che fosse anche la configurazione.

Sono tornato alla pagina principale di s3, quindi ho fatto clic sul bucket e ho tentato di eliminarlo e ha funzionato.

anche quando l'ho fatto usando aws-cli

$ aws s3 rb s3://bucket-name --force  

Comunque, questa è la cosa che ha funzionato per me. La politica sulle autorizzazioni ti impedisce di eliminare il bucket.


0

Una volta ho ricevuto questo errore semplicemente cercando di eseguire:

aws s3 cp s3://[bucketName]/[fileName] .

in una cartella in cui non avevo i permessi. È sciocco, ma assicurati di essere il proprietario della cartella in cui ti trovi prima di andare avanti!


0

Il problema sorge quando si inseriscono nomi di risorse o oggetti non validi. Ho avuto lo stesso problema con boto3 (nel mio caso non era un nome bucket non valido)

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.