AccessDenied สำหรับ ListObjects สำหรับ S3 ที่เก็บข้อมูลเมื่อสิทธิ์เป็น s3: *


135

ฉันได้รับ:

เกิดข้อผิดพลาด (AccessDenied) เมื่อเรียกใช้การดำเนินการ ListObjects: Access Denied

เมื่อฉันพยายามรับโฟลเดอร์จากที่เก็บ S3 ของฉัน

ใช้คำสั่งนี้:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

สิทธิ์ IAM สำหรับที่เก็บข้อมูลมีลักษณะดังนี้:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

ฉันต้องเปลี่ยนแปลงอะไรบ้างจึงจะทำได้copyและlsประสบความสำเร็จ


1
ในกรณีของฉันฉันได้กำหนดค่าawsสำหรับผู้ใช้รายหนึ่งและใช้มันภายในสคริปต์ bash ที่เรียกว่า cronjob จากผู้ใช้รายอื่นซึ่งหมายความว่าคีย์การเข้าถึงและโทเค็นการเข้าถึงไม่ถูกต้อง / ไม่ได้ตั้งค่า วิธีการแก้ปัญหาของฉันคือการโดยตรงใส่ข้อมูลประจำตัว ( AWS_ACCESS_KEY_IDและAWS_SECRET_ACCESS_KEY) ลงในไฟล์สคริปต์ทุบตีฉันตามที่อธิบายไว้ที่นี่
Uwe Keim

คำตอบ:


200

คุณได้รับอนุญาตให้ดำเนินการคำสั่งกับอ็อบเจ็กต์ภายในที่เก็บข้อมูล S3 แต่คุณไม่ได้รับอนุญาตให้ดำเนินการใด ๆ กับที่เก็บข้อมูล

การปรับเปลี่ยนนโยบายของคุณเล็กน้อยจะมีลักษณะดังนี้:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

อย่างไรก็ตามอาจให้สิทธิ์มากกว่าที่จำเป็น การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดของ AWS IAM ในการให้สิทธิ์น้อยที่สุดจะมีลักษณะดังนี้:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}

40
รายการการดำเนินการนี้กว้างเกินไป สำหรับรายการและสิทธิ์การคัดลอกสิ่งที่คุณจะแนะนำคือการดำเนินการที่จำเป็น
dom farr

6
@domfarr ฉันแค่ทำน้อยที่สุดเท่าที่จะเป็นไปได้ในการปรับนโยบาย OPs เพื่อให้มันใช้งานได้สำหรับเขา หากคุณมีคำถามเฉพาะคุณควรโพสต์เป็นคำถามแยกต่างหากในไซต์นี้แทนที่จะติดแท็กไปยังคำถามนี้พร้อมกับความคิดเห็น แม้ว่าการดูรายการการดำเนินการ S3 และสร้างนโยบายที่คุณต้องการควรเป็นเรื่องง่ายมาก
Mark B

4
ฉันไม่ได้ติดแท็ก OP ได้ร้องขอสิ่งที่จำเป็นสำหรับการทำสำเนาและ ls ขาด arn ระดับถัง แต่คุณไม่ได้ปรับการดำเนินการ ... ดังนั้นความคิดเห็นของฉัน
dom farr

1
บางทีการกำหนดบทบาทที่เหมาะสมให้กับ EC3 โดยตรงก็น่าจะใช้ได้ :)
ChikuMiku

6
อย่าลืมเขียน"Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]เหมือนที่ฉันทำ (เช่นคุณต้องการเพียงสแลชก่อนหน้า*) - ฉันใช้เวลานาน 4 ชั่วโมงกว่าจะตระหนักถึงความผิดพลาดนี้ทำให้การlistObjectsโทรทั้งหมดของฉันล้มเหลว ...
Dániel Kis-Nagy

36

หากคุณต้องการคัดลอกออบเจ็กต์ที่เก็บข้อมูล s3 ทั้งหมดโดยใช้คำสั่ง "aws s3 cp s3: // bucket-name / data / all-data /. --recursive" ตามที่คุณกล่าวไว้นี่เป็นนโยบายที่ปลอดภัยและน้อยที่สุดในการดำเนินการ:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

