1. บทนำ
สวัสดี ยินดีต้อนรับสู่ Codelab ของกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าของ Cloud Armor
Google Cloud Armor เป็นโซลูชันด้านความปลอดภัยของเครือข่าย Edge ระดับองค์กรของ Google ที่ให้การป้องกัน DDoS, การบังคับใช้กฎ WAF และความสามารถในการจัดการแบบปรับตัวได้ในวงกว้าง
Cloud Armor ได้ขยายชุดกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อลดช่องโหว่ด้านความปลอดภัยของเว็บแอปพลิเคชันในรายการความเสี่ยงด้านความปลอดภัย 10 อันดับสูงสุดของ OWASP ชุดกฎอิงตาม OWASP Modsecurity Core Rule Set เวอร์ชัน 3.0.2 เพื่อป้องกันความเสี่ยงด้านความปลอดภัยของเว็บแอปพลิเคชันที่พบบ่อยที่สุดบางอย่าง ซึ่งรวมถึงการรวมไฟล์ในเครื่อง (LFI), การรวมไฟล์จากระยะไกล (RFI), การเรียกใช้โค้ดจากระยะไกล (RCE) และอื่นๆ อีกมากมาย
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีลดช่องโหว่ที่พบบ่อยบางอย่างโดยใช้กฎ WAF ของ Google Cloud Armor
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่ากลุ่มอินสแตนซ์และตัวจัดสรรภาระงานส่วนกลางเพื่อรองรับบริการ
- วิธีกำหนดค่านโยบายความปลอดภัยของ Cloud Armor ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อป้องกัน LFI, RCE, สแกนเนอร์, การโจมตีโปรโตคอล และการยึดเซสชัน
- วิธีตรวจสอบว่า Cloud Armor ลดผลกระทบจากการโจมตีโดยการดูบันทึก
สิ่งที่คุณต้องมี
- ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( โค้ดแล็บ)
- ความรู้พื้นฐานด้านเครือข่ายและ TCP/IP
- ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
- การทัวร์เครือข่ายใน GCP ด้วยเครือข่ายใน Google Cloud จะช่วยให้คุณเข้าใจได้ดียิ่งขึ้น
- (ไม่บังคับ) ทำแล็บ Cloudnet20 Cloud Armor ให้เสร็จสมบูรณ์เพื่อเรียนรู้วิธีปกป้องภาระงานด้วยกฎการแทรก SQL, กฎที่อิงตาม IP และกฎที่อิงตามภูมิศาสตร์
โทโพโลยีและกรณีการใช้งาน Codelab

