AccessDenied for ListObjects for S3 bucket quando as permissões são s3: *

134

Estou obtendo:

Ocorreu um erro (AccessDenied) ao chamar a operação ListObjects: Acesso negado

Quando tento obter pasta do meu bucket S3.

Usando este comando:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

As permissões do IAM para o bucket são assim:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

O que preciso alterar para poder copye ter lssucesso?

user1411335
fonte
1
No meu caso, eu configurei awspara um usuário e o usei dentro de um script bash chamado cronjob de outro usuário, o que significa que a chave de acesso e o token de acesso estavam errados / não configurados. Minha solução foi colocar diretamente as credenciais ( AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEY) no meu arquivo de script bash, conforme descrito aqui .
Uwe Keim

Respostas:

199

Você concedeu permissão para executar comandos em objetos dentro do bucket do S3, mas não deu permissão para executar nenhuma ação no próprio bucket.

Modificar levemente sua política seria assim:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

No entanto, isso provavelmente dá mais permissão do que o necessário. Seguindo as práticas recomendadas do AWS IAM de Concessão de menos privilégios, seria algo como isto:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}
Mark B
fonte
40
Esta é uma lista de ações muito ampla. Para direitos de lista e cópia, o que você sugere são as ações necessárias.
22417 Dom Domrr
6
@domfarr Eu estava fazendo o mínimo possível para ajustar a política de OPs para que funcionasse para ele. Se você tiver uma pergunta específica, deve publicá-la como uma pergunta separada neste site, em vez de marcá-la com comentários. Embora deva ser realmente fácil olhar para a lista de ações do S3 e criar a política que você deseja.
Mark B
4
Eu não estava etiquetando. O OP solicitou o que era necessário para cópia e sl. A falta de nível de bucket do arn foi incluída, mas você não ajustou as ações ... daí o meu comentário.
dom Farr
1
Talvez a atribuição direta de uma função apropriada ao EC3 deva funcionar. :)
ChikuMiku
6
Também não se esqueça de escrever "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]como eu fiz (ou seja, você quer apenas uma barra antes do *) - Levei 4 longas horas para realizar esse erro causou todas as minhas listObjectschamadas para falhar ...
Dániel Kis-Nagy
35

Se você deseja copiar todos os objetos de bloco s3 usando o comando "aws s3 cp s3: // nome do bloco / dados / todos os dados /. --Recursive" como você mencionou, aqui está uma política segura e mínima para fazer isso:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

A primeira instrução nesta política permite listar objetos dentro do subdiretório de um intervalo específico. O recurso precisa ser o arn do bloco S3 e, para limitar a listagem a apenas um subdiretório nesse bloco, você pode editar o valor "s3: prefix".

A segunda instrução nesta política permite colocar objetos dentro do bucket em um subdiretório específico. Isso significa que qualquer coisa dentro do caminho "s3: // bucket-name / data / all-data /" você poderá copiar. Esteja ciente de que isso não permite copiar dos caminhos-pai, como "s3: // bucket-name / data /".

Esta solução é específica para limitar o uso de comandos da AWS CLI; se você precisar limitar o acesso ao S3 por meio do console ou da API da AWS, serão necessárias mais políticas. Sugiro que você dê uma olhada aqui: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Um problema semelhante a esse pode ser encontrado aqui, o que me levou à solução que estou dando. https://github.com/aws/aws-cli/issues/2408

Espero que isto ajude!

Robert Smith
fonte
1
Na verdade, parece que você pode restringir ListBucketa uma subchave: stackoverflow.com/a/35952877/89218
paleozogt
Obrigado por me informar, vou tentar isso em alguns dos meus projetos atuais!
Robert Smith
Obrigado. Nunca pensei que a não-primeira resposta pode me ajudar
Vyacheslav Tsivina
Na verdade, é possível, aws.amazon.com/blogs/security/… #
citynorman
Editei a resposta para incluir uma condição para limitar a listagem de objetos que estão em uma subpasta específica. Obrigado pela ajuda!
Robert Smith
8

