การดำเนินการ S3 Bucket ใช้ไม่ได้กับทรัพยากรใด ๆ


124

ฉันทำตามคำแนะนำจากคำตอบนี้เพื่อสร้างนโยบายที่เก็บข้อมูล S3:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

ฉันได้รับข้อผิดพลาดต่อไปนี้กลับมา:

การดำเนินการใช้ไม่ได้กับทรัพยากรใด ๆ ในคำสั่ง

ฉันขาดอะไรจากนโยบายของฉัน?


1
ฉันได้ลองวิธีแก้ปัญหาในลิงค์: stackoverflow.com/a/36551238/2786039และตอนนี้ก็ใช้งานได้แล้ว ขอแสดงความนับถือ
Vuong Nguyen

คำตอบ:


219

จากเอกสาร IAM http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

บริการบางอย่างไม่อนุญาตให้คุณระบุการดำเนินการสำหรับทรัพยากรแต่ละรายการ การดำเนินการใด ๆ ที่คุณระบุไว้ในองค์ประกอบ Action หรือ NotAction จะนำไปใช้กับทรัพยากรทั้งหมดในบริการนั้นแทน ในกรณีเหล่านี้คุณใช้สัญลักษณ์แทน * ในองค์ประกอบทรัพยากร

ด้วยข้อมูลนี้ทรัพยากรควรมีค่าดังนี้:

"Resource": "arn:aws:s3:::surplace-audio/*"

40
ไม่อยากจะเชื่อเลยว่าสิ่งนี้ไม่ได้กล่าวถึงในนโยบายของที่เก็บข้อมูลและ / หรือตัวสร้างนโยบาย!
Carles Alcolea

4
ฉันใช้ * และยังคงให้ข้อผิดพลาดนั้น มีใครช่วยฉันได้บ้าง
Yehuda Clinton

@YehudaClinton ทำงานให้ฉัน อย่าลืมเพิ่มทั้ง / *
RMati

74

การลบการs3:ListBucketอนุญาตนั้นไม่ใช่วิธีแก้ปัญหาที่ดีพอสำหรับฉันและอาจไม่ใช่สำหรับคนอื่น ๆ อีกมากมาย

