ข้ามไปยังเนื้อหา

Runner

runner.sh คือตัวประสานชุดทดสอบที่รันสคริปต์ที่มีหมายเลขกำกับทั้งหมดในไดเรกทอรีชุดทดสอบตามลำดับ บันทึกผลลัพธ์ และจัดเก็บข้อมูลเมตาดาตาของผลลัพธ์ โดยติดตั้งไว้ที่ /opt/traffic-generator/suites/runner.sh บน VM

Terminal window
runner.sh <suite-name> [--dry-run]

อาร์กิวเมนต์:

อาร์กิวเมนต์จำเป็นคำอธิบาย
suite-nameใช่ชื่อไดเรกทอรีชุดทดสอบ (เช่น web-app-attacks, api-attacks)
--dry-runไม่แสดงสิ่งที่จะรันโดยไม่รันสคริปต์จริง

ตัวอย่าง:

Terminal window
# Run the web-app-attacks suite
/opt/traffic-generator/suites/runner.sh web-app-attacks
# Dry-run to preview api-attacks scripts
/opt/traffic-generator/suites/runner.sh api-attacks --dry-run
# Run bot simulation
/opt/traffic-generator/suites/runner.sh bot-simulation

Runner อ่านค่าการกำหนดค่าจาก /opt/traffic-generator/config.env:

Terminal window
# Required: target FQDN (F5 XC load balancer domain)
TARGET_FQDN=demo.example.com
# Optional: direct origin IP for baseline testing (bypasses F5 XC)
TARGET_ORIGIN_IP=

ไฟล์นี้ถูกเขียนโดยอัตโนมัติระหว่างการ provision ด้วย Terraform จากตัวแปร target_fqdn และ target_origin_ip หากต้องการเปลี่ยนเป้าหมายหลังการ deploy ให้แก้ไขไฟล์นี้โดยตรงบน VM

ตัวแปรใดก็ตามใน config.env สามารถแทนที่ได้โดยการ export ก่อนรันชุดทดสอบ:

Terminal window
# Override target FQDN for a single run
TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh web-app-attacks
# Override via export
export TARGET_FQDN=staging.example.com
/opt/traffic-generator/suites/runner.sh web-app-attacks

เส้นทางของไฟล์การกำหนดค่าเองก็สามารถแทนที่ได้เช่นกัน:

Terminal window
CONFIG_FILE=/tmp/my-config.env /opt/traffic-generator/suites/runner.sh web-app-attacks

แฟล็ก --dry-run จะแสดงสคริปต์แต่ละตัวที่จะถูกรันโดยไม่รันจริง:

Terminal window
/opt/traffic-generator/suites/runner.sh web-app-attacks --dry-run

ผลลัพธ์:

=== 01-sqli.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
=== 02-xss.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/02-xss.sh demo.example.com
=== 03-command-injection.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/03-command-injection.sh demo.example.com
=== 04-path-traversal.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/04-path-traversal.sh demo.example.com
=== 05-nikto-scan.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/05-nikto-scan.sh demo.example.com
=== 06-nuclei-scan.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/06-nuclei-scan.sh demo.example.com
=== Suite Complete ===
Passed: 0 | Failed: 0 | Skipped: 6
Results: /opt/traffic-generator/results/20260425-143000-web-app-attacks

ใช้ dry-run เพื่อตรวจสอบโครงสร้างชุดทดสอบหลังการ deploy หรือก่อนรันชุดทดสอบกับเป้าหมายใหม่

การรันชุดทดสอบแต่ละครั้งจะสร้างไดเรกทอรีผลลัพธ์ที่มีการประทับเวลา:

/opt/traffic-generator/results/<YYYYMMDD-HHMMSS>-<suite-name>/

โครงสร้าง:

/opt/traffic-generator/results/20260425-143000-web-app-attacks/
meta.json
01-sqli.sh.log
02-xss.sh.log
03-command-injection.sh.log
04-path-traversal.sh.log
05-nikto-scan.sh.log
06-nuclei-scan.sh.log

stdout และ stderr ของแต่ละสคริปต์จะถูกบันทึกไปยังไฟล์ .log ที่ตั้งชื่อตามสคริปต์นั้น

ไฟล์ meta.json บันทึกเมตาดาตาการรันชุดทดสอบ:

