J'ai un utilisateur foo avec les privilèges suivants (il n'est membre d'aucun groupe):
{
"Statement": [
{
"Sid": "Stmt1308813201865",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::bar"
}
]
}
Cet utilisateur semble cependant incapable de télécharger ou de faire quoi que ce soit jusqu'à ce que j'accorde un accès complet aux utilisateurs authentifiés (qui pourraient s'appliquer à n'importe qui). Cela ne permet toujours pas à l'utilisateur de modifier l'autorisation car boto génère une erreur après un téléchargement lorsqu'il essaie de faire key.set_acl('public-read')
.
Idéalement, cet utilisateur aurait un accès complet au compartiment bar
et à rien d'autre, que fais-je de mal?
Vous devez accorder s3: ListBucket l'autorisation au compartiment lui-même. Essayez la politique ci-dessous.
{
"Statement": [
{
"Effect": "Allow",
"Action": "S3:*",
"Resource": "arn:aws:s3:::bar/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::bar",
"Condition": {}
}
]
}
La réponse sélectionnée n'a pas fonctionné pour moi, mais celle-ci a:
{
"Statement": [
{
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
],
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
}
]
}
Crédit: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-Amazon-iam/
Connaissez-vous AWS Policy Generator ?
Il existe une documentation AWS officielle sur Écriture de stratégies IAM: comment accorder l'accès à un compartiment Amazon S
Copiez et collez simplement la règle appropriée et remplacez la clé "Resource" par l'ARN de votre compartiment dans toutes les instructions.
Pour l'accès programmatique la politique doit être:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bar"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bar/*"]
}
]
}
Et pour l'accès à la console , l'accès doit être:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::bar*"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bar"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bar/*"]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::YOUR-BUCKET",
"arn:aws:s3:::YOUR-BUCKET/*"
]
}
]
}
Si vous vous êtes arraché les cheveux parce que vous ne pouvez pas comprendre pourquoi Cyberduck n'est pas en mesure de définir des listes de contrôle d'accès d'objet mais qu'il fonctionne avec un autre client (comme Panic Transmit), voici la solution:
Vous devez ajouter s3:GetBucketAcl
à votre liste d'actions, par exemple:
{
"Statement": [
{
"Sid": "Stmt1",
"Action": [
"s3:GetBucketAcl",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-bucket-name"
}
]
}
Bien sûr, vous n'avez pas besoin de le faire si vous êtes moins restrictif avec s3:*
mais je pense que c'est bon à savoir.
La réponse de @ cloudberryman est correcte mais j'aime que les choses soient aussi courtes que possible. Cette réponse peut être réduite à:
{
"Statement":[
{
"Effect":"Allow",
"Action":"S3:*",
"Resource":[
"arn:aws:s3:::bar",
"arn:aws:s3:::bar/*"
]
}
]
}
Autoriser les dossiers internes de compartiment en mentionnant comme ci-dessous dans la ressource, vous devez également donner l'autorisation de liste à tous les compartiments. Consultez l'exemple de politique ci-dessous,
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket/*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
}
]
}
Pour en savoir plus sur ce sujet, trouvez ceci article .
Ça marche pour moi:
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions"
],
"Resource": "arn:aws:s3:::bucket_name_here"
},
{
"Effect": "Allow",
"Action": [
"s3:*Object*",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::bucket_name_here/*"
}
]
}