อะไรทำให้ Access Denied เมื่อใช้ aws cli เพื่อดาวน์โหลดจาก Amazon S3


57

ฉันกำลังสับสนอยู่ใน AWS พยายามคิดว่าฉันพลาดอะไรบ้างที่นี่ ฉันต้องการทำให้เป็นเช่นนั้นเพื่อให้ผู้ใช้ IAM สามารถดาวน์โหลดไฟล์จากที่เก็บข้อมูล S3 - โดยไม่เพียง แต่ทำให้ไฟล์เป็นแบบสาธารณะทั้งหมด แต่ฉันถูกปฏิเสธการเข้าถึง หากใครสามารถเห็นสิ่งที่ปิดฉันจะถูก stoked

สิ่งที่ฉันทำไปแล้ว:

  • สร้างผู้ใช้ชื่อ my-user (เพื่อเป็นตัวอย่าง)
  • สร้างคีย์การเข้าถึงสำหรับผู้ใช้และวางไว้ใน ~ / .aws บนอินสแตนซ์ EC2
  • สร้างนโยบายฝากข้อมูลที่ฉันต้องการให้สิทธิ์การเข้าถึงแก่ผู้ใช้ของฉัน
  • เรียกใช้คำสั่ง aws s3 cp --profile my-user s3://my-bucket/thing.zip .

นโยบายถัง:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

ผลลัพธ์คือA client error (AccessDenied) occurred: Access Deniedแม้ว่าฉันสามารถดาวน์โหลดโดยใช้คำสั่งเดียวกันและคีย์การเข้าถึงเริ่มต้น (บัญชีรูท?)

ฉันพยายามเพิ่มนโยบายผู้ใช้ด้วย ในขณะที่ฉันไม่รู้ว่าทำไมมันถึงมีความจำเป็นฉันคิดว่ามันจะไม่เจ็บปวดดังนั้นฉันจึงแนบไฟล์นี้กับผู้ใช้ของฉัน

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

ผลลัพธ์เดียวกัน

คำตอบ:


39

ฉันกำลังดิ้นรนกับสิ่งนี้เช่นกัน แต่ฉันพบคำตอบที่นี่https://stackoverflow.com/a/17162973/1750869ที่ช่วยแก้ไขปัญหานี้ให้ฉัน โพสต์คำตอบใหม่ด้านล่าง


คุณไม่ต้องเปิดการอนุญาตให้ทุกคน ใช้นโยบายฝากข้อมูลด้านล่างในแหล่งที่มาและปลายทางสำหรับการคัดลอกจากที่เก็บข้อมูลในบัญชีหนึ่งไปยังอีกบัญชีหนึ่งโดยใช้ผู้ใช้ IAM

ที่ฝากข้อมูลเพื่อคัดลอกจาก - SourceBucket

ที่ฝากข้อมูลเพื่อคัดลอกไปยัง - DestinationBucket

รหัสบัญชี AWS ต้นทาง - XXXX – XXXX-XXXX

ผู้ใช้ IAM ต้นทาง - src – iam-user

นโยบายด้านล่างหมายถึง - ผู้ใช้ IAM - XXXX – XXXX-XXXX: src – iam-user มี s3: ListBucket และ s3: สิทธิ์ GetObject บน SourceBucket / * และ s3: ListBucket และ s3: PutObject บนปลายทาง Destination /

บน SourceBucket นโยบายควรเป็นดังนี้:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

บน DestinationBucket นโยบายควรเป็น:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

คำสั่งที่จะเรียกใช้คือ s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1


1
โอ้พระเจ้าคุณเป็นฮีโร่ของฉัน ฉันเพิ่งพลาดสิทธิ์ ListBucket ที่ระดับที่ฝากข้อมูล ฉันยังไม่รู้ว่าทำไมฉันจึงต้องใช้ที่ฝากข้อมูลเพื่อที่จะ cp วัตถุจากมัน แต่ก็ไม่เป็นไร อาจเป็นเพียงการเล่นโวหารของคำสั่ง aws?
Josh Gagnon

