- หน้าแรก
- การป้องกันฝั่งไคลเอนต์
- การวินิจฉัยและการตรวจสอบ
การวินิจฉัยและการตรวจสอบ
หน้านี้จัดเตรียม เมทริกซ์การตรวจสอบ UAT แบบหลายชั้น สำหรับการตรวจสอบการปรับใช้การป้องกันฝั่งไคลเอนต์ของคุณแบบครบวงจร กรณีทดสอบแต่ละรายการจะดำเนินตามห่วงโซ่การพึ่งพาโครงสร้างพื้นฐาน — ตั้งแต่การแก้ไข DNS จนถึงการวัดผล CSD — เพื่อให้คุณสามารถพิสูจน์อย่างเป็นระบบว่าทุกส่วนประกอบทำงานได้อย่างถูกต้อง
คำสั่งเหล่านี้คือ API ที่เทียบเท่ากับ คู่มือการใช้งาน CSD คอนโซล — ใช้คำสั่งเหล่านี้เมื่อต้องการตรวจสอบจากเทอร์มินัล ทำการตรวจสอบอัตโนมัติ หรือสาธิตความสามารถ CSD โดยไม่ต้องใช้ UI
ข้อกำหนดเบื้องต้น
หัวข้อที่มีชื่อว่า “ข้อกำหนดเบื้องต้น”ตั้งค่าตัวแปรสภาพแวดล้อมของคุณตามที่อธิบายไว้ใน การทำงานอัตโนมัติของ API — การตั้งค่าสภาพแวดล้อม:
set -a && source .env && set +aคำสั่งทั้งหมดด้านล่างใช้รูปแบบตัวแทน xTOKENx แทนที่ด้วยตัวแปรสภาพแวดล้อมของคุณ ($F5XC_API_TOKEN, $F5XC_NAMESPACE, ฯลฯ) หรือใช้แบบฟอร์มแบบโต้ตอบที่ด้านบนของหน้า
หมายเหตุเกี่ยวกับพฤติกรรม API
หัวข้อที่มีชื่อว่า “หมายเหตุเกี่ยวกับพฤติกรรม API”ตัวช่วยช่วงเวลา
หัวข้อที่มีชื่อว่า “ตัวช่วยช่วงเวลา”Endpoint ของ CSD หลายรายการต้องการ timestamp แบบ epoch (วินาทีนับจาก Unix epoch) คำสั่งบรรทัดเดียวเหล่านี้คำนวณเวลาเริ่มต้น/สิ้นสุดสำหรับช่วงเวลาทั่วไป
ข้ามแพลตฟอร์ม (macOS + Linux):
# เวลาปัจจุบันในรูปแบบ epoch secondsNOW=$(date +%s)
# 1 ชั่วโมงที่แล้วSTART_1H=$(( NOW - 3600 ))
# 24 ชั่วโมงที่แล้วSTART_24H=$(( NOW - 86400 ))
# 7 วันที่แล้วSTART_7D=$(( NOW - 604800 ))
# 30 วันที่แล้วSTART_30D=$(( NOW - 2592000 ))| ค่าที่ตั้งไว้ล่วงหน้า | วินาที | นิพจน์ Shell |
|---|---|---|
| 1 ชั่วโมง | 3,600 | $(( $(date +%s) - 3600 )) |
| 24 ชั่วโมง | 86,400 | $(( $(date +%s) - 86400 )) |
| 7 วัน | 604,800 | $(( $(date +%s) - 604800 )) |
| 30 วัน | 2,592,000 | $(( $(date +%s) - 2592000 )) |
รูปแบบกรณีทดสอบ
หัวข้อที่มีชื่อว่า “รูปแบบกรณีทดสอบ”การทดสอบแต่ละรายการด้านล่างเป็นไปตามโครงสร้างนี้:
| ฟิลด์ | คำอธิบาย |
|---|---|
| รหัสการทดสอบ | หมายเลขชั้น + รหัสลำดับ (เช่น DNS-1, TLS-2) |
| สิ่งที่พิสูจน์ | ข้อเท็จจริงด้านโครงสร้างพื้นฐานเฉพาะที่กำลังตรวจสอบ |
| คำสั่ง | คำสั่ง curl หรือ dig ที่พร้อมใช้งาน |
| ผ่าน / ล้มเหลว | ผลลัพธ์ที่คาดหวังสำหรับสถานะปกติและสถานะผิดปกติ |
| แก้ไข | ลิงก์ไปยังส่วนการตั้งค่าหรือการแก้ปัญหาที่เกี่ยวข้อง |
ชั้นที่ 1: การแก้ไข DNS
หัวข้อที่มีชื่อว่า “ชั้นที่ 1: การแก้ไข DNS”DNS คือรากฐาน — หากโดเมนไม่สามารถแก้ไขเป็น VIP IP ของ load balancer ได้ สิ่งอื่นจะไม่ทำงาน
DNS-1: การแก้ไข A Record
หัวข้อที่มีชื่อว่า “DNS-1: การแก้ไข A Record”สิ่งที่พิสูจน์: โดเมนแก้ไขเป็น VIP IP address ของ load balancer
dig +short xF5XC_DOMAINNAMEx A| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — VIP IP ที่คืนค่ามา (เช่น 72.19.3.185) | โดเมนแก้ไขเป็น LB virtual IP |
| ล้มเหลว — การตอบสนองว่างเปล่า | ไม่ได้กำหนดค่า DNS A record |
แก้ไข: การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4: กำหนดค่า DNS
DNS-2: ACME Challenge Record
หัวข้อที่มีชื่อว่า “DNS-2: ACME Challenge Record”สิ่งที่พิสูจน์: ACME challenge record มีอยู่สำหรับการจัดเตรียมใบรับรอง TLS อัตโนมัติ
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — CNAME ไปยัง *.autocerts.ves.volterra.io. (external DNS) | ACME challenge CNAME พร้อมใช้งาน |
| ผ่าน — TXT record ที่มีค่าโดเมน (F5 Distributed Cloud (F5 XC) managed DNS) | ACME challenge ที่จัดการโดยแพลตฟอร์มผ่าน TXT record |
| ล้มเหลว — ทั้งคู่ว่างเปล่า | ไม่ได้กำหนดค่า ACME record; ใบรับรองจะอยู่ใน PreDomainChallengePending |
แก้ไข: สำหรับ external DNS ให้สร้าง CNAME: _acme-challenge.xF5XC_DOMAINNAMEx → *.autocerts.ves.volterra.io สำหรับ F5 XC managed DNS ให้เปิดใช้งาน allow_http_lb_managed_records บน DNS zone — ดู DNS-4 ดู การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4
DNS-3: อำนาจของ Nameserver
หัวข้อที่มีชื่อว่า “DNS-3: อำนาจของ Nameserver”สิ่งที่พิสูจน์: ว่า F5 XC เป็น authoritative DNS provider สำหรับ root domain หรือไม่
dig +short NS xF5XC_ROOT_DOMAINx| ผลลัพธ์ | ความหมาย |
|---|---|
รวม ns1.f5clouddns.com และ ns2.f5clouddns.com | F5 XC managed DNS — สามารถสร้าง record ได้อัตโนมัติ |
| nameserver อื่น | External DNS — ต้องสร้าง record ด้วยตนเอง |
แก้ไข: การทำงานอัตโนมัติของ API — ตรวจจับอำนาจ DNS
DNS-4: เปิดใช้งาน F5 XC Managed Records
หัวข้อที่มีชื่อว่า “DNS-4: เปิดใช้งาน F5 XC Managed Records”สิ่งที่พิสูจน์: DNS zone ของ F5 XC อนุญาตให้สร้าง record อัตโนมัติสำหรับ load balancer (เฉพาะ F5 XC managed DNS)
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \ | jq '.spec.primary.allow_http_lb_managed_records'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — true | แพลตฟอร์มจะสร้าง A record และ ACME record สำหรับ LB อัตโนมัติ |
ล้มเหลว — false หรือ null | Managed records ถูกปิดใช้งาน; เปิดใช้งานผ่านการอัปเดต zone |
แก้ไข: การทำงานอัตโนมัติของ API — ตัวเลือก A: F5 XC Managed DNS
ชั้นที่ 2: ใบรับรอง TLS
หัวข้อที่มีชื่อว่า “ชั้นที่ 2: ใบรับรอง TLS”หลังจาก DNS แก้ไขแล้ว load balancer ต้องมีใบรับรอง TLS ที่ถูกต้อง
TLS-1: สถานะใบรับรอง
หัวข้อที่มีชื่อว่า “TLS-1: สถานะใบรับรอง”สิ่งที่พิสูจน์: ใบรับรอง TLS อัตโนมัติได้รับการออกบน HTTPS LB แล้ว
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '.spec.cert_state'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — "CertificateValid" หรือ "AutoCertRenewing" | ใบรับรองถูกต้องและใช้งานอยู่ |
เตือน — "DomainChallengePending" หรือ "DomainChallengeStarted" | ACME challenge กำลังดำเนินการ — รอ 5–10 นาที |
ข้อมูล — "AutoCertDomainRateLimited" | ถึงขีดจำกัดอัตราของ Let’s Encrypt — คาดหวังในสภาพแวดล้อมสาธิต ไม่ส่งผลต่อ HTTP LB |
ล้มเหลว — "PreDomainChallengePending" | ACME challenge record หายไป — ดู DNS-2 |
แก้ไข: ตรวจสอบให้แน่ใจว่า ACME challenge record พร้อมใช้งาน (CNAME สำหรับ external DNS หรือเปิดใช้งาน managed records สำหรับ F5 XC DNS) การจัดเตรียมใบรับรองใช้เวลา 5–10 นาที หลังจากกำหนดค่า record แล้ว หากค้างอยู่นานกว่า 15 นาที ดู ใบรับรองค้าง — การสร้างใหม่ทำความสะอาด หากถูกจำกัดอัตรา HTTP LB จะไม่ได้รับผลกระทบ
TLS-2: รายละเอียดใบรับรอง
หัวข้อที่มีชื่อว่า “TLS-2: รายละเอียดใบรับรอง”สิ่งที่พิสูจน์: ใบรับรองครอบคลุมโดเมนที่คาดหวังและแสดงข้อมูลการหมดอายุ ใช้ได้เฉพาะกับ HTTPS LB เท่านั้น
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ cert_state: .spec.cert_state, auto_cert_info: .spec.auto_cert_info }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — auto_cert_info มี dns_records และข้อมูลเมตาของใบรับรอง | รายละเอียดการจัดเตรียมใบรับรองพร้อมใช้งาน |
ล้มเหลว — auto_cert_info เป็น null หรือว่างเปล่า | ใบรับรองยังไม่ได้รับการจัดเตรียม |
TLS-3: การ TLS Handshake แบบสด
หัวข้อที่มีชื่อว่า “TLS-3: การ TLS Handshake แบบสด”สิ่งที่พิสูจน์: ใบรับรอง TLS ถูกต้องและการ handshake เสร็จสมบูรณ์จากฝั่งไคลเอนต์ ใช้ได้เฉพาะเมื่อ HTTPS LB มีใบรับรองที่ถูกต้องเท่านั้น
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'SSL connection|subject:|expire date:|issuer:'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — แสดง SSL connection using TLSv1.3, subject และวันหมดอายุที่ถูกต้อง | TLS แบบ end-to-end ทำงานได้ |
| ล้มเหลว — ปฏิเสธการเชื่อมต่อหรือข้อผิดพลาดใบรับรอง | ตรวจสอบการแก้ไข DNS และสถานะใบรับรอง; หากถูกจำกัดอัตรา ให้ใช้ HTTP แทน |
TLS-4: เป้าหมาย ACME Record จาก LB
หัวข้อที่มีชื่อว่า “TLS-4: เป้าหมาย ACME Record จาก LB”สิ่งที่พิสูจน์: HTTPS load balancer รายงานเป้าหมาย ACME ที่ถูกต้องสำหรับการตรวจสอบใบรับรอง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ vip_ip: .spec.dns_info[0].ip_address, acme_target: .spec.auto_cert_info.dns_records }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — vip_ip และ acme_target มีค่า | สามารถตรวจสอบ DNS record กับค่าเหล่านี้ได้ |
ล้มเหลว — ค่า null | LB อาจไม่ได้กำหนดค่า https_auto_cert |
ชั้นที่ 3: HTTP Load Balancer
หัวข้อที่มีชื่อว่า “ชั้นที่ 3: HTTP Load Balancer”Load balancer ต้องอยู่ในสถานะพร้อมใช้งานและกำหนดค่าอย่างถูกต้อง
LB-1: สถานะการทำงาน
หัวข้อที่มีชื่อว่า “LB-1: สถานะการทำงาน”สิ่งที่พิสูจน์: HTTP load balancer (หลัก) ทำงานได้อย่างสมบูรณ์และรับทราฟฟิกได้
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.state'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — "VIRTUAL_HOST_READY" | LB ทำงานได้ |
ล้มเหลว — "VIRTUAL_HOST_PENDING_A_RECORD" | ไม่ได้กำหนดค่า DNS A record — ดู DNS-1 |
แก้ไข: LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD
LB-2: การกำหนดค่าโดเมน
หัวข้อที่มีชื่อว่า “LB-2: การกำหนดค่าโดเมน”สิ่งที่พิสูจน์: HTTP load balancer ถูกกำหนดค่าสำหรับโดเมนที่ถูกต้อง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.domains'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — array มี FQDN ของคุณ (เช่น ["app.example.com"]) | LB ถูกกำหนดค่าสำหรับโดเมนที่คาดหวัง |
| ล้มเหลว — โดเมนหายไปหรือผิด | อัปเดต LB spec ด้วยโดเมนที่ถูกต้อง |
LB-3: เปิดใช้งาน CSD บน LB
หัวข้อที่มีชื่อว่า “LB-3: เปิดใช้งาน CSD บน LB”สิ่งที่พิสูจน์: การป้องกันฝั่งไคลเอนต์เปิดใช้งานบน load balancer พร้อมนโยบายการฉีด JS ที่ถูกต้อง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ csd_enabled: (if .spec.client_side_defense then true else false end), js_policy: .spec.client_side_defense.policy }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — csd_enabled: true พร้อม js_insert_all_pages ในนโยบาย | CSD ทำงานอยู่พร้อมการฉีด JS ในทุกหน้า |
ล้มเหลว — csd_enabled: false | ไม่ได้กำหนดค่า CSD บน LB |
แก้ไข: API Reference — เปิดใช้งาน CSD บน Load Balancer
LB-4: Default Route Pool
หัวข้อที่มีชื่อว่า “LB-4: Default Route Pool”สิ่งที่พิสูจน์: Load balancer อ้างอิง origin pool ที่ถูกต้องพร้อมน้ำหนักและลำดับความสำคัญที่คาดหวัง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '.spec.default_route_pools[] | { pool: .pool.name, namespace: .pool.namespace, weight: .weight, priority: .priority }'| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — แสดงชื่อ origin pool ของคุณพร้อม weight/priority | LB กำลังส่งทราฟฟิกไปยัง backend ที่ถูกต้อง |
| ล้มเหลว — pool ว่างเปล่าหรือผิด | อัปเดตการกำหนดค่า default_route_pools ของ LB |
LB-5: สถานะการปรับใช้ (เงื่อนไขต่อไซต์)
หัวข้อที่มีชื่อว่า “LB-5: สถานะการปรับใช้ (เงื่อนไขต่อไซต์)”สิ่งที่พิสูจน์: Load balancer ถูกปรับใช้และรายงานสภาพที่ดีในทุกไซต์
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ state: .spec.state, dns_info: .spec.dns_info, host_name: .spec.host_name }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — state เป็น VIRTUAL_HOST_READY, dns_info มีค่า | LB ปรับใช้อย่างสมบูรณ์พร้อม VIP ที่กำหนด |
ล้มเหลว — สถานะรอดำเนินการหรือ dns_info ว่างเปล่า | ปัญหา DNS หรือใบรับรองที่บล็อกการปรับใช้ |
LB-6: สรุป LB แบบครบถ้วน
หัวข้อที่มีชื่อว่า “LB-6: สรุป LB แบบครบถ้วน”สิ่งที่พิสูจน์: สแนปชอตที่ครอบคลุมของการกำหนดค่า LB ทั้งสองสำหรับการดีบัก
HTTP LB (หลัก):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ name: .metadata.name, state: .spec.state, domains: .spec.domains, csd_enabled: (if .spec.client_side_defense then true else false end), route_pools: [.spec.default_route_pools[] | .pool.name], advertise: (if .spec.advertise_on_public_default_vip then "public_default_vip" else "custom" end) }'HTTPS LB (รอง — รวมสถานะใบรับรอง):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ name: .metadata.name, state: .spec.state, cert_state: .spec.cert_state, domains: .spec.domains, csd_enabled: (if .spec.client_side_defense then true else false end), route_pools: [.spec.default_route_pools[] | .pool.name] }'ชั้นที่ 4: Origin Pool
หัวข้อที่มีชื่อว่า “ชั้นที่ 4: Origin Pool”Origin pool กำหนดเซิร์ฟเวอร์ backend ที่ load balancer ส่งทราฟฟิกไปให้
OP-1: การกำหนดค่า Origin Pool
หัวข้อที่มีชื่อว่า “OP-1: การกำหนดค่า Origin Pool”สิ่งที่พิสูจน์: Origin pool มีอยู่พร้อมเซิร์ฟเวอร์ backend ที่ถูกต้อง พอร์ต และ LB algorithm
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '{ name: .metadata.name, origin_servers: [.spec.origin_servers[] | { ip: .public_ip.ip, labels: .labels }], port: .spec.port, lb_algorithm: .spec.loadbalancer_algorithm, endpoint_selection: .spec.endpoint_selection }'| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — แสดง IP, พอร์ต และ algorithm ที่ถูกต้อง | Origin pool กำหนดค่าอย่างถูกต้อง |
ล้มเหลว — 404 หรือค่าผิด | Origin pool หายไปหรือกำหนดค่าผิดพลาด |
แก้ไข: การทำงานอัตโนมัติของ API — ขั้นตอนที่ 2: สร้าง Origin Pool
OP-2: TLS ไปยัง Origin
หัวข้อที่มีชื่อว่า “OP-2: TLS ไปยัง Origin”สิ่งที่พิสูจน์: ว่า TLS ถูกกำหนดค่าสำหรับการเชื่อมต่อระหว่าง LB และเซิร์ฟเวอร์ต้นทางหรือไม่
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '{ tls_config: (if .spec.no_tls then "no_tls (plaintext)" elif .spec.use_tls then "use_tls (encrypted)" else "unknown" end) }'| ผลลัพธ์ | ความหมาย |
|---|---|
no_tls (plaintext) | LB เชื่อมต่อกับ origin ผ่าน HTTP (คาดหวังสำหรับการสาธิต Juice Shop) |
use_tls (encrypted) | LB เชื่อมต่อกับ origin ผ่าน HTTPS |
OP-3: การเชื่อมโยง Healthcheck
หัวข้อที่มีชื่อว่า “OP-3: การเชื่อมโยง Healthcheck”สิ่งที่พิสูจน์: Origin pool มี healthcheck ที่ถูกต้องเชื่อมโยงอยู่ (ถ้ามี)
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '.spec.healthcheck'| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — array พร้อมการอ้างอิง healthcheck (name, namespace, kind) | Healthcheck เชื่อมโยงแล้ว |
ตกลง — array ว่างเปล่า [] | ไม่มี healthcheck (ยอมรับได้ — CSD ไม่ต้องการ) |
| ล้มเหลว — คาดหวัง healthcheck แต่ array ว่างเปล่า | ไม่พบ healthcheck ในเวลาที่สร้าง — ดู Healthcheck ไม่ถูกเชื่อมโยง |
OP-4: การเชื่อมต่อ Origin
หัวข้อที่มีชื่อว่า “OP-4: การเชื่อมต่อ Origin”สิ่งที่พิสูจน์: เซิร์ฟเวอร์ต้นทางสามารถเข้าถึงได้จากฝั่งไคลเอนต์ (ไม่ทดสอบเส้นทาง LB-to-origin)
curl -s -o /dev/null -w '%{http_code}' \ "http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — 200 (หรือรหัส HTTP ที่ถูกต้องอื่น) | เซิร์ฟเวอร์ต้นทางกำลังตอบสนอง |
ล้มเหลว — 000 หรือปฏิเสธการเชื่อมต่อ | เซิร์ฟเวอร์ต้นทางไม่สามารถเข้าถึงได้จากเครือข่ายนี้ |
ชั้นที่ 5: Health Check
หัวข้อที่มีชื่อว่า “ชั้นที่ 5: Health Check”Health check ตรวจสอบความพร้อมใช้งานของ backend ไม่จำเป็นสำหรับ CSD แต่มีประโยชน์สำหรับการปรับใช้ในสภาพแวดล้อมการผลิต
HC-1: การกำหนดค่า Healthcheck
หัวข้อที่มีชื่อว่า “HC-1: การกำหนดค่า Healthcheck”สิ่งที่พิสูจน์: healthcheck มีอยู่พร้อมประเภท เส้นทาง ช่วงเวลา และ threshold ที่ถูกต้อง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx" \ | jq '{ name: .metadata.name, type: (if .spec.http_health_check then "HTTP" elif .spec.tcp_health_check then "TCP" else "unknown" end), path: .spec.http_health_check.path, expected_status: .spec.http_health_check.expected_status_codes, timeout: .spec.timeout, interval: .spec.interval, unhealthy_threshold: .spec.unhealthy_threshold, healthy_threshold: .spec.healthy_threshold }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — แสดงประเภท HTTP พร้อมเส้นทาง / และ 200 ที่คาดหวัง | Healthcheck กำหนดค่าอย่างถูกต้อง |
ล้มเหลว — การตอบสนอง 404 | Healthcheck ไม่มีอยู่ (อาจถูกข้ามไป — ดู Phase 1 ขั้นตอนที่ 1) |
HC-2: แสดงรายการ Healthcheck ทั้งหมด
หัวข้อที่มีชื่อว่า “HC-2: แสดงรายการ Healthcheck ทั้งหมด”สิ่งที่พิสูจน์: แสดง healthcheck ทั้งหมดใน namespace เพื่อตรวจสอบการตั้งชื่อและจำนวน
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \ | jq -r ' ["NAME", "NAMESPACE", "DESCRIPTION"], (.items[] | [ .name, .namespace, (.description | if length == 0 then "—" else . end) ]) | @tsv' | column -tชั้นที่ 6: การกำหนดค่า CSD
หัวข้อที่มีชื่อว่า “ชั้นที่ 6: การกำหนดค่า CSD”CSD ต้องเปิดใช้งานในระดับ tenant และมีการกำหนดค่า tag การฉีด JavaScript
CSD-1: สถานะ CSD ของ Tenant
หัวข้อที่มีชื่อว่า “CSD-1: สถานะ CSD ของ Tenant”สิ่งที่พิสูจน์: CSD ถูกกำหนดค่าและเปิดใช้งานสำหรับ tenant
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{isConfigured, isEnabled}'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — ทั้งคู่เป็น true | CSD ทำงานอยู่สำหรับ tenant นี้ |
ล้มเหลว — isConfigured: false | CSD ไม่ได้เปิดใช้งานในระดับ tenant — ติดต่อผู้ดูแลระบบ F5 XC |
ล้มเหลว — isEnabled: false | CSD ถูกกำหนดค่าแต่ไม่ได้ใช้งาน |
CSD-2: JS Injection Tag
หัวข้อที่มีชื่อว่า “CSD-2: JS Injection Tag”สิ่งที่พิสูจน์: CSD JavaScript injection tag ถูกสร้างขึ้นและพร้อมสำหรับการฉีด
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq '{has_script_tag: (.scriptTag | length > 0)}'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — has_script_tag: true | JS injection tag ถูกกำหนดค่าแล้ว |
ล้มเหลว — has_script_tag: false | ไม่มี script tag — ตรวจสอบว่า CSD เปิดใช้งานอยู่และโดเมนที่ได้รับการป้องกันถูกลงทะเบียนแล้ว |
CSD-3: เนื้อหา JS Tag
หัวข้อที่มีชื่อว่า “CSD-3: เนื้อหา JS Tag”สิ่งที่พิสูจน์: แสดง script tag แบบเต็มสำหรับการตรวจสอบหรือการฉีดด้วยตนเอง
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq '.scriptTag'CSD-4: การลงทะเบียนโดเมนที่ได้รับการป้องกัน
หัวข้อที่มีชื่อว่า “CSD-4: การลงทะเบียนโดเมนที่ได้รับการป้องกัน”สิ่งที่พิสูจน์: root domain ถูกลงทะเบียนเป็น CSD protected domain บน tenant
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items[] | {name, namespace, description}'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — แสดงรายการพร้อม name ที่ไม่ว่างเปล่า | โดเมนได้รับการป้องกัน |
ล้มเหลว — รายการมีฟิลด์ name และ namespace ว่างเปล่า | ไม่มีโดเมนที่ได้รับการป้องกันที่ลงทะเบียน — ดู Phase 1 ขั้นตอนที่ 6 |
CSD-5: การตรวจสอบการฉีด JS แบบสด
หัวข้อที่มีชื่อว่า “CSD-5: การตรวจสอบการฉีด JS แบบสด”สิ่งที่พิสูจน์: CSD JavaScript กำลังถูกฉีดเข้าไปในการตอบสนองของหน้าที่ให้บริการโดย load balancer จริง ๆ
curl -s "http://xF5XC_DOMAINNAMEx/" \ | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — คืนค่า fragment URL ของ zeronaught.com หรือ shape.com (เช่น zeronaught.com/__imp_apg__/js/...) | CSD JavaScript กำลังถูกฉีดเข้าไปในหน้า |
| ล้มเหลว — ผลลัพธ์ว่างเปล่า | JS ไม่ถูกฉีด — ตรวจสอบ LB-3 และ CSD-1 |
ชั้นที่ 7: การตรวจสอบทราฟฟิก
หัวข้อที่มีชื่อว่า “ชั้นที่ 7: การตรวจสอบทราฟฟิก”ตรวจสอบว่าทราฟฟิกแบบสดกำลังไปถึง load balancer และถูกประมวลผลอย่างถูกต้อง
TV-1: จำนวนคำขอ (24 ชั่วโมงที่ผ่านมา)
หัวข้อที่มีชื่อว่า “TV-1: จำนวนคำขอ (24 ชั่วโมงที่ผ่านมา)”สิ่งที่พิสูจน์: ทราฟฟิกกำลังไปถึง load balancer ผลลัพธ์เป็นศูนย์หมายความว่าไม่มีทราฟฟิกมาถึง
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'" }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \ | jq '{total_requests: .total_hits}'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — total_requests เป็น string ที่ไม่ใช่ศูนย์ (เช่น "380") | ทราฟฟิกกำลังไหลผ่าน LB |
ล้มเหลว — "0" หรือไม่มีข้อมูล | ไม่มีทราฟฟิกถึง LB — ตรวจสอบ DNS-1 และ LB-1 |
TV-2: การกระจาย Status Code
หัวข้อที่มีชื่อว่า “TV-2: การกระจาย Status Code”สิ่งที่พิสูจน์: การแจกแจง response status code เผยให้เห็นรูปแบบข้อผิดพลาด
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 100 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq -r ' [.logs[] | fromjson | .rsp_code_class] | group_by(.) | map({class: .[0], count: length}) | sort_by(-.count) | ["STATUS_CLASS", "COUNT"], (.[] | [.class, .count]) | @tsv' | column -tผลลัพธ์ที่คาดหวังสำหรับไซต์ที่มีสุขภาพดี:
STATUS_CLASS COUNT2xx 82downstream_remote_disconnect 18| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — ส่วนใหญ่เป็น 2xx | ไซต์กำลังให้บริการการตอบสนองที่สำเร็จ |
เตือน — จำนวน 4xx สูง | ข้อผิดพลาดของไคลเอนต์ (URL ไม่ถูกต้อง ทรัพยากรหายไป) |
ล้มเหลว — จำนวน 5xx สูง | ข้อผิดพลาดของเซิร์ฟเวอร์ — ตรวจสอบสุขภาพ origin server |
คลาส downstream_remote_disconnect บ่งชี้ว่าไคลเอนต์ปิดการเชื่อมต่อก่อนที่การตอบสนองจะเสร็จสมบูรณ์ (พบบ่อยสำหรับคำขอ long-polling หรือ WebSocket upgrade)
TV-3: ตัวอย่างคำขอล่าสุด
หัวข้อที่มีชื่อว่า “TV-3: ตัวอย่างคำขอล่าสุด”สิ่งที่พิสูจน์: คำขอแต่ละรายการถูกบันทึกพร้อมฟิลด์ที่ถูกต้อง
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 10 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq -r ' ["TIMESTAMP", "METHOD", "PATH", "STATUS", "SRC_IP"], (.logs[] | fromjson | [.["@timestamp"], .method, .req_path, .rsp_code, .src_ip]) | @tsv' | column -tTV-4: CSD JS Injection ใน Access Log
หัวข้อที่มีชื่อว่า “TV-4: CSD JS Injection ใน Access Log”สิ่งที่พิสูจน์: Access log ยืนยันว่า CSD JavaScript กำลังถูกฉีดเข้าไปในการตอบสนอง
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'", "end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'", "sort": "DESCENDING", "limit": 20 }' \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \ | jq '[.logs[] | fromjson | select(.csd_js_injection == "true")] | length as $injected | {injected_count: $injected, total_sampled: 20}'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — injected_count > 0 | CSD JS กำลังถูกฉีดเข้าไปในการตอบสนองของหน้า |
ล้มเหลว — injected_count: 0 | JS ไม่ถูกฉีด — ตรวจสอบ CSD-1 และ LB-3 |
TV-5: การทดสอบการเชื่อมต่อ End-to-End
หัวข้อที่มีชื่อว่า “TV-5: การทดสอบการเชื่อมต่อ End-to-End”สิ่งที่พิสูจน์: คำขอที่สมบูรณ์ไหลจากไคลเอนต์ผ่าน DNS, LB และ origin และคืนค่าการตอบสนองที่ถูกต้อง
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'Connected to|< HTTP|< content-type'| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — แสดงการเชื่อมต่อ HTTP 200 และ content-type | stack ทั้งหมดทำงานได้ |
| ล้มเหลว — ปฏิเสธการเชื่อมต่อหรือข้อผิดพลาด DNS | เริ่มดีบักที่ ชั้นที่ 1: DNS |
ชั้นที่ 8: CSD Telemetry & นโยบายโดเมน
หัวข้อที่มีชื่อว่า “ชั้นที่ 8: CSD Telemetry & นโยบายโดเมน”คำสั่งเหล่านี้สอบถามข้อมูลเดียวกับที่แสดงในแดชบอร์ด CSD คอนโซล รายการ script ฟิลด์ฟอร์ม และมุมมองเครือข่าย
TEL-1: รายการ Script
หัวข้อที่มีชื่อว่า “TEL-1: รายการ Script”สิ่งที่พิสูจน์: CSD กำลังตรวจจับและจัดทำแคตตาล็อก script ที่ทำงานบนโดเมนที่ได้รับการป้องกัน
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq -r ' ["SCRIPT", "RISK", "STATUS", "FIELDS", "USERS"], (.scripts[] | [ (.script_name | if length > 50 then .[:47] + "..." else . end), .risk_level, .status, (.form_fields_read // 0), (.affected_users_count // 0) ]) | @tsv' | column -t| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — แสดง script พร้อมระดับความเสี่ยง | CSD กำลังตรวจสอบ script อย่างแข็งขัน |
| ล้มเหลว — array ว่างเปล่า | ดู การแก้ปัญหา: Empty Scripts Array |
TEL-2: โดเมนที่ตรวจพบ
หัวข้อที่มีชื่อว่า “TEL-2: โดเมนที่ตรวจพบ”สิ่งที่พิสูจน์: CSD ตรวจพบโดเมนต้นทาง script และจำแนกตามสถานะ
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ summary: { action_needed: .domain_summary.actionNeededCount.count, mitigated: .domain_summary.mitigatedDomains.count, allowed: .domain_summary.allowedDomains.count, total: .domain_summary.totalDomains.count }, domains: [.domains_list[] | { domain: .domain, category: .category, status: .status, first_seen: (.firstSeenDate | tonumber | todate), latest_seen: (.latestSeenDate | tonumber | todate) }] }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — total > 0 พร้อมโดเมนที่แสดงรายการ | CSD กำลังติดตาม script domain |
เตือน — action_needed > 0 | บางโดเมนต้องการการตรวจสอบ |
| ล้มเหลว — การตอบสนองว่างเปล่า | ไม่มีข้อมูล telemetry — ตรวจสอบ CSD-5 |
TEL-3: สถานะนโยบายโดเมน
หัวข้อที่มีชื่อว่า “TEL-3: สถานะนโยบายโดเมน”สิ่งที่พิสูจน์: แสดงการกระจายของโดเมนที่อนุญาตเทียบกับที่บรรเทาแล้ว และว่านโยบายสอดคล้องกันหรือไม่
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ action_needed: .domain_summary.actionNeededCount.count, mitigated: .domain_summary.mitigatedDomains.count, allowed: .domain_summary.allowedDomains.count, total: .domain_summary.totalDomains.count, domains_needing_action: [.domains_list[] | select(.status == "AN") | .domain] }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — action_needed: 0 | โดเมนทั้งหมดได้รับการตรวจสอบและจำแนกแล้ว |
เตือน — action_needed > 0 | โดเมนที่แสดงรายการใน domains_needing_action ต้องการการตรวจสอบ |
TEL-4: รายการฟิลด์ฟอร์ม
หัวข้อที่มีชื่อว่า “TEL-4: รายการฟิลด์ฟอร์ม”สิ่งที่พิสูจน์: CSD ตรวจพบฟิลด์ฟอร์มที่ script กำลังอ่าน พร้อมการจำแนกความไว
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=${START}&endTime=${NOW}" \ | jq -r ' ["FIELD", "SENSITIVITY", "SCRIPTS"], (.form_fields[] | [ .name, .analysis, (.scripts_count // 0) ]) | @tsv' | column -t| ผลลัพธ์ | ความหมาย |
|---|---|
| ผ่าน — แสดงฟิลด์ฟอร์มพร้อมความไว | CSD กำลังติดตามการเข้าถึงฟิลด์ฟอร์ม |
| ข้อมูล — array ว่างเปล่า | ไม่ตรวจพบฟิลด์ฟอร์ม (คาดหวังหากไซต์ไม่มีฟอร์ม) |
TEL-5: การตรวจสอบ Script เชิงลึก
หัวข้อที่มีชื่อว่า “TEL-5: การตรวจสอบ Script เชิงลึก”สิ่งที่พิสูจน์: ข้อมูลโดยละเอียดเกี่ยวกับ script เฉพาะ รวมถึงความเสี่ยง พฤติกรรม และการโต้ตอบทางเครือข่าย
ก่อนอื่น ให้รับ script ID จาก TEL-1 จากนั้นสอบถามรายละเอียด:
SCRIPT_ID="your-script-id"
# ภาพรวม (ระดับความเสี่ยง ประเภท source domain)curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/dashboard" \ | jq '{script_name, risk_level, type, source_domain, status}'
# พฤติกรรมตามเวลาcurl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \ | jq '.behaviors'
# การโต้ตอบทางเครือข่าย (โดเมนที่ script สื่อสารด้วย)curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \ | jq '.network_interactions'TEL-6: ผู้ใช้ที่ได้รับผลกระทบ
หัวข้อที่มีชื่อว่า “TEL-6: ผู้ใช้ที่ได้รับผลกระทบ”สิ่งที่พิสูจน์: แสดงรายการผู้ใช้ที่ได้รับผลกระทบจาก script เฉพาะ แสดงขอบเขตของการเปิดเผย
SCRIPT_ID="your-script-id"NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/affectedUsers" \ | jq -r ' ["IP_ADDRESS", "DEVICE_ID", "GEO", "CHANNEL", "USER_AGENT"], (.affected_users[] | [ .ip_address, (.device_id | if length > 12 then .[:12] + "..." else . end), .geolocation, .channel, (.user_agent | if length > 30 then .[:27] + "..." else . end) ]) | @tsv' | column -tTEL-7: จำนวน Script ตามระดับความเสี่ยง
หัวข้อที่มีชื่อว่า “TEL-7: จำนวน Script ตามระดับความเสี่ยง”สิ่งที่พิสูจน์: การกระจายความเสี่ยงรวมสำหรับ script ทั้งหมดที่ตรวจพบ
NOW=$(date +%s)START=$(( NOW - 604800 ))
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"startTime\": \"${START}\", \"endTime\": \"${NOW}\" }" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '[.scripts[] | .risk_level] | group_by(.) | map({risk_level: .[0], count: length}) | sort_by(-.count)'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — ทั้งหมดเป็น No Risk | ไม่ตรวจพบ script ที่มีความเสี่ยง |
เตือน — มี Low Risk หรือ High Risk | ตรวจสอบ script ที่ถูกตั้งค่าสถานะใน TEL-5 |
TEL-8: ความสดใหม่ของ Telemetry
หัวข้อที่มีชื่อว่า “TEL-8: ความสดใหม่ของ Telemetry”สิ่งที่พิสูจน์: ข้อมูล CSD telemetry เป็นปัจจุบัน ยืนยันการตรวจสอบที่ทำงานอยู่
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{ total_domains: .domain_summary.totalDomains.count, latest_update: (.domain_summary.totalDomains.lastUpdated // "unknown"), most_recent_domain: (.domains_list | sort_by(.latestSeenDate) | last | { domain: .domain, latest_seen: (.latestSeenDate | tonumber | todate) }) }'| ผลลัพธ์ | ความหมาย |
|---|---|
ผ่าน — latest_seen อยู่ภายใน 24 ชั่วโมงที่ผ่านมา | Telemetry กำลังรวบรวมข้อมูลอย่างแข็งขัน |
เตือน — latest_seen เก่ากว่า 24 ชั่วโมง | ทราฟฟิกอาจหยุดหรือการประมวลผล CSD ล่าช้า |
แดชบอร์ด Full-Stack
หัวข้อที่มีชื่อว่า “แดชบอร์ด Full-Stack”เรียกใช้คำสั่งเดียวที่ตรวจสอบตัวบ่งชี้สุขภาพที่สำคัญทั้งหมดในทุกชั้นและสร้างตารางสรุป:
echo "=== CSD Verification Dashboard ==="echo ""
# ชั้นที่ 1: DNSDNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# ชั้นที่ 2-3: LB + TLSLB=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")LB_HTTPS=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")
LB_STATE=$(echo "$LB" | jq -r '.spec.state // "UNKNOWN"')CERT_STATE=$(echo "$LB_HTTPS" | jq -r '.spec.cert_state // "UNKNOWN"')CSD_ON_LB=$(echo "$LB" | jq -r 'if .spec.client_side_defense then "ENABLED" else "DISABLED" end')DOMAINS=$(echo "$LB" | jq -r '.spec.domains | join(", ")')ROUTE_POOL=$(echo "$LB" | jq -r '[.spec.default_route_pools[] | .pool.name] | join(", ")')
# ชั้นที่ 6: สถานะ CSDCSD=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status")
CSD_CONFIGURED=$(echo "$CSD" | jq -r '.isConfigured // false')CSD_ENABLED=$(echo "$CSD" | jq -r '.isEnabled // false')
# ชั้นที่ 6: JS configJS_TAG=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq -r 'if (.scriptTag | length) > 0 then "PRESENT" else "MISSING" end')
# ชั้นที่ 7: ทราฟฟิก (24 ชั่วโมงล่าสุด)TRAFFIC=$(curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{ \"start_time\": \"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)\", \"end_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" }" \ "xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \ | jq -r '.total_hits // "0"')
printf "%-28s %s\n" "CHECK" "STATUS"printf "%-28s %s\n" "----------------------------" "----------------------------"printf "%-28s %s\n" "[DNS] A Record" "${DNS_A:-NOT_FOUND}"printf "%-28s %s\n" "[DNS] ACME CNAME" "${DNS_ACME:-NOT_FOUND}"printf "%-28s %s\n" "[TLS] Certificate" "$CERT_STATE"printf "%-28s %s\n" "[LB] State" "$LB_STATE"printf "%-28s %s\n" "[LB] Domains" "$DOMAINS"printf "%-28s %s\n" "[LB] Route Pool" "$ROUTE_POOL"printf "%-28s %s\n" "[LB] CSD on LB" "$CSD_ON_LB"printf "%-28s %s\n" "[CSD] Configured (tenant)" "$CSD_CONFIGURED"printf "%-28s %s\n" "[CSD] Enabled" "$CSD_ENABLED"printf "%-28s %s\n" "[CSD] JS Script Tag" "$JS_TAG"printf "%-28s %s\n" "[Traffic] Requests (24h)" "$TRAFFIC"การอ้างอิงฟิลด์ Access Log
หัวข้อที่มีชื่อว่า “การอ้างอิงฟิลด์ Access Log”| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
@timestamp | string | timestamp ของคำขอ (ISO 8601) สังเกต prefix @ — เข้าถึงด้วย .["@timestamp"] ใน jq |
method | string | HTTP method (GET, POST, ฯลฯ) |
req_path | string | URI path ของคำขอ |
rsp_code | string | HTTP response status code เป็น string (เช่น "200", "404") |
rsp_code_class | string | คลาสของ status code (2xx, 3xx, 4xx, 5xx หรือ downstream_remote_disconnect) |
src_ip | string | IP address ต้นทางของไคลเอนต์ |
dst_ip | string | IP address ปลายทาง (VIP) |
domain | string | ค่า Host header ของคำขอ |
user_agent | string | string User-Agent ของไคลเอนต์ |
rsp_size | string | ขนาด response body เป็นไบต์ (คืนค่าเป็น string) |
req_size | string | ขนาด request body เป็นไบต์ (คืนค่าเป็น string) |
duration_with_data_tx_delay | string | ระยะเวลาคำขอรวมทั้งหมดเป็นวินาที (คืนค่าเป็น string เช่น "0.024219") |
csd_js_injection | string | "true" เมื่อ CSD JavaScript ถูกฉีด (มีอยู่เฉพาะเมื่อทำงาน) |
การอ้างอิงฟิลด์ CSD Telemetry
หัวข้อที่มีชื่อว่า “การอ้างอิงฟิลด์ CSD Telemetry”| ฟิลด์ | Endpoint | คำอธิบาย |
|---|---|---|
isConfigured | status | CSD เปิดใช้งานในระดับ tenant |
isEnabled | status | CSD ทำงานอยู่สำหรับ namespace นี้ |
scripts[] | scripts | Array ของอ็อบเจกต์ script ที่ตรวจพบ |
.script_name | scripts | URL แบบเต็มของไฟล์ JavaScript |
.risk_level | scripts | ระดับความเสี่ยง (No Risk, Low Risk, High Risk) |
.status | scripts | AN (Action Needed) หรือ NA (No Action Needed) |
.form_fields_read | scripts | จำนวนฟิลด์ฟอร์มที่ script อ่าน |
.affected_users_count | scripts | จำนวนผู้ใช้/เซสชันที่ไม่ซ้ำกันที่ได้รับผลกระทบ |
domain_summary | detected_domains | จำนวนตามสถานะ: .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (แต่ละรายการมี .count และ .lastUpdated) |
domains_list[] | detected_domains | Array ของอ็อบเจกต์โดเมนที่ตรวจพบพร้อม .domain, .status, .category, .firstSeenDate, .latestSeenDate (epoch seconds เป็น string) |
form_fields[] | formFields | Array ของอ็อบเจกต์ฟิลด์ฟอร์มที่ตรวจพบ |
.analysis | formFields | การจำแนกความไว (Sensitive, Not Sensitive) |
การแก้ปัญหา
หัวข้อที่มีชื่อว่า “การแก้ปัญหา”Access Log เป็นศูนย์
หัวข้อที่มีชื่อว่า “Access Log เป็นศูนย์”หาก TV-1 คืนค่า 0:
-
ตรวจสอบการแก้ไข DNS — ตรวจสอบว่าโดเมนแก้ไขเป็น LB VIP:
Terminal window dig +short xF5XC_DOMAINNAMEx Aหากว่างเปล่า DNS ไม่ได้กำหนดค่า ดู การทำงานอัตโนมัติของ API — ขั้นตอนที่ 4
-
ตรวจสอบสถานะ LB — load balancer ต้องเป็น
VIRTUAL_HOST_READY:Terminal window curl -s \-H "Authorization: APIToken xF5XC_API_TOKENx" \"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \| jq '.spec.state' -
ส่งคำขอทดสอบ — สร้างทราฟฟิกเพื่อยืนยันการเชื่อมต่อ end-to-end:
Terminal window curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20มองหาการตอบสนอง HTTP ที่สำเร็จ ใช้
https://เฉพาะเมื่อใบรับรอง HTTPS LB ถูกต้องเท่านั้น
Managed Records ถูกปิดใช้งานบน DNS Zone
หัวข้อที่มีชื่อว่า “Managed Records ถูกปิดใช้งานบน DNS Zone”หาก DNS-4 คืนค่า false การสร้าง record อัตโนมัติจะถูกปิดใช้งานแม้ว่า F5 XC จะเป็น authoritative DNS provider นี่เป็นการกำหนดค่าผิดพลาดที่พบบ่อยซึ่งทำให้ทั้ง A record และ ACME CNAME หายไป ซึ่งบล็อก load balancer จากการถึง VIRTUAL_HOST_READY และใบรับรองจากการออก
หากต้องการเปิดใช้งาน managed records ให้อัปเดตการกำหนดค่า DNS zone เพื่อตั้งค่า allow_http_lb_managed_records: true ดู การทำงานอัตโนมัติของ API — ตัวเลือก A: F5 XC Managed DNS สำหรับการเรียก API
LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD
หัวข้อที่มีชื่อว่า “LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD”Load balancer กำลังรอ DNS A record ที่ชี้ไปที่ VIP ดู LB ค้างใน VIRTUAL_HOST_PENDING_A_RECORD สำหรับขั้นตอนการแก้ปัญหาโดยละเอียด
ใบรับรองค้างใน PreDomainChallengePending
หัวข้อที่มีชื่อว่า “ใบรับรองค้างใน PreDomainChallengePending”ใบรับรอง TLS อัตโนมัติต้องการ ACME challenge record วิธีการขึ้นอยู่กับผู้ให้บริการ DNS ของคุณ:
F5 XC Managed DNS: เปิดใช้งาน allow_http_lb_managed_records บน DNS zone (DNS-4) แพลตฟอร์มสร้าง TXT-based ACME challenge record อัตโนมัติในกลุ่ม RR set x-ves-io-managed หากใบรับรองยังคงค้างหลังจากเปิดใช้งาน managed records ให้ลบและสร้าง load balancer ใหม่เพื่อเริ่มคำขอใบรับรองใหม่
External DNS: สร้าง CNAME record ที่ผู้ให้บริการ DNS ของคุณ:
_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.ioตรวจสอบว่า record มีอยู่:
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXTหากทั้งคู่ว่างเปล่า ACME record ไม่ได้กำหนดค่า การจัดเตรียมใบรับรองใช้เวลา 5–10 นาทีหลังจาก record พร้อมใช้งาน ตรวจสอบสถานะข้อผิดพลาดของ LB สำหรับข้อผิดพลาดการตรวจสอบ ACME เฉพาะ:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'CSD isConfigured เป็น false
หัวข้อที่มีชื่อว่า “CSD isConfigured เป็น false”CSD ต้องเปิดใช้งานในระดับ tenant โดยผู้ดูแลระบบ F5 XC นี่เป็นการตั้งค่าทั่วทั้ง tenant ที่ไม่สามารถกำหนดค่าผ่าน namespace API ได้ ติดต่อผู้ดูแลระบบของคุณเพื่อเปิดใช้งานการป้องกันฝั่งไคลเอนต์
Empty Scripts Array
หัวข้อที่มีชื่อว่า “Empty Scripts Array”หาก TEL-1 คืนค่า array ว่างเปล่า:
-
ตรวจสอบโดเมนที่ได้รับการป้องกัน — CSD ตรวจสอบ script เฉพาะบนโดเมนที่ลงทะเบียนเท่านั้น:
Terminal window curl -s \-H "Authorization: APIToken xF5XC_API_TOKENx" \"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \| jq '.items[] | {name, namespace}' -
ตรวจสอบการฉีด JS — ยืนยันว่า CSD script tag กำลังถูกฉีดเข้าไปในหน้า:
Terminal window curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1หากไม่มีการจับคู่ CSD JavaScript ไม่ถูกฉีด ตรวจสอบว่า LB มี
client_side_defenseเปิดใช้งาน -
รอเวลาการประมวลผล — หลังจากเปิดใช้งาน CSD ครั้งแรกหรือลงทะเบียนโดเมนที่ได้รับการป้องกันใหม่ การตรวจจับ script อาจใช้เวลา 5–15 นาที สร้างทราฟฟิกไปยังไซต์และรอก่อนตรวจสอบอีกครั้ง
การอ้างอิงด่วน
หัวข้อที่มีชื่อว่า “การอ้างอิงด่วน”ค่าที่ตั้งไว้ล่วงหน้าสำหรับช่วงเวลา
หัวข้อที่มีชื่อว่า “ค่าที่ตั้งไว้ล่วงหน้าสำหรับช่วงเวลา”| ระยะเวลา | Epoch offset | ISO 8601 (Linux) | ISO 8601 (macOS) |
|---|---|---|---|
| 1 ชั่วโมง | $(( $(date +%s) - 3600 )) | date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-1H +%Y-%m-%dT%H:%M:%SZ |
| 24 ชั่วโมง | $(( $(date +%s) - 86400 )) | date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-24H +%Y-%m-%dT%H:%M:%SZ |
| 7 วัน | $(( $(date +%s) - 604800 )) | date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-7d +%Y-%m-%dT%H:%M:%SZ |
| 30 วัน | $(( $(date +%s) - 2592000 )) | date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ | date -u -v-30d +%Y-%m-%dT%H:%M:%SZ |
สรุปชั้นการตรวจสอบ
หัวข้อที่มีชื่อว่า “สรุปชั้นการตรวจสอบ”| ชั้น | การทดสอบ | สิ่งที่ครอบคลุม |
|---|---|---|
| 1. การแก้ไข DNS | DNS-1 ถึง DNS-4 | A record, ACME CNAME, อำนาจ nameserver, managed records |
| 2. ใบรับรอง TLS | TLS-1 ถึง TLS-4 | สถานะใบรับรอง, รายละเอียดใบรับรอง, handshake แบบสด, เป้าหมาย ACME |
| 3. HTTP Load Balancer | LB-1 ถึง LB-6 | สถานะ, โดเมน, ค่าสถานะ CSD, route pool, การปรับใช้, สรุป |
| 4. Origin Pool | OP-1 ถึง OP-4 | การกำหนดค่า, โหมด TLS, การเชื่อมโยง HC, การเชื่อมต่อ origin |
| 5. Health Check | HC-1 ถึง HC-2 | การกำหนดค่า HC, แสดงรายการ HC ทั้งหมด |
| 6. การกำหนดค่า CSD | CSD-1 ถึง CSD-5 | สถานะ tenant, JS tag, โดเมนที่ได้รับการป้องกัน, การฉีดแบบสด |
| 7. การตรวจสอบทราฟฟิก | TV-1 ถึง TV-5 | จำนวนคำขอ, status code, ตัวอย่าง, JS ใน log, การทดสอบ E2E |
| 8. CSD Telemetry | TEL-1 ถึง TEL-8 | Script, โดเมน, นโยบาย, ฟิลด์ฟอร์ม, การตรวจสอบเชิงลึก, ผู้ใช้, ความเสี่ยง, ความสดใหม่ |
สรุป Endpoint
หัวข้อที่มีชื่อว่า “สรุป Endpoint”| การวินิจฉัย | Endpoint | Method | รูปแบบเวลา |
|---|---|---|---|
| จำนวนคำขอ | /api/data/namespaces/\{ns\}/access_logs/aggregation | POST | ISO 8601 |
| Status code | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| คำขอล่าสุด | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| สถานะ LB | /api/config/namespaces/\{ns\}/http_loadbalancers/\{name\} | GET | ไม่มี |
| Origin pool | /api/config/namespaces/\{ns\}/origin_pools/\{name\} | GET | ไม่มี |
| Healthcheck | /api/config/namespaces/\{ns\}/healthchecks/\{name\} | GET | ไม่มี |
| DNS zone | /api/config/dns/namespaces/system/dns_zones/\{zone\} | GET | ไม่มี |
| สถานะ CSD | /api/shape/csd/namespaces/\{ns\}/status | GET | ไม่มี |
| การกำหนดค่า JS | /api/shape/csd/namespaces/\{ns\}/js_configuration | GET | ไม่มี |
| โดเมนที่ได้รับการป้องกัน | /api/shape/csd/namespaces/\{ns\}/protected_domains | GET | ไม่มี |
| รายการ script | /api/shape/csd/namespaces/\{ns\}/scripts | POST | Epoch seconds |
| โดเมนที่ตรวจพบ | /api/shape/csd/namespaces/\{ns\}/detected_domains | GET | ไม่มี |
| ฟิลด์ฟอร์ม | /api/shape/csd/namespaces/\{ns\}/formFields | GET | Epoch seconds (query params) |
| รายละเอียด script | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboard | GET | ไม่มี |
| พฤติกรรม script | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviors | GET | ไม่มี |
| เครือข่าย script | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractions | GET | ไม่มี |
| ผู้ใช้ที่ได้รับผลกระทบ | /api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsers | POST | Epoch seconds |