{
"suite": "web-app-attacks",
"target": "demo.example.com",
"started": "2026-04-25T14:30:00Z",
"completed": "2026-04-25T14:45:23Z",
"status": "completed",
"passed": 5,
"failed": 1,
"skipped": 0
}
ฟิลด์คำอธิบาย
suiteชื่อชุดทดสอบ
targetFQDN เป้าหมายที่ใช้ในการรัน
startedการประทับเวลา UTC เมื่อชุดทดสอบเริ่มต้น
completedการประทับเวลา UTC เมื่อชุดทดสอบเสร็จสิ้น
statusrunning ระหว่างการรัน, completed เมื่อเสร็จสิ้น
passedจำนวนสคริปต์ที่ออกด้วย code 0
failedจำนวนสคริปต์ที่ออกด้วย code ที่ไม่ใช่ศูนย์
skippedจำนวนสคริปต์ที่ถูกข้าม (ไม่สามารถรันได้หรือ dry-run)

แต่ละสคริปต์สามารถรันแบบ standalone ได้โดยไม่ต้องใช้ runner:

Terminal window
# Run a single script directly
/opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
# Run a specific API attack
/opt/traffic-generator/suites/api-attacks/01-vampi-owasp-top10.sh demo.example.com

สคริปต์รับ FQDN เป้าหมายเป็นอาร์กิวเมนต์ตำแหน่งแรก สคริปต์ไม่ได้อ่าน config.env โดยตรง — เฉพาะ runner เท่านั้นที่ทำ เมื่อรันแบบ standalone คุณต้องส่ง FQDN อย่างชัดเจน

หากต้องการรันชุดทดสอบทุกชุดต่อเนื่องกัน:

Terminal window
for suite in web-app-attacks api-attacks bot-simulation reconnaissance ssl-scanning javascript-exploits traffic-generation; do
echo "========================================="
echo "Starting suite: ${suite}"
echo "========================================="
/opt/traffic-generator/suites/runner.sh "$suite"
echo ""
done

การดำเนินการนี้จะสร้างทราฟฟิกที่ครอบคลุมทั่วทุกฟีเจอร์ความปลอดภัยของ F5 XC คาดว่าการรันทั้งหมดจะใช้เวลา 45-80 นาที ขึ้นอยู่กับเวลาตอบสนองของเป้าหมาย

รันชุดทดสอบจากเครื่องของคุณโดยไม่ต้องคงการเชื่อมต่อ SSH ไว้:

Terminal window
TGEN_IP=$(terraform output -raw public_ip)
# Run a single suite
ssh azureuser@${TGEN_IP} '/opt/traffic-generator/suites/runner.sh web-app-attacks'
# Run a suite with target override
ssh azureuser@${TGEN_IP} 'TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh api-attacks'
# Run in background (disconnection-safe)
ssh azureuser@${TGEN_IP} 'nohup /opt/traffic-generator/suites/runner.sh web-app-attacks > /tmp/web-app-attacks.log 2>&1 &'
# Check results later
ssh azureuser@${TGEN_IP} 'ls -la /opt/traffic-generator/results/ | tail -5'
ssh azureuser@${TGEN_IP} 'cat /opt/traffic-generator/results/$(ls -t /opt/traffic-generator/results/ | head -1)/meta.json'

สำหรับชุดทดสอบที่ใช้เวลานาน ให้ใช้ nohup หรือ tmux เพื่อป้องกันไม่ให้การตัดการเชื่อมต่อ SSH หยุดกระบวนการ:

Terminal window
ssh azureuser@${TGEN_IP} 'tmux new-session -d -s traffic "/opt/traffic-generator/suites/runner.sh reconnaissance"'
# Reattach later to watch progress
ssh -t azureuser@${TGEN_IP} 'tmux attach-session -t traffic'
  1. โหลดการกำหนดค่า — Runner อ่าน config.env (หรือการแทนที่ CONFIG_FILE) จากนั้นตรวจสอบ TARGET_FQDN ในสภาพแวดล้อม

  2. ตรวจสอบชุดทดสอบ — ยืนยันว่าไดเรกทอรีชุดทดสอบที่ระบุมีอยู่ภายใต้ไดเรกทอรี suites แสดงรายการชุดทดสอบที่มีอยู่หากไม่พบ

  3. สร้างไดเรกทอรีผลลัพธ์ — สร้าง /opt/traffic-generator/results/<timestamp>-<suite>/ และเขียน meta.json เริ่มต้นด้วย status: running

  4. รันสคริปต์ — วนซ้ำผ่านไฟล์ที่ตรงกับ [0-9]* ในไดเรกทอรีชุดทดสอบ เรียงลำดับตามชื่อ ข้ามไฟล์ที่ไม่สามารถรันได้ ส่ง TARGET_FQDN เป็นอาร์กิวเมนต์แรก บันทึกผลลัพธ์ไปยัง <script-name>.log

  5. บันทึกผลลัพธ์ — อัปเดต meta.json ด้วยการประทับเวลาการเสร็จสิ้นและจำนวน pass/fail/skip