Obtendo acesso negado ao chamar a operação PutObject com permissão de nível de intervalo

108

Segui o exemplo em http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 sobre como conceder a um usuário acesso a apenas um intervalo.

Em seguida, testei a configuração usando o plugin W3 Total Cache Wordpress. O teste falhou.

Também tentei reproduzir o problema usando

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

e isso falhou com

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

Por que não consigo fazer upload para o meu intervalo?

Greg
fonte

Respostas:

204

Para responder à minha própria pergunta:

A política de exemplo concedeu acesso PutObject, mas também tive que conceder acesso PutObjectAcl.

Eu tive que mudar

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

do exemplo para:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

Você também precisa se certificar de que seu intervalo está configurado para que os clientes definam uma ACL acessível ao público, desmarcando estas duas caixas:

insira a descrição da imagem aqui

Greg
fonte
2
Obrigado! Não sei por que a própria documentação da Amazon está desativada. Você pode querer incluir "s3: AbortMultipartUpload" também para que um upload cancelado possa ser devidamente limpo.
Hashcut de
amostras para políticas S3 colocadas aqui docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big
1
btw não funciona para mim. interação boto3, mesmo com a política s3fullaccess Estou recebendo "AccessDenied for PutObject"
E.Big
2
No meu caso está trabalhando com AWS cli, mas não é wrokign com boto
Hardik Gajjar
3
Eu tinha acesso total ao S3, mas estava faltando Bloquear novas ACLs públicas e fazer upload de objetos públicos. Obrigado!
the_ccalderon
36

Eu estava tendo um problema semelhante. Eu não estava usando o ACL, então não precisava s3:PutObjectAcl.

No meu caso, eu estava fazendo (no Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

Ao invés de:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

O que adiciona um /*ao final do bucket ARN.

Espero que isto ajude.

movedor
fonte
2
Eu precisava de um com / *
cyrf
este foi o meu caso também
Visualspark
10

Eu estava batendo minha cabeça contra uma parede apenas tentando fazer uploads S3 funcionarem com arquivos grandes. Inicialmente, meu erro foi:

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

Então tentei copiar um arquivo menor e obtive:

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

Eu poderia listar objetos sem problemas, mas não poderia fazer mais nada, embora tivesse s3:*permissões em minha política de Função. Acabei reformulando a política para isso:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

Agora posso fazer upload de qualquer arquivo. Substitua my-bucketpelo nome do seu intervalo. Espero que isso ajude alguém que está passando por isso.

Ken J
fonte
2
Isso resulta em: Campo obrigatório ausente Principal :(
Sameera K
2
Também estou recebendo o seguinte erro: Campo obrigatório ausente Diretor
Karan Sharma
como você faz isso em yml
ichimaru
Cuidado: isso dará ao usuário / função do IAM acesso para listar as chaves em todos os intervalos. Use com cuidado; idealmente, evite usar "Resource": "*".
Darian Moody
Adicione - "Principal": "*", - abaixo de "Efeito": "Permitir", para resolver o problema com o campo obrigatório ausente
meck373
9

Caso isso ajude mais alguém, no meu caso, eu estava usando um CMK (funcionou bem usando a chave padrão aws / s3)

Tive que entrar em minha definição de chave de criptografia no IAM e adicionar o usuário programático conectado ao boto3 à lista de usuários que "podem usar esta chave para criptografar e descriptografar dados de dentro de aplicativos e ao usar serviços AWS integrados com KMS."

PeskyGnat
fonte
Isso me ajudou. Obrigado! O mesmo erro das permissões, mas na verdade foi a criptografia.
Vicente Rocha
6

Tive um problema semelhante ao fazer upload para um balde S3 protegido com criptografia KWS. Eu tenho uma política mínima que permite a adição de objetos em uma chave s3 específica.

Eu precisava adicionar as seguintes permissões KMS à minha política para permitir que a função colocasse objetos no intervalo. (Pode ser um pouco mais do que o estritamente necessário)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
Spangen
fonte
Impressionante. Copiei as permissões da aws/s3chave gerenciada padrão para uma política IAM anexada a uma função (não na política KMS) e funcionou bem. As únicas acções que precisava contra o KMS Arns foram: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Depois, apenas as permissões padrão do S3.
z0r
3

Eu estava recebendo a mesma mensagem de erro para um erro que cometi: Certifique-se de usar um uri s3 correto, como: s3://my-bucket-name/

(Se my-bucket-name estiver na raiz de seu aws s3, obviamente)

Eu insisto nisso porque ao copiar e colar o balde s3 do seu navegador, você obtém algo como https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Portanto, cometi o erro de usar o s3://buckets/my-bucket-nameque aumenta:

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

amigável
fonte
1

Para mim, eu estava usando chaves de autenticação expiradas. Gerou novos e boom.

Mark Jackson
fonte
1

Semelhante a uma postagem acima, (exceto que eu estava usando credenciais de administrador) para fazer uploads S3 funcionarem com arquivos grandes de 50M.

Inicialmente, meu erro foi:

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

Eu mudei o multipart_threshold para estar acima de 50M

aws configure set default.s3.multipart_threshold 64MB

e eu tenho:

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

Verifiquei as configurações de acesso público do balde e tudo foi permitido. Portanto, descobri que o acesso público pode ser bloqueado no nível da conta para todos os buckets S3 :

S3 pode bloquear ACL pública no nível da conta

dovka
fonte
1

Se você configurou o acesso público para o intervalo e ele ainda não está funcionando, edite a política do Bucker e cole o seguinte:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}
Den Pat
fonte
Funcionou para mim, criei um novo bucket S3, tornei-o totalmente público. Seu put_object gravável, mas falha ao executar put_object com a opção ACL =. Ímpar ?
Doug F
0

Se você especificou sua própria chave KMS gerenciada pelo cliente para criptografia S3, também precisará fornecer o sinalizador --server-side-encryption aws:kms, por exemplo:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

Se você não adicionar o sinalizador, --server-side-encryption aws:kmso cli exibe um AccessDeniederro

Benjamin Slabbert
fonte
0

Consegui resolver o problema concedendo acesso s3 completo ao Lambda a partir de políticas. Crie uma nova função para Lambda e anexe a política com acesso S3 completo a ela.

Espero que isso ajude.

bajaj profundo
fonte