การเข้าถึงถูกปฏิเสธเมื่อเรียกการดำเนินการ PutObject ด้วยการอนุญาตระดับที่เก็บข้อมูล


109

ฉันทำตามตัวอย่างในhttp://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3สำหรับวิธีให้สิทธิ์ผู้ใช้เข้าถึงที่เก็บข้อมูลเดียว

จากนั้นฉันทดสอบการกำหนดค่าโดยใช้ปลั๊กอิน W3 Total Cache Wordpress การทดสอบล้มเหลว

ฉันยังลองจำลองปัญหาโดยใช้ไฟล์

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

และล้มเหลวด้วย

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

ทำไมฉันไม่สามารถอัปโหลดไปยังที่เก็บข้อมูลของฉันได้

คำตอบ:


205

เพื่อตอบคำถามของตัวเอง:

นโยบายตัวอย่างให้สิทธิ์การเข้าถึง PutObject แต่ฉันต้องให้สิทธิ์การเข้าถึง PutObjectAcl ด้วย

ฉันต้องเปลี่ยน

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

จากตัวอย่างเป็น:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

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

ป้อนคำอธิบายภาพที่นี่


2
ขอบคุณ! ไม่แน่ใจว่าเหตุใดเอกสารของ Amazon จึงปิดอยู่ คุณอาจต้องการรวม "s3: AbortMultipartUpload" ด้วยเพื่อให้สามารถล้างการอัปโหลดที่ถูกยกเลิกได้อย่างเหมาะสม
Hashcut

ตัวอย่างนโยบาย S3 วางไว้ที่นี่docs.aws.amazon.com/IAM/latest/UserGuide/…
E. Big

1
มันไม่ได้ผลสำหรับฉัน การโต้ตอบ boto3 แม้จะมีนโยบาย s3fullaccess ฉันได้รับ "AccessDenied for PutObject"
E. Big

2
ในกรณีของฉันมันใช้งานได้กับ AWS cli แต่มันไม่เหมาะกับ boto
Hardik Gajjar

3
ฉันมีสิทธิ์เข้าถึง S3 เต็มรูปแบบ แต่ไม่มีการบล็อก ACL สาธารณะใหม่และการอัปโหลดวัตถุสาธารณะ ขอบคุณ!
the_ccalderon

37

ฉันมีปัญหาที่คล้ายกัน ฉันไม่ได้ใช้สิ่งที่ ACL s3:PutObjectAclดังนั้นฉันไม่จำเป็นต้อง

