Cloud Armor และตัวจัดสรรภาระงานพร็อกซี TCP/SSL - การจำกัดอัตราและรายการการปฏิเสธ IP Codelab

1. บทนำ

การจัดสรรภาระงานของ Google Cloud ใช้งานได้ที่ขอบของเครือข่ายของ Google ในจุดแสดงตัวตน (POP) ของ Google ทั่วโลก การรับส่งข้อมูลของผู้ใช้ซึ่งส่งไปยังตัวจัดสรรภาระงานของพร็อกซี TCP จะป้อน POP ที่ใกล้กับผู้ใช้มากที่สุด จากนั้นจะมีการจัดสรรภาระงานผ่านเครือข่ายทั่วโลกของ Google ไปยังแบ็กเอนด์ที่ใกล้ที่สุดที่มีความจุเพียงพอ

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

ตัวจัดสรรภาระงานพร็อกซี TCP/SSL ของ Google Cloud ช่วยให้คุณสามารถพร็อกซีการจราจรของข้อมูลประเภท TCP/ SSL ในบริการแบ็กเอนด์ของคุณ

ใน Codelab นี้ คุณจะสร้างตัวจัดสรรภาระงานพร็อกซี TCP/SSL พร้อมบริการแบ็กเอนด์และใช้ Cloud Armor เพื่อจำกัดการเข้าถึงตัวจัดสรรภาระงานสำหรับชุดไคลเอ็นต์ผู้ใช้ที่เฉพาะเจาะจงเท่านั้น

be33dadf836374bb.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างตัวจัดสรรภาระงานพร็อกซี TCP/SSL
  • วิธีสร้างนโยบายความปลอดภัยของ Cloud Armor
  • วิธีสร้างกฎรายการปฏิเสธ IP สำหรับตัวจัดสรรภาระงานพร็อกซี TCP/SSL ใน Cloud Armor
  • วิธีสร้างกฎการจำกัดอัตราสำหรับตัวจัดสรรภาระงานพร็อกซี TCP ใน Cloud Armor
  • วิธีเพิ่มนโยบายความปลอดภัยในบริการแบ็กเอนด์การจัดสรรภาระงาน TCP/SSL

สิ่งที่ต้องมี

  • ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( codelab)
  • ความรู้เกี่ยวกับเครือข่ายและ TCP/IP ขั้นพื้นฐาน
  • ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
  • การสำรวจเครือข่ายใน GCP ด้วยการสร้างเครือข่ายใน Google Cloud จะเป็นประโยชน์อย่างมาก

2. ข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

หมายเหตุ: คุณเข้าถึง Cloud Console ได้ง่ายๆ โดยจดจำ URL ของ Cloud Console ซึ่งก็คือconsole.cloud.google.com

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) โดยจะเรียกใน Codelab ว่า PROJECT_ID ในภายหลัง

หมายเหตุ: หากคุณใช้บัญชี Gmail คุณอาจปล่อยให้การตั้งค่าตำแหน่งเริ่มต้นเป็น "ไม่มีองค์กร" ได้ หากคุณใช้บัญชี Google Workspace ให้เลือกสถานที่ที่เหมาะกับองค์กรของคุณ

  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้

จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบนดังนี้

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ใช้งานได้ต่อเนื่องและทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานทั้งหมดใน Lab นี้สามารถทำได้โดยใช้เบราว์เซอร์

ก่อนเริ่มต้น

ตรวจสอบว่าตั้งค่ารหัสโปรเจ็กต์ใน 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

สร้างพอร์ตที่ระบุชื่อสำหรับกลุ่มอินสแตนซ์ สำหรับ Lab นี้ เราจะใช้พอร์ต 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 จะดำเนินการจำกัดอัตรา

  1. ใน 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

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 ในรายการบันทึก และการดำเนินการที่กำหนดค่าไว้ "DENY" ก็มีผลตามคำสั่งทั้ง 2 อย่างจากกฎการปฏิเสธและ IP ที่ถูกปฏิเสธดังที่แสดงด้านล่าง

db9b835e0360dcaf.png

8. ตรวจสอบกฎการจำกัดอัตรา

ตรวจสอบความถูกต้องของกฎขีดจำกัดอัตราที่มีผลบังคับใช้อยู่โดยส่งคำขอหลายรายการในกรอบเวลาสั้นๆ ซึ่งเกินเกณฑ์ที่กำหนดไว้ (5 คำขอต่อนาที)

เมื่อดำเนินการเสร็จแล้ว ให้คลิกมุมมองบันทึกในบริการ Cloud Armor แล้วระบบจะนำคุณไปยังการบันทึกในระบบคลาวด์ ซึ่งคุณจะกรองบันทึกตามตัวจัดสรรภาระงานเพื่อดูบันทึกของ Cloud Arm ได้เมื่อมีข้อมูลเข้ามา

รายการการจำกัดอัตราควรมีรูปแบบตามภาพหน้าจอด้านล่าง เราสามารถตรวจสอบว่ากฎขีดจำกัดอัตรามีผลจากค่า PRIORITY ที่ 3, 000 ในรายการบันทึก และจากการดำเนินการที่กำหนดค่าไว้ การดำเนินการ "BAN โดยอิงตามอัตรา" จะมีผลตามคำแนะนำจากกฎการจำกัดอัตราดังกล่าว

37c76e5d7532623.png

9. การล้างข้อมูลสภาพแวดล้อม

อย่าลืมทำความสะอาดโครงสร้างพื้นฐานที่สร้างขึ้นเพื่อหลีกเลี่ยงค่าใช้จ่ายของโครงสร้างพื้นฐานที่ไม่ได้ใช้

วิธีที่เร็วที่สุดคือการลบทั้งโปรเจ็กต์ใน GCP เพื่อให้มั่นใจว่าไม่มีทรัพยากรที่อันตรายเหลืออยู่โดยที่ไม่ต้องดำเนินการใดๆ อย่างไรก็ตาม ให้ลบทรัพยากรแต่ละรายการด้วยคำสั่งต่อไปนี้

ตัวจัดสรรภาระงานพร็อกซี TCP

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