คำสั่งแรกในนโยบายนี้อนุญาตให้แสดงรายการวัตถุภายในไดเรกทอรีย่อยของที่เก็บข้อมูลเฉพาะ ทรัพยากรต้องเป็นอาร์เรย์ของบัคเก็ต S3 และเพื่อ จำกัด การแสดงรายการเฉพาะไดเรกทอรีย่อยในที่เก็บข้อมูลนั้นคุณสามารถแก้ไขค่า "s3: prefix" ได้

คำสั่งที่สองในนโยบายนี้อนุญาตให้รับวัตถุภายในที่เก็บข้อมูลในไดเรกทอรีย่อยที่ระบุ ซึ่งหมายความว่าทุกสิ่งภายในเส้นทาง "s3: // bucket-name / data / all-data /" ที่คุณจะคัดลอกได้ โปรดทราบว่าสิ่งนี้ไม่อนุญาตให้คุณคัดลอกจากพา ธ ระดับบนสุดเช่น "s3: // bucket-name / data /"

โซลูชันนี้มีไว้เพื่อ จำกัด การใช้คำสั่ง AWS CLI โดยเฉพาะ หากคุณต้องการ จำกัด การเข้าถึง S3 ผ่านคอนโซล AWS หรือ API จำเป็นต้องมีนโยบายเพิ่มเติม ผมขอแนะนำการดูที่นี่: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

ปัญหาที่คล้ายกันนี้สามารถพบได้ที่นี่ซึ่งนำฉันไปสู่วิธีแก้ปัญหาที่ฉันให้ https://github.com/aws/aws-cli/issues/2408

หวังว่านี่จะช่วยได้!


1
จริงๆแล้วดูเหมือนว่าคุณสามารถจำกัดListBucketคีย์ย่อยได้: stackoverflow.com/a/35952877/89218
paleozogt

ขอขอบคุณที่แจ้งให้เราทราบฉันจะลองใช้กับโครงการปัจจุบันของฉัน
Robert Smith

ขอบคุณ ไม่เคยคิดว่าคำตอบที่ไม่ใช่ครั้งแรกอาจช่วยฉันได้
Vyacheslav Tsivina

เป็นไปได้แน่นอนaws.amazon.com/blogs/security/…
citynorman

ฉันได้แก้ไขคำตอบเพื่อรวมเงื่อนไขในการ จำกัด รายการวัตถุที่อยู่ภายใต้โฟลเดอร์ย่อยเฉพาะ ขอบคุณสำหรับความช่วยเหลือ!
Robert Smith

8

คุณต้องระบุทรัพยากรสำหรับที่เก็บข้อมูลผ่าน "arn: aws: 3 ::: bucketname" หรือ "arn: aws: 3 ::: bucketname *" อย่างหลังนี้เป็นที่ต้องการเนื่องจากอนุญาตให้ใช้งานวัตถุในถังได้เช่นกัน สังเกตว่าไม่มีการเฉือน!

การแสดงรายการวัตถุคือการดำเนินการบน Bucket ดังนั้นจึงต้องมีการดำเนินการ "s3: ListBucket" การเพิ่มวัตถุลงใน Bucket เป็นการดำเนินการบน Object ดังนั้นจึงจำเป็นต้องมีการดำเนินการ "s3: PutObject" แน่นอนคุณอาจต้องการเพิ่มการดำเนินการอื่น ๆ ตามที่คุณต้องการ

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

21
ปัญหาarn:aws:s3:::bucketname*คือมันยังอนุญาตให้เข้าถึงarn:aws:s3:::bucketname-with-suffix
Guss

1
ตามที่เขียนไว้นี่เป็นนโยบายที่ไม่ดี อย่าใช้มัน ควรอนุญาตให้ s3: ListBucket เทียบกับ arn: aws: s3 ::: bucketname และ s3: PutObject กับ arn: aws: s3 ::: bucketname / *
jarmod

7

ฉันไม่สามารถเข้าถึง S3 ได้เนื่องจาก

  • ก่อนอื่นฉันกำหนดค่าการเข้าถึงคีย์บนอินสแตนซ์ (ไม่สามารถแนบบทบาทได้หลังจากเปิดตัวแล้ว)
  • ลืมเรื่องนี้ไปสองสามเดือน
  • แนบบทบาทกับอินสแตนซ์
  • พยายามเข้าถึง คีย์ที่กำหนดค่ามีลำดับความสำคัญสูงกว่าบทบาทและการเข้าถึงถูกปฏิเสธเนื่องจากผู้ใช้ไม่ได้รับสิทธิ์ S3 ที่จำเป็น

