Amazon S3 Security
เจาะลึก Encryption, CORS, MFA Delete, Pre-Signed URLs, Access Points และ Object Lambda สำหรับ DVA-C02
01ภาพรวม S3 Encryption (4 วิธี + Client-Side)
Amazon S3 รองรับการเข้ารหัส object ได้หลายวิธี โดยแบ่งเป็น Server-Side Encryption (SSE) ที่ S3 เข้ารหัสให้ฝั่ง server และ Client-Side Encryption ที่ client เข้ารหัสเองก่อนส่งขึ้น S3 จุดที่ต้องจำคือ ตั้งแต่เดือนมกราคม 2023 เป็นต้นมา S3 จะเข้ารหัส object ใหม่ทุกชิ้นด้วย SSE-S3 เป็นค่า default โดยอัตโนมัติ
- SSE-S3 — S3-Managed Keys: S3 จัดการ key ให้เองด้วย AES-256 (ค่า default ปัจจุบัน)
- SSE-KMS — AWS KMS-Managed Keys: ควบคุม key เองและ audit การใช้งานผ่าน CloudTrail
- DSSE-KMS — Dual-layer Server-Side Encryption with KMS: เข้ารหัส 2 ชั้น
- SSE-C — Customer-Provided Keys: ลูกค้าส่ง encryption key มาเองในแต่ละ request
- Client-Side Encryption — เข้ารหัสฝั่ง client เองก่อน upload (ใช้ Amazon S3 Client-Side Encryption Library)
02เจาะลึก SSE-S3, SSE-KMS, DSSE-KMS
x-amz-server-side-encryption: AES256 ไม่ต้องดูแล key เอง แต่ก็ควบคุม/audit การใช้ key ไม่ได้aws:kms ข้อควรระวัง: ทุกครั้งที่ upload/download จะเรียก KMS API ซึ่งมี quota และอาจโดน throttling03SSE-C และ Client-Side Encryption
| วิธี | ใครจัดการ Key | Header / ตำแหน่งเข้ารหัส | จุดเด่น |
|---|---|---|---|
| SSE-S3 | AWS (S3) | x-amz-server-side-encryption: AES256 | default, ง่ายที่สุด |
| SSE-KMS | ลูกค้า + KMS | aws:kms | control + audit ผ่าน CloudTrail |
| DSSE-KMS | ลูกค้า + KMS | aws:kms:dsse | เข้ารหัส 2 ชั้น (compliance) |
| SSE-C | ลูกค้า (ส่งมาเอง) | key ใน HTTP header ต้อง HTTPS | S3 ไม่เก็บ key |
| Client-Side | ลูกค้า (ฝั่ง client) | เข้ารหัสก่อน upload | S3 ไม่เห็นข้อมูลจริง |
04Default Encryption & การบังคับเข้ารหัสด้วย Bucket Policy
เราสามารถตั้ง Default Encryption ที่ระดับ bucket ได้ ซึ่งจะเข้ารหัส object ใหม่อัตโนมัติ แต่ถ้าต้องการ บังคับ (enforce) ให้ทุก object ต้องเข้ารหัสด้วยวิธีที่กำหนด หรือป้องกันไม่ให้ upload object ที่ไม่เข้ารหัส ต้องใช้ Bucket Policy
- ลำดับการประเมิน: Bucket Policy ถูกประเมิน ก่อน Default Encryption setting
- ใช้ policy แบบ Deny PutObject ถ้า header การเข้ารหัสไม่ตรงเงื่อนไข
- เงื่อนไขใช้ key เช่น
s3:x-amz-server-side-encryptionหรือs3:x-amz-server-side-encryption-aws-kms-key-id - บังคับ SSE-C ได้ด้วยการเช็ค
s3:x-amz-server-side-encryption-customer-algorithm
"AES256" หรือถ้าต้องการ deny request ที่ไม่ระบุ header เลย สามารถใช้ Null condition กับ key s3:x-amz-server-side-encryption ได้05S3 CORS (Cross-Origin Resource Sharing)
CORS เป็นกลไกความปลอดภัยของ web browser ที่อนุญาตให้ request ไปยัง origin อื่นได้ตามที่กำหนด Origin ประกอบด้วย scheme (protocol) + host (domain) + port การร้องขอข้าม origin (cross-origin) จะถูก browser บล็อกเว้นแต่ origin ปลายทางจะอนุญาตผ่าน CORS headers
- ถ้า web app ที่ origin หนึ่งเรียก file จาก S3 ที่อีก origin หนึ่ง ต้องตั้งค่า CORS ที่ S3 bucket ปลายทาง (cross-origin bucket)
- Browser จะส่ง preflight OPTIONS request เพื่อถามก่อนว่า origin นี้ได้รับอนุญาตไหม
- S3 ตอบกลับด้วย header เช่น Access-Control-Allow-Origin, Access-Control-Allow-Methods
- ตั้งค่า CORS เป็น JSON (รูปแบบใหม่) หรือ XML (รูปแบบเดิม)
06S3 MFA Delete & S3 Access Logs
07S3 Pre-Signed URLs
Pre-Signed URL คือ URL ชั่วคราวที่สร้างขึ้นเพื่อให้ผู้รับ download หรือ upload object ได้โดย สืบทอดสิทธิ์ (permissions) ของผู้สร้าง URL มีอายุจำกัด (expiration) ใช้สำหรับให้สิทธิ์ชั่วคราวแก่ผู้ที่ไม่มี AWS credentials
- ผู้ที่ได้ pre-signed URL จะมี สิทธิ์เท่ากับ IAM principal ที่สร้าง URL สำหรับ GET หรือ PUT นั้น
- กำหนด expiration ได้: ผ่าน S3 Console = 1 นาที ถึง 12 ชั่วโมง, ผ่าน CLI/SDK = สูงสุด 168 ชั่วโมง (7 วัน)
- Use case: ให้เฉพาะ user ที่ login แล้วดาวน์โหลดไฟล์จาก bucket ที่ private, ให้ user อัปโหลดไฟล์ไปยัง path ที่กำหนด, ให้ดาวน์โหลด premium content ชั่วคราว
- สร้างได้ด้วย AWS SDK หรือ CLI
08S3 Access Points
S3 Access Points ช่วยให้จัดการ access control ของ bucket ขนาดใหญ่ที่มีหลาย use case ได้ง่ายขึ้น แทนที่จะมี bucket policy เดียวที่ซับซ้อนมาก เราสร้าง access point แยกตาม use case โดยแต่ละ access point มี DNS name และ policy ของตัวเอง
- แต่ละ access point มี own access point policy (คล้าย bucket policy) จัดการง่ายในระดับขนาดใหญ่
- ตัวอย่าง: access point หนึ่งให้สิทธิ์ R/W ที่ prefix /finance อีกอันให้ R/W ที่ /sales
- มี DNS name เฉพาะ (Internet origin หรือ VPC origin)
- VPC Origin: จำกัดให้เข้าถึง access point ได้จากภายใน VPC เท่านั้น ต้องสร้าง VPC Endpoint เพื่อเข้าถึง และ VPC Endpoint Policy ต้องอนุญาตการเข้าถึง target bucket + access point
09S3 Object Lambda
S3 Object Lambda ใช้ AWS Lambda function เพื่อ แปลงข้อมูลของ object ตอนที่ถูกเรียก (GET/HEAD/LIST) ก่อนส่งกลับไปยัง application โดยใช้ข้อมูลจริงเพียงชุดเดียวใน S3 แต่ให้แต่ละ application เห็นมุมมองข้อมูลที่ต่างกันได้ ทำงานร่วมกับ S3 Access Point เสมอ
- ต้องสร้าง S3 Access Point ก่อน แล้วสร้าง Object Lambda Access Point ที่ชี้ไปยัง access point นั้น
- Use case: redact ข้อมูลส่วนบุคคล (PII) สำหรับ analytics, convert รูปแบบไฟล์ (XML→JSON), resize/watermark รูปภาพแบบ on-the-fly, เติมข้อมูลจากฐานข้อมูลอื่น
- ข้อดี: ไม่ต้องเก็บข้อมูลหลายชุด (single source of truth) ลดการทำ derivative copies
10สรุปประเด็นออกสอบ (Exam Cram)
Keywords ที่ต้องจำเพื่อแยกคำตอบ
- Default + ง่ายสุด = SSE-S3 (AES256)
- ต้องการ audit ใครใช้ key / control key = SSE-KMS
- KMS throttling / 503 SlowDown = เปิด S3 Bucket Key
- compliance double encryption = DSSE-KMS
- ลูกค้าส่ง key เองทุก request + HTTPS = SSE-C
- ให้สิทธิ์ชั่วคราว download/upload ใช้ permission ผู้สร้าง = Pre-Signed URL (CLI/SDK ได้สูงสุด 7 วัน)
- Browser cross-origin error เรียกไฟล์จากอีก bucket = ตั้ง CORS ที่ bucket ปลายทาง
- ป้องกันลบถาวร + ปิด versioning = MFA Delete (root + CLI เท่านั้น, ต้องเปิด versioning ก่อน)
- จัดการ access หลาย use case บน bucket ใหญ่ + VPC only = S3 Access Points
- แปลง/redact/resize ข้อมูลตอน GET = S3 Object Lambda
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ Amazon S3 Security
20 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.บริษัทต้องการตรวจสอบ (audit) ได้ว่าใครเรียกใช้ encryption key เพื่อถอดรหัส object ใน S3 เมื่อไหร่ และต้องการควบคุม key rotation เอง ควรใช้วิธีเข้ารหัสแบบใด
2.Application เก็บ object เข้ารหัสด้วย SSE-KMS และมี traffic การ GET/PUT สูงมาก เริ่มเจอ error ThrottlingException จาก KMS ควรแก้ไขอย่างไรให้กระทบน้อยที่สุด
3.ลูกค้าต้องการให้ S3 ไม่จัดเก็บ encryption key เลย และจะส่ง key มาเองในทุก request ข้อใดถูกต้องเกี่ยวกับ SSE-C
4.Web application ที่ host บน https://app.example.com พยายามโหลดไฟล์ JavaScript จาก S3 bucket อีกตัว แต่ browser แสดง CORS error ควรแก้ไขที่ใด
5.ต้องการบังคับให้ทุก object ที่ upload เข้า bucket ต้องเข้ารหัสด้วย SSE-KMS เท่านั้น ถ้าไม่ระบุให้ปฏิเสธ ควรทำอย่างไร
6.ต้องการให้ผู้ใช้ที่ไม่มี AWS credentials สามารถ download ไฟล์ private จาก S3 ได้ชั่วคราวเป็นเวลา 2 ชั่วโมง โดยใช้สิทธิ์ของ application ควรใช้สิ่งใด
7.ระยะเวลาหมดอายุสูงสุดของ S3 Pre-Signed URL ที่สร้างผ่าน AWS SDK/CLI คือเท่าใด
8.ข้อใดเป็นข้อกำหนดของการเปิดใช้งาน S3 MFA Delete
9.องค์กรต้องการให้ analytics team เห็นข้อมูลที่ถูกลบ PII ออก ขณะที่ team อื่นเห็นข้อมูลเต็ม โดยใช้ object เดียวกันใน S3 และไม่ต้องการเก็บสำเนาหลายชุด ควรใช้บริการใด
10.Bucket ขนาดใหญ่มีหลาย use case (finance, sales) ต้องการให้แต่ละทีมมี policy การเข้าถึงเฉพาะ prefix ของตน และบางทีมเข้าถึงได้จาก VPC เท่านั้น ควรใช้สิ่งใด
11.header ใดที่ต้องระบุเมื่อต้องการ upload object โดยใช้ SSE-S3 อย่างชัดเจน
12.บริษัทมีข้อกำหนด compliance ที่ต้องการเข้ารหัสข้อมูลแบบสองชั้น (double-layer) โดยใช้ KMS ควรใช้วิธีใด
13.เมื่อตั้งค่า S3 Access Logs ควรตั้ง target bucket (bucket ที่เก็บ log) อย่างไร
14.ข้อใดอธิบาย Client-Side Encryption ได้ถูกต้องที่สุด
15.Pre-Signed URL ที่สร้างโดย IAM user ที่มีสิทธิ์ GetObject จะให้ผู้รับ URL ทำอะไรได้
16.เมื่อต้องการเข้าถึง S3 Access Point ที่ตั้งค่าเป็น VPC origin จาก resource ภายใน VPC ต้องมีสิ่งใด
17.ลำดับการประเมินระหว่าง Bucket Policy และ Default Encryption setting เป็นอย่างไรเมื่อ object ถูก upload
18.ตั้งแต่เดือนมกราคม 2023 S3 เข้ารหัส object ใหม่ทุกชิ้นด้วยวิธีใดเป็นค่า default
19.browser ส่ง request แบบใดก่อนทำ cross-origin request จริงเพื่อตรวจว่า origin ได้รับอนุญาตหรือไม่
20.use case ใดเหมาะสมที่สุดสำหรับ S3 Object Lambda