รูปที่ 1 - โทโพโลยีของ Codelab กฎ WAF ของ Cloud Armor
แอปพลิเคชัน OWASP Juice Shop มีประโยชน์สำหรับการฝึกอบรมและสร้างความตระหนักด้านความปลอดภัย เนื่องจากมีตัวอย่างของช่องโหว่ด้านความปลอดภัยแต่ละรายการในรายการความเสี่ยงด้านความปลอดภัย 10 อันดับสูงสุดของ OWASP ตามที่ออกแบบไว้ ผู้โจมตีสามารถใช้ช่องโหว่นี้เพื่อวัตถุประสงค์ในการทดสอบได้ ใน Codelab นี้ เราจะใช้เพื่อสาธิตการโจมตีแอปพลิเคชันบางอย่าง จากนั้นจะปกป้องแอปพลิเคชันด้วยกฎ WAF ของ Cloud Armor แอปพลิเคชันจะอยู่หน้าตัวจัดสรรภาระงานของ Google Cloud ซึ่งจะใช้นโยบายและกฎความปลอดภัยของ Cloud Armor โดยจะแสดงบนอินเทอร์เน็ตสาธารณะ จึงเข้าถึงได้จากเกือบทุกที่ และได้รับการปกป้องโดยใช้ Cloud Armor และกฎไฟร์วอลล์ VPC
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน 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. สร้างเครือข่าย VPC
สร้างเครือข่าย VPC
จาก Cloud Shell
gcloud compute networks create ca-lab-vpc --subnet-mode custom
เอาต์พุต
Created NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 ca-lab-vpc CUSTOM REGIONAL
สร้างซับเน็ต
จาก Cloud Shell
gcloud compute networks subnets create ca-lab-subnet \
--network ca-lab-vpc --range 10.0.0.0/24 --region us-central1
เอาต์พุต
Created NAME REGION NETWORK RANGE ca-lab-subnet us-central1 ca-lab-vpc 10.0.0.0/24
สร้างกฎไฟร์วอลล์ VPC
หลังจากสร้าง VPC และเครือข่ายย่อยแล้ว ตอนนี้คุณจะตั้งค่ากฎไฟร์วอลล์ 2-3 ข้อ กฎไฟร์วอลล์แรกจะใช้เพื่ออนุญาตให้ IP ทั้งหมดเข้าถึง IP ภายนอกของเว็บไซต์แอปพลิเคชันทดสอบในพอร์ต 3000 กฎไฟร์วอลล์ที่ 2 จะใช้เพื่ออนุญาตการตรวจสอบประสิทธิภาพการทำงานจาก IP ต้นทางของตัวจัดสรรภาระงาน
จาก Cloud Shell
gcloud compute firewall-rules create allow-js-site --allow tcp:3000 --network ca-lab-vpc
เอาต์พุต
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-js-site ca-lab-vpc INGRESS 1000 tcp:3000 False
สร้างกฎ FW เพื่ออนุญาตการตรวจสอบประสิทธิภาพการทำงานจากช่วงการตรวจสอบประสิทธิภาพการทำงานของ Google
จาก Cloud Shell
gcloud compute firewall-rules create allow-health-check \
--network=ca-lab-vpc \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-healthcheck \
--rules=tcp
เอาต์พุต
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-health-check ca-lab-vpc INGRESS 1000 tcp False
4. ตั้งค่าแอปพลิเคชันทดสอบ
ขั้นตอนถัดไปคือการสร้างแอปพลิเคชันทดสอบ ในกรณีนี้คือเว็บเซิร์ฟเวอร์ OWASP Juice Shop
เมื่อสร้างอินสแตนซ์ Compute เราจะใช้อิมเมจคอนเทนเนอร์เพื่อให้แน่ใจว่าเซิร์ฟเวอร์มีบริการที่เหมาะสม เซิร์ฟเวอร์นี้จะได้รับการติดตั้งใช้งานใน us-central1-c และจะมีแท็กเครือข่ายที่อนุญาตให้ตรวจสอบประสิทธิภาพการทำงาน
สร้างแอปพลิเคชัน OWASP Juice Shop
ใช้แอปพลิเคชัน OWASP Juice Shop แบบโอเพนซอร์สที่รู้จักกันดีเพื่อใช้เป็นแอปพลิเคชันที่มีช่องโหว่ นอกจากนี้ คุณยังใช้แอปพลิเคชันนี้เพื่อทำโจทย์ความท้าทายด้านความปลอดภัยของ OWASP ผ่านเว็บไซต์ได้ด้วย
จาก Cloud Shell
gcloud compute instances create-with-container owasp-juice-shop-app --container-image bkimminich/juice-shop \
--network ca-lab-vpc \
--subnet ca-lab-subnet \
--private-network-ip=10.0.0.3 \
--machine-type n1-standard-2 \
--zone us-central1-c \
--tags allow-healthcheck
เอาต์พุต
NAME ZONE MACHINE_TYPE PREEMPTIBLE owasp-juice-shop-app us-central1-c n1-standard-2 INTERNAL_IP EXTERNAL_IP STATUS 10.0.0.3 <public IP> RUNNING
ตั้งค่าคอมโพเนนต์ของ Cloud Load Balancer: กลุ่มอินสแตนซ์
สร้างกลุ่มอินสแตนซ์ที่ไม่มีการจัดการ
จาก Cloud Shell
gcloud compute instance-groups unmanaged create juice-shop-group \
--zone=us-central1-c
เอาต์พุต
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES juice-shop-group us-central1-c zone 0
เพิ่มอินสแตนซ์ GCE ของ Juice Shop ลงในกลุ่มอินสแตนซ์ที่ไม่มีการจัดการ
จาก Cloud Shell
gcloud compute instance-groups unmanaged add-instances juice-shop-group \
--zone=us-central1-c \
--instances=owasp-juice-shop-app
เอาต์พุต
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
ตั้งค่าพอร์ตที่มีชื่อเป็นพอร์ตของแอปพลิเคชัน Juice Shop
จาก Cloud Shell
gcloud compute instance-groups unmanaged set-named-ports \ juice-shop-group \ --named-ports=http:3000 \ --zone=us-central1-c
เอาต์พุต
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
ตอนนี้คุณได้สร้างกลุ่มอินสแตนซ์ที่ไม่มีการจัดการแล้ว ขั้นตอนถัดไปคือการสร้างการตรวจสอบประสิทธิภาพการทำงาน บริการแบ็กเอนด์ แมป URL พร็อกซีเป้าหมาย และกฎการส่งต่อ
ตั้งค่าคอมโพเนนต์ตัวจัดสรรภาระงานของ Cloud: การตรวจสอบประสิทธิภาพการทำงาน
สร้างการตรวจสอบประสิทธิภาพการทำงานสำหรับพอร์ตบริการ Juice Shop
จาก Cloud Shell
gcloud compute health-checks create tcp tcp-port-3000 \
--port 3000
เอาต์พุต
Created NAME PROTOCOL tcp-port-3000 TCP
ตั้งค่าคอมโพเนนต์ของตัวจัดสรรภาระงานบนระบบคลาวด์: บริการแบ็กเอนด์
สร้างพารามิเตอร์บริการแบ็กเอนด์
จาก Cloud Shell
gcloud compute backend-services create juice-shop-backend \
--protocol HTTP \
--port-name http \
--health-checks tcp-port-3000 \
--enable-logging \
--global
เอาต์พุต
NAME BACKENDS PROTOCOL juice-shop-backend HTTP
เพิ่มกลุ่มอินสแตนซ์ Juice Shop ลงในบริการแบ็กเอนด์
จาก Cloud Shell
gcloud compute backend-services add-backend juice-shop-backend \
--instance-group=juice-shop-group \
--instance-group-zone=us-central1-c \
--global
เอาต์พุต
Updated [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/backendServices/juice-shop-backend].
ตั้งค่าคอมโพเนนต์ของตัวจัดสรรภาระงาน Cloud: แมป URL
สร้างแผนที่ URL เพื่อส่งไปยังแบ็กเอนด์
จาก Cloud Shell
gcloud compute url-maps create juice-shop-loadbalancer \
--default-service juice-shop-backend
เอาต์พุต
NAME DEFAULT_SERVICE juice-shop-loadbalancer backendServices/juice-shop-backend
ตั้งค่าคอมโพเนนต์ของ Cloud Load Balancer: พร็อกซีเป้าหมาย
สร้างพร็อกซีเป้าหมายเพื่อเป็นส่วนหน้าของแมป URL
จาก Cloud Shell
gcloud compute target-http-proxies create juice-shop-proxy \
--url-map juice-shop-loadbalancer
เอาต์พุต
NAME URL_MAP juice-shop-proxy juice-shop-loadbalancer
ตั้งค่าคอมโพเนนต์ของ Cloud Load Balancer: กฎการส่งต่อ
สร้างกฎการส่งต่อสำหรับ Load Balancer
จาก Cloud Shell
gcloud compute forwarding-rules create juice-shop-rule \
--global \
--target-http-proxy=juice-shop-proxy \
--ports=80
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/forwardingRules/juice-shop-rule].
ตรวจสอบว่าบริการ Juice Shop ออนไลน์อยู่
จาก Cloud Shell
PUBLIC_SVC_IP="$(gcloud compute forwarding-rules describe juice-shop-rule --global --format="value(IPAddress)")"
จาก Cloud Shell
echo $PUBLIC_SVC_IP
เอาต์พุต
<public VIP of service>
โปรดรอสักครู่ก่อนดำเนินการต่อ ไม่เช่นนั้นคุณอาจได้รับคำตอบ HTTP/1.1 404 ไม่พบ
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP
เอาต์พุต
HTTP/1.1 200 OK <...>
นอกจากนี้ คุณยังไปที่เบราว์เซอร์เพื่อดู Juice Shop ได้ด้วย

