Block การเข้าถึงที่ไม่ผ่าน Amazon CloudFront ด้วยวิธีง่ายๆ
POP จากบริษัท Classmethod (Thailand) ครับ (ผู้เขียนบทความแปลภาษาญี่ปุ่นนี้)
ครั้งนี้ผมจะมาเขียนบทความ Block การเข้าถึงที่ไม่ผ่าน Amazon CloudFront ด้วยวิธีง่ายๆ
บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า 【アップデート】Amazon CloudFront を経由しないアクセスのブロックが簡単になりました ซึ่งเจ้าของบทความนี้ก็คือ คุณ 大栗 หรือ โอกุริ เป็นคนญี่ปุ่นครับ
เนื่องจากว่าบทความนี้แปลมาจากภาษาญี่ปุ่น เมื่อแปลมาเป็นภาษาไทยแล้วผมได้เรียบเรียงเนื้อหาใหม่เพื่อให้เข้าใจง่ายขึ้นครับ
ผม โอกุริ ชอบวิสกี้, ซิการ์ และไปป์ ครับ
IP Address ของ CloudFront ได้รับการสนับสนุนโดย Managed Prefix List ที่อัปเดตล่าสุด ทำให้สามารถป้องกันการเข้าถึงโดยไม่ได้รับอนุญาตที่ไม่ผ่าน CloudFront ได้อย่างง่ายดาย แนะนำให้ใช้สำหรับบริการที่มักจะใช้ CloudFront เช่น CMS เป็นต้น นอกจากนี้ ยังสามารถปิดกั้นการเข้าถึงทางอ้อมในกรณีที่ปรับปรุงความปลอดภัยโดยใช้ AWS WAF ด้วย CloudFront ได้
Amazon CloudFront now supports a managed prefix list
การเข้าถึงที่ไม่ผ่าน CloudFront
ในกรณีที่บังคับให้เข้าถึงผ่าน CloudFront ใน AWS ได้เท่านั้น จะได้รับการตรวจสอบค่านั้นด้วย ALB หรือ Web server โดยทำการอนุญาต custom header ใน CloudFront
Configuring CloudFront to add a custom HTTP header to requests
อย่างไรก็ตาม การสาธิตนี้จำเป็นต้องเก็บ custom header name กับ value เป็นความลับตามที่ได้มีการอธิบายไว้ใน document ด้านล่างนี้
สำคัญ
กรณีการใช้งานนี้ ได้ทำการรักษาความลับของ custom header name กับ value ไว้ หาก header name กับ value ไม่เป็นความลับ HTTP Client อื่นๆ อาจรวม header name หรือ value ใน request ที่ส่งไปยัง Application Load Balancer โดยตรง แล้วตอนที่ไม่ได้ส่ง request อาจทำให้ Application Load Balancer ดำเนินการเหมือนกับว่าส่ง request มาจาก CloudFront เพื่อป้องกันสิ่งนี้ ให้เก็บ custom header name กับ value ไว้เป็นความลับ
อีกวิธีหนึ่งคือการตรวจสอบ CIDR ของ IP Address ของ CloudFront และก็จะมีวิธีบล็อกส่วนที่เหลือด้วย security group แต่การ maintenance นั้นทำได้ยาก เนื่องจากมี CIDR จำนวนมาก และมีความผันผวนที่ไม่สม่ำเสมอ
(CIDR ของ CloudFront ณ วันที่ 8 กุมภาพันธ์ 2022 คือ 131)
วิธีที่ 1 มีการจำกัดบริการที่สามารถรองรับได้ เนื่องจากจำเป็นต้องตัดสินใจของ L7 เพื่อใช้ custom header
วิธีที่ 2 จะมีค่าบริการ maintenance (ถ้าทำให้เป็นอัตโนมัติได้ก็จะดีมากเลย แต่ว่ามันยุ่งยากน่ะครับ)
ซึ่งเราไม่จำเป็นต้อง maintenance ฝั่ง user เนื่องจาก CloudFront เป็นหัวข้อใน Managed Prefix List ที่ทาง AWS ได้ทำการ maintenance ให้ จึงทำให้สามารถใช้ฟังก์ชันได้มากมาย เช่น security groups และ route tables AWS Firewall Manager เป็นต้น
ขั้นตอน
เปิดคอนโซล Amazon VPC แล้วเลือกManaged Prefix Lists
จากนั้นเปลี่ยน Region ที่เราต้องการใช้งาน เช่นSingapore
เลือกที่com.amazonaws.global.cloudfront.origin-facing
จะเห็นว่า Prefix list ID เป็นpl-31a34658
ซึ่งเป็นสิ่งที่ถูกกำหนดไว้ในแต่ละ Region ร่วมกันโดยข้ามบัญชี
เมื่อคลิกแท็บ Entries แล้ว CIDR ที่มีการลงทะเบียนไว้ก็จะแสดงขึ้นมา ซึ่งhttps://ip-ranges.amazonaws.com/ip-ranges.json
มีCLOUDFRONT
ที่แตกต่างกัน 131 แบบ หรือว่าอาจจะมีการลงทะเบียนใน Managed Prefix List โดยจำกัด Regional edge cache ที่เข้าถึงไปยังฝั่งเซิร์ฟเวอร์
ผมได้เตรียม CloudFront กับ EC2 ไว้เป็นที่เรียบร้อยแล้ว งั้นมาลองทำกันโดยให้ตั้งค่าตามนี้
ทำการตั้งค่า Inbound rule ใน security group
เนื่องจากเราจะเข้าถึง EC2 ด้วย HTTP ก็ให้ตั้งค่า Type เป็นHTTP
เมื่อเลือก Source แล้ว Prefix list name จะแสดงที่ด้านล่างสุด แล้วเลือกที่ list ของ CloudFront
EC2 นี้ได้ทำการ Run Command ตามด้านล่างนี้เตรียมไว้แล้ว
ติดตั้ง Apache HTTP Server และ PHP
$ sudo yum install -y httpd php
เนื่องจากผมต้องการดูข้อมูลในขณะที่เข้าถึง ดังนั้นผมจะสร้างหน้าเว็บที่จะแสดงผลลัพธ์ของphpinfo()
$ cat << EOF | sudo tee /var/www/html/index.php > <?php > phpinfo(INFO_VARIABLES); > EOF
Start Apache HTTP Serve
$ sudo systemctl start httpd
ตรวจสอบว่าสามารถเข้าถึง http ด้วย port 80 ได้
$ curl http://127.0.0.1:80/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head> <style type="text/css"> ・ ・ ・
ตั้งค่า CloudFront โดยดูจากบทความด้านล่างนี้
ผมจะลองทำการเข้าถึงดังนี้
ก่อนอื่นจะทำการเข้าถึงโดยผ่าน CloudFront ก็จะสามารถเข้าถึงได้ตามปกติ ส่วนREMOTE_ADDR
คือแหล่งการเข้าถึงของฝั่ง CloudFront มี Value เป็น64.252.103.182
นี่คือช่วงของ CIDR:64.252.64.0/18
ของ entry ใน Managed Prefix List ซึ่ง origin ของการเข้าถึงปลายทางก็จะเป็นec2-54-255-18-174.ap-southeast-1.compute.amazonaws.com
งั้น เรามาลองเข้าถึงec2-54-255-18-174.ap-southeast-1.compute.amazonaws.com
โดยตรงด้วย origin ดูครับ จะเห็นว่าไม่ได้รับการอนุญาตให้เข้าถึงใน security group เหมือนกับรูปภาพด้านล่างนี้
สุดท้ายนี้
CloudFront คือการนำมาใช้เพื่อเพิ่มความเร็วในการเข้าถึงและลด load ของ origin แต่เมื่อมีการเข้าถึง origin โดยตรง ก็จะทำให้ load ของ origin เพิ่มขึ้น ดังนั้นการบล็อกการเข้าถึงจากภายนอกโดยไม่ผ่าน CloudFront จึงมีความสำคัญมาก จนถึงตอนนี้ วิธีการเพิ่ม load ของ resource และ load ของ maintenance ก็ได้ถูกนำมาใช้แล้ว แต่ด้วยการรองรับ Managed Prefix List ในครั้งนี้ จึงทำให้สามารถบล็อกโดยการตั้งค่าได้อย่างง่ายดาย ดังนั้นผมหวังว่าผู้ที่ใช้ CloudFront จะสามารถใช้งานได้อย่างมีประสิทธิภาพครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP จากบริษัท Classmethod (Thailand) ครับ !