Block การเข้าถึงที่ไม่ผ่าน Amazon CloudFront ด้วยวิธีง่ายๆ

CloudFront ได้รับการสนับสนุนโดย Managed Prefix List ทำให้ง่ายต่อการบล็อกการเข้าถึงจากแหล่งภายนอกโดยไม่คาดคิดที่ไม่ผ่าน CloudFront ซึ่ง load จะเพิ่มขึ้นโดยถูกเข้าถึงต้นทางโดยตรง เราก็สามารถปิดกั้นการเข้าถึงที่ไม่ผ่าน AWS WAF ได้อย่างง่ายดายครับ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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)

AWS IP address ranges

วิธีที่ 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) ครับ !

Link อ้างอิง