ตอนนี้เราพร้อมที่จะสำรวจช่องโหว่ของ Juice Shop และวิธีป้องกันช่องโหว่เหล่านั้นด้วยชุดกฎ WAF ของ Cloud Armor แล้ว
5. แสดงให้เห็นถึงช่องโหว่ที่ทราบ
เพื่อประหยัดเวลา เราจะสาธิตสถานะก่อนและหลังการเผยแพร่กฎ WAF ของ Cloud Armor ในขั้นตอนที่กระชับ
สังเกตช่องโหว่ LFI: Path Traversal
การรวมไฟล์ในเครื่องคือกระบวนการสังเกตไฟล์ที่อยู่ในเซิร์ฟเวอร์โดยใช้ประโยชน์จากการขาดการตรวจสอบอินพุตในคำขอเพื่อเปิดเผยข้อมูลที่ละเอียดอ่อน ต่อไปนี้เป็นเพียงการแสดงให้เห็นว่าการข้ามเส้นทางเป็นไปได้ ในเบราว์เซอร์หรือด้วย curl ให้สังเกตเส้นทางที่มีอยู่ซึ่งแอปพลิเคชันแสดง
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp
เอาต์พุต
HTTP/1.1 200 OK <...>
และสังเกตว่าการข้ามผ่านเส้นทางก็ใช้ได้เช่นกัน
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp/../
เอาต์พุต
HTTP/1.1 200 OK <...>
สังเกตช่องโหว่ RCE
การดำเนินการโค้ดจากระยะไกลรวมถึงสถานการณ์การแทรกคำสั่งต่างๆ ของ UNIX และ Windows ซึ่งอนุญาตให้ผู้โจมตีดำเนินการคำสั่งของระบบปฏิบัติการที่โดยปกติแล้วจะจำกัดไว้สำหรับผู้ใช้ที่มีสิทธิ์ ต่อไปนี้แสดงการเรียกใช้คำสั่ง ls แบบง่ายที่ส่งเข้ามา
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
เอาต์พุต
HTTP/1.1 200 OK <...>
คุณสามารถนำแฟล็ก curl ออกเพื่อดูเอาต์พุตทั้งหมดได้
สังเกตการเข้าถึงของสแกนเนอร์ที่รู้จักกันดี
ทั้งแอปพลิเคชันสแกนเชิงพาณิชย์และโอเพนซอร์สสำหรับวัตถุประสงค์ต่างๆ รวมถึงการสแกนหาช่องโหว่ เครื่องมือเหล่านี้ใช้ User-Agent และส่วนหัวอื่นๆ ที่เป็นที่รู้จัก สังเกตว่า curl ทำงานกับส่วนหัว User-Agent ที่เป็นที่รู้จักกันดี
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
เอาต์พุต
HTTP/1.1 200 OK <...>
สังเกตการโจมตีโปรโตคอล: การแยก HTTP
เว็บแอปพลิเคชันบางรายการใช้ข้อมูลที่ผู้ใช้ป้อนเพื่อสร้างส่วนหัวในการตอบกลับ หากแอปพลิเคชันไม่ได้กรองอินพุตอย่างเหมาะสม ผู้โจมตีอาจทำให้พารามิเตอร์อินพุตเสียหายด้วยลำดับ %0d%0a (ลำดับ CRLF ที่ใช้แยกบรรทัดต่างๆ) จากนั้นระบบจะตีความการตอบกลับเป็นการตอบกลับ 2 รายการโดยทุกอย่างที่เกิดขึ้นเพื่อแยกวิเคราะห์ เช่น พร็อกซีเซิร์ฟเวอร์ตัวกลาง ซึ่งอาจแสดงเนื้อหาที่ไม่ถูกต้องในคำขอที่ตามมา แทรกลำดับ %0d%0a ลงในพารามิเตอร์อินพุต ซึ่งอาจทำให้แสดงหน้าเว็บที่ทำให้เข้าใจผิด
จาก Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
เอาต์พุต
HTTP/1.1 200 OK <...>
สังเกตการยึดเซสชัน
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H session_id=X
เอาต์พุต
HTTP/1.1 200 OK <...>
6. กำหนดกฎ WAF ของ Cloud Armor
แสดงรายการกฎ WAF ที่กำหนดค่าไว้ล่วงหน้า
จาก Cloud Shell
gcloud compute security-policies list-preconfigured-expression-sets
เอาต์พุต
EXPRESSION_SET
Sqli-canary
RULE_ID
owasp-crs-v030001-id942110-sqli
owasp-crs-v030001-id942120-sqli
<...>
สร้างนโยบายความปลอดภัยของ Cloud Armor
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies create block-with-modsec-crs \
--description "Block with OWASP ModSecurity CRS"
อัปเดตกฎเริ่มต้นของนโยบายความปลอดภัย
โปรดทราบว่าลำดับความสำคัญของกฎเริ่มต้นมีค่าตัวเลขเป็น 2147483647
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules update 2147483647 \
--security-policy block-with-modsec-crs \
--action "deny-403"
เนื่องจากกฎเริ่มต้นได้รับการกำหนดค่าด้วยการดำเนินการปฏิเสธ เราจึงต้องอนุญาตการเข้าถึงจาก IP ของคุณ โปรดค้นหา IP สาธารณะของคุณ (curl, ipmonkey, whatismyip ฯลฯ)
จาก Cloud Shell ให้ทำดังนี้
MY_IP=$(curl ifconfig.me)
เพิ่มกฎแรกเพื่ออนุญาตการเข้าถึงจาก IP ของคุณ (แทรก IP ของคุณด้านล่าง)
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 10000 \
--security-policy block-with-modsec-crs \
--description "allow traffic from my IP" \
--src-ip-ranges "$MY_IP/32" \
--action "allow"
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกการโจมตีแบบ LFI
ใช้ชุดกฎหลักของ OWASP ModSecurity ที่ป้องกันการข้ามเส้นทางสำหรับการรวมไฟล์ในเครื่อง
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 9000 \
--security-policy block-with-modsec-crs \
--description "block local file inclusion" \
--expression "evaluatePreconfiguredExpr('lfi-stable')" \
--action deny-403
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกการดำเนินการโค้ดจากระยะไกล (RCE)
ตามชุดกฎหลักของ ModSecurity ของ OWASP ให้ใช้กฎที่ค้นหา RCE ซึ่งรวมถึงการแทรกคำสั่ง ระบบจะตรวจจับและบล็อกคำสั่งของระบบปฏิบัติการทั่วไป
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 9001 \
--security-policy block-with-modsec-crs \
--description "block rce attacks" \
--expression "evaluatePreconfiguredExpr('rce-stable')" \
--action deny-403
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกเครื่องสแกนความปลอดภัย
ใช้ชุดกฎหลักของ OWASP ModSecurity เพื่อบล็อกเครื่องมือสแกนความปลอดภัยที่รู้จักกันดี ไคลเอ็นต์ HTTP ที่ใช้สคริปต์ และ Web Crawler
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 9002 \
--security-policy block-with-modsec-crs \
--description "block scanners" \
--expression "evaluatePreconfiguredExpr('scannerdetection-stable')" \
--action deny-403
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกการโจมตีโปรโตคอล
ตามชุดกฎหลักของ OWASP ModSecurity ให้ใช้กฎที่ค้นหาอักขระ Carriage Return (CR) %0d และ Linefeed (LF) %0a รวมถึงการโจมตีโปรโตคอลประเภทอื่นๆ เช่น HTTP Request Smuggling
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 9003 \
--security-policy block-with-modsec-crs \
--description "block protocol attacks" \
--expression "evaluatePreconfiguredExpr('protocolattack-stable')" \
--action deny-403
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกการยึดเซสชัน
ตามชุดกฎหลักของ ModSecurity ของ OWASP ให้ใช้กฎที่...
จาก Cloud Shell ให้ทำดังนี้
gcloud compute security-policies rules create 9004 \
--security-policy block-with-modsec-crs \
--description "block session fixation attacks" \
--expression "evaluatePreconfiguredExpr('sessionfixation-stable')" \
--action deny-403
แนบนโยบายความปลอดภัยกับบริการแบ็กเอนด์
จาก Cloud Shell ให้ทำดังนี้
gcloud compute backend-services update juice-shop-backend \
--security-policy block-with-modsec-crs \
--global
กฎอาจใช้เวลาสักครู่จึงจะมีผล (แต่ไม่เกิน 10 นาที) เมื่อมั่นใจว่าเวลาผ่านไปเพียงพอแล้ว ให้ทดสอบช่องโหว่ที่แสดงให้เห็นก่อนหน้านี้เพื่อยืนยันการบังคับใช้กฎ WAF ของ Cloud Armor ในขั้นตอนถัดไป
7. สังเกตการป้องกันของ Cloud Armor ด้วยชุดกฎหลักของ OWASP ModSecurity
ยืนยันว่าช่องโหว่ LFI ได้รับการแก้ไขแล้ว
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?a=../
เอาต์พุต
HTTP/1.1 403 Forbidden <...>
ยืนยันว่าได้ลดความเสี่ยงของการโจมตี RCE แล้ว
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
เอาต์พุต
HTTP/1.1 403 Forbidden <..>
ยืนยันการตรวจหาเครื่องสแกนที่รู้จักกันดี
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
เอาต์พุต
HTTP/1.1 403 Forbidden <..>
ยืนยันว่าการโจมตีโปรโตคอลได้รับการบรรเทาแล้ว
ตามชุดกฎหลักของ ModSecurity เวอร์ชัน 3.0.2 ของ OWASP การโจมตีโปรโตคอลจะได้รับการลดผลกระทบโดย
จาก Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
เอาต์พุต
HTTP/1.1 403 Forbidden <..>
ยืนยันว่ามีการบล็อกความพยายามในการแก้ไขเซสชัน
จาก Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?session_id=a
เอาต์พุต
HTTP/1.1 403 Forbidden <..>
8. ตรวจสอบกฎการรักษาความปลอดภัยของ Cloud Armor
ตอนนี้เราได้สร้างนโยบายความปลอดภัยแล้ว มาดูกันว่ามีการกำหนดค่ากฎใดบ้าง

