O que está causando o acesso negado ao usar o aws cli para baixar no Amazon S3?

57

Estou realmente se debatendo na AWS tentando descobrir o que estou perdendo aqui. Gostaria de fazê-lo para que um usuário do IAM possa baixar arquivos de um bucket S3 - sem apenas tornar os arquivos totalmente públicos - mas estou tendo acesso negado. Se alguém puder descobrir 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
  • Criei uma política de bucket que eu esperava conceder acesso ao meu usuário
  • Executou o comando aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Política de bucket:

{
  "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 Deniedque posso fazer o download usando o mesmo comando e as teclas 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 iria doer, então anexei isso ao meu usuário.

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

Mesmos resultados.

Josh Gagnon
fonte

Respostas:

39

Também estava com problemas, mas encontrei uma resposta aqui https://stackoverflow.com/a/17162973/1750869 que ajudou a resolver esse problema para mim. Reposicionando a resposta abaixo.


Você não precisa abrir permissões para todos. Use as políticas de bucket abaixo na origem e destino para copiar de um bucket em uma conta para outra usando um usuário do IAM

Balde para copiar de - SourceBucket

Balde para copiar para - DestinationBucket

ID da conta da AWS de origem - XXXX – XXXX-XXXX

Usuário IAM de origem - src – iam-user

A política abaixo significa - o usuário do IAM - XXXX – XXXX-XXXX: src – iam-user tem s3: privilégios de ListBucket e s3: GetObject em SourceBucket / * e s3: privilégios de ListBucket e s3: PutObject em DestinationBucket / *

No SourceBucket, a política deve ser como:

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

No DestinationBucket, a política deve ser:

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

comando a ser executado é s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

Sergio
fonte
1
Oh meu Deus, você é meu herói. Eu estava apenas perdendo a permissão ListBucket no nível do bucket. Ainda não sei por que preciso do ls bucket para poder copiar um objeto dele, mas tudo bem. Talvez seja apenas uma peculiaridade de usar o comando aws?
Josh Gagnon
Sim, é bem estranho. Você pensaria que ter uma única política de s3: * (por mais insegura que seja) seria suficiente para testar a sanidade.
22813 Sergio Sergio
fml, dois dias perdidos para essa permissão ListBucket. boa captura
chaqke
Passou muito tempo .. Esta foi a resposta necessária. ListBucket - bucketname, GetObject - bucketname / *
rsmoorthy
12

Quando enfrentei o mesmo problema, a AWS exigiu que a criptografia do lado do servidor estivesse ativada. Portanto, o seguinte comando funcionou com êxito para mim:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
zjor
fonte
3
Obrigado! No meu caso, foi --sse aws:kmsde usar o balde "default" ...
Michael Yoo
Se você estiver usando uma chave KMS não padrão, precisará passar também: --sse-kms-key-id 0123-abc-etc No entanto, a parte que não está clara é que, para usar sua própria chave KMS, você deve ter a permissão IAM kms:GenerateDataKeyou o acesso será negado.
digarok 28/03
A pergunta é sobre Download. Você está fazendo um upload para um S3 criptografado, daí o requisito para a chave.
Ilhicas
4

Eu não recomendaria a opção 'Qualquer usuário autenticado da AWS' mencionada por James.

Isso adiciona uma ACL no nível do bloco que permite que qualquer conta da AWS (não apenas os usuários do IAM) liste / exclua / modifique-acls para esse bloco.

isto é, leitura / gravação pública para qualquer pessoa com uma conta aws.

Andrew
fonte
Você já testou isso? Fiquei com a impressão de que a conta da AWS realmente significa qualquer entidade da minha organização - ou seja, um usuário, uma instância do EC2, uma função do IAM, mas não alguém de uma conta diferente. Eu posso estar errado, e editarei minha contribuição e auditarei rapidamente meus baldes, se for esse o caso. Obrigado.
James Dunmore
1
Sim. O usuário autorizado "Usuário autenticado" nas ACLs do S3 significa todas as contas da AWS. Ele impõe solicitações assinadas, mas nada mais. Aqui está uma referência: link
Andrew
3

Consegui consertar isso sem precisar escrever políticas - no console S3 (ui da web), selecionei o bucket e, na guia permissões, escolhi "Qualquer usuário autenticado da AWS" e marquei todas as caixas.

ATUALIZAÇÃO: como indicado nos comentários "Qualquer usuário autenticado da AWS" não é apenas um usuário da sua conta; é apenas um usuário autenticado da AWS, use com cuidado

James Dunmore
fonte
Eu imagino que isso esteja criando uma política para você. Marcar todas as caixas fará com que você ListBucket, etc. e muito mais.
Josh Gagnon
Tenho certeza que é - Eu só sei que escrever políticas pode ser uma dor, essas caixas de seleção pode dar-lhe um pouco mais, mas uma solução rápida agradável
James Dunmore
2

Mesmo que suas políticas do IAM estejam configuradas corretamente, você ainda poderá receber um erro An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denieddevido aos requisitos de MFA (autenticação multifator) em suas credenciais. Isso pode pegá-lo desprevenido porque, se você já fez login no console da AWS, parece que suas credenciais estão funcionando bem, e a permissão de mensagem de erro negada pelo aws cli não é particularmente útil.

Já existem algumas boas instruções sobre como configurar o MFA com o aws cli:

Basicamente, você precisa acessar o endereço do seu dispositivo MFA e enviá-lo com o código do seu dispositivo para obter um token temporário.

Mark Chackerian
fonte
Você salvou meu dia mano!
Shintaroid # 16/18
Sim, essa é a razão! Por que a AWS não mostrou esse motivo na saída?
tommy.qichang
0

Simplesmente entrei na webUI e cliquei no balde, depois fui em permissões e depois em política. Quando o abri, cliquei em excluir. Fiz isso porque acho que também era configuração.

Voltei à página principal do s3, cliquei no balde e tentei excluí-lo e funcionou.

mesmo quando eu fiz isso por aws-cli usando

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

Enfim, é isso que funcionou para mim. A política de permissões está impedindo que você exclua o bucket.

Spencer Davis
fonte
0

Depois que eu recebi esse erro, simplesmente tentando executar:

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

em uma pasta onde eu não tinha permissões. É bobagem, mas verifique se você é o proprietário da pasta em que está antes de prosseguir!

Jeff Diederiks
fonte
0

O problema surge quando você insere nomes de recursos ou objetos inválidos. Eu tive o mesmo problema com o boto3 (no meu caso, era um nome de bloco inválido)

yunus
fonte