- الرئيسية
- الدفاع من جهة العميل
- التشخيصات والتحقق
التشخيصات والتحقق
تقدم هذه الصفحة مصفوفة تحقق UAT متعددة الطبقات للتحقق من صحة نشر الدفاع من جهة العميل من البداية إلى النهاية. يتبع كل حالة اختبار سلسلة تبعيات البنية التحتية — من حل أسماء DNS عبر بيانات قياس CSD — حتى تتمكن من إثبات أن كل مكون يعمل بشكل صحيح بصورة منهجية.
هذه الأوامر هي المكافئ عبر API لـ جولة وحدة تحكم CSD — استخدمها عندما تحتاج إلى التحقق من الطرفية، أو أتمتة المراقبة، أو عرض إمكانات CSD دون واجهة المستخدم.
المتطلبات المسبقة
Section titled “المتطلبات المسبقة”قم بإعداد متغيرات البيئة كما هو موضح في أتمتة API — إعداد البيئة:
set -a && source .env && set +aتستخدم جميع الأوامر أدناه صيغة العنصر النائب xTOKENx. استبدلها بمتغيرات البيئة الخاصة بك ($F5XC_API_TOKEN، $F5XC_NAMESPACE، إلخ) أو استخدم النموذج التفاعلي أعلى الصفحة.
ملاحظات سلوك API
Section titled “ملاحظات سلوك API”مساعدات النطاق الزمني
Section titled “مساعدات النطاق الزمني”تتطلب العديد من نقاط نهاية CSD طوابع زمنية بصيغة epoch (الثواني منذ Unix epoch). تحسب هذه الأوامر المختصرة أوقات البداية/النهاية للنطاقات الشائعة.
متعدد المنصات (macOS + Linux):
# Current time as epoch secondsNOW=$(date +%s)
# 1 hour agoSTART_1H=$(( NOW - 3600 ))
# 24 hours agoSTART_24H=$(( NOW - 86400 ))
# 7 days agoSTART_7D=$(( NOW - 604800 ))
# 30 days agoSTART_30D=$(( NOW - 2592000 ))| الإعداد المسبق | الثواني | تعبير Shell |
|---|---|---|
| ساعة واحدة | 3,600 | $(( $(date +%s) - 3600 )) |
| 24 ساعة | 86,400 | $(( $(date +%s) - 86400 )) |
| 7 أيام | 604,800 | $(( $(date +%s) - 604800 )) |
| 30 يومًا | 2,592,000 | $(( $(date +%s) - 2592000 )) |
تنسيق حالات الاختبار
Section titled “تنسيق حالات الاختبار”تتبع كل حالة اختبار أدناه هذا الهيكل:
| الحقل | الوصف |
|---|---|
| معرف الاختبار | رقم الطبقة + المعرف التسلسلي (مثل DNS-1، TLS-2) |
| ما يُثبته | حقيقة البنية التحتية المحددة الجاري التحقق منها |
| الأمر | أمر curl أو dig جاهز للتشغيل |
| نجاح / فشل | المخرجات المتوقعة للحالة الصحية مقابل غير الصحية |
| الإصلاح | رابط إلى قسم الإعداد أو استكشاف الأخطاء ذي الصلة |
الطبقة 1: حل أسماء DNS
Section titled “الطبقة 1: حل أسماء DNS”DNS هو الأساس — إذا لم يتم حل اسم النطاق إلى عنوان VIP الخاص بموازن التحميل، فلن يعمل أي شيء آخر.
DNS-1: حل سجل A
Section titled “DNS-1: حل سجل A”ما يُثبته: يتم حل النطاق إلى عنوان IP الخاص بـ VIP لموازن التحميل.
dig +short xF5XC_DOMAINNAMEx A| النتيجة | المعنى |
|---|---|
نجاح — تم إرجاع عنوان IP للـ VIP (مثل 72.19.3.185) | يتم حل النطاق إلى العنوان الافتراضي IP لموازن التحميل |
| فشل — استجابة فارغة | لم يتم تكوين سجل A لـ DNS |
الإصلاح: أتمتة API — الخطوة 4: تكوين DNS
DNS-2: سجل تحدي ACME
Section titled “DNS-2: سجل تحدي ACME”ما يُثبته: يوجد سجل تحدي ACME لتوفير شهادة TLS تلقائيًا.
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT| النتيجة | المعنى |
|---|---|
نجاح — CNAME إلى *.autocerts.ves.volterra.io. (DNS خارجي) | سجل CNAME لتحدي ACME موجود |
| نجاح — سجل TXT بقيمة النطاق (DNS مُدار بواسطة F5 Distributed Cloud (F5 XC)) | تحدي ACME مُدار بواسطة المنصة عبر سجل TXT |
| فشل — كلاهما فارغ | لم يتم تكوين سجل ACME؛ ستظل الشهادة في حالة PreDomainChallengePending |
الإصلاح: بالنسبة للـ DNS الخارجي، أنشئ CNAME: _acme-challenge.xF5XC_DOMAINNAMEx → *.autocerts.ves.volterra.io. بالنسبة لـ DNS المُدار بواسطة F5 XC، مكّن allow_http_lb_managed_records في منطقة DNS — راجع DNS-4. انظر أتمتة API — الخطوة 4.
DNS-3: صلاحية خادم الأسماء
Section titled “DNS-3: صلاحية خادم الأسماء”ما يُثبته: ما إذا كانت F5 XC هي موفر DNS الموثوق للنطاق الجذر.
dig +short NS xF5XC_ROOT_DOMAINx| النتيجة | المعنى |
|---|---|
تتضمن ns1.f5clouddns.com وns2.f5clouddns.com | DNS مُدار بواسطة F5 XC — يمكن إنشاء السجلات تلقائيًا |
| خوادم أسماء أخرى | DNS خارجي — يجب إنشاء السجلات يدويًا |
الإصلاح: أتمتة API — الكشف عن صلاحية DNS
DNS-4: تمكين السجلات المُدارة بواسطة F5 XC
Section titled “DNS-4: تمكين السجلات المُدارة بواسطة F5 XC”ما يُثبته: تسمح منطقة DNS الخاصة بـ F5 XC بإنشاء السجلات تلقائيًا لموازنات التحميل (لـ DNS المُدار بواسطة F5 XC فقط).
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 وACME لموازنات التحميل |
فشل — false أو null | السجلات المُدارة معطلة؛ مكّنها عبر تحديث المنطقة |
الإصلاح: أتمتة API — الخيار أ: DNS المُدار بواسطة F5 XC
الطبقة 2: شهادة TLS
Section titled “الطبقة 2: شهادة TLS”بعد حل DNS، يجب أن يمتلك موازن التحميل شهادة TLS صالحة.
TLS-1: حالة الشهادة
Section titled “TLS-1: حالة الشهادة”ما يُثبته: تم إصدار شهادة TLS التلقائية لموازن تحميل HTTPS.
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 جارٍ — انتظر 5–10 دقائق |
معلومات — "AutoCertDomainRateLimited" | تجاوز حد معدل Let’s Encrypt — متوقع في بيئات العرض التوضيحي، لا يؤثر على موازن تحميل HTTP |
فشل — "PreDomainChallengePending" | سجل تحدي ACME مفقود — انظر DNS-2 |
الإصلاح: تأكد من وجود سجل تحدي ACME (CNAME لـ DNS الخارجي، أو مكّن السجلات المُدارة لـ DNS الخاص بـ F5 XC). يستغرق توفير الشهادة 5–10 دقائق بعد تكوين السجل. إذا ظلت عالقة لأكثر من 15 دقيقة، راجع الشهادة عالقة — إعادة الإنشاء النظيفة. إذا كان الحد قد تجاوز، فإن موازن تحميل HTTP غير متأثر.
TLS-2: تفاصيل الشهادة
Section titled “TLS-2: تفاصيل الشهادة”ما يُثبته: تغطي الشهادة النطاق المتوقع وتُظهر معلومات انتهاء الصلاحية. ينطبق فقط على موازن تحميل HTTPS.
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 الحية
Section titled “TLS-3: مصافحة TLS الحية”ما يُثبته: شهادة TLS صالحة وتكتمل المصافحة من جانب العميل. ينطبق فقط عندما يمتلك موازن تحميل HTTPS شهادة صالحة.
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'SSL connection|subject:|expire date:|issuer:'| النتيجة | المعنى |
|---|---|
نجاح — يُظهر SSL connection using TLSv1.3، الموضوع وتاريخ الانتهاء صالحان | يعمل TLS من طرف إلى طرف |
| فشل — رُفض الاتصال أو خطأ في الشهادة | تحقق من حل DNS وحالة الشهادة؛ إذا كان الحد قد تجاوز، استخدم HTTP بدلاً من ذلك |
TLS-4: هدف سجل ACME من موازن التحميل
Section titled “TLS-4: هدف سجل ACME من موازن التحميل”ما يُثبته: يُبلّغ موازن تحميل HTTPS عن هدف 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 مقابل هذه القيم |
فشل — قيم null | قد لا يكون موازن التحميل مكوّنًا بـ https_auto_cert |
الطبقة 3: موازن تحميل HTTP
Section titled “الطبقة 3: موازن تحميل HTTP”يجب أن يكون موازن التحميل في حالة جاهزة ومكوّنًا بشكل صحيح.
LB-1: الحالة التشغيلية
Section titled “LB-1: الحالة التشغيلية”ما يُثبته: موازن تحميل HTTP (الأساسي) يعمل بشكل كامل ويقبل حركة المرور.
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" | موازن التحميل يعمل |
فشل — "VIRTUAL_HOST_PENDING_A_RECORD" | لم يتم تكوين سجل A لـ DNS — انظر DNS-1 |
الإصلاح: موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD
LB-2: تكوين النطاق
Section titled “LB-2: تكوين النطاق”ما يُثبته: تم تكوين موازن تحميل HTTP للنطاق(ات) الصحيح.
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'| النتيجة | المعنى |
|---|---|
نجاح — تحتوي المصفوفة على FQDN الخاص بك (مثل ["app.example.com"]) | تم تكوين موازن التحميل للنطاق المتوقع |
| فشل — نطاق مفقود أو خاطئ | قم بتحديث مواصفات موازن التحميل بالنطاق الصحيح |
LB-3: تمكين CSD على موازن التحميل
Section titled “LB-3: تمكين CSD على موازن التحميل”ما يُثبته: تم تمكين الدفاع من جهة العميل على موازن التحميل مع سياسة حقن 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 غير مكوّن على موازن التحميل |
الإصلاح: مرجع API — تمكين CSD على موازن تحميل
LB-4: مجموعة المسار الافتراضي
Section titled “LB-4: مجموعة المسار الافتراضي”ما يُثبته: يشير موازن التحميل إلى مجموعة الخوادم المصدر الصحيحة مع الوزن والأولوية المتوقعين.
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 }'| النتيجة | المعنى |
|---|---|
| نجاح — يُظهر اسم مجموعة الخوادم المصدر الخاصة بك مع الوزن/الأولوية | موازن التحميل يوجه إلى الواجهة الخلفية الصحيحة |
| فشل — مجموعة فارغة أو خاطئة | قم بتحديث تكوين default_route_pools لموازن التحميل |
LB-5: حالة النشر (حالات لكل موقع)
Section titled “LB-5: حالة النشر (حالات لكل موقع)”ما يُثبته: تم نشر موازن التحميل ويُبلّغ عن حالات صحية عبر جميع المواقع.
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 مملوء | موازن التحميل منشور بالكامل مع VIP مُعيّن |
فشل — حالة معلقة أو dns_info فارغ | مشكلة في DNS أو الشهادة تمنع النشر |
LB-6: ملخص كامل لموازن التحميل
Section titled “LB-6: ملخص كامل لموازن التحميل”ما يُثبته: لقطة شاملة لتكويني موازن التحميل لأغراض التصحيح.
موازن تحميل HTTP (الأساسي):
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 (الثانوي — يتضمن حالة الشهادة):
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: مجموعة خوادم المصدر
Section titled “الطبقة 4: مجموعة خوادم المصدر”تحدد مجموعة خوادم المصدر الخوادم الخلفية التي يوجه إليها موازن التحميل حركة المرور.
OP-1: تكوين مجموعة خوادم المصدر
Section titled “OP-1: تكوين مجموعة خوادم المصدر”ما يُثبته: توجد مجموعة خوادم المصدر مع خادم الواجهة الخلفية الصحيح والمنفذ وخوارزمية موازنة التحميل.
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 وPort وخوارزمية صحيحة | تم تكوين مجموعة خوادم المصدر بشكل صحيح |
فشل — 404 أو قيم خاطئة | مجموعة خوادم المصدر مفقودة أو مكوّنة بشكل خاطئ |
الإصلاح: أتمتة API — الخطوة 2: إنشاء مجموعة خوادم المصدر
OP-2: TLS إلى المصدر
Section titled “OP-2: TLS إلى المصدر”ما يُثبته: ما إذا كان TLS مكوّنًا للاتصال بين موازن التحميل وخادم المصدر.
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) | يتصل موازن التحميل بالمصدر عبر HTTP (متوقع لعرض Juice Shop التوضيحي) |
use_tls (encrypted) | يتصل موازن التحميل بالمصدر عبر HTTPS |
OP-3: ارتباط فحص الصحة
Section titled “OP-3: ارتباط فحص الصحة”ما يُثبته: ترتبط مجموعة خوادم المصدر بفحص الصحة الصحيح (إذا كان قابلاً للتطبيق).
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '.spec.healthcheck'| النتيجة | المعنى |
|---|---|
| نجاح — مصفوفة مع مرجع فحص الصحة (الاسم، مساحة الاسم، النوع) | فحص الصحة مرتبط |
مقبول — مصفوفة فارغة [] | لا يوجد فحص صحة (مقبول — لا يتطلب CSD واحدًا) |
| فشل — كان متوقعًا وجود فحص صحة لكن المصفوفة فارغة | لم يتم العثور على فحص الصحة وقت الإنشاء — انظر فحص الصحة غير المرتبط |
OP-4: اتصال المصدر
Section titled “OP-4: اتصال المصدر”ما يُثبته: يمكن الوصول إلى خادم المصدر من جانب العميل (لا يختبر مسار موازن التحميل إلى المصدر).
curl -s -o /dev/null -w '%{http_code}' \ "http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"| النتيجة | المعنى |
|---|---|
نجاح — 200 (أو رمز HTTP صالح آخر) | خادم المصدر يستجيب |
فشل — 000 أو رُفض الاتصال | خادم المصدر غير قابل للوصول من هذه الشبكة |
الطبقة 5: فحص الصحة
Section titled “الطبقة 5: فحص الصحة”تراقب فحوصات الصحة توافر الواجهة الخلفية. وهي اختيارية لـ CSD لكنها مفيدة لعمليات النشر في الإنتاج.
HC-1: تكوين فحص الصحة
Section titled “HC-1: تكوين فحص الصحة”ما يُثبته: يوجد فحص الصحة مع النوع والمسار والتوقيت والعتبات الصحيحة.
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 | تم تكوين فحص الصحة بشكل صحيح |
فشل — استجابة 404 | لا يوجد فحص صحة (ربما تم تخطيه — انظر المرحلة 1 الخطوة 1) |
HC-2: سرد جميع فحوصات الصحة
Section titled “HC-2: سرد جميع فحوصات الصحة”ما يُثبته: يعدد جميع فحوصات الصحة في مساحة الاسم للتحقق من التسمية والعدد.
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
Section titled “الطبقة 6: تكوين CSD”يجب تمكين CSD على مستوى المستأجر وتكوين علامة حقن JavaScript.
CSD-1: حالة CSD للمستأجر
Section titled “CSD-1: حالة CSD للمستأجر”ما يُثبته: CSD مكوّن ومفعّل للمستأجر.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{isConfigured, isEnabled}'| النتيجة | المعنى |
|---|---|
نجاح — كلاهما true | CSD نشط لهذا المستأجر |
فشل — isConfigured: false | CSD غير مفعّل على مستوى المستأجر — تواصل مع مسؤول F5 XC |
فشل — isEnabled: false | CSD مكوّن لكنه غير نشط |
CSD-2: علامة حقن JS
Section titled “CSD-2: علامة حقن JS”ما يُثبته: تم إنشاء علامة حقن JavaScript الخاصة بـ CSD وهي جاهزة للحقن.
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 مكوّنة |
فشل — has_script_tag: false | لا توجد علامة script — تحقق من تمكين CSD وتسجيل نطاق محمي |
CSD-3: محتوى علامة JS
Section titled “CSD-3: محتوى علامة JS”ما يُثبته: يُظهر علامة script الكاملة للتحقق أو الحقن اليدوي.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq '.scriptTag'CSD-4: تسجيل النطاق المحمي
Section titled “CSD-4: تسجيل النطاق المحمي”ما يُثبته: تم تسجيل النطاق الجذر كنطاق محمي بواسطة CSD على المستأجر.
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 فارغة | لا توجد نطاقات محمية مسجلة — انظر المرحلة 1 الخطوة 6 |
CSD-5: التحقق من حقن JS الحي
Section titled “CSD-5: التحقق من حقن JS الحي”ما يُثبته: يتم فعليًا حقن JavaScript الخاص بـ CSD في استجابات الصفحات التي يخدمها موازن التحميل.
curl -s "http://xF5XC_DOMAINNAMEx/" \ | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1| النتيجة | المعنى |
|---|---|
نجاح — يُعيد جزءًا من رابط zeronaught.com أو shape.com (مثل zeronaught.com/__imp_apg__/js/...) | يتم حقن JavaScript الخاص بـ CSD في الصفحات |
| فشل — مخرجات فارغة | لم يتم حقن JS — تحقق من LB-3 وCSD-1 |
الطبقة 7: التحقق من حركة المرور
Section titled “الطبقة 7: التحقق من حركة المرور”تحقق من أن حركة المرور الحية تصل إلى موازن التحميل ويتم معالجتها بشكل صحيح.
TV-1: عدد الطلبات (آخر 24 ساعة)
Section titled “TV-1: عدد الطلبات (آخر 24 ساعة)”ما يُثبته: حركة المرور تصل إلى موازن التحميل. النتيجة صفر تعني عدم وصول أي حركة مرور.
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 هو سلسلة غير صفرية (مثل "380") | حركة المرور تتدفق عبر موازن التحميل |
فشل — "0" أو لا توجد بيانات | لا تصل حركة مرور إلى موازن التحميل — تحقق من DNS-1 وLB-1 |
TV-2: توزيع رموز الحالة
Section titled “TV-2: توزيع رموز الحالة”ما يُثبته: يكشف توزيع رموز حالة الاستجابة عن أنماط الأخطاء.
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 مرتفع | أخطاء الخادم — تحقق من صحة خادم المصدر |
تشير فئة downstream_remote_disconnect إلى أن العميل أغلق الاتصال قبل اكتمال الاستجابة (شائع لطلبات long-polling أو ترقية WebSocket).
TV-3: عينات الطلبات الأخيرة
Section titled “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: حقن JS لـ CSD في سجلات الوصول
Section titled “TV-4: حقن JS لـ CSD في سجلات الوصول”ما يُثبته: تؤكد سجلات الوصول أن JavaScript الخاص بـ CSD يتم حقنه في الاستجابات.
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 | يتم حقن JS الخاص بـ CSD في استجابات الصفحة |
فشل — injected_count: 0 | لم يتم حقن JS — تحقق من CSD-1 وLB-3 |
TV-5: اختبار الاتصال من طرف إلى طرف
Section titled “TV-5: اختبار الاتصال من طرف إلى طرف”ما يُثبته: يتدفق طلب كامل من العميل عبر DNS وموازن التحميل والمصدر ويُعيد استجابة صالحة.
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \ | grep -E 'Connected to|< HTTP|< content-type'| النتيجة | المعنى |
|---|---|
| نجاح — يُظهر الاتصال وHTTP 200 ونوع المحتوى | المنظومة الكاملة تعمل |
| فشل — رُفض الاتصال أو خطأ DNS | ابدأ التصحيح من الطبقة 1: DNS |
الطبقة 8: بيانات قياس CSD وسياسة النطاق
Section titled “الطبقة 8: بيانات قياس CSD وسياسة النطاق”تستعلم هذه الأوامر عن نفس البيانات المعروضة في لوحة تحكم وحدة تحكم CSD، وقائمة scripts، وحقول النماذج، وطرق عرض الشبكة.
TEL-1: مخزون Scripts
Section titled “TEL-1: مخزون Scripts”ما يُثبته: يكتشف CSD ويفهرس scripts التي تعمل على النطاق المحمي.
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| النتيجة | المعنى |
|---|---|
| نجاح — scripts مدرجة مع مستويات المخاطر | CSD يراقب scripts بشكل نشط |
| فشل — مصفوفة فارغة | انظر استكشاف الأخطاء: مصفوفة Scripts الفارغة |
TEL-2: النطاقات المكتشفة
Section titled “TEL-2: النطاقات المكتشفة”ما يُثبته: اكتشف CSD نطاقات مصادر scripts وصنّفها حسب الحالة.
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 يتتبع نطاقات scripts |
تحذير — action_needed > 0 | بعض النطاقات تحتاج إلى مراجعة |
| فشل — استجابة فارغة | لا توجد بيانات قياس — تحقق من CSD-5 |
TEL-3: حالة سياسة النطاق
Section titled “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: مخزون حقول النماذج
Section titled “TEL-4: مخزون حقول النماذج”ما يُثبته: اكتشف CSD حقول النماذج التي تقرأها scripts، مع تصنيف الحساسية.
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 يتتبع الوصول إلى حقول النماذج |
| معلومات — مصفوفة فارغة | لم يتم اكتشاف حقول نماذج (متوقع إذا لم تكن هناك نماذج على الموقع) |
TEL-5: التعمق في Script محدد
Section titled “TEL-5: التعمق في Script محدد”ما يُثبته: معلومات مفصلة حول script معين بما في ذلك المخاطر والسلوكيات وتفاعلات الشبكة.
أولاً، احصل على معرف script من TEL-1، ثم استعلم عن تفاصيله:
SCRIPT_ID="your-script-id"
# Overview (risk level, type, 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}'
# Behaviors over timecurl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \ | jq '.behaviors'
# Network interactions (domains the script communicates with)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: المستخدمون المتأثرون
Section titled “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: عدد Scripts حسب مستوى المخاطرة
Section titled “TEL-7: عدد Scripts حسب مستوى المخاطرة”ما يُثبته: توزيع المخاطر المجمّع عبر جميع scripts المكتشفة.
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 | لم يتم اكتشاف scripts ذات مخاطر |
تحذير — وجود Low Risk أو High Risk | راجع scripts التي تم وضع علامة عليها في TEL-5 |
TEL-8: حداثة بيانات القياس
Section titled “TEL-8: حداثة بيانات القياس”ما يُثبته: بيانات قياس CSD حديثة، مما يؤكد المراقبة النشطة.
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 ساعة | بيانات القياس تجمع البيانات بنشاط |
تحذير — latest_seen أقدم من 24 ساعة | ربما توقفت حركة المرور أو معالجة CSD متأخرة |
لوحة تحكم المنظومة الكاملة
Section titled “لوحة تحكم المنظومة الكاملة”شغّل أمرًا واحدًا يفحص جميع مؤشرات الصحة الحرجة عبر كل طبقة وينتج جدول ملخص:
echo "=== CSD Verification Dashboard ==="echo ""
# Layer 1: DNSDNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# Layers 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(", ")')
# Layer 6: CSD statusCSD=$(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')
# Layer 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')
# Layer 7: Traffic (last 24h)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"مرجع حقول سجل الوصول
Section titled “مرجع حقول سجل الوصول”| الحقل | النوع | الوصف |
|---|---|---|
@timestamp | سلسلة نصية | طابع زمني للطلب (ISO 8601). لاحظ بادئة @ — للوصول إليه في jq استخدم .["@timestamp"] |
method | سلسلة نصية | أسلوب HTTP (GET، POST، إلخ) |
req_path | سلسلة نصية | مسار URI للطلب |
rsp_code | سلسلة نصية | رمز حالة استجابة HTTP كسلسلة نصية (مثل "200"، "404") |
rsp_code_class | سلسلة نصية | فئة رمز الحالة (2xx، 3xx، 4xx، 5xx، أو downstream_remote_disconnect) |
src_ip | سلسلة نصية | عنوان IP المصدر للعميل |
dst_ip | سلسلة نصية | عنوان IP الوجهة (VIP) |
domain | سلسلة نصية | قيمة رأس Host للطلب |
user_agent | سلسلة نصية | سلسلة User-Agent للعميل |
rsp_size | سلسلة نصية | حجم جسم الاستجابة بالبايت (يُعاد كسلسلة نصية) |
req_size | سلسلة نصية | حجم جسم الطلب بالبايت (يُعاد كسلسلة نصية) |
duration_with_data_tx_delay | سلسلة نصية | إجمالي مدة الطلب بالثواني (يُعاد كسلسلة نصية، مثل "0.024219") |
csd_js_injection | سلسلة نصية | "true" عندما يتم حقن JavaScript الخاص بـ CSD (موجود فقط عند النشاط) |
مرجع حقول بيانات قياس CSD
Section titled “مرجع حقول بيانات قياس CSD”| الحقل | نقطة النهاية | الوصف |
|---|---|---|
isConfigured | status | CSD مفعّل على مستوى المستأجر |
isEnabled | status | CSD نشط لمساحة الاسم هذه |
scripts[] | scripts | مصفوفة كائنات scripts المكتشفة |
.script_name | scripts | عنوان URL الكامل لملف JavaScript |
.risk_level | scripts | مستوى المخاطرة (No Risk، Low Risk، High Risk) |
.status | scripts | AN (إجراء مطلوب) أو NA (لا إجراء مطلوب) |
.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 | مصفوفة كائنات النطاقات المكتشفة مع .domain، .status، .category، .firstSeenDate، .latestSeenDate (ثواني epoch كسلاسل نصية) |
form_fields[] | formFields | مصفوفة كائنات حقول النماذج المكتشفة |
.analysis | formFields | تصنيف الحساسية (Sensitive، Not Sensitive) |
استكشاف الأخطاء وإصلاحها
Section titled “استكشاف الأخطاء وإصلاحها”سجلات وصول بقيمة صفر
Section titled “سجلات وصول بقيمة صفر”إذا أعاد TV-1 القيمة 0:
-
تحقق من حل DNS — تحقق من أن النطاق يتم حله إلى VIP لموازن التحميل:
Terminal window dig +short xF5XC_DOMAINNAMEx Aإذا كانت النتيجة فارغة، فـ DNS غير مكوّن. انظر أتمتة API — الخطوة 4.
-
تحقق من حالة موازن التحميل — يجب أن يكون موازن التحميل في حالة
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' -
أرسل طلبًا تجريبيًا — أنشئ حركة مرور لتأكيد الاتصال من طرف إلى طرف:
Terminal window curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20ابحث عن استجابة HTTP ناجحة. استخدم
https://فقط إذا كانت شهادة موازن تحميل HTTPS صالحة.
السجلات المُدارة معطلة في منطقة DNS
Section titled “السجلات المُدارة معطلة في منطقة DNS”إذا أعاد DNS-4 القيمة false، فإن الإنشاء التلقائي للسجلات معطل حتى وإن كانت F5 XC موفر DNS الموثوق. هذا خطأ تكوين شائع يتسبب في غياب سجل A وACME CNAME، مما يمنع موازن التحميل من الوصول إلى VIRTUAL_HOST_READY وإصدار الشهادة.
لتمكين السجلات المُدارة، قم بتحديث تكوين منطقة DNS لتعيين allow_http_lb_managed_records: true. انظر أتمتة API — الخيار أ: DNS المُدار بواسطة F5 XC لاستدعاء API.
موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD
Section titled “موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD”موازن التحميل ينتظر سجل DNS A يشير إلى VIP الخاص به. انظر موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD للحصول على خطوات الحل التفصيلية.
الشهادة عالقة في PreDomainChallengePending
Section titled “الشهادة عالقة في PreDomainChallengePending”تتطلب شهادة TLS التلقائية سجل تحدي ACME. تعتمد الطريقة على موفر DNS الخاص بك:
DNS المُدار بواسطة F5 XC: مكّن allow_http_lb_managed_records في منطقة DNS (DNS-4). تُنشئ المنصة تلقائيًا سجل تحدي ACME مستندًا إلى TXT في مجموعة سجلات RR الخاصة بـ x-ves-io-managed. إذا ظلت الشهادة عالقة بعد تمكين السجلات المُدارة، احذف موازن التحميل وأعد إنشاءه لتشغيل طلب شهادة جديد.
DNS الخارجي: أنشئ سجل CNAME لدى موفر DNS الخاص بك:
_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.ioتحقق من وجود السجل:
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEdig +short _acme-challenge.xF5XC_DOMAINNAMEx TXTإذا كان كلاهما فارغًا، فسجل ACME غير مكوّن. يستغرق توفير الشهادة 5–10 دقائق بعد وضع السجل. تحقق من حالة خطأ موازن التحميل للاطلاع على أخطاء التحقق من 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
Section titled “CSD isConfigured يُعيد false”يجب تمكين CSD على مستوى المستأجر من قِبل مسؤول F5 XC. هذا إعداد على مستوى المستأجر بأكمله ولا يمكن تكوينه عبر API لمساحة الاسم. تواصل مع مسؤولك لتفعيل الدفاع من جهة العميل.
مصفوفة Scripts فارغة
Section titled “مصفوفة Scripts فارغة”إذا أعاد TEL-1 مصفوفة فارغة:
-
تحقق من النطاق المحمي — يراقب CSD scripts فقط على النطاقات المسجلة:
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 — تأكد من حقن علامة script الخاصة بـ CSD في الصفحات:
Terminal window curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1إذا لم يكن هناك تطابق، فـ JavaScript الخاص بـ CSD لا يتم حقنه. تحقق من تمكين
client_side_defenseعلى موازن التحميل. -
انتظر وقت المعالجة — بعد تمكين CSD لأول مرة أو تسجيل نطاق محمي جديد، قد يستغرق اكتشاف scripts من 5 إلى 15 دقيقة. أنشئ حركة مرور إلى الموقع وانتظر قبل إعادة الفحص.
مرجع سريع
Section titled “مرجع سريع”الإعدادات المسبقة للنطاق الزمني
Section titled “الإعدادات المسبقة للنطاق الزمني”| الفترة | إزاحة Epoch | ISO 8601 (Linux) | ISO 8601 (macOS) |
|---|---|---|---|
| ساعة واحدة | $(( $(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 |
ملخص طبقات التحقق
Section titled “ملخص طبقات التحقق”| الطبقة | الاختبارات | ما تغطيه |
|---|---|---|
| 1. حل DNS | DNS-1 إلى DNS-4 | سجل A، CNAME لـ ACME، صلاحية خادم الأسماء، السجلات المُدارة |
| 2. شهادة TLS | TLS-1 إلى TLS-4 | حالة الشهادة، تفاصيلها، المصافحة الحية، هدف ACME |
| 3. موازن تحميل HTTP | LB-1 إلى LB-6 | الحالة، النطاقات، علامة CSD، مجموعات المسارات، النشر، الملخص |
| 4. مجموعة خوادم المصدر | OP-1 إلى OP-4 | التكوين، وضع TLS، ارتباط فحص الصحة، اتصال المصدر |
| 5. فحص الصحة | HC-1 إلى HC-2 | تكوين فحص الصحة، سرد جميع فحوصات الصحة |
| 6. تكوين CSD | CSD-1 إلى CSD-5 | حالة المستأجر، علامة JS، النطاقات المحمية، الحقن الحي |
| 7. التحقق من حركة المرور | TV-1 إلى TV-5 | عدد الطلبات، رموز الحالة، العينات، JS في السجلات، اختبار E2E |
| 8. بيانات قياس CSD | TEL-1 إلى TEL-8 | Scripts، النطاقات، السياسة، حقول النماذج، التعمق، المستخدمون، المخاطر، الحداثة |
ملخص نقاط النهاية
Section titled “ملخص نقاط النهاية”| التشخيص | نقطة النهاية | الأسلوب | تنسيق الوقت |
|---|---|---|---|
| عدد الطلبات | /api/data/namespaces/\{ns\}/access_logs/aggregation | POST | ISO 8601 |
| رموز الحالة | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| الطلبات الأخيرة | /api/data/namespaces/\{ns\}/access_logs | POST | ISO 8601 |
| حالة موازن التحميل | /api/config/namespaces/\{ns\}/http_loadbalancers/\{name\} | GET | لا شيء |
| مجموعة خوادم المصدر | /api/config/namespaces/\{ns\}/origin_pools/\{name\} | GET | لا شيء |
| فحص الصحة | /api/config/namespaces/\{ns\}/healthchecks/\{name\} | GET | لا شيء |
| منطقة DNS | /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 | لا شيء |
| قائمة scripts | /api/shape/csd/namespaces/\{ns\}/scripts | POST | ثواني Epoch |
| النطاقات المكتشفة | /api/shape/csd/namespaces/\{ns\}/detected_domains | GET | لا شيء |
| حقول النماذج | /api/shape/csd/namespaces/\{ns\}/formFields | GET | ثواني Epoch (معاملات الاستعلام) |
| تفاصيل 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 |