ในกรณีของฉันฉันกำลังทำ (ในServerless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

แทน:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

ซึ่งจะเพิ่ม/*จุดสิ้นสุดของที่เก็บข้อมูล ARN

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


2
ฉันต้องการอันที่มี / *
cyrf

นี่เป็นกรณีของฉันเช่นกัน
Visualspark

10

ฉันแค่เอาหัวโขกกำแพงแค่พยายามอัปโหลด S3 ให้ทำงานกับไฟล์ขนาดใหญ่ เริ่มแรกข้อผิดพลาดของฉันคือ:

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

จากนั้นฉันลองคัดลอกไฟล์ที่เล็กกว่าและได้รับ:

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

ฉันสามารถแสดงรายการวัตถุได้ดี แต่ฉันไม่สามารถทำอย่างอื่นได้แม้ว่าฉันจะมีs3:*สิทธิ์ในนโยบายบทบาทของฉัน ฉันลงเอยด้วยการแก้ไขนโยบายนี้ใหม่:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

ตอนนี้ฉันสามารถอัปโหลดไฟล์ใดก็ได้ แทนที่my-bucketด้วยชื่อที่เก็บข้อมูลของคุณ ฉันหวังว่านี่จะช่วยคนอื่นที่กำลังจะผ่านไป


2
สิ่งนี้ทำให้: ขาดตำแหน่งหลักในฟิลด์ที่จำเป็น :(
Sameera K

2
ฉันยังได้รับข้อผิดพลาดต่อไปนี้: ไม่มีตำแหน่งหลักที่จำเป็น
Karan Sharma

คุณทำสิ่งนี้ได้อย่างไรใน yml
ichimaru

ระวัง: สิ่งนี้จะให้สิทธิ์ผู้ใช้ / บทบาท IAM ของคุณเพื่อแสดงรายการคีย์ในที่เก็บข้อมูลทั้งหมด ใช้ด้วยความระมัดระวัง "Resource": "*"หลีกเลี่ยงความนึกคิดที่เคยใช้
Darian Moody

เพิ่ม - "Principal": "*", - ด้านล่าง "Effect": "Allow" เพื่อแก้ไขปัญหาเกี่ยวกับฟิลด์บังคับที่ขาดหายไป
meck373

9

ในกรณีนี้ให้ความช่วยเหลือคนอื่นในกรณีของฉันฉันใช้ CMK (ใช้งานได้ดีโดยใช้คีย์ aws / s3 เริ่มต้น)

ฉันต้องเข้าไปในนิยามคีย์การเข้ารหัสของฉันใน IAM และเพิ่มผู้ใช้แบบเป็นโปรแกรมที่ล็อกอินเข้าสู่ boto3 ในรายชื่อผู้ใช้ที่ "สามารถใช้คีย์นี้เพื่อเข้ารหัสและถอดรหัสข้อมูลจากภายในแอปพลิเคชันและเมื่อใช้บริการ AWS ที่รวมกับ KMS"


สิ่งนี้ช่วยฉันได้ ขอบคุณ! ข้อผิดพลาดเดียวกับสิทธิ์ แต่แท้จริงแล้วคือการเข้ารหัส
Vicente Rocha

6

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

ฉันต้องการเพิ่มสิทธิ์ KMS ต่อไปนี้ในนโยบายของฉันเพื่ออนุญาตให้บทบาทใส่ออบเจ็กต์ในที่เก็บข้อมูล (อาจมากกว่าที่กำหนดไว้เล็กน้อย)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}

น่ากลัว ฉันคัดลอกการอนุญาตจากaws/s3คีย์ที่มีการจัดการเริ่มต้นไปยังนโยบาย IAM ที่แนบมากับบทบาท (ไม่ใช่ในนโยบาย KMS) และทำงานได้ดี การกระทำเท่านั้นที่ฉันต้องการกับ KMS Arns คน: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, ,kms:GenerateDataKey* kms:DescribeKeyจากนั้นก็แค่สิทธิ์ S3 มาตรฐาน
z0r

3

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันกับความผิดพลาดที่ฉันทำ: ตรวจสอบให้แน่ใจว่าคุณใช้ s3 uri ที่ถูกต้องเช่น: s3://my-bucket-name/

(ถ้าชื่อถังของฉันอยู่ที่รูทของ aws s3 ของคุณอย่างชัดเจน)

ฉันยืนยันอย่างนั้นเพราะเมื่อคัดลอกวางถัง s3 จากเบราว์เซอร์ของคุณคุณจะได้รับสิ่งที่ต้องการ https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

ดังนั้นฉันจึงใช้ผิดพลาดs3://buckets/my-bucket-nameซึ่งทำให้เกิด:

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


3

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

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}

สำหรับฉันฉันสร้างที่เก็บข้อมูล S3 ใหม่ทำให้เป็นแบบสาธารณะอย่างเต็มที่ put_object ที่เขียนได้ แต่ล้มเหลวเมื่อทำตัวเลือก put_object w / ACL = แปลก?
Doug F

2

คล้ายกับหนึ่งโพสต์ด้านบน (ยกเว้นว่าฉันใช้ข้อมูลรับรองของผู้ดูแลระบบ) เพื่อรับการอัปโหลด S3 เพื่อทำงานกับไฟล์ขนาดใหญ่ 50M

เริ่มแรกข้อผิดพลาดของฉันคือ:

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

ฉันเปลี่ยน multipart_threshold ให้อยู่เหนือ 50M

aws configure set default.s3.multipart_threshold 64MB

และฉันได้รับ:

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

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

S3 สามารถบล็อก ACL สาธารณะในระดับบัญชี



0

หากคุณระบุคีย์ KMS ที่มีการจัดการของลูกค้าของคุณเองสำหรับการเข้ารหัส S3 คุณต้องระบุแฟล็ก--server-side-encryption aws:kmsด้วยเช่น:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

หากคุณไม่เพิ่มแฟ--server-side-encryption aws:kmsล็ก cli จะแสดงAccessDeniedข้อผิดพลาด


0

ฉันสามารถแก้ปัญหาได้โดยให้สิทธิ์ s3 เข้าถึง Lambda จากนโยบายโดยสมบูรณ์ สร้างบทบาทใหม่ให้กับ Lambda และแนบนโยบายพร้อม S3 Access ไปด้วย

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


0

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

อ้างอิง: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

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