หากคุณต้องการการs3:ListBucketอนุญาตคุณจะต้องมี arn ธรรมดาของที่เก็บข้อมูล (โดยไม่ต้อง/*ต่อท้าย) เนื่องจากการอนุญาตนี้ใช้กับที่เก็บข้อมูลไม่ใช่รายการภายในที่เก็บข้อมูล

ดังที่แสดงด้านล่างคุณต้องได้s3:ListBucketรับอนุญาตเป็นคำสั่งแยกต่างหากจากสิทธิ์ที่เกี่ยวข้องกับรายการภายในที่เก็บข้อมูลเช่นs3:GetObjectและs3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}

ตกลง สำหรับการดำเนินการบางอย่างจำเป็นต้องมีสิทธิ์ ListBucket ก่อนจึงจะสามารถดำเนินการ GetObject ได้ดังนั้นคำตอบนี้จึงมีความละเอียดมากขึ้น
3cheesewheel

2
สิ่งนี้ใช้ได้ผลสำหรับฉันและเน้นเฉพาะว่า AWS ยังต้องทำอะไรอีกมากในการแนะนำผู้ใช้ให้ทำสิ่งพื้นฐาน
volvox

41

Error Action ใช้ไม่ได้กับทรัพยากรใด ๆ ในคำสั่ง

หมายความว่าการดำเนินการ (ที่คุณเขียนไว้ในนโยบาย) ไม่ได้มีผลกับทรัพยากร ฉันพยายามทำให้ที่เก็บข้อมูลของฉันเป็นสาธารณะเพื่อให้ทุกคนสามารถดาวน์โหลดจากที่เก็บข้อมูลของฉันได้ ฉันได้รับข้อผิดพลาดจนกระทั่งฉันลบ ("s3: ListBucket") ออกจากคำสั่งของฉัน

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

เนื่องจากที่เก็บรายการใช้ไม่ได้ในที่เก็บข้อมูลดังนั้นการลบนโยบายการดำเนินการนี้จึงได้ผลดี


ขอบคุณที่ช่วยฉันได้โดยลบ "s3: ListBucket" ออก
Paul Watson

14

เพิ่งพบปัญหานี้และพบวิธีแก้ปัญหาที่สั้นกว่าสำหรับผู้ที่ต้องการมี ListBucket และ GetObject ในนโยบายเดียวกัน

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}

ผิด - Principalไม่อนุญาตให้ใช้ไวยากรณ์นโยบาย S3
azec-pdx

วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉันอาจารย์ใหญ่ไม่ถูกต้องหรือฉันจะถูกปฏิเสธการเข้าถึง
Daniel

ถูกต้องทรัพยากรควรเป็นอาร์เรย์ในกรณีนี้และรวม 2 บรรทัดนั้น ... โหวตขึ้น
Assil

4

ฉันประสบปัญหาที่คล้ายกันนี้ขณะสร้างที่เก็บข้อมูล

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

ฉันได้เปลี่ยนรหัสด้านบนเป็น

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

เพิ่ม/ * ในชื่อที่เก็บข้อมูลของคุณจะช่วยแก้ปัญหาได้

นี่ชื่อถังของฉันคือ mrt9949


ขอบคุณ! ใช้เวลาหลายวัยในการค้นหาสิ่งนี้
Jack_Hardy

4

ในกรณีของฉันวิธีแก้ไขข้อผิดพลาดนี้พยายามลบการดำเนินการบางอย่างที่ฉันใช้อยู่ บางส่วนไม่เกี่ยวข้องกับหรือไม่สามารถทำงานกับแหล่งข้อมูลนี้ได้ ในกรณีนี้จะไม่ให้ฉันรวมสิ่งเหล่านี้:

GetBucketAcl ListBucket ListBucketMultipartUploads


ListBucket มีฉัน! ขอบคุณสำหรับสิ่งนี้
Quad64Bit

สำหรับผมทำงานเมื่อมีเพียงการรักษา getObjet
LittleTiger

0

คุณต้องตรวจสอบรูปแบบของ arn ที่กำหนดไว้ภายใต้แท็กทรัพยากรสำหรับ Policy-

"ทรัพยากร": "arn: aws: s3 ::: s3mybucketname / *"

การเพิ่ม "/ *" ในตอนท้ายจะช่วยแก้ไขปัญหาได้หากคุณประสบปัญหาแม้ว่าจะมีนโยบายการเข้าถึงสาธารณะที่เลิกบล็อกสำหรับที่เก็บข้อมูลแล้วก็ตาม


0
  • ไปที่ Amazon S3 ในอินสแตนซ์ของคุณ
  • ไปที่สิทธิ์ -> แท็บการเข้าถึงสาธารณะ
  • เลือกแก้ไขและยกเลิกการเลือกบล็อกการเข้าถึงสาธารณะทั้งหมดและบันทึก
  • คุณจะเห็นแท็ก 'สาธารณะ' ในแท็บสิทธิ์และรายการควบคุมการเข้าถึง

0

คุณยังสามารถกำหนดค่า ListBuckets สำหรับแต่ละโฟลเดอร์ได้เช่นกัน

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1521238702575",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::buckets.email/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[red]"
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": "/",
                    "s3:prefix": [
                        "",
                        "domain.co",
                        "domain.co/user"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "domain.co/user/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*"
        }
    ]
}

กฎเหล่านี้ใช้ร่วมกับ SES เพื่อรับอีเมล แต่อนุญาตให้ผู้ใช้ภายนอกดูไฟล์ที่ SES ใส่ไว้ในที่เก็บข้อมูล ฉันทำตามคำแนะนำจากที่นี่: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

นอกจากนี้คุณต้องระบุคำนำหน้าเป็นdomain.co/user/ด้วยเครื่องหมายทับในตอนท้ายเมื่อใช้ SDK มิฉะนั้นคุณจะถูกปฏิเสธการเข้าถึง หวังว่ามันจะช่วยทุกคน

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