Estou realmente me debatendo na AWS tentando descobrir o que estou perdendo aqui. Eu gostaria de fazer com que um usuário do IAM pudesse baixar arquivos de um bucket do S3 - sem apenas tornar os arquivos totalmente públicos - mas estou tendo acesso negado. Se alguém puder identificar o que está acontecendo, ficarei feliz.
O que eu fiz até agora:
- Criou um usuário chamado my-user (por exemplo)
- Chaves de acesso geradas para o usuário e colocadas em ~/.aws em uma instância do EC2
- Criou uma política de bucket que eu esperava conceder acesso para my-user
- Executou o comando
aws s3 cp --profile my-user s3://my-bucket/thing.zip .
Política do intervalo:
{
"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"
}
}
]
}
O resultado é A client error (AccessDenied) occurred: Access Denied
que eu posso baixar usando o mesmo comando e as chaves de acesso padrão (conta root?)
Eu tentei adicionar uma política de usuário também. Embora eu não saiba por que seria necessário, pensei que não faria mal, então anexei isso ao my-user.
{
"Statement": [
{
"Sid": "Stmt1384889624746",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Mesmos resultados.
Eu também estava lutando com isso, mas encontrei uma resposta aqui https://stackoverflow.com/a/17162973/1750869 que ajudou a resolver esse problema para mim. Repostando a resposta abaixo.
Você não precisa abrir permissões para todos. Use as políticas de bucket abaixo na origem e no destino para copiar de um bucket em uma conta para outra usando um usuário do IAM
Bucket para copiar – SourceBucket
Bucket para copiar – DestinationBucket
ID da conta da AWS de origem - XXXX–XXXX-XXXX
Usuário do IAM de origem - src–iam-user
A política abaixo significa - o usuário do IAM - XXXX–XXXX-XXXX:src–iam-user tem privilégios s3:ListBucket e s3:GetObject em SourceBucket/* e privilégios s3:ListBucket e s3:PutObject em DestinationBucket/*
No SourceBucket a política deve ser assim:
No DestinationBucket, a política deve ser:
comando a ser executado é
s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1
Quando enfrentei o mesmo problema, descobri que a AWS exigia que a criptografia do lado do servidor fosse habilitada. Portanto, o seguinte comando funcionou com sucesso para mim:
Mesmo que suas políticas do IAM estejam configuradas corretamente, você ainda pode receber um erro
An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied
devido aos requisitos de MFA (autenticação multifator) em suas credenciais. Isso pode pegá-lo desprevenido porque, se você já tiver feito login no console da AWS, parecerá que suas credenciais estão funcionando bem e a mensagem de erro de permissão negada do aws cli não é particularmente útil.Já existem algumas boas instruções sobre como configurar o MFA com aws cli:
Basicamente, você precisa obter o endereço do seu dispositivo MFA e enviá-lo com o código do seu dispositivo para obter um token temporário.
Eu não recomendaria a opção 'Qualquer usuário autenticado da AWS' mencionada por James.
Isso adiciona uma ACL no nível do bucket que permite que qualquer conta da AWS (não apenas seus usuários do IAM) liste/exclua/modifique-acls para esse bucket.
ou seja, leitura/gravação pública para qualquer pessoa com uma conta aws.
Consegui corrigir isso sem precisar escrever políticas - no console do S3 (web ui) selecionei o bucket e na guia permissions escolhi "Any Authenticated AWS User" e tíquete todas as caixas.
ATUALIZAÇÃO: como apontado nos comentários "Qualquer usuário autenticado da AWS" não é apenas usuários em sua conta, é todo usuário autenticado da AWS, use com cuidado
Eu simplesmente entrei na webUI e cliquei no bucket, depois fui para permissions e depois fui para policy. Quando abri, apenas cliquei em excluir. Eu fiz isso porque eu acho que foi configuração também.
Voltei para a página principal do s3, cliquei no bucket e tentei excluí-lo e funcionou.
mesmo quando eu fiz isso por aws-cli usando
De qualquer forma, essa é a coisa que funcionou para mim. A política de permissões está impedindo você de excluir o bucket.
Uma vez que recebi este erro simplesmente tentando executar:
aws s3 cp s3://[bucketName]/[fileName] .
em uma pasta onde eu não tinha permissões. É bobagem, mas certifique-se de que você é o dono da pasta em que está antes de prosseguir!
O problema surge quando você insere nomes de recursos ou objetos inválidos. Eu tive o mesmo problema com boto3 (no meu caso, era um nome de bucket inválido)