ใช่มันค่อนข้างแปลก คุณจะคิดว่ามีนโยบายเดียวของ s3: * (แต่ไม่ปลอดภัยที่อาจเป็น) จะเพียงพอสำหรับการทดสอบสติ
Sergio

fml 2 วันสูญเสียสิทธิ์ ListBucket นั้น จับได้ดี
chaqke

ใช้เวลามาก .. นี่เป็นคำตอบที่ต้องการ ListBucket - bucketname, GetObject - bucketname / *
rsmoorthy

12

เมื่อฉันประสบปัญหาเดียวกันปรากฎว่า AWS ต้องเปิดใช้งานการเข้ารหัสฝั่งเซิร์ฟเวอร์ ดังนั้นคำสั่งต่อไปนี้ทำงานได้สำเร็จสำหรับฉัน:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256

3
ขอบคุณ! ในกรณีของฉันมันคือ--sse aws:kmsการใช้ bucket "default" ...
Michael Yoo

หากคุณใช้คีย์ KMS ที่ไม่ใช่ค่าเริ่มต้นคุณจะต้องผ่านสิ่งนั้นด้วย: --sse-kms-key-id 0123-abc-etc อย่างไรก็ตามส่วนที่ไม่ชัดเจนคือการใช้คีย์ KMS ของคุณเองคุณต้องได้รับอนุญาตจาก IAM มิkms:GenerateDataKeyฉะนั้นคุณจะยังคงถูกปฏิเสธการเข้าถึง
digarok

คำถามเกี่ยวกับการดาวน์โหลด .. คุณกำลังทำการอัพโหลดไปยัง S3 ที่เข้ารหัสดังนั้นข้อกำหนดสำหรับคีย์
Ilhicas

4

ฉันจะไม่แนะนำตัวเลือก 'ผู้ใช้ AWS ที่ผ่านการรับรองใด ๆ ' ที่กล่าวถึงโดย James

การทำเช่นนี้จะเพิ่ม ACL ระดับถังที่อนุญาตให้บัญชี AWS ใด ๆ (ไม่ใช่แค่ผู้ใช้ IAM ของคุณ) เพื่อแสดงรายการ / ลบ / ดัดแปลง-acls สำหรับที่ฝากข้อมูลนั้น

เช่นสาธารณะอ่าน / เขียนสำหรับทุกคนที่มีบัญชี aws


คุณเคยทดสอบสิ่งนี้หรือไม่? ฉันรู้สึกว่าบัญชี AWS จริง ๆ แล้วหมายถึงเอนทิตีใด ๆ ภายในองค์กรของฉัน - เช่นผู้ใช้อินสแตนซ์ EC2 บทบาท IAM แต่ไม่ใช่ใครบางคนจากบัญชีอื่น ฉันอาจผิดและฉันจะแก้ไขการมีส่วนร่วมของฉันและตรวจสอบถังของฉันอย่างรวดเร็วหากเป็นเช่นนั้น ขอบคุณ
James Dunmore

1
ได้. ผู้รับสิทธิ์ "ผู้ใช้ที่ผ่านการรับรองความถูกต้อง" ใน S3 ACLs หมายถึงบัญชี AWS ทั้งหมด มันบังคับใช้คำขอที่ลงนาม แต่ไม่มีอะไรเพิ่มเติม นี่คือการอ้างอิง: ลิงค์
แอนดรู

3

ฉันจัดการเพื่อแก้ไขปัญหานี้โดยไม่ต้องเขียนนโยบาย - จากคอนโซล S3 (web ui) ฉันเลือกที่ฝากข้อมูลและในแท็บการอนุญาตเลือก "ผู้ใช้ AWS ที่ผ่านการรับรองใด ๆ " และจองตั๋วทั้งหมด

