web-dev-qa-db-fra.com

Qu'est-ce qui provoque le refus d'accès lors de l'utilisation de aws cli pour télécharger à partir d'Amazon S3?

Je fouille vraiment dans AWS pour essayer de comprendre ce qui me manque ici. J'aimerais faire en sorte qu'un utilisateur IAM puisse télécharger des fichiers à partir d'un compartiment S3 - sans simplement rendre les fichiers totalement publics - mais mon accès est refusé. Si quelqu'un peut repérer ce qui ne va pas, je serai content.

Ce que j'ai fait jusqu'à présent:

  • Création d'un utilisateur appelé my-user (par exemple)
  • Généré des clés d'accès pour l'utilisateur et les mettre dans ~/.aws sur une instance EC2
  • A créé une politique de compartiment que j'espérais accorder un accès à mon utilisateur
  • Exécutez la commande aws s3 cp --profile my-user s3://my-bucket/thing.Zip .

Politique de compartiment:

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

Le résultat est A client error (AccessDenied) occurred: Access Denied bien que je puisse télécharger en utilisant la même commande et les clés d'accès par défaut (compte root?).

J'ai également essayé d'ajouter une stratégie utilisateur. Bien que je ne sache pas pourquoi cela serait nécessaire, je pensais que cela ne ferait pas de mal, alors j'ai attaché cela à mon utilisateur.

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

Mêmes résultats.

59
Josh Gagnon

Je me battais aussi avec cela, mais j'ai trouvé une réponse ici https://stackoverflow.com/a/17162973/1750869 qui a aidé à résoudre ce problème pour moi. Republier la réponse ci-dessous.


Vous n'êtes pas obligé d'ouvrir des autorisations à tout le monde. Utilisez les stratégies de compartiment ci-dessous sur la source et la destination pour copier d'un compartiment dans un compte vers un autre à l'aide d'un utilisateur IAM

À partir duquel copier - SourceBucket

À copier vers - DestinationBucket

ID de compte AWS source - XXXX – XXXX-XXXX

Utilisateur IAM source - src – iam-user

La stratégie ci-dessous signifie - l'utilisateur IAM - XXXX – XXXX-XXXX: src – iam-user a s3: ListBucket et s3: privilèges GetObject sur SourceBucket/* et s3: ListBucket et s3: privilèges PutObject sur DestinationBucket/*

Sur le SourceBucket, la stratégie doit être comme:

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

Sur DestinationBucket, la stratégie doit être:

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

la commande à exécuter est s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

41
Sergio

Lorsque j'ai rencontré le même problème, il s'est avéré qu'AWS exigeait l'activation du chiffrement côté serveur. La commande suivante a donc fonctionné avec succès pour moi:

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

Je ne recommanderais pas l'option "Tout utilisateur AWS authentifié" mentionnée par James.

Cela ajoute une ACL au niveau du compartiment qui permet à tout compte AWS (et pas seulement à vos utilisateurs IAM) de répertorier/supprimer/modifier-acls pour ce compartiment.

c'est-à-dire lecture/écriture publique pour toute personne possédant un compte aws.

5
Andrew

J'ai réussi à résoudre ce problème sans avoir à écrire de politiques - à partir de la console S3 (interface utilisateur Web), j'ai sélectionné le compartiment et dans l'onglet autorisations, j'ai choisi "Tout utilisateur AWS authentifié" et ticketz toutes les cases.

MISE À JOUR: comme indiqué dans les commentaires "Tout utilisateur AWS authentifié" n'est pas seulement des utilisateurs de votre compte, c'est tout utilisateur authentifié AWS, veuillez utiliser avec prudence

3
James Dunmore

Même si vos stratégies IAM sont correctement configurées, vous pouvez toujours obtenir une erreur comme An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied en raison des exigences MFA (Multi-Factor Authentication) sur vos informations d'identification. Ceux-ci peuvent vous surprendre car si vous vous êtes déjà connecté à la console AWS, il semblera que vos informations d'identification fonctionnent correctement et le message d'erreur d'autorisation refusée de aws cli n'est pas particulièrement utile.

Il existe déjà de bonnes instructions sur la façon de configurer MFA avec aws cli:

Fondamentalement, vous devez obtenir l'adresse de votre appareil MFA et l'envoyer avec le code de votre appareil pour obtenir un jeton temporaire.

2
Mark Chackerian

Je suis simplement allé sur l'interface utilisateur Web et j'ai cliqué sur le seau, puis je suis allé aux autorisations et ensuite à la politique. Quand je l'ai ouvert, j'ai juste cliqué sur supprimer. Je l'ai fait car je pense que c'était aussi la configuration.

Je suis retourné à la page principale de s3, puis j'ai cliqué sur le seau et tenté de le supprimer et cela a fonctionné.

même quand je l'ai fait par aws-cli en utilisant

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

Quoi qu'il en soit, c'est la chose qui a fonctionné pour moi. La stratégie sur les autorisations vous empêche de supprimer le compartiment.

0
Spencer Davis

Une fois que j'ai eu cette erreur en essayant simplement d'exécuter:

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

dans un dossier où je n'avais pas d'autorisations. C'est idiot, mais assurez-vous d'être le propriétaire du dossier dans lequel vous vous trouvez avant de continuer!

0
Jeff Diederiks

Le problème survient lorsque vous insérez des noms de ressources ou d'objets non valides. J'ai eu le même problème avec boto3 (dans mon cas, c'était un nom de compartiment non valide)

0
yunus