Codelab ของกฎ WAF ที่กำหนดค่าไว้ล่วงหน้าของ Cloud Armor

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

119e13312f3cec25.jpeg

รูปที่ 1 - โทโพโลยีกฎ Codelab ของ Cloud Armor

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

2. การตั้งค่าและข้อกำหนด

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

  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. สร้างเครือข่าย 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
<...>

คุณยังสามารถไปที่เบราว์เซอร์เพื่อดูร้านน้ำผลไม้ได้ด้วย

428c18eee6708c28.png

เราพร้อมที่จะสำรวจช่องโหว่ของ 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

เมื่อเราสร้างนโยบายความปลอดภัยแล้ว มาดูกันว่ามีการกำหนดค่ากฎอะไรบ้าง

d00e4102fc89e44f.png

กฎจะได้รับการประเมินตามลำดับความสำคัญ: ตัวเลขที่ต่ำกว่าจะได้รับการประเมินก่อน และเมื่อมีการเรียกใช้ การประมวลผลจะไม่ดำเนินการต่อสำหรับกฎที่มีค่าลำดับความสำคัญสูงกว่า

  • ลำดับความสำคัญ 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

983a6cab0cff940d.png

บันทึก RCE

988a3a571f9d9d45.png

บันทึกการตรวจหาโปรแกรมสแกน

7ed661863ba27555.png

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

17ee3cbe0bd98939.png

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

80d1ddfd0fe982e1.png

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 ผ่านบันทึก

ขั้นตอนถัดไป