วิธีแก้ไข: rm -rf .aws/credentialsจากนั้นawsใช้บทบาท


1
ปัญหาเดียวกันแน่นอน อาการนี้คือผู้ใช้รายหนึ่งสามารถเข้าถึงสิ่งที่ผู้ใช้รายอื่นไม่สามารถเข้าถึงได้ในโหนด EC2 เดียวกัน
Doc Kaos

6

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อใช้นโยบายด้านล่างแม้ว่าฉันจะมี "s3: ListBucket" สำหรับการดำเนินการ s3: ListObjects

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

จากนั้นฉันแก้ไขโดยเพิ่มหนึ่งบรรทัด "arn: aws: s3 ::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

4

ฉันคิดว่าข้อผิดพลาดเกิดจากการกระทำ"s3: ListObjects"แต่ฉันต้องเพิ่มการกระทำ "s3: ListBucket"เพื่อแก้ปัญหา "AccessDenied for ListObjects for S3 bucket"


4

ฉันประสบปัญหาเดียวกัน ฉันเพิ่งเพิ่มการกำหนดค่าข้อมูลรับรอง:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

ลงใน"~ / .aws / credentials" + รีสตาร์ทเทอร์มินัลสำหรับโปรไฟล์เริ่มต้น

ในกรณีของหลายโปรไฟล์- ต้องเพิ่มอาร์กิวเมนต์โปรไฟล์:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

โดยที่PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่าข้อมูลรับรองและหลายโปรไฟล์ได้ที่นี่


2

ฉันลองทำสิ่งต่อไปนี้:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

การใช้แบบฟอร์มนี้ได้ผล:

aws s3 ls {bucket name}

0

ฉันกำลังเพิ่มคำตอบในทิศทางเดียวกับคำตอบที่ยอมรับ แต่มีความแตกต่างเล็กน้อย (สำคัญ) และเพิ่มรายละเอียดเพิ่มเติม

พิจารณาการกำหนดค่าด้านล่าง:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

นโยบายให้สิทธิ์การเข้าถึงการเขียน - ลบแบบเป็นโปรแกรมและแยกออกเป็นสองส่วน:
การListBucketดำเนินการให้สิทธิ์ในระดับที่เก็บข้อมูลและการPutObject/DeleteObjectดำเนินการอื่น ๆต้องการสิทธิ์ในออบเจ็กต์ภายในที่เก็บข้อมูล

องค์ประกอบทรัพยากรแรกระบุarn:aws:s3:::<Bucket-Name>สำหรับการListBucketดำเนินการเพื่อให้แอปพลิเคชันสามารถแสดงรายการวัตถุทั้งหมดในที่เก็บข้อมูล

องค์ประกอบทรัพยากรที่สองระบุarn:aws:s3:::<Bucket-Name>/*สำหรับPutObjectและDeletObjectการดำเนินการเพื่อให้แอปพลิเคชันสามารถเขียนหรือลบวัตถุใด ๆ ในที่เก็บข้อมูล

การแยกออกเป็นสอง 'arns' ที่แตกต่างกันมีความสำคัญจากเหตุผลด้านความปลอดภัยเพื่อระบุสิทธิ์แบบละเอียดระดับที่เก็บข้อมูลและระดับออบเจ็กต์

สังเกตว่าถ้าฉันจะระบุGetObjectในบล็อกที่ 2 สิ่งที่จะเกิดขึ้นคือในกรณีของการเข้าถึงแบบเป็นโปรแกรมฉันจะได้รับข้อผิดพลาดเช่น:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.


-1

พบปัญหาที่คล้ายกันสำหรับฉันปัญหาคือฉันตั้งค่าคีย์ AWS ที่แตกต่างกันใน bash_profile ของฉัน

ฉันตอบคำถามที่คล้ายกันที่นี่: https://stackoverflow.com/a/57317494/11871462

หากคุณมีคีย์ AWS ที่ขัดแย้งกันใน bash_profile ของคุณ AWS CLI จะตั้งค่าเริ่มต้นเป็นคีย์เหล่านี้แทน


-1

ฉันประสบปัญหานี้ตามความต้องการของฉันฉันต้องการอนุญาตให้ผู้ใช้เขียนไปยังเส้นทางที่ระบุ

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

และปัญหาได้รับการแก้ไขด้วยการเปลี่ยนแปลงนี้

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.