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

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

119e13312f3cec25.jpeg

รูปที่ 1 - โทโพโลยีของ Codelab กฎ WAF ของ 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 ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

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

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

เริ่มต้น Cloud Shell

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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 ได้ด้วย

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
<...>

และสังเกตว่าการข้ามผ่านเส้นทางก็ใช้ได้เช่นกัน

จาก 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

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

d00e4102fc89e44f.png

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

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

983a6cab0cff940d.png

บันทึก RCE

988a3a571f9d9d45.png

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

7ed661863ba27555.png

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

17ee3cbe0bd98939.png

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

80d1ddfd0fe982e1.png

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

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