ระบบจะประเมินกฎตามลำดับความสำคัญ โดยจะประเมินตัวเลขที่ต่ำกว่าก่อน และเมื่อทริกเกอร์แล้ว ระบบจะไม่ประมวลผลต่อสำหรับกฎที่มีค่าลำดับความสำคัญสูงกว่า
- ลำดับความสำคัญ 9000 - บล็อก LFI (การรวมไฟล์ในเครื่อง)
- ลำดับความสำคัญ 9001 - บล็อก RCE (การดำเนินการกับโค้ด/การแทรกคำสั่งจากระยะไกล)
- Priority 9002 - Block Scanners Detected
- ลำดับความสำคัญ 9003 - บล็อกการโจมตีโปรโตคอล เช่น การแยก HTTP และการลักลอบใช้ HTTP
- ลำดับความสำคัญ 9004 - บล็อกการโจมตีแบบ Session Fixation
- ลำดับความสำคัญ 10000 - อนุญาตให้ IP เข้าถึงเว็บไซต์
- ค่าเริ่มต้นของลำดับความสำคัญ - ปฏิเสธ
*โปรดสังเกตกฎ "อนุญาต IP ของคุณ" ซึ่งกำหนดค่าด้วยหมายเลขลำดับความสำคัญสูงสุดเพื่ออนุญาตการเข้าถึงเว็บไซต์ แต่จะบล็อกการโจมตี
9. ดูบันทึกนโยบายความปลอดภัยของ Cloud Armor
จากหน้า Cloud Armor Console คุณจะดูรายละเอียดของนโยบายความปลอดภัยและคลิกแท็บ Logs ตามด้วยลิงก์ View policy logs เพื่อไปยังหน้า Cloud Logging ได้ โดยจะกรองตามนโยบายความปลอดภัยที่คุณสนใจโดยอัตโนมัติ เช่น resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(block-with-modsec-crs) สังเกตรหัสการตอบสนองข้อผิดพลาด 403 และขยายรายละเอียดบันทึกเพื่อสังเกตชื่อนโยบายความปลอดภัยที่บังคับใช้ ค่าฟิลด์ที่ตรงกัน และรหัสนิพจน์ที่กำหนดค่าไว้ล่วงหน้า (หรือรหัสลายเซ็น) ภาพหน้าจอต่อไปนี้แสดงตัวอย่างบันทึกสำหรับนโยบายความปลอดภัยที่บังคับใช้ซึ่งกำหนดค่าไว้ในโค้ดแล็บนี้
บันทึก LFI