Você deve especificar Recurso para o bucket via "arn: aws: 3 ::: bucketname" ou "arn: aws: 3 ::: bucketname *". O último é preferido, pois também permite manipulações nos objetos do balde. Observe que não há barra!

Listar objetos é uma operação no Bucket. Portanto, a ação "s3: ListBucket" é necessária. Adicionar um objeto ao Balde é uma operação em Objeto. Portanto, a ação "s3: PutObject" é necessária. Certamente, você pode querer adicionar outras ações conforme necessário.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}
marzhaev
fonte
21
o problema com arn:aws:s3:::bucketname*é que ele também permite o acesso aarn:aws:s3:::bucketname-with-suffix
Guss
1
Como está escrito, essa é uma política ruim; não use. Ele deve permitir que s3: ListBucket contra ARN: AWS: s3 ::: bucketname e s3: putObject contra ARN: AWS: s3 ::: bucketname / *
jarmod
7

Não consegui acessar o S3 porque

  • primeiro, configurei o acesso de chave na instância (era impossível anexar a função após o lançamento)
  • esqueci por alguns meses
  • função anexada à instância
  • tentou acessar. A chave configurada tinha prioridade mais alta que a função e o acesso foi negado porque o usuário não recebeu as permissões necessárias do S3.

Solução:, rm -rf .aws/credentialsentão awsusa role.

Putnik
fonte
1
Exatamente o mesmo problema. Um sintoma disso é que um usuário pode acessar coisas que outro usuário não pode no mesmo nó do EC2.
Doc Kaos 5/17
6

Eu recebi o mesmo erro ao usar a política abaixo, embora eu tenha "s3: ListBucket" para a operação s3: ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Então eu o corrigi adicionando uma linha "arn: aws: s3 ::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}
Gabriel Wu
fonte
4

Eu estava pensando que o erro se devia à ação "s3: ListObjects" , mas tive que adicionar a ação "s3: ListBucket" para resolver o problema "AccessDenied for bucket ListObjects for S3"

Sudhakar Naidu
fonte
4

Eu enfrentei o mesmo problema. Acabei de adicionar credenciais de configuração:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

em "~ / .aws / credentials" + reinicie o terminal para o perfil padrão.

No caso de multi-perfis - arg --profile precisa ser adicionado:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

onde PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Mais informações sobre como configurar credenciais e perfis múltiplos podem ser encontradas aqui

Ihor Pavlyk
fonte
2

Eu tentei o seguinte:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Isso me deu o erro:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

Usando este formulário funcionou:

aws s3 ls {bucket name}
Henry
fonte
0

Estou adicionando uma resposta com a mesma direção que a resposta aceita, mas com pequenas (importantes) diferenças e adicionando mais detalhes.

Considere a configuração abaixo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

A política concede acesso programático de exclusão de gravação e é separada em duas partes:
a ListBucketação fornece permissões no nível do bloco e as outras PutObject/DeleteObjectações requerem permissões nos objetos dentro do bloco.

O primeiro elemento Resource especifica arn:aws:s3:::<Bucket-Name>a ListBucketação para que os aplicativos possam listar todos os objetos no bucket.

O segundo elemento Resource especifica arn:aws:s3:::<Bucket-Name>/*as ações PutObject, e DeletObjectpara que os aplicativos possam gravar ou excluir qualquer objeto no bucket.

A separação em dois 'arns' diferentes é importante por motivos de segurança, a fim de especificar permissões refinadas no nível do bucket e no nível do objeto.

Observe que se eu tivesse especificado apenas GetObjectno segundo bloco, o que aconteceria é que, nos casos de acesso programático, eu receberia um erro como:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

RtmY
fonte
-1

Ocorreu um problema semelhante. Para mim, o problema era que eu tinha diferentes chaves da AWS definidas no meu bash_profile.

Respondi a uma pergunta semelhante aqui: https://stackoverflow.com/a/57317494/11871462

Se você tiver chaves AWS conflitantes em seu perfil de bash, a CLI da AWS assumirá o padrão delas.

Varun Tandon
fonte
-1

Eu tive esse problema meu requisito que eu queria permitir que o usuário escrevesse no caminho específico

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

e o problema foi resolvido com essa mudança

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Ameen
fonte