อัปเดต:ตามที่ระบุไว้ในความคิดเห็น "ผู้ใช้ AWS ที่ผ่านการรับรองใด ๆ " ไม่ได้เป็นเพียงผู้ใช้ในบัญชีของคุณ แต่เป็นผู้ใช้ที่ผ่านการรับรองความถูกต้อง AWS ทั้งหมดโปรดใช้ด้วยความระมัดระวัง


ฉันจินตนาการว่ากำลังสร้างนโยบายสำหรับคุณ การทำเครื่องหมายที่กล่องทั้งหมดจะทำให้คุณได้รับ ListBucket เป็นต้นและอีกมากมาย
Josh Gagnon

ฉันแน่ใจว่ามันเป็น - ฉันเพิ่งรู้ว่านโยบายการเขียนอาจเป็นเรื่องเจ็บปวดกล่องเห็บเหล่านั้นอาจให้คุณได้มากกว่า แต่เป็นการแก้ปัญหาอย่างรวดเร็วดี
James Dunmore

2

แม้ว่านโยบาย IAM ของคุณจะตั้งค่าไว้อย่างถูกต้องคุณยังสามารถได้รับข้อผิดพลาดเช่นAn error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Deniedเนื่องจากข้อกำหนด MFA (การรับรองความถูกต้องแบบหลายปัจจัย) ในข้อมูลรับรองของคุณ สิ่งเหล่านี้อาจทำให้คุณระวังเพราะถ้าคุณลงชื่อเข้าใช้คอนโซล AWS แล้วจะปรากฏว่าข้อมูลประจำตัวของคุณใช้งานได้ดีและการอนุญาตปฏิเสธข้อความแสดงข้อผิดพลาดจาก aws cli ไม่เป็นประโยชน์อย่างยิ่ง

มีคำแนะนำที่ดีเกี่ยวกับวิธีตั้งค่า MFA ด้วย aws cli แล้ว:

โดยทั่วไปคุณต้องมีที่อยู่ของอุปกรณ์ MFA ของคุณและส่งรหัสนั้นพร้อมรหัสจากอุปกรณ์ของคุณเพื่อรับโทเค็นชั่วคราว


คุณช่วยชีวิตฉันไว้!
shintaroid

Yas นั่นคือเหตุผล! ทำไม AWS ไม่แสดงเหตุผลนี้ในผลลัพธ์
tommy.qichang

0

ฉันเพียงแค่ไปที่ webUI บนและคลิกที่ถังจากนั้นก็ไปที่สิทธิ์แล้วไปที่นโยบาย เมื่อฉันเปิดขึ้นฉันเพิ่งคลิกลบ ฉันทำสิ่งนี้เพราะฉันคิดว่ามันเป็นโครงแบบเช่นกัน

ฉันกลับไปที่หน้า s3 หลักจากนั้นคลิกที่ฝากข้อมูลและพยายามลบออกและใช้งานได้

แม้ว่าฉันจะใช้ aws-cli ก็ตาม

$ aws s3 rb s3://bucket-name --force  

อย่างไรก็ตามนั่นคือสิ่งที่ทำงานให้ฉัน นโยบายเกี่ยวกับการอนุญาตกำลังหยุดคุณจากการลบที่ฝากข้อมูล


0

เมื่อฉันได้รับข้อผิดพลาดนี้โดยพยายามเรียกใช้:

aws s3 cp s3://[bucketName]/[fileName] .

ในโฟลเดอร์ที่ฉันไม่มีสิทธิ์ มันโง่ แต่ให้แน่ใจว่าคุณเป็นเจ้าของโฟลเดอร์ที่คุณอยู่ก่อนที่จะไป!


0

ปัญหาเกิดขึ้นเมื่อคุณใส่ชื่อทรัพยากรหรือวัตถุที่ไม่ถูกต้องฉันมีปัญหาเดียวกันกับ boto3 (ในกรณีของฉันมันเป็นชื่อถังที่ไม่ถูกต้อง)

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