บันทึก RCE

บันทึกการตรวจจับสแกนเนอร์

บันทึกการโจมตีโปรโตคอล

บันทึกการยึดเซสชัน

10. การทำความสะอาดห้องทดลอง
ล้างข้อมูลทรัพยากรเมื่อทำแล็บเสร็จแล้ว
เรียกใช้คำสั่งต่อไปนี้เพื่อลบนโยบายความปลอดภัยของ Cloud Armor, ตัวจัดสรรภาระงาน, อินสแตนซ์, กฎไฟร์วอลล์ และเครือข่าย VPC
นำนโยบายความปลอดภัยของ Cloud Armor ออกจากบริการแบ็กเอนด์
gcloud -q compute backend-services update juice-shop-backend --security-policy "" --global
ลบนโยบายความปลอดภัยของ Cloud Armor
การลบนโยบายความปลอดภัยจะลบกฎที่เกี่ยวข้องโดยอัตโนมัติ
gcloud -q compute security-policies delete block-with-modsec-crs
ลบทรัพยากรตัวจัดสรรภาระงาน
ทรัพยากรตัวจัดสรรภาระงานที่จะลบ ได้แก่ กฎการส่งต่อ, target-http-proxies, url-maps, แบ็กเอนด์, health-checks และกลุ่มอินสแตนซ์
gcloud -q compute forwarding-rules delete juice-shop-rule --global
gcloud -q compute target-http-proxies delete juice-shop-proxy
gcloud -q compute url-maps delete juice-shop-loadbalancer
gcloud -q compute backend-services delete juice-shop-backend \
--global
gcloud -q compute health-checks delete tcp-port-3000
gcloud -q compute instance-groups unmanaged delete juice-shop-group --zone=us-central1-c
ลบอินสแตนซ์
gcloud -q compute instances delete owasp-juice-shop-app --zone us-central1-c
ลบกฎไฟร์วอลล์ ซับเน็ต และ VPC
gcloud -q compute firewall-rules delete allow-health-check gcloud -q compute firewall-rules delete allow-js-site gcloud -q compute networks subnets delete ca-lab-subnet --region us-central1 gcloud -q compute networks delete ca-lab-vpc
11. ยินดีด้วย
ขอแสดงความยินดีที่ทำ Codelab กฎ WAF ที่กำหนดค่าล่วงหน้าของ Cloud Armor เสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- วิธีตั้งค่ากลุ่มอินสแตนซ์และ Cloud Load Balancer ทั่วโลก
- วิธีกำหนดค่านโยบายความปลอดภัยของ Cloud Armor ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อป้องกัน LFI, RCE, สแกนเนอร์, การโจมตีโปรโตคอล และการยึดเซสชัน
- วิธีตรวจสอบว่า Cloud Armor ลดการโจมตีบางอย่างในรายการความเสี่ยงด้านความปลอดภัย 10 อันดับสูงสุดของ OWASP ผ่านบันทึก
ขั้นตอนถัดไป
- ปกป้องแอปพลิเคชันจากช่องโหว่ในรายการความเสี่ยงด้านความปลอดภัย 10 อันดับสูงสุดของ OWASP ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าของ Cloud Armor
- ปรับแต่งกฎตามระดับความละเอียดอ่อนของเนื้อหา
- ใช้ข้อมูลอ้างอิงภาษาของกฎที่กำหนดเองเพื่อบังคับใช้การรักษาความปลอดภัยที่เฉพาะเจาะจงมากขึ้น