Bagaimana cara pengguna mengunggah file ke bucket S3, tetapi tidak menimpa atau menghapus?

19

Saya memiliki kebijakan IAM berikut untuk pengguna

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

Tujuannya adalah membiarkan pengguna mengunggah file ke ember, tetapi tidak menimpa atau menghapus. Ini untuk cadangan. Saya mulai dengan ListBucketdan PutObject, tetapi menambahkan *karena tidak berhasil. Bahkan tidak *memungkinkan pengguna mengunggah file, hanya mendapatkan Access Denied.

Ketika saya mencoba Simulator, itu kembali Denied - Implicitly denied (no matching statements found).untuk ListBucket, yang tampaknya aneh karena saya secara implisit telah mengizinkannya.

Saya sudah mencoba Cyberduck dan 3Hub sebagai klien S3.

Adakah yang tahu apa yang salah?

Znarkus
sumber

Jawaban:

25

Saat membuat kebijakan IAM Amazon untuk Amazon S3 , Anda harus mengetahui perbedaan antara Operasi pada Layanan (mis. ListAllMyBuckets ), Operasi pada Bucket (mis. ListBucket ) dan Operasi pada Objek (mis. GetObject ).

Secara khusus, Resourcespesifikasi kebijakan Anda perlu menangani entitas target yang sesuai sesuai dengan pola berikut (lihat misalnya berbagai Kebijakan Contoh untuk Amazon S3 ):

  • Operasi pada Layanan - arn:aws:s3:::*
  • Operasi pada Bucket - arn:aws:s3:::<bucket>
  • Operasi pada Objek - arn:aws:s3:::<bucket>/<object>

Larutan

Anda menjumpai Access Denied, karena Anda telah menentukan sumber daya level bucket untuk PutObject, yang memerlukan spesifikasi sumber daya level objek seperti arn:aws:s3:::<bucket>/*- karenanya, kebijakan berikut harus mencakup kasus penggunaan sampel Anda:

{
  "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
sumber
1
Luar biasa, itu bekerja dengan sempurna. Terima kasih! Jadi sidtidak perlu?
Znarkus
1
Menurut Sid , ini adalah pengidentifikasi opsional yang Anda berikan untuk pernyataan kebijakan , yang harus unik dalam suatu kebijakan . Mengingat tampaknya berfungsi dengan baik tanpa (tetapi lihat di bawah), saya cenderung menghapusnya di sini untuk singkatnya dan ketika membuat kebijakan versi, tetapi jangan repot-repot ketika membuat kebijakan secara otomatis misalnya - namun, sesuai Catatan berikut : Beberapa layanan AWS (misalnya, Amazon SQS atau Amazon SNS) mungkin memerlukan elemen ini [...] .
Steffen Opel
3
OP mengatakan mereka ingin "membiarkan pengguna mengunggah file ke ember, tetapi tidak menimpa atau menghapus", tetapi kebijakan ini memberikan PutObject, yang memungkinkan menimpa objek, bukan? Saya pikir tidak ada cara untuk memisahkan itu.
Xiong Chiamiov
2
@XiongChiamiov - tindakan S3 utPutObject´ memang menyiratkan menimpa, ini hanyalah cara kerja S3 secara default. Jika Anda membutuhkan perlindungan terhadap penghapusan tidak disengaja, Anda mungkin ingin melihat ke dalam Menggunakan versi untuk melestarikan, mengambil, dan mengembalikan setiap versi dari setiap objek yang disimpan dalam ember Amazon S3 Anda. - ini memungkinkan Anda untuk dengan mudah pulih dari tindakan pengguna yang tidak diinginkan dan kegagalan aplikasi .
Steffen Opel
4
Ya, versi memberi Anda kemampuan untuk memulihkan objek yang telah ditimpa (tetapi Anda harus menemukan bahwa itu telah, dan kemudian lakukan). Bagaimanapun, -1 karena tidak memberikan jawaban yang akurat untuk pertanyaan itu.
Xiong Chiamiov