Como permitir que o usuário faça upload de arquivos no bucket do S3, mas não substitua ou exclua?

19

Eu tenho a seguinte política do IAM para um usuário

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

O objetivo é permitir que o usuário faça upload de arquivos para o bucket, mas não substitua ou exclua. É para backup. Comecei com ListBuckete PutObject, mas acrescentei *, pois não funcionava. Nem *permite que o usuário faça upload de arquivos, apenas obtendo Access Denied.

Quando tento o Simulator, ele retorna Denied - Implicitly denied (no matching statements found).para ListBucket, o que parece estranho, porque eu permiti isso implicitamente.

Eu tentei o Cyberduck e o 3Hub como clientes S3.

Alguma idéia do que está errado?

Znarkus
fonte

Respostas:

25

Ao elaborar políticas do Amazon IAM para o Amazon S3 , você precisa estar ciente da diferença entre Operações no Serviço (por exemplo, ListAllMyBuckets ), Operações em Buckets (por exemplo, ListBucket ) e Operações em Objetos (por exemplo, GetObject ).

Em particular, a Resourceespecificação de sua política precisa abordar as entidades de destino apropriadas de acordo com os seguintes padrões (consulte, por exemplo, as várias Políticas de Exemplo para o Amazon S3 ):

  • Operações em Serviço - arn:aws:s3:::*
  • Operações em caçambas - arn:aws:s3:::<bucket>
  • Operações em objetos - arn:aws:s3:::<bucket>/<object>

Solução

Você está encontrando Access Denied, porque especificou um recurso no nível do bucket PutObject, o que requer uma especificação de recurso no nível do objeto, como arn:aws:s3:::<bucket>/*- portanto, a política a seguir deve cobrir seu caso de uso de amostra:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
Steffen Opel
fonte
1
Incrível, isso funcionou perfeitamente. Obrigado! Então sidnão é necessário?
Znarkus
1
De acordo com Sid , é um identificador opcional que você fornece para a declaração de política , que deve ser exclusiva dentro de uma política . Dado que parece funcionar bem sem (mas veja abaixo), costumo removê-lo aqui por questões de brevidade e ao versionar políticas, mas não me incomodo em gerar políticas automaticamente, por exemplo - no entanto, conforme a Nota subseqüente : Alguns serviços da AWS (por exemplo, Amazon SQS ou Amazon SNS) pode exigir esse elemento [...] .
Steffen Opel
3
O OP diz que deseja "permitir que o usuário faça upload de arquivos para o bucket, mas não substitua ou exclua", mas essa política concede PutObject, o que permite a substituição de objetos, não? Eu acho que não há como separar isso.
Xiong Chiamiov
2
@XiongChiamiov - a ação 'PutObject' do S3 realmente implica sobrescrever, é simplesmente como o S3 funciona por padrão. Se você precisar de proteção contra exclusão acidental, poderá usar o uso de versão para preservar, recuperar e restaurar todas as versões de todos os objetos armazenados no seu bucket do Amazon S3. - isso permite que você se recupere facilmente de ações não intencionais do usuário e falhas de aplicativos .
Steffen Opel
4
Sim, o controle de versão permite recuperar objetos que foram substituídos (mas você precisa descobrir que eles foram e depois faz isso). Enfim, -1 porque não fornece uma resposta precisa para a pergunta.
Xiong Chiamiov