จะให้ผู้ใช้อัพโหลดไฟล์ไปที่ถัง S3 แต่ไม่เขียนทับหรือลบได้อย่างไร


19

ฉันมีนโยบาย IAM ต่อไปนี้สำหรับผู้ใช้

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

เป้าหมายคือเพื่อให้ผู้ใช้อัปโหลดไฟล์ไปยังที่ฝากข้อมูล แต่ไม่เขียนทับหรือลบ มันสำหรับการสำรองข้อมูล ฉันเริ่มต้นด้วยListBucketและPutObjectแต่เพิ่ม*เมื่อมันไม่ทำงาน ไม่ได้ช่วยให้ผู้ใช้อัปโหลดไฟล์เพียงแค่ได้รับ*Access Denied

เมื่อฉันลองใช้ Simulator มันจะกลับDenied - Implicitly denied (no matching statements found).มาListBucketซึ่งดูเหมือนแปลกเพราะฉันอนุญาตโดยปริยาย

ฉันได้ลองทั้ง Cyberduck และ 3Hub เป็นลูกค้า S3

มีความคิดอะไรผิดหรือเปล่า?

คำตอบ:


25

เมื่อกำหนดนโยบายAmazon IAMสำหรับAmazon S3คุณต้องระวังความแตกต่างระหว่างการดำเนินการกับบริการ (เช่นListAllMyBuckets ) การดำเนินการกับถัง (เช่นListBucket ) และการดำเนินการกับวัตถุ (เช่นGetObject )

โดยเฉพาะอย่างยิ่งResourceข้อมูลจำเพาะของนโยบายของคุณต้องระบุเอนทิตีเป้าหมายที่เหมาะสมตามรูปแบบต่อไปนี้ (ดูตัวอย่างนโยบายตัวอย่างสำหรับ Amazon S3 ):

  • การดำเนินงานเกี่ยวกับการบริการ - arn:aws:s3:::*
  • การดำเนินงานเกี่ยวกับที่เก็บ - arn:aws:s3:::<bucket>
  • การดำเนินงานเกี่ยวกับวัตถุ - arn:aws:s3:::<bucket>/<object>

วิธีการแก้

คุณกำลังเผชิญหน้าAccess Deniedเนื่องจากคุณได้ระบุทรัพยากรระดับฝากข้อมูลPutObjectซึ่งต้องการข้อกำหนดคุณสมบัติทรัพยากรระดับวัตถุเช่นarn:aws:s3:::<bucket>/*- ดังนั้นนโยบายต่อไปนี้ควรครอบคลุมกรณีการใช้ตัวอย่างของคุณ:

{
  "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
น่าทึ่งที่ทำงานได้อย่างไร้ที่ติ ขอขอบคุณ! ดังนั้นsidไม่จำเป็นต้องใช้?
Znarkus

1
ตามที่ซิดก็จะเป็นตัวระบุตัวเลือกที่คุณให้คำสั่งนโยบายซึ่งต้องไม่ซ้ำกันภายในนโยบาย เนื่องจากดูเหมือนว่าจะทำงานได้ดีโดยไม่มี (แต่ดูด้านล่าง) ฉันมักจะลบที่นี่เพื่อความกะทัดรัดและเมื่อกำหนดนโยบาย แต่ไม่ต้องกังวลเมื่อสร้างนโยบายโดยอัตโนมัติเช่น - อย่างไรก็ตามตามหมายเหตุต่อไปนี้: บริการ AWS บางอย่าง (ตัวอย่างเช่น Amazon SQS หรือ Amazon SNS) อาจจำเป็นต้องใช้องค์ประกอบนี้ [ ... ]
Steffen Opel

3
OP บอกว่าพวกเขาต้องการ "เพื่อให้ผู้ใช้อัปโหลดไฟล์ไปยังที่ฝากข้อมูล แต่ไม่เขียนทับหรือลบ" แต่นโยบายนี้ให้สิทธิ์PutObjectซึ่งช่วยให้สามารถแทนที่ออบเจ็กต์ได้ใช่ไหม ฉันคิดว่าไม่มีวิธีที่จะแยกสิ่งนั้นออก
Xiong Chiamiov

2
@XiongChiamiov - การกระทำ S3 utPutObject´ นั้นหมายถึงการเขียนทับมันเป็นเพียงวิธีการทำงานของ S3 โดยค่าเริ่มต้น หากคุณต้องการการป้องกันจากการลบโดยไม่ตั้งใจคุณอาจต้องการใช้การกำหนดเวอร์ชัน เพื่อรักษาดึงและเรียกคืนทุกรุ่นของทุกวัตถุที่เก็บอยู่ในที่เก็บ Amazon S3 ของคุณ - นี้ช่วยให้คุณสามารถกู้คืนจากทั้งสองกระทำของผู้ใช้ที่ไม่ได้ตั้งใจและความล้มเหลวของโปรแกรมประยุกต์
Steffen Opel

4
ใช่การกำหนดเวอร์ชันจะช่วยให้คุณสามารถกู้คืนวัตถุที่ถูกเขียนทับได้ (แต่คุณต้องค้นพบว่าพวกเขาเป็นแบบนั้นแล้วไปทำเช่นนั้น) อย่างไรก็ตาม -1 เพราะมันไม่ได้ให้คำตอบที่ถูกต้องสำหรับคำถาม
Xiong Chiamiov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.