1. บทนำ
สวัสดี ยินดีต้อนรับสู่ Codelab ของกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าของ Cloud Armor
Google Cloud Armor เป็นโซลูชันการรักษาความปลอดภัยเครือข่าย Edge สำหรับองค์กรของ Google ที่ให้การป้องกัน DDOS, การบังคับใช้กฎ WAF และความสามารถในการจัดการที่ยืดหยุ่นได้ในวงกว้าง
Cloud Armor ได้ขยายชุดกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อลดช่องโหว่ด้านความปลอดภัยของเว็บแอปพลิเคชัน OWASP Top 10 ชุดกฎจะยึดตามชุดกฎหลักของ OWASP Modsecurity เวอร์ชัน 3.0.2 เพื่อป้องกันความเสี่ยงด้านความปลอดภัยของเว็บแอปพลิเคชันที่พบได้บ่อยที่สุด ซึ่งรวมถึงการรวมไฟล์ในเครื่อง (lfi), การรวมไฟล์ระยะไกล (rfi), การเรียกใช้โค้ดจากระยะไกล (rce) และอื่นๆ อีกมากมาย
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีลดช่องโหว่ทั่วไปบางอย่างโดยใช้กฎ WAF ของ Google Cloud Armor
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าอินสแตนซ์และตัวจัดสรรภาระงานทั่วโลกเพื่อรองรับบริการ
- วิธีกำหนดค่านโยบายความปลอดภัยของ Cloud Armor ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อป้องกัน lfi, rce, เครื่องสแกน, การโจมตีโปรโตคอล และการตรึงเซสชัน
- วิธีตรวจสอบว่า Cloud Armor ช่วยลดการโจมตีโดยการดูบันทึกหรือไม่
สิ่งที่คุณต้องมี
- ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( codelab)
- ความรู้เกี่ยวกับเครือข่ายและ TCP/IP ขั้นพื้นฐาน
- ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
- การสำรวจเครือข่ายใน GCP ด้วยการสร้างเครือข่ายใน Google Cloud จะเป็นประโยชน์อย่างมาก
- (ไม่บังคับ) ดำเนินการตามห้องทดลอง Cloud Armor ของ Cloudnet20 ให้เสร็จสมบูรณ์เพื่อเรียนรู้การปกป้องภาระงานด้วยการแทรก SQL, กฎที่อิงตาม IP และกฎที่อิงตามภูมิศาสตร์
โทโพโลจีของ Codelab และ Use Case
รูปที่ 1 - โทโพโลยีกฎ Codelab ของ 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 ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID
ในภายหลัง
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้
จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบนดังนี้
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 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. สร้างเครือข่าย 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
สร้างกฎเฟิร์มแวร์เพื่ออนุญาตให้มีการตรวจสอบประสิทธิภาพการทำงานจากช่วงการตรวจสอบประสิทธิภาพการทำงานของ 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
เราจะใช้อิมเมจคอนเทนเนอร์เพื่อให้มั่นใจว่าเซิร์ฟเวอร์จะมีบริการที่เหมาะสมเมื่อสร้างอินสแตนซ์การประมวลผล ระบบจะทำให้เซิร์ฟเวอร์นี้ใช้งานได้ใน 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: กลุ่มอินสแตนซ์
สร้างกลุ่มอินสแตนซ์ที่ไม่มีการจัดการ
จาก 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
เพิ่มอินสแตนซ์ Juice Shop GCE ในอินสแตนซ์ที่ไม่มีการจัดการ
จาก 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: บริการแบ็กเอนด์
สร้างพารามิเตอร์บริการแบ็กเอนด์
จาก 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].
ตั้งค่าคอมโพเนนต์ตัวจัดสรรภาระงาน Clud: แมป 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
ตั้งค่าคอมโพเนนต์ตัวจัดสรรภาระงาน oud: พร็อกซีเป้าหมาย
สร้างพร็อกซีเป้าหมายที่ด้านหน้าแมป 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: กฎการส่งต่อ
สร้างกฎการส่งต่อสำหรับตัวจัดสรรภาระงาน
จาก 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].
ยืนยันว่าบริการร้านน้ำผลไม้ออนไลน์
จาก 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 และวิธีป้องกันช่องโหว่ด้วยชุดกฎ 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 <...>
และสังเกตด้วยว่า Path Traversal ทำงานเป็นปกติ ดังนี้
จาก 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 และส่วนหัวอื่นๆ ที่มีชื่อเสียง Observe ทำงานร่วมกับส่วนหัว 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)
ตามชุดกฎหลักของ OWASP ModSecurity ให้ใช้กฎที่มองหา 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 ที่เขียนสคริปต์และโปรแกรมรวบรวมข้อมูลเว็บที่รู้จัก
จาก 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 ให้ใช้กฎที่มองหาอักขระ Cracing Return (CR) %0d และ Linefeed (LF) %0a และการโจมตีโปรโตคอลประเภทอื่นๆ เช่น การลักลอบส่งคำขอ HTTP
จาก 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
อัปเดตนโยบายความปลอดภัยเพื่อบล็อกการกำหนดเซสชัน
ตามชุดกฎหลักของ OWASP ModSecurity ให้ใช้กฎที่...
จาก 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 <..>
ตรวจสอบว่าการโจมตีโปรโตคอลลดลงแล้ว
ตามชุดกฎหลักของ OWASP ModSecurity เวอร์ชัน 3.0.2 การโจมตีโปรโตคอลจะลดลงดังนี้
จาก 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 (การดำเนินการโค้ดระยะไกล/การแทรกคำสั่ง)
- ลำดับความสำคัญ 9002 - ตรวจพบเครื่องสแกนบล็อก
- ลำดับความสำคัญ 9003 - บล็อกการโจมตีโปรโตคอล เช่น การแยก HTTP และการลักลอบนำเข้า HTTP
- ลำดับความสำคัญ 9004 - การโจมตีแบบบล็อกเซสชันถาวร
- Priority 10000 - อนุญาตให้ IP เข้าถึงเว็บไซต์
- ค่าเริ่มต้นของลำดับความสำคัญ - ปฏิเสธ
*เห็นปุ่ม "อนุญาต IP ของคุณ" กฎจะได้รับการกำหนดค่าด้วยตัวเลขลำดับความสำคัญสูงสุดเพื่ออนุญาตการเข้าถึงเว็บไซต์ แต่จะบล็อกการโจมตีได้
9. ตรวจสอบบันทึกนโยบายความปลอดภัยของ Cloud Armor
จากหน้าคอนโซล Cloud Armor คุณจะดูรายละเอียดของนโยบายความปลอดภัยและคลิกแท็บ Logs
ตามด้วยลิงก์ View policy logs
เพื่อไปยังหน้า Cloud Logging ได้ ระบบจะกรองโดยอัตโนมัติตามนโยบายการรักษาความปลอดภัยที่สนใจ เช่น resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(block-with-modsec-crs)
สังเกตโค้ดตอบกลับข้อผิดพลาด 403 และขยายรายละเอียดบันทึกเพื่อดูชื่อของนโยบายความปลอดภัยที่บังคับใช้ ค่าช่องที่ตรงกัน และต่อด้วยรหัสนิพจน์ที่กำหนดค่าไว้ล่วงหน้า (หรือรหัสลายเซ็น) ภาพหน้าจอต่อไปนี้แสดงตัวอย่างบันทึกสำหรับนโยบายความปลอดภัยที่บังคับใช้ซึ่งกำหนดค่าไว้ใน Codelab นี้
บันทึก LFI
บันทึก RCE
บันทึกการตรวจหาโปรแกรมสแกน
บันทึกการโจมตีของโปรโตคอล
บันทึกการกำหนดเซสชัน
10. ทำความสะอาดห้องปฏิบัติการ
ล้างทรัพยากรเมื่อคุณทำ Lab เสร็จแล้ว
เรียกใช้คำสั่งเหล่านี้เพื่อลบนโยบายความปลอดภัยของ 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, แบ็กเอนด์, การตรวจสอบประสิทธิภาพการทำงาน และอินสแตนซ์
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 ทั่วโลก
- วิธีกำหนดค่านโยบายความปลอดภัยของ Cloud Armor ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าเพื่อป้องกัน lfi, rce, เครื่องสแกน, การโจมตีโปรโตคอล และการตรึงเซสชัน
- วิธีตรวจสอบว่า Cloud Armor สามารถลดการโจมตี 10 อันดับแรกของ OWASP ผ่านบันทึก
ขั้นตอนถัดไป
- ปกป้องแอปพลิเคชันจากช่องโหว่ 10 อันดับสูงสุดของ OWASP ด้วยกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าของ Cloud Armor
- กฎการปรับแต่งตามระดับความไว
- ใช้ข้อมูลอ้างอิงภาษาของกฎที่กำหนดเองเพื่อบังคับใช้การรักษาความปลอดภัยที่เจาะจงมากขึ้น