1. บทนำ
Google Cloud Load Balancing จะได้รับการติดตั้งใช้งานที่ขอบของเครือข่าย Google ในจุดแสดงตัวตน (POP) ของ Google ทั่วโลก การเข้าชมของผู้ใช้ที่นำไปยังตัวจัดสรรภาระงานพร็อกซี TCP จะเข้าสู่ POP ที่ใกล้ผู้ใช้มากที่สุด จากนั้นระบบจะจัดสรรภาระงานผ่านเครือข่ายทั่วโลกของ Google ไปยังแบ็กเอนด์ที่ใกล้ที่สุดซึ่งมีความจุเพียงพอ
Cloud Armor คือระบบตรวจจับการปฏิเสธการให้บริการแบบกระจายและไฟร์วอลล์สำหรับเว็บแอปพลิเคชัน (WAF) ของ Google Cloud Armor ทำงานร่วมกับตัวจัดสรรภาระงาน TCP Proxy ของ Google Cloud อย่างใกล้ชิด และช่วยให้คุณตรวจสอบการรับส่งข้อมูลขาเข้าเพื่อหาคำขอที่ไม่ต้องการได้ ฟีเจอร์การจำกัดอัตราคำขอของบริการนี้ช่วยให้คุณลดการรับส่งข้อมูลไปยังแบ็กเอนด์ตามปริมาณคำขอ และป้องกันไม่ให้การรับส่งข้อมูลที่ไม่พึงประสงค์ใช้ทรัพยากรในเครือข่าย Virtual Private Cloud (VPC)
ตัวจัดสรรภาระงานพร็อกซี TCP/SSL ของ Google Cloud ช่วยให้คุณพร็อกซีการรับส่งข้อมูลประเภท TCP/ SSL ระหว่างบริการแบ็กเอนด์ได้
ใน Codelab นี้ คุณจะได้สร้างตัวจัดสรรภาระงานพร็อกซี TCP/SSL ที่มีบริการแบ็กเอนด์ และใช้ Cloud Armor เพื่อจำกัดการเข้าถึงตัวจัดสรรภาระงานให้เฉพาะไคลเอ็นต์ของผู้ใช้บางกลุ่มเท่านั้น

สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างตัวจัดสรรภาระงานพร็อกซี TCP/SSL
- วิธีสร้างนโยบายความปลอดภัยของ Cloud Armor
- วิธีสร้างกฎรายการ IP ที่ปฏิเสธสำหรับตัวจัดสรรภาระงานพร็อกซี TCP/SSL ใน Cloud Armor
- วิธีสร้างกฎการจำกัดอัตราคำขอสำหรับตัวจัดสรรภาระงานพร็อกซี TCP ใน Cloud Armor
- วิธีเพิ่มนโยบายความปลอดภัยลงในบริการแบ็กเอนด์การจัดสรรภาระงาน TCP/SSL
สิ่งที่คุณต้องมี
- ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( โค้ดแล็บ)
- ความรู้พื้นฐานด้านเครือข่ายและ TCP/IP
- ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
- การทัวร์ชมระบบเครือข่ายใน GCP ด้วยระบบเครือข่ายใน Google Cloud จะช่วยให้คุณเข้าใจได้ดียิ่งขึ้น
2. ข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
หมายเหตุ: คุณเข้าถึง Cloud Console ได้ง่ายๆ โดยจำ URL ซึ่งก็คือ console.cloud.google.com



โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนถูกใช้ไปแล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
หมายเหตุ: หากใช้บัญชี Gmail คุณจะปล่อยให้ตำแหน่งเริ่มต้นเป็น "ไม่มีองค์กร" ได้ หากใช้บัญชี Google Workspace ให้เลือกสถานที่ตั้งที่เหมาะสมกับองค์กร
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในห้องทดลองนี้ได้โดยใช้เพียงเบราว์เซอร์
ก่อนเริ่มต้น
ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์ใน Cloud Shell แล้ว
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
เปิดใช้ API
เปิดใช้บริการทั้งหมดที่จำเป็น
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. สร้างบริการแบ็กเอนด์
สร้างอินสแตนซ์ 2 รายการดังนี้ - สร้างอินสแตนซ์1-b1 ในโซน us-central1-b
gcloud compute instances create vm-1-b1 \
--image-family debian-9 \
--image-project debian-cloud \
--tags tcp-lb \
--zone us-central1-b \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
sudo service apache2 restart
echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html
EOF"
สร้างอินสแตนซ์ 1-b2 ในโซน us-central1-b
gcloud compute instances create vm-1-b2 \
--image-family debian-9 \
--image-project debian-cloud \
--tags tcp-lb \
--zone us-central1-b \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
sudo service apache2 restart
echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html
EOF"
สร้างกลุ่มอินสแตนซ์ vm-ig1
gcloud compute instance-groups unmanaged create vm-ig1 --zone us-central1-b
สร้างพอร์ตที่มีชื่อสำหรับกลุ่มอินสแตนซ์ สำหรับแล็บนี้ เราจะใช้พอร์ต 110
gcloud compute instance-groups set-named-ports vm-ig1 \ --named-ports tcp 110:110 --zone us-central1-b
เพิ่มอินสแตนซ์ลงในกลุ่มอินสแตนซ์
gcloud compute instance-groups unmanaged add-instances vm-ig1 \ --instances vm-1-b1,vm-1-b2 --zone us-central1-b
4. การกำหนดค่าตัวจัดสรรภาระงาน
จากนั้นเราจะสร้างการตรวจสอบประสิทธิภาพการทำงาน
gcloud compute health-checks create tcp my-tcp-health-check --port 110
สร้างบริการแบ็กเอนด์
gcloud compute backend-services create my-tcp-lb --global-health-checks --global \ --protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110
เพิ่มกลุ่มอินสแตนซ์ลงในบริการแบ็กเอนด์
gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8
กำหนดค่าพร็อกซี TCP เป้าหมาย
gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE
สำรองที่อยู่ IPv4 แบบคงที่ส่วนกลาง
คุณจะใช้ที่อยู่ IP นี้เพื่อเข้าถึงบริการที่โหลดบาลานซ์
gcloud compute addresses create tcp-lb-static-ipv4 --ip-version=IPV4 --global
กำหนดค่ากฎการส่งต่อร่วมสำหรับที่อยู่ IP ของ LB
gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
--global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110
5. การสร้างกฎไฟร์วอลล์สำหรับตัวจัดสรรภาระงานพร็อกซี TCP
gcloud compute firewall-rules create allow-tcplb-and-health \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --target-tags tcp-lb \ --allow tcp:110
เมื่อสร้างตัวจัดสรรภาระงานแล้ว ให้ทดสอบด้วยคำสั่งต่อไปนี้
Curl LB_IP:110
จากนั้นสร้าง VM เพื่อตรวจสอบการปฏิเสธการเข้าถึง LB
คุณควรสร้างอินสแตนซ์ 2 รายการ โดยแต่ละรายการมีที่อยู่ IP สาธารณะและตั้งชื่อเป็น test-server1 และ test-server2
6. สร้างนโยบายความปลอดภัยใน Cloud Armor
ในส่วนนี้ คุณจะสร้างนโยบายความปลอดภัยของแบ็กเอนด์และกฎ 2 ข้อในนโยบายใน Cloud Armor
กฎแรกจะปฏิเสธ IP บางชุดไม่ให้เข้าถึงตัวจัดสรรภาระงาน TCP โดยการตั้งค่านโยบายความปลอดภัยเพื่อปฏิเสธ IP บางรายการ และกฎที่ 2 จะจำกัดอัตราคำขอ
- ใน Cloud Shell(ดูวิธีการใช้ Cloud Shell ในส่วน "เริ่มต้น Cloud Shell" ภายใต้ "การตั้งค่าและข้อกำหนด") ให้สร้างนโยบายความปลอดภัยของบริการแบ็กเอนด์ชื่อ rate-limit-and-deny-tcp ดังนี้
gcloud compute security-policies create rate-limit-and-deny-tcp \
--description "policy for tcp proxy rate limiting and IP deny"
เพิ่มกฎไปยังนโยบายความปลอดภัย
จากนั้นเพิ่มกฎรายการที่ไม่อนุญาตไปยังนโยบาย Cloud Armor "rate-limit-and-deny-tcp"
gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"
เพิ่มกฎการจำกัดอัตราคำขอลงในนโยบายความปลอดภัยของ Cloud Armor "rate-limit-and-deny-tcp"
gcloud compute security-policies rules create 3000 \ --security-policy=rate-limit-and-deny-tcp \ --expression="true" --action=rate-based-ban --rate-limit-threshold-count=5 \ --rate-limit-threshold-interval-sec=60 --ban-duration-sec=300 \ --conform-action=allow --exceed-action=deny-404 --enforce-on-key=IP
แนบนโยบายกับบริการแบ็กเอนด์ของพร็อกซี TCP
เรียกใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่าได้แนบนโยบายความปลอดภัยกับบริการแบ็กเอนด์ของพร็อกซี TCP แล้ว
gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp
เปิดใช้การบันทึกในตัวจัดสรรภาระงาน TCP Proxy
gcloud beta compute backend-services update my-tcp-lb \ --enable-logging --logging-sample-rate=1
7. ตรวจสอบกฎรายการที่ถูกปฏิเสธ
ตรวจสอบกฎรายการที่ถูกปฏิเสธโดยเข้าสู่ระบบเซิร์ฟเวอร์ทดสอบที่มีการระบุ IP ในกฎรายการที่ถูกปฏิเสธ แล้วเรียกใช้คำสั่งต่อไปนี้
Curl LB_IP:110
คำขอทันทีอาจให้การตอบกลับจาก LB แต่ให้รอจนกว่าคำขอ curl จะถูกปฏิเสธหรือถูกทิ้ง แล้วดูบันทึกใน Cloud Logging เพื่อยืนยันรายการบันทึกสำหรับกฎการปฏิเสธ IP ที่ทริกเกอร์
ไปที่ Cloud Logging แล้วเลือกประเภททรัพยากรเป็น "tcp_ssl_proxy_rule" ในส่วนทรัพยากร และตั้งค่าเป้าหมายแบ็กเอนด์เป็น "my-tcp-lb"
เมื่อกำหนดทรัพยากรสำหรับการกรองแล้ว เราจะตรวจสอบได้ว่ากฎการปฏิเสธ IP มีผลจากค่า PRIORITY ที่ 1000 ในรายการบันทึก และการดำเนินการที่กำหนดค่า "ปฏิเสธ" มีผลเนื่องจากทั้ง 2 รายการได้รับคำสั่งจากกฎการปฏิเสธและ IP ที่ถูกปฏิเสธดังที่แสดงด้านล่าง

8. ตรวจสอบกฎการจำกัดอัตราคำขอ
ตรวจสอบว่ากฎการจำกัดอัตรามีผลใช้งานโดยการส่งคำขอจำนวนมากในช่วงเวลาสั้นๆ ซึ่งเกินเกณฑ์ที่กำหนด (5 คำขอต่อนาที)
เมื่อดำเนินการเสร็จแล้ว ให้คลิกดูบันทึกในบริการ Cloud Armor ซึ่งจะนำคุณไปยัง Cloud Logging ที่คุณสามารถกรองบันทึกตามตัวจัดสรรภาระงานเพื่อดูบันทึก Cloud Armor เมื่อเข้ามา
รายการจำกัดอัตราคำขอควรเป็นไปตามภาพหน้าจอด้านล่าง เราสามารถตรวจสอบได้ว่ากฎการจำกัดอัตราคำขอมีผลจากค่าลำดับความสำคัญ 3000 ในรายการบันทึก และจากการดำเนินการที่กำหนดค่าไว้ การดำเนินการ"แบนตามอัตรา" มีผลตามที่ระบุไว้ในกฎการจำกัดอัตราคำขอ

9. การทำความสะอาดสภาพแวดล้อม
อย่าลืมล้างข้อมูลโครงสร้างพื้นฐานที่สร้างขึ้นเพื่อหลีกเลี่ยงค่าใช้จ่ายในการใช้งานโครงสร้างพื้นฐานที่ไม่ได้ใช้
วิธีที่เร็วที่สุดคือการลบทั้งโปรเจ็กต์ใน GCP เพื่อให้แน่ใจว่าไม่มีทรัพยากรที่ไม่ได้ใช้เหลืออยู่ อย่างไรก็ตาม คุณสามารถลบทรัพยากรแต่ละรายการได้ด้วยคำสั่งต่อไปนี้
ตัวจัดสรรภาระงาน TCP Proxy
gcloud compute target-tcp-proxies delete my-tcp-lb
กลุ่มอินสแตนซ์
gcloud compute instance-groups unmanaged delete vm-ig1
สร้างอินสแตนซ์ VM ทดสอบ 2 รายการแล้ว
gcloud compute instances delete Instance_name --zone=instance_zone
บริการแบ็กเอนด์
gcloud compute backend-services delete BACKEND_SERVICE_NAME
กฎ Cloud Armor ภายในนโยบาย
gcloud compute security-policies rules delete 1000 \ --security-policy=rate-limit-and-deny-tcp && gcloud compute security-policies rules delete 3000 \ --security-policy=rate-limit-and-deny-tcp
นโยบายความปลอดภัยของ Cloud Armor
gcloud compute security-policies delete rate-limit-and-deny-tcp