Làm cách nào để cho phép người dùng tải tệp lên thùng S3, nhưng không ghi đè hoặc xóa?


19

Tôi có chính sách IAM sau đây cho người dùng

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

Mục tiêu là để cho phép người dùng tải tệp lên thùng, nhưng không ghi đè hoặc xóa. Đó là để sao lưu. Tôi đã bắt đầu với ListBucketPutObject, nhưng thêm vào *vì nó không hoạt động. Thậm chí không *cho phép người dùng tải lên các tập tin, chỉ nhận được Access Denied.

Khi tôi cố gắng Simulator, nó sẽ trả về Denied - Implicitly denied (no matching statements found).cho ListBucket, mà có vẻ kỳ lạ kể từ khi tôi đã mặc nhiên cho phép đó.

Tôi đã thử cả Cyberduck và 3Hub với tư cách là khách hàng S3.

Bất cứ ý tưởng những gì sai?

Câu trả lời:


25

Khi xây dựng các chính sách IAM của Amazon cho Amazon S3 , bạn cần nhận thức được sự khác biệt giữa các Hoạt động trên Dịch vụ (ví dụ: ListAllMyBuckets ), Hoạt động trên các thùng (ví dụ như ListBucket ) và Hoạt động trên các đối tượng (ví dụ GetObject ).

Cụ thể, Resourceđặc điểm kỹ thuật của chính sách của bạn cần giải quyết các thực thể mục tiêu phù hợp theo các mẫu sau (xem ví dụ: Chính sách ví dụ khác nhau cho Amazon S3 ):

  • Hoạt động trên dịch vụ - arn:aws:s3:::*
  • Hoạt động trên xô - arn:aws:s3:::<bucket>
  • Hoạt động trên các đối tượng - arn:aws:s3:::<bucket>/<object>

Dung dịch

Bạn đang gặp phải Access Denied, bởi vì bạn đã chỉ định tài nguyên cấp độ nhóm cho PutObject, yêu cầu một đặc tả tài nguyên cấp đối tượng như arn:aws:s3:::<bucket>/*- theo đó, chính sách sau sẽ bao gồm trường hợp sử dụng mẫu của bạn:

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

1
Thật tuyệt vời, nó hoạt động hoàn hảo. Cảm ơn bạn! Vì vậy, sidkhông bắt buộc?
Znarkus

1
Theo Sid , đây là một mã định danh tùy chọn mà bạn cung cấp cho tuyên bố chính sách , phải là duy nhất trong một chính sách . Do nó có vẻ hoạt động tốt (nhưng xem bên dưới), tôi có xu hướng loại bỏ nó ở đây để đơn giản hóa và khi phiên bản chính sách, nhưng không bận tâm khi tạo chính sách tự động - ví dụ, theo Lưu ý tiếp theo : Một số dịch vụ AWS (ví dụ: Amazon SQS hoặc Amazon SNS) có thể yêu cầu yếu tố này [...] .
Steffen Opel

3
OP nói rằng họ muốn "cho phép người dùng tải tệp lên thùng, nhưng không ghi đè hoặc xóa", nhưng chính sách này cấp PutObject, cho phép ghi đè lên các đối tượng, phải không? Tôi nghĩ không có cách nào để tách nó ra.
Xiong Chiamiov

2
@XiongChiamiov - hành động S3 PutObject của S3 thực sự ngụ ý ghi đè, đó đơn giản là cách S3 hoạt động theo mặc định. Nếu bạn cần bảo vệ chống xóa ngẫu nhiên, bạn có thể muốn xem xét Sử dụng phiên bản để bảo tồn, truy xuất và khôi phục mọi phiên bản của mọi đối tượng được lưu trữ trong nhóm Amazon S3 của bạn. - điều này cho phép bạn dễ dàng phục hồi từ cả hành động của người dùng ngoài ý muốn và lỗi ứng dụng .
Steffen Opel

4
Có, phiên bản cung cấp cho bạn khả năng khôi phục các đối tượng đã bị ghi đè (nhưng bạn phải khám phá ra rằng chúng đã bị, và sau đó thực hiện điều đó). Dù sao, -1 vì nó không cung cấp câu trả lời chính xác cho câu hỏi.
Xiong Chiamiov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.