0Pricing
Cloud & IT Cert Prep · บทเรียน

การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL

เขียนนโยบายบักเก็ต เปรียบเทียบนโยบายเหล่านี้กับ ACL และกำหนดค่าการบล็อกการเข้าถึงสาธารณะเพื่อการโฮสต์ที่ปลอดภัย

การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL เป็นบทเรียน Cloud & IT Cert Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cloud & IT Cert Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมการควบคุมการเข้าถึง S3

S3 มีกลไกการควบคุมการเข้าถึงหลายแบบที่ทับซ้อนกัน: IAM policy (อิงตามตัวตน ควบคุมสิ่งที่ principal ทำได้), bucket policy (JSON policy ที่อิงตามทรัพยากรบน bucket), Access Control List (ACL) (การให้สิทธิ์แยกตามอ็อบเจ็กต์/bucket แบบเดิม) และ S3 Block Public Access (การแทนที่ระดับบัญชีหรือ bucket ที่บล็อกการเข้าถึงแบบสาธารณะทั้งหมด ไม่ว่านโยบายอื่นจะกำหนดไว้เช่นไร) สำหรับกรณีใช้งานส่วนใหญ่ในปัจจุบัน แนวทางที่แนะนำคือ bucket policy ร่วมกับ Block Public Access—ACL ถือเป็นรูปแบบเดิม

นโยบายบักเก็ต: JSON ที่อิงตามทรัพยากร

นโยบายบักเก็ตคือเอกสาร JSON ที่แนบโดยตรงกับบักเก็ต S3 โดยระบุว่าตัวการใดบ้าง (ผู้ใช้ IAM, บทบาท, บัญชี AWS, บริการ หรือสาธารณะ) สามารถดำเนินการใดกับทรัพยากรใด (บักเก็ตและ/หรือคำนำหน้าคีย์ที่ระบุ) นโยบายบักเก็ตรองรับการเข้าถึงข้ามบัญชีโดยไม่จำเป็นต้องใช้บทบาท IAM คุณสามารถมอบสิทธิ์การอ่านออบเจ็กต์ที่ระบุในบักเก็ตโดยตรงผ่านนโยบายบักเก็ตให้กับบทบาท IAM ของบัญชี AWS อื่นได้ แต่ละบักเก็ตมีนโยบายได้หนึ่งรายการ และมีขนาดสูงสุด 20 KB

# Allow a specific IAM role from another account to read objects
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': {
      'AWS': 'arn:aws:iam::999999999999:role/PartnerReadRole'
    },
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-bucket/partner-data/*'
  }]
}

ทำให้ออบเจ็กต์อ่านได้แบบสาธารณะ

หากต้องการให้บริการเนื้อหาสาธารณะ (เช่น สินทรัพย์ของเว็บไซต์แบบสแตติกหรือชุดข้อมูลสาธารณะ) คุณสามารถทำให้ออบเจ็กต์อ่านได้แบบสาธารณะผ่านนโยบายบักเก็ต ขั้นแรกให้ปิดใช้ Block Public Access ในระดับบักเก็ต จากนั้นเพิ่มคำสั่งในนโยบายบักเก็ตโดยใช้ Principal: '*' และ Action: s3:GetObject การปิดใช้การตั้งค่า Block Public Access และการใช้ Allow ใน​​นโยบายบักเก็ตต้องทำร่วมกัน—หากเปิดใช้เพียงอย่างใดอย่างหนึ่งจะไม่ทำงาน ควรกำหนดขอบเขตของ Resource ให้เป็นคำนำหน้าที่ระบุ แทนการใช้ทั้งบักเก็ต เว้นแต่คุณตั้งใจให้ออบเจ็กต์ทั้งหมดเป็นสาธารณะ

# Public read policy for static website assets
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': '*',
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-website-bucket/public/*'
  }]
}

การตั้งค่า S3 Block Public Access

S3 Block Public Access เป็นกลไกป้องกันที่มีการตั้งค่าสี่รายการ ซึ่งมีผลเหนือกว่านโยบายบักเก็ตและ ACLs ได้แก่ BlockPublicAcls (ปฏิเสธคำขอให้ตั้งค่า ACLs แบบสาธารณะ), IgnorePublicAcls (ไม่สนใจ ACLs แบบสาธารณะที่มีอยู่), BlockPublicPolicy (ปฏิเสธนโยบายบักเก็ตที่อนุญาตการเข้าถึงแบบสาธารณะ) และ RestrictPublicBuckets (จำกัดการเข้าถึงตามนโยบายสาธารณะ) การตั้งค่าทั้งสี่รายการเปิดใช้เป็นค่าเริ่มต้น คุณยังสามารถเปิดใช้ Block Public Access ในระดับบัญชี ซึ่งจะบล็อกการเข้าถึงสำหรับบักเก็ตทั้งหมดโดยไม่คำนึงถึงการตั้งค่าของแต่ละบักเก็ต เหมาะอย่างยิ่งสำหรับป้องกันการเปิดเผยข้อมูลต่อสาธารณะโดยไม่ตั้งใจ

# Enable all Block Public Access settings on a bucket
aws s3api put-public-access-block \
  --bucket my-private-bucket \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

รายการควบคุมการเข้าถึง (ACLs): แบบดั้งเดิม

S3 ACLs เป็นกลไกควบคุมการเข้าถึงดั้งเดิมที่มีมาก่อน IAM ACL จะมอบสิทธิ์ที่กำหนดไว้ล่วงหน้า (READ, WRITE, FULL_CONTROL) ให้แก่บัญชี AWS หรือกลุ่มที่กำหนดไว้ล่วงหน้า (ผู้ใช้ทั้งหมด ผู้ใช้ AWS ที่ผ่านการยืนยันตัวตน และการส่งบันทึก) สามารถใช้ ACL ในระดับบักเก็ตหรือในระดับออบเจ็กต์แต่ละรายการได้ ปัจจุบัน AWS แนะนำให้ปิดใช้ ACLs (การตั้งค่า S3 'Bucket Owner Enforced' ทำให้เจ้าของบักเก็ตเป็นเจ้าของออบเจ็กต์ทั้งหมดและปิดใช้ ACLs) แล้วใช้นโยบายบักเก็ตและ IAM แทน ACLs ยังคงเป็นแนวคิดแบบดั้งเดิมที่ออกสอบใน SAA-C03

# Disable ACLs by setting ownership to BucketOwnerEnforced
aws s3api put-bucket-ownership-controls \
  --bucket my-bucket \
  --ownership-controls '{"Rules":[{"ObjectOwnership":"BucketOwnerEnforced"}]}'

การควบคุมการเข้าถึงต้นทางสำหรับ CloudFront

เมื่อให้บริการเนื้อหา S3 ผ่าน CloudFront คุณต้องการให้บักเก็ตเป็นส่วนตัว แต่ให้ CloudFront ดึงออบเจ็กต์ได้ ให้ใช้ Origin Access Control (OAC) ซึ่งเป็นสิ่งทดแทนสมัยใหม่ของ Origin Access Identity (OAI) OAC จะสร้างข้อมูลระบุตัวตนของ CloudFront ที่คุณมอบสิทธิ์ s3:GetObject ให้ในนโยบายบักเก็ต พร้อมคงการเปิดใช้ Block Public Access ไว้ ด้วยวิธีนี้ ผู้ใช้จะต้องเข้าถึงผ่าน CloudFront (เพื่อใช้การแคช, WAF และ HTTPS) และจะไม่สามารถเข้าถึงบักเก็ตโดยตรงได้ ซึ่งเป็นรูปแบบสถาปัตยกรรมที่ปลอดภัยและมักออกสอบใน SAA-C03

# Bucket policy granting CloudFront OAC access
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': {
      'Service': 'cloudfront.amazonaws.com'
    },
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-bucket/*',
    'Condition': {
      'StringEquals': {
        'AWS:SourceArn': 'arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE'
      }
    }
  }]
}

การเข้าถึง S3 ข้ามบัญชี

มีสองวิธีในการมอบสิทธิ์ให้บัญชี AWS อื่นเข้าถึงบักเก็ต S3 ของคุณ ตัวเลือกที่ 1 — นโยบายบักเก็ต: เพิ่มคำสั่งที่ใช้ ARN ของบัญชีภายนอกเป็น Principal และระบุการดำเนินการ S3 ที่ต้องการ ผู้ใช้หรือบทบาท IAM ของบัญชีภายนอกยังคงต้องมีสิทธิ์ IAM เพื่อเรียกใช้ S3 และนโยบายบักเก็ตต้อง Allow ให้สิทธิ์ดังกล่าวด้วย ตัวเลือกที่ 2 — บทบาท IAM พร้อมนโยบายความน่าเชื่อถือ: สร้างบทบาทในบัญชีของคุณที่ไว้วางใจบัญชีภายนอก จากนั้นข้อมูลระบุตัวตนของบัญชีภายนอกจะรับบทบาทนั้นและได้รับสิทธิ์ของบักเก็ตของคุณ นโยบายบักเก็ตเหมาะกว่าและง่ายกว่าสำหรับกรณีอ่านอย่างเดียว ส่วนบทบาทเหมาะกว่าสำหรับการเข้าถึงเพื่อปฏิบัติงาน

การกำหนดค่า CORS สำหรับแอปพลิเคชันเว็บ

Cross-Origin Resource Sharing (CORS) ช่วยให้แอปพลิเคชันเว็บที่โฮสต์อยู่บนโดเมนหนึ่งส่งคำขอเรียกข้อมูล JavaScript ไปยังบักเก็ต S3 ที่อยู่บนอีกโดเมนหนึ่งได้ หากไม่มีการกำหนดค่า CORS เบราว์เซอร์จะบล็อกคำขอเหล่านี้ด้วยเหตุผลด้านความปลอดภัย คุณเพิ่มการกำหนดค่า CORS ให้กับบักเก็ตเพื่อระบุต้นทางที่อนุญาต วิธี HTTP และส่วนหัวที่อนุญาต โดยทั่วไปจำเป็นต้องใช้ CORS เมื่อ SPA ของ React ที่โฮสต์บน example.com ดึงรูปภาพหรือไฟล์จาก URL ของบักเก็ต S3 โดยตรง

# Apply a CORS configuration
aws s3api put-bucket-cors \
  --bucket my-website-bucket \
  --cors-configuration '{"CORSRules":[{"AllowedOrigins":["https://example.com"],"AllowedMethods":["GET"],"AllowedHeaders":["*"],"MaxAgeSeconds":3600}]}'

URL ที่ลงลายเซ็นล่วงหน้าสำหรับการเข้าถึงชั่วคราว

URL ที่ลงลายเซ็นล่วงหน้ามอบสิทธิ์เข้าถึงออบเจ็กต์ S3 ส่วนตัวแบบจำกัดเวลา (สำหรับ GET หรือ PUT) โดยไม่เปลี่ยนสิทธิ์ของบักเก็ตหรือออบเจ็กต์ URL นี้ฝังข้อมูลรับรองและเวลาหมดอายุไว้ ผู้ที่มี URL จะสามารถเข้าถึงออบเจ็กต์ได้จนกว่า URL จะหมดอายุ ใช้ URL ที่ลงลายเซ็นล่วงหน้าเพื่อให้ผู้ใช้ที่ผ่านการยืนยันตัวตนในแอปดาวน์โหลดไฟล์ส่วนตัว อนุญาตให้ไคลเอ็นต์อัปโหลดไปยัง S3 โดยตรงโดยไม่ต้องผ่านส่วนหลังของระบบ หรือแชร์รายงานเป็นการชั่วคราว เวลาหมดอายุสามารถอยู่ในช่วงตั้งแต่ 1 วินาทีถึง 7 วัน (เมื่อใช้ข้อมูลรับรองชั่วคราวของ STS ค่าสูงสุดคือ 12 ชั่วโมง)

# Generate a pre-signed GET URL valid for 24 hours
aws s3 presign s3://my-private-bucket/reports/invoice.pdf \
  --expires-in 86400

# Generate a pre-signed PUT URL (for client uploads)
aws s3 presign s3://my-private-bucket/uploads/new-file.pdf \
  --expires-in 3600 \
  --method PUT

เงื่อนไขนโยบายบักเก็ตเพื่อความปลอดภัย

ใช้เงื่อนไขของนโยบายบักเก็ตเพื่อเพิ่มความปลอดภัยตามบริบท รูปแบบที่พบบ่อย ได้แก่ aws:SourceIp ซึ่งจำกัดการเข้าถึงให้เฉพาะช่วง IP ที่ระบุ (เช่น ปลายทาง VPC หรือเครือข่ายองค์กร); aws:SecureTransport: true ซึ่งบังคับใช้ HTTPS โดยปฏิเสธคำขอผ่าน HTTP (แนวทางปฏิบัติที่ดีสำหรับบักเก็ตทั้งหมดที่จัดเก็บข้อมูลสำคัญ); s3:x-amz-server-side-encryption ซึ่งกำหนดให้ออบเจ็กต์ต้องอัปโหลดด้วยการเข้ารหัสฝั่งเซิร์ฟเวอร์; และ aws:PrincipalOrgID ซึ่งจำกัดการเข้าถึงให้เฉพาะตัวการภายในองค์กร AWS ของคุณ เพื่อป้องกันการนำข้อมูลออกไปยังบัญชีภายนอก

# Deny non-HTTPS access to the bucket
{
  'Effect': 'Deny',
  'Principal': '*',
  'Action': 's3:*',
  'Resource': [
    'arn:aws:s3:::my-secure-bucket',
    'arn:aws:s3:::my-secure-bucket/*'
  ],
  'Condition': {
    'Bool': {'aws:SecureTransport': 'false'}
  }
}

ปลายทาง S3 VPC สำหรับการเข้าถึงแบบส่วนตัว

โดยค่าเริ่มต้น อินสแตนซ์ EC2 ในเครือข่ายย่อยส่วนตัวจะเข้าถึง S3 ผ่านอินเทอร์เน็ต (ผ่านเกตเวย์ NAT) ทำให้เกิดค่าใช้จ่าย NAT และทำให้การรับส่งข้อมูลเปิดออกสู่อินเทอร์เน็ตสาธารณะ ปลายทางเกตเวย์ S3 ให้การเชื่อมต่อส่วนตัวไปยัง S3 จากภายใน VPC โดยไม่ต้องใช้เกตเวย์ NAT และไม่มีค่าใช้จ่ายเพิ่มเติม คุณเพิ่มปลายทางเกตเวย์ลงในตารางเส้นทาง แล้วการรับส่งข้อมูลไปยัง S3 จะถูกกำหนดเส้นทางผ่านเครือข่ายส่วนตัวของ AWS โดยอัตโนมัติ นอกจากนี้ยังสามารถเพิ่มเงื่อนไขนโยบายบักเก็ตโดยใช้ aws:SourceVpce เพื่อจำกัดการเข้าถึงให้เฉพาะคำขอที่มาจากปลายทางนี้เท่านั้น

# Create an S3 gateway endpoint and associate with route tables
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-12345678 \
  --service-name com.amazonaws.us-east-1.s3 \
  --route-table-ids rtb-12345678

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิด AWS Solutions Architect (SAA-C03) จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า นโยบายบักเก็ตเป็นเอกสาร JSON ที่อิงตามทรัพยากรและควบคุมการเข้าถึง S3 ข้ามบัญชีและผ่านบริการ S3 Block Public Access เป็นกลไกป้องกันที่มีผลเหนือกว่าและช่วยป้องกันการเปิดเผยข้อมูลต่อสาธารณะโดยไม่ตั้งใจ และ URL ที่ลงลายเซ็นล่วงหน้า ปลายทาง VPC และการกำหนดค่า CORS ช่วยรองรับรูปแบบการเข้าถึงเฉพาะด้านอย่างปลอดภัย บทถัดไปจะกล่าวถึงการทำเวอร์ชันของ S3, MFA Delete และการทำสำเนา

คำถามที่พบบ่อย

บทเรียน “การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cloud & IT Cert Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL”

เขียนนโยบายบักเก็ต เปรียบเทียบนโยบายเหล่านี้กับ ACL และกำหนดค่าการบล็อกการเข้าถึงสาธารณะเพื่อการโฮสต์ที่ปลอดภัย คุณปฏิบัติ Cloud & IT Cert Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cloud & IT Cert Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cloud & IT Cert Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Cloud & IT Cert Prep นี้ได้ไหม

ได้ บทเรียน Cloud & IT Cert Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. บักเก็ต ออบเจ็กต์ และรีเจียน
  2. การควบคุมการเข้าถึง S3: นโยบายบักเก็ตและ ACL
  3. การกำหนดเวอร์ชัน การลบด้วย MFA และการจำลองแบบ
  4. คลาสพื้นที่จัดเก็บและนโยบายวงจรชีวิต
← กลับไปที่ Cloud & IT Cert Prep