คำอธิบายสั้น:
หากต้องการแก้ไขข้อผิดพลาดการปฏิเสธการเข้าถึง ให้พิจารณาว่าการแจกจ่ายของคุณหรือไม่
ชื่อโดเมนต้นทางคือจุดสิ้นสุดของเว็บไซต์ S3 หรือ S3 REST API
จุดสิ้นสุด ทำตามขั้นตอนเหล่านี้เพื่อกำหนดประเภทปลายทาง:
- เปิดคอนโซล CloudFront
- เลือกการแจกจ่าย CloudFront ของคุณ จากนั้นเลือกการตั้งค่าการแจกจ่าย
- เลือกแท็บ Origins และ Origin Groups
- เลือกแท็บ Origins และ Origin Groups
ตรวจสอบชื่อโดเมนใต้ Origin Domain Name and Path จากนั้น
กำหนดประเภทปลายทางตามรูปแบบของชื่อโดเมน
ตำแหน่งข้อมูล REST API ใช้รูปแบบนี้:
DOC-ตัวอย่าง-BUCKET.s3.amazonaws.com
บันทึก: ตรวจสอบให้แน่ใจว่าได้ปฏิบัติตามกฎสำหรับการตั้งชื่อบัคเก็ต Amazon S3
จุดสิ้นสุดของเว็บไซต์ใช้รูปแบบนี้:
DOC-ตัวอย่าง-BUCKET.s3-website-us-east-1.amazonaws.com
บันทึก: ขึ้นอยู่กับภูมิภาค AWS รูปแบบจุดสิ้นสุดอาจใช้รูปแบบเส้นประ (s3-เว็บไซต์-ภูมิภาค) หรือรูปแบบจุด
(s3-website.Region).
หากการกระจายของคุณใช้ตำแหน่งข้อมูล REST API โปรดดูที่ ฉันกำลังใช้ S3
ตำแหน่งข้อมูล REST API เป็นที่มาของการแจกจ่าย CloudFront ของฉัน ทำไม
ฉันได้รับข้อผิดพลาด 403 Access Denied หรือไม่
หากการแจกจ่ายของคุณใช้จุดสิ้นสุดของเว็บไซต์ ให้ตรวจสอบสิ่งต่อไปนี้
ข้อกำหนดเพื่อหลีกเลี่ยงข้อผิดพลาดการปฏิเสธการเข้าถึง:
- ออบเจ็กต์ในบัคเก็ตต้องเข้าถึงได้แบบสาธารณะ
- ออบเจ็กต์ในบัคเก็ตไม่สามารถเข้ารหัสโดย AWS Key Management Service (AWS KMS)
- นโยบายบัคเก็ตต้องอนุญาตให้เข้าถึง s3:GetObject
- หากนโยบายบัคเก็ตให้สิทธิ์การเข้าถึงแบบสาธารณะ บัญชี AWS ที่เป็นเจ้าของบัคเก็ตจะต้องเป็นเจ้าของออบเจกต์ด้วย
5. วัตถุที่ร้องขอต้องมีอยู่ในที่ฝากข้อมูล
- ต้องปิดใช้งาน Amazon S3 Block Public Access บนบัคเก็ต
- หากเปิดใช้การจ่ายเงินของผู้ร้องขอ คำขอจะต้องมีพารามิเตอร์ผู้ร้องขอ-ผู้ชำระเงิน
- หากคุณใช้ส่วนหัวผู้อ้างอิงเพื่อจำกัดการเข้าถึงจาก CloudFront ไปยังต้นทาง S3 ของคุณ ให้ตรวจสอบส่วนหัวที่กำหนดเอง
บันทึก: หากคุณไม่ต้องการให้สาธารณะ (ไม่ระบุชื่อ) เข้าถึงออบเจกต์ S3 ของคุณ จากนั้นเปลี่ยนการกำหนดค่าของคุณเพื่อใช้ S3 REST API
จุดสิ้นสุดเป็นที่มาของการกระจายของคุณ จากนั้นกำหนดค่าของคุณ
การแจกจ่ายและบัคเก็ต S3 เพื่อจำกัดการเข้าถึงโดยใช้การเข้าถึงจากต้นทาง
เอกลักษณ์ (OAI) สำหรับคำแนะนำ โปรดดู การใช้จุดสิ้นสุด REST API เป็น
ต้นทางที่จำกัดการเข้าถึงโดย OAI ใน ฉันจะใช้ CloudFront ได้อย่างไร
ให้บริการเว็บไซต์คงที่ที่โฮสต์บน Amazon S3 หรือไม่
ปณิธาน
ออบเจ็กต์ในบัคเก็ตต้องเข้าถึงได้แบบสาธารณะ
การแจกจ่ายโดยใช้จุดสิ้นสุดของเว็บไซต์สนับสนุนแบบสาธารณะเท่านั้น
เนื้อหาที่เข้าถึงได้ เพื่อตรวจสอบว่าออบเจกต์ในบัคเก็ต S3 ของคุณเป็นออบเจกต์หรือไม่
เข้าถึงได้แบบสาธารณะ เปิด URL ของวัตถุในเว็บเบราว์เซอร์ หรือคุณ
สามารถเรียกใช้คำสั่ง curl บน URL
ต่อไปนี้เป็นตัวอย่าง URL ของวัตถุ S3:
http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html
หากเว็บเบราว์เซอร์หรือคำสั่ง curl ส่งกลับข้อผิดพลาด Access Denied
ดังนั้นวัตถุจะไม่สามารถเข้าถึงได้แบบสาธารณะ
อนุญาตให้สาธารณะเข้าถึงวัตถุด้วยวิธีใดวิธีหนึ่งต่อไปนี้:
- สร้างนโยบายบัคเก็ตที่อนุญาตให้สาธารณะเข้าถึงการอ่านสำหรับอ็อบเจกต์ทั้งหมดในบัคเก็ต
- ใช้คอนโซล Amazon S3 เพื่ออนุญาตการเข้าถึงแบบสาธารณะสำหรับออบเจกต์
- ออบเจ็กต์ในบัคเก็ตไม่สามารถเข้ารหัส AWS KMS ได้
- การกระจาย CloudFront ไม่รองรับอ็อบเจ็กต์ที่เข้ารหัส AWS KMS คุณต้องลบการเข้ารหัส KMS ออกจากวัตถุ S3 ที่คุณต้องการ
ให้บริการโดยใช้การกระจาย
บันทึก: แทนที่จะใช้การเข้ารหัส AWS KMS ให้ใช้ AES-256 เพื่อเข้ารหัสวัตถุของคุณ
ใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อตรวจสอบว่ามีวัตถุในบัคเก็ตของคุณหรือไม่
เข้ารหัส KMS:
ใช้คอนโซล Amazon S3 เพื่อดูคุณสมบัติของอ็อบเจ็กต์ ทบทวน
กล่องโต้ตอบการเข้ารหัส หากเลือก AWS-KMS แสดงว่าอ็อบเจ็กต์คือ
เข้ารหัส KMS เรียกใช้คำสั่ง head-object โดยใช้ AWS Command Line
อินเทอร์เฟซ (AWS CLI) หากคำสั่งส่งคืน ServerSideEncryption เป็น
aws:kms ดังนั้นอ็อบเจ็กต์จะถูกเข้ารหัสด้วย KMS หมายเหตุ: หากคุณได้รับข้อผิดพลาด
เมื่อเรียกใช้คำสั่ง AWS CLI ตรวจสอบให้แน่ใจว่าคุณใช้มากที่สุด
AWS CLI เวอร์ชันล่าสุด เพื่อเปลี่ยนการเข้ารหัสของวัตถุ
การตั้งค่าโดยใช้คอนโซล Amazon S3 โปรดดู ฉันจะเพิ่มการเข้ารหัสได้อย่างไร
วัตถุ S3?
หากต้องการเปลี่ยนการตั้งค่าการเข้ารหัสของวัตถุโดยใช้ AWS CLI,
ก่อนอื่นให้ตรวจสอบว่าที่เก็บข้อมูลของวัตถุไม่มีการเข้ารหัสเริ่มต้น
หากบัคเก็ตไม่มีการเข้ารหัสเริ่มต้น ให้เรียกใช้สิ่งต่อไปนี้
คำสั่งเพื่อลบการเข้ารหัสของวัตถุโดยการคัดลอกวัตถุทับ
ตัวเอง:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
คำเตือน: การคัดลอกอ็อบเจกต์ทับตัวเองจะลบการตั้งค่าสำหรับคลาสพื้นที่เก็บข้อมูลและ
เว็บไซต์เปลี่ยนเส้นทางตำแหน่ง เพื่อรักษาการตั้งค่าเหล่านี้ในใหม่
วัตถุต้องแน่ใจว่าได้ระบุคลาสการจัดเก็บอย่างชัดเจนหรือ
ค่าตำแหน่งเปลี่ยนเส้นทางเว็บไซต์ในคำขอคัดลอก
นโยบายบัคเก็ตต้องอนุญาตให้เข้าถึง s3:GetObject เพื่อใช้
การกระจายด้วยตำแหน่งข้อมูลเว็บไซต์ S3 นโยบายฝากข้อมูลของคุณต้องไม่
มีคำสั่งปฏิเสธที่ปิดกั้นการเข้าถึงการอ่านของสาธารณะ
s3:การกระทำ GetObject
แม้ว่าคุณจะมีคำสั่งอนุญาตที่ชัดเจนสำหรับ s3:GetObject ในไฟล์
นโยบายฝากข้อมูล ยืนยันว่าไม่มีการปฏิเสธอย่างชัดเจนที่ขัดแย้งกัน
คำแถลง. คำสั่งปฏิเสธที่ชัดเจนจะแทนที่คำชี้แจงที่ชัดเจนเสมอ
อนุญาตคำสั่ง
ทำตามขั้นตอนเหล่านี้เพื่อตรวจสอบนโยบายบัคเก็ตของคุณสำหรับ s3:GetObject:
เปิดบัคเก็ต S3 ของคุณจากคอนโซล Amazon S3
เลือกแท็บสิทธิ์
เลือกนโยบายฝากข้อมูล
ตรวจสอบนโยบายบัคเก็ตสำหรับข้อความที่มี "Action": "s3:GetObject" หรือ "Action": "s3:*"
นโยบายตัวอย่างต่อไปนี้มีคำสั่งอนุญาตที่ชัดเจนสำหรับ
การเข้าถึง s3:GetObject แบบสาธารณะ อย่างไรก็ตาม มีการปฏิเสธอย่างชัดเจนเช่นกัน
คำสั่งสำหรับ s3:GetObject ที่บล็อกการเข้าถึงเว้นแต่จะมีการร้องขอ
จาก Amazon Virtual Private Cloud (Amazon VPC) ที่เฉพาะเจาะจง
{
"เวอร์ชัน": "2008-10-17",
"รหัส": "PolicyForCloudFrontPrivateContent",
"คำแถลง": [
{
"ซิด": "อนุญาต-OAI-เข้าถึง-To-Bucket",
"เอฟเฟกต์": "อนุญาต",
"อาจารย์ใหญ่": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
},
"การกระทำ": "s3:GetObject",
"ทรัพยากร": [
"arn:aws:s3:::DOC-ตัวอย่าง-BUCKET/*"
]
},
{
"ซิด": "อนุญาตให้สาธารณะเข้าถึงที่ฝากข้อมูล",
"เอฟเฟกต์": "อนุญาต",
"อาจารย์ใหญ่": "*",
"การกระทำ": "s3:GetObject",
"ทรัพยากร": [
"arn:aws:s3:::DOC-ตัวอย่าง-BUCKET/*"
]
},
{
"ซิด": "เข้าถึงเฉพาะ VPCE เท่านั้น",
"ผล": "ปฏิเสธ",
"อาจารย์ใหญ่": "*",
"การกระทำ": "s3:GetObject",
"ทรัพยากร": [
"arn:aws:s3:::DOC-ตัวอย่าง-BUCKET/*"
]
"เงื่อนไข": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}
- แก้ไขนโยบายบัคเก็ตเพื่อลบหรือแก้ไขคำสั่งที่บล็อกการเข้าถึงการอ่านแบบสาธารณะไปยัง s3:GetObject
บันทึก: CloudFront แคชผลลัพธ์ของข้อผิดพลาดการปฏิเสธการเข้าถึงตามระยะเวลาที่ระบุในข้อผิดพลาดในการแคช TTL ขั้นต่ำ เดอะ
ค่าเริ่มต้นคือหนึ่งนาที หลังจากลบคำสั่งปฏิเสธออกจาก
นโยบายฝากข้อมูล คุณสามารถเรียกใช้การทำให้ไม่ถูกต้องในการแจกจ่ายของคุณได้
ลบวัตถุออกจากแคช
หากนโยบายบัคเก็ตให้สิทธิ์การเข้าถึงแบบสาธารณะ บัญชี AWS
ที่เป็นเจ้าของที่ฝากข้อมูลจะต้องเป็นเจ้าของวัตถุสำหรับนโยบายที่ฝากข้อมูลด้วย
อนุญาตให้สาธารณะเข้าถึงการอ่านวัตถุ บัญชี AWS ที่เป็นเจ้าของ
ถังต้องเป็นเจ้าของวัตถุด้วย ที่ฝากข้อมูลหรือวัตถุเป็นของ
บัญชีของข้อมูลประจำตัว AWS Identity and Access Management (IAM) ที่
สร้างถังหรือวัตถุ
บันทึก: ข้อกำหนดการเป็นเจ้าของอ็อบเจกต์ใช้กับการเข้าถึงการอ่านแบบสาธารณะที่ได้รับจากนโยบายบัคเก็ต ใช้ไม่ได้กับการอ่านสาธารณะ
การเข้าถึงที่ได้รับจากรายการควบคุมการเข้าถึงของวัตถุ (ACL)
ทำตามขั้นตอนเหล่านี้เพื่อตรวจสอบว่าบัคเก็ตและอ็อบเจ็กต์เหมือนกันหรือไม่
เจ้าของ:
- เรียกใช้คำสั่ง AWS CLI นี้เพื่อรับรหัสมาตรฐาน S3 ของเจ้าของที่เก็บข้อมูล:
aws s3api list-buckets --query Owner.ID
- เรียกใช้คำสั่งนี้เพื่อรับรหัสมาตรฐาน S3 ของเจ้าของวัตถุ:
หมายเหตุ: ตัวอย่างนี้แสดงวัตถุเดียว แต่คุณสามารถใช้รายการได้
คำสั่งตรวจสอบวัตถุต่างๆ
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --คำนำหน้า index.html
- หากรหัสตามรูปแบบบัญญัติไม่ตรงกัน แสดงว่าที่ฝากข้อมูลและวัตถุมีเจ้าของต่างกัน
หมายเหตุ: คุณยังสามารถใช้คอนโซล Amazon S3 เพื่อตรวจสอบบัคเก็ตและ
เจ้าของวัตถุ พบเจ้าของได้ในแท็บสิทธิ์ของ
ถังหรือวัตถุที่เกี่ยวข้อง
ทำตามขั้นตอนเหล่านี้เพื่อเปลี่ยนเจ้าของวัตถุเป็นเจ้าของบัคเก็ต:
- จากบัญชีเจ้าของวัตถุ ให้รันคำสั่งนี้เพื่อดึงสิทธิ์ ACL ที่กำหนดให้กับวัตถุ:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
- หากออบเจ็กต์มีสิทธิ์ ACL ที่ควบคุมโดยเจ้าของที่ฝากข้อมูล ให้ข้ามไปยังขั้นตอนที่ #3 ถ้าวัตถุไม่มี
สิทธิ์ ACL ที่ควบคุมทั้งหมดของถังเจ้าของถัง จากนั้นเรียกใช้คำสั่งนี้จาก
บัญชีของเจ้าของวัตถุ:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
- จากบัญชีเจ้าของบัคเก็ต ให้รันคำสั่งนี้เพื่อเปลี่ยนเจ้าของอ็อบเจกต์โดยการคัดลอกอ็อบเจกต์ทับตัวเอง:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
วัตถุที่ร้องขอต้องมีอยู่ในบัคเก็ต หากผู้ใช้ไม่มีสิทธิ์ s3:ListBucket ผู้ใช้นั้นจะถูกปฏิเสธการเข้าถึง
ข้อผิดพลาดสำหรับวัตถุที่หายไปแทนข้อผิดพลาด 404 ไม่พบ เรียกใช้
คำสั่ง AWS CLI ของ head-object เพื่อตรวจสอบว่ามีวัตถุอยู่ในไฟล์
ถัง.
บันทึก: ยืนยันว่าคำขอวัตถุที่ส่งไปยัง CloudFront ตรงกับชื่อวัตถุ S3 ทุกประการ ชื่อวัตถุ S3 คำนึงถึงขนาดตัวพิมพ์ ถ้า
คำขอไม่มีชื่อออบเจกต์ที่ถูกต้อง จากนั้น Amazon S3 จะตอบกลับ
ราวกับว่าวัตถุนั้นหายไป เพื่อระบุวัตถุ CloudFront
กำลังร้องขอจาก Amazon S3 ให้ใช้การบันทึกการเข้าถึงเซิร์ฟเวอร์
หากวัตถุมีอยู่ในบัคเก็ต แสดงว่าไม่มีข้อผิดพลาด Access Denied
กำบังข้อผิดพลาด 404 ไม่พบ. ตรวจสอบข้อกำหนดการกำหนดค่าอื่นๆ เพื่อแก้ไขข้อผิดพลาด Access Denied
หากวัตถุไม่อยู่ในบัคเก็ต แสดงว่ามีข้อผิดพลาด Access Denied
กำบังข้อผิดพลาด 404 ไม่พบ. แก้ไขปัญหาที่เกี่ยวข้องกับวัตถุที่หายไป
บันทึก: ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในการรักษาความปลอดภัยในการเปิดใช้งานการเข้าถึง s3:ListBucket สาธารณะ การเปิดใช้งานการเข้าถึง s3:ListBucket สาธารณะจะอนุญาต
ผู้ใช้เพื่อดูและแสดงรายการวัตถุทั้งหมดในถัง สิ่งนี้เปิดเผยวัตถุ
รายละเอียดข้อมูลเมตา (เช่น คีย์และขนาด) ให้กับผู้ใช้แม้ว่า
ผู้ใช้ไม่มีสิทธิ์ในการดาวน์โหลดวัตถุ
ต้องปิดใช้งาน Amazon S3 Block Public Access บนบัคเก็ต ยืนยันว่าไม่มีการตั้งค่า Amazon S3 Block Public Access
นำไปใช้กับถัง การตั้งค่าเหล่านี้สามารถลบล้างสิทธิ์ที่
อนุญาตให้เข้าถึงการอ่านสาธารณะ การตั้งค่า Amazon S3 Block Public Access สามารถ
ใช้กับแต่ละบัคเก็ตหรือบัญชี AWS
หากเปิดใช้งานการจ่ายเงินของผู้ร้องขอ คำขอจะต้องมี
พารามิเตอร์ผู้จ่ายคำขอ หากผู้ร้องขอจ่ายถูกเปิดใช้งานบนบัคเก็ต ดังนั้น
ไม่อนุญาตให้เข้าถึงบัคเก็ตโดยไม่ระบุชื่อ ผู้ใช้จากที่อื่น
บัญชีต้องระบุพารามิเตอร์ผู้ขอจ่ายเมื่อส่ง
ร้องขอไปยังถัง มิฉะนั้น ผู้ใช้เหล่านั้นจะถูกปฏิเสธการเข้าถึง
ข้อผิดพลาด.
หากคุณใช้ส่วนหัวผู้อ้างอิงเพื่อจำกัดการเข้าถึงจาก CloudFront เป็น
ต้นกำเนิด S3 ของคุณ จากนั้นตรวจสอบส่วนหัวที่กำหนดเอง หากคุณกำลังใช้
ส่วนหัวอ้างอิงเพื่อจำกัดการเข้าถึงจาก CloudFront ไปยังเว็บไซต์ S3 ของคุณ
จุดต้นทาง ให้ตรวจสอบค่าลับหรือโทเค็นที่ตั้งบนบัคเก็ต S3
นโยบาย. จากนั้น ยืนยันว่าค่าลับหรือโทเค็นตรงกับค่า
บนส่วนหัวที่กำหนดเองของ CloudFront ต้นทาง
หากคุณใช้คำสั่งปฏิเสธที่ชัดเจนในนโยบายบัคเก็ต
ยืนยันว่ายังมีคำสั่งอนุญาตที่ให้สิทธิ์การเข้าถึงตาม
บนส่วนหัวผู้อ้างอิง คุณไม่สามารถให้สิทธิ์การเข้าถึงได้อย่างชัดเจนเท่านั้น
ปฏิเสธคำสั่ง
ตัวอย่างเช่นนโยบายฝากข้อมูลต่อไปนี้ให้สิทธิ์การเข้าถึงต้นทาง S3 เมื่อคำขอมีสตริง
"aws:ผู้อ้างอิง":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER":
{
"เวอร์ชั่น":"2012-10-17",
"รหัส":"ตัวอย่างนโยบายอ้างอิง http",
"คำแถลง":[
{
"Sid":"อนุญาตให้รับคำขอที่มาจาก CloudFront ของฉันด้วยส่วนหัวผู้อ้างอิง",
"ผล":"อนุญาต",
"อาจารย์ใหญ่":"*",
"การกระทำ":"s3:GetObject",
"ทรัพยากร":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"เงื่อนไข":{
"StringLike":{"aws:ผู้อ้างอิง":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
}
}
]
}
ด้วยนโยบายบัคเก็ตตัวอย่างนี้ ส่วนหัวที่กำหนดเองจาก CloudFront
ต้องเป็น:
- หัวข้อ: ผู้อ้างอิง
- ค่า: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
บันทึก:
นโยบายบัคเก็ตตัวอย่างให้สิทธิ์สาธารณะ (ไม่ระบุตัวตน) ในการเข้าถึง
bucket เนื่องจาก Principal เป็นค่าไวด์การ์ด ("Principal":"*")
อย่างไรก็ตาม เนื่องจากคำสั่งเงื่อนไข การเข้าถึงต้นกำเนิด S3
จะได้รับก็ต่อเมื่อคำขอมีส่วนหัวผู้อ้างอิงและ
ค่าส่วนหัวตรงกับค่าในนโยบายที่ฝากข้อมูล