تخطَّ إلى المحتوى

التشخيصات والتحقق

تقدم هذه الصفحة مصفوفة تحقق UAT متعددة الطبقات للتحقق من صحة نشر الدفاع من جهة العميل من البداية إلى النهاية. يتبع كل حالة اختبار سلسلة تبعيات البنية التحتية — من حل أسماء DNS عبر بيانات قياس CSD — حتى تتمكن من إثبات أن كل مكون يعمل بشكل صحيح بصورة منهجية.

هذه الأوامر هي المكافئ عبر API لـ جولة وحدة تحكم CSD — استخدمها عندما تحتاج إلى التحقق من الطرفية، أو أتمتة المراقبة، أو عرض إمكانات CSD دون واجهة المستخدم.

قم بإعداد متغيرات البيئة كما هو موضح في أتمتة API — إعداد البيئة:

Terminal window
set -a && source .env && set +a

تستخدم جميع الأوامر أدناه صيغة العنصر النائب xTOKENx. استبدلها بمتغيرات البيئة الخاصة بك ($F5XC_API_TOKEN، $F5XC_NAMESPACE، إلخ) أو استخدم النموذج التفاعلي أعلى الصفحة.

تتطلب العديد من نقاط نهاية CSD طوابع زمنية بصيغة epoch (الثواني منذ Unix epoch). تحسب هذه الأوامر المختصرة أوقات البداية/النهاية للنطاقات الشائعة.

متعدد المنصات (macOS + Linux):

Terminal window
# Current time as epoch seconds
NOW=$(date +%s)
# 1 hour ago
START_1H=$(( NOW - 3600 ))
# 24 hours ago
START_24H=$(( NOW - 86400 ))
# 7 days ago
START_7D=$(( NOW - 604800 ))
# 30 days ago
START_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 ))

تتبع كل حالة اختبار أدناه هذا الهيكل:

الحقلالوصف
معرف الاختباررقم الطبقة + المعرف التسلسلي (مثل DNS-1، TLS-2)
ما يُثبتهحقيقة البنية التحتية المحددة الجاري التحقق منها
الأمرأمر curl أو dig جاهز للتشغيل
نجاح / فشلالمخرجات المتوقعة للحالة الصحية مقابل غير الصحية
الإصلاحرابط إلى قسم الإعداد أو استكشاف الأخطاء ذي الصلة

DNS هو الأساس — إذا لم يتم حل اسم النطاق إلى عنوان VIP الخاص بموازن التحميل، فلن يعمل أي شيء آخر.

ما يُثبته: يتم حل النطاق إلى عنوان IP الخاص بـ VIP لموازن التحميل.

Terminal window
dig +short xF5XC_DOMAINNAMEx A
النتيجةالمعنى
نجاح — تم إرجاع عنوان IP للـ VIP (مثل 72.19.3.185)يتم حل النطاق إلى العنوان الافتراضي IP لموازن التحميل
فشل — استجابة فارغةلم يتم تكوين سجل A لـ DNS

الإصلاح: أتمتة API — الخطوة 4: تكوين DNS

ما يُثبته: يوجد سجل تحدي ACME لتوفير شهادة TLS تلقائيًا.

Terminal window
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +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 الموثوق للنطاق الجذر.

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx
النتيجةالمعنى
تتضمن ns1.f5clouddns.com وns2.f5clouddns.comDNS مُدار بواسطة F5 XC — يمكن إنشاء السجلات تلقائيًا
خوادم أسماء أخرىDNS خارجي — يجب إنشاء السجلات يدويًا

الإصلاح: أتمتة API — الكشف عن صلاحية DNS

DNS-4: تمكين السجلات المُدارة بواسطة F5 XC

Section titled “DNS-4: تمكين السجلات المُدارة بواسطة F5 XC”

ما يُثبته: تسمح منطقة DNS الخاصة بـ F5 XC بإنشاء السجلات تلقائيًا لموازنات التحميل (لـ DNS المُدار بواسطة F5 XC فقط).

Terminal window
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


بعد حل DNS، يجب أن يمتلك موازن التحميل شهادة TLS صالحة.

ما يُثبته: تم إصدار شهادة TLS التلقائية لموازن تحميل HTTPS.

Terminal window
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 غير متأثر.

ما يُثبته: تغطي الشهادة النطاق المتوقع وتُظهر معلومات انتهاء الصلاحية. ينطبق فقط على موازن تحميل HTTPS.

Terminal window
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 صالحة وتكتمل المصافحة من جانب العميل. ينطبق فقط عندما يمتلك موازن تحميل HTTPS شهادة صالحة.

Terminal window
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 الصحيح للتحقق من صحة الشهادة.

Terminal window
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”

يجب أن يكون موازن التحميل في حالة جاهزة ومكوّنًا بشكل صحيح.

ما يُثبته: موازن تحميل HTTP (الأساسي) يعمل بشكل كامل ويقبل حركة المرور.

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'
النتيجةالمعنى
نجاح"VIRTUAL_HOST_READY"موازن التحميل يعمل
فشل"VIRTUAL_HOST_PENDING_A_RECORD"لم يتم تكوين سجل A لـ DNS — انظر DNS-1

الإصلاح: موازن التحميل عالق في VIRTUAL_HOST_PENDING_A_RECORD

ما يُثبته: تم تكوين موازن تحميل HTTP للنطاق(ات) الصحيح.

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.domains'
النتيجةالمعنى
نجاح — تحتوي المصفوفة على FQDN الخاص بك (مثل ["app.example.com"])تم تكوين موازن التحميل للنطاق المتوقع
فشل — نطاق مفقود أو خاطئقم بتحديث مواصفات موازن التحميل بالنطاق الصحيح

LB-3: تمكين CSD على موازن التحميل

Section titled “LB-3: تمكين CSD على موازن التحميل”

ما يُثبته: تم تمكين الدفاع من جهة العميل على موازن التحميل مع سياسة حقن JS الصحيحة.

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 '{
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: falseCSD غير مكوّن على موازن التحميل

الإصلاح: مرجع API — تمكين CSD على موازن تحميل

LB-4: مجموعة المسار الافتراضي

Section titled “LB-4: مجموعة المسار الافتراضي”

ما يُثبته: يشير موازن التحميل إلى مجموعة الخوادم المصدر الصحيحة مع الوزن والأولوية المتوقعين.

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.default_route_pools[] | {
pool: .pool.name,
namespace: .pool.namespace,
weight: .weight,
priority: .priority
}'
النتيجةالمعنى
نجاح — يُظهر اسم مجموعة الخوادم المصدر الخاصة بك مع الوزن/الأولويةموازن التحميل يوجه إلى الواجهة الخلفية الصحيحة
فشل — مجموعة فارغة أو خاطئةقم بتحديث تكوين default_route_pools لموازن التحميل

LB-5: حالة النشر (حالات لكل موقع)

Section titled “LB-5: حالة النشر (حالات لكل موقع)”

ما يُثبته: تم نشر موازن التحميل ويُبلّغ عن حالات صحية عبر جميع المواقع.

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 '{
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 (الأساسي):

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 '{
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 (الثانوي — يتضمن حالة الشهادة):

Terminal window
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: تكوين مجموعة خوادم المصدر”

ما يُثبته: توجد مجموعة خوادم المصدر مع خادم الواجهة الخلفية الصحيح والمنفذ وخوارزمية موازنة التحميل.

Terminal window
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: إنشاء مجموعة خوادم المصدر

ما يُثبته: ما إذا كان TLS مكوّنًا للاتصال بين موازن التحميل وخادم المصدر.

Terminal window
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

ما يُثبته: ترتبط مجموعة خوادم المصدر بفحص الصحة الصحيح (إذا كان قابلاً للتطبيق).

Terminal window
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 واحدًا)
فشل — كان متوقعًا وجود فحص صحة لكن المصفوفة فارغةلم يتم العثور على فحص الصحة وقت الإنشاء — انظر فحص الصحة غير المرتبط

ما يُثبته: يمكن الوصول إلى خادم المصدر من جانب العميل (لا يختبر مسار موازن التحميل إلى المصدر).

Terminal window
curl -s -o /dev/null -w '%{http_code}' \
"http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"
النتيجةالمعنى
نجاح200 (أو رمز HTTP صالح آخر)خادم المصدر يستجيب
فشل000 أو رُفض الاتصالخادم المصدر غير قابل للوصول من هذه الشبكة

تراقب فحوصات الصحة توافر الواجهة الخلفية. وهي اختيارية لـ CSD لكنها مفيدة لعمليات النشر في الإنتاج.

ما يُثبته: يوجد فحص الصحة مع النوع والمسار والتوقيت والعتبات الصحيحة.

Terminal window
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: سرد جميع فحوصات الصحة”

ما يُثبته: يعدد جميع فحوصات الصحة في مساحة الاسم للتحقق من التسمية والعدد.

Terminal window
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

يجب تمكين CSD على مستوى المستأجر وتكوين علامة حقن JavaScript.

ما يُثبته: CSD مكوّن ومفعّل للمستأجر.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{isConfigured, isEnabled}'
النتيجةالمعنى
نجاح — كلاهما trueCSD نشط لهذا المستأجر
فشلisConfigured: falseCSD غير مفعّل على مستوى المستأجر — تواصل مع مسؤول F5 XC
فشلisEnabled: falseCSD مكوّن لكنه غير نشط

ما يُثبته: تم إنشاء علامة حقن JavaScript الخاصة بـ CSD وهي جاهزة للحقن.

Terminal window
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 وتسجيل نطاق محمي

ما يُثبته: يُظهر علامة script الكاملة للتحقق أو الحقن اليدوي.

Terminal window
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 على المستأجر.

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, description}'
النتيجةالمعنى
نجاح — يُظهر عنصرًا بـ name غير فارغالنطاق محمي
فشل — العناصر بها حقول name وnamespace فارغةلا توجد نطاقات محمية مسجلة — انظر المرحلة 1 الخطوة 6

CSD-5: التحقق من حقن JS الحي

Section titled “CSD-5: التحقق من حقن JS الحي”

ما يُثبته: يتم فعليًا حقن JavaScript الخاص بـ CSD في استجابات الصفحات التي يخدمها موازن التحميل.

Terminal window
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 ساعة)”

ما يُثبته: حركة المرور تصل إلى موازن التحميل. النتيجة صفر تعني عدم وصول أي حركة مرور.

Terminal window
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

ما يُثبته: يكشف توزيع رموز حالة الاستجابة عن أنماط الأخطاء.

Terminal window
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 COUNT
2xx 82
downstream_remote_disconnect 18
النتيجةالمعنى
نجاح — أغلبية 2xxالموقع يخدم استجابات ناجحة
تحذير — عدد 4xx مرتفعأخطاء العميل (عناوين URL خاطئة، موارد مفقودة)
فشل — عدد 5xx مرتفعأخطاء الخادم — تحقق من صحة خادم المصدر

تشير فئة downstream_remote_disconnect إلى أن العميل أغلق الاتصال قبل اكتمال الاستجابة (شائع لطلبات long-polling أو ترقية WebSocket).

TV-3: عينات الطلبات الأخيرة

Section titled “TV-3: عينات الطلبات الأخيرة”

ما يُثبته: يتم تسجيل الطلبات الفردية بالحقول الصحيحة.

Terminal window
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 -t

TV-4: حقن JS لـ CSD في سجلات الوصول

Section titled “TV-4: حقن JS لـ CSD في سجلات الوصول”

ما يُثبته: تؤكد سجلات الوصول أن JavaScript الخاص بـ CSD يتم حقنه في الاستجابات.

Terminal window
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 وموازن التحميل والمصدر ويُعيد استجابة صالحة.

Terminal window
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، وحقول النماذج، وطرق عرض الشبكة.

ما يُثبته: يكتشف CSD ويفهرس scripts التي تعمل على النطاق المحمي.

Terminal window
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 الفارغة

ما يُثبته: اكتشف CSD نطاقات مصادر scripts وصنّفها حسب الحالة.

Terminal window
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

ما يُثبته: يُظهر توزيع النطاقات المسموح بها مقابل المخففة وما إذا كانت السياسة متسقة.

Terminal window
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 تتطلب مراجعة

ما يُثبته: اكتشف CSD حقول النماذج التي تقرأها scripts، مع تصنيف الحساسية.

Terminal window
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 يتتبع الوصول إلى حقول النماذج
معلومات — مصفوفة فارغةلم يتم اكتشاف حقول نماذج (متوقع إذا لم تكن هناك نماذج على الموقع)

ما يُثبته: معلومات مفصلة حول script معين بما في ذلك المخاطر والسلوكيات وتفاعلات الشبكة.

أولاً، احصل على معرف script من TEL-1، ثم استعلم عن تفاصيله:

Terminal window
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 time
curl -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 معين، مما يُظهر نطاق التعرض.

Terminal window
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 -t

TEL-7: عدد Scripts حسب مستوى المخاطرة

Section titled “TEL-7: عدد Scripts حسب مستوى المخاطرة”

ما يُثبته: توزيع المخاطر المجمّع عبر جميع scripts المكتشفة.

Terminal window
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 حديثة، مما يؤكد المراقبة النشطة.

Terminal window
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 “لوحة تحكم المنظومة الكاملة”

شغّل أمرًا واحدًا يفحص جميع مؤشرات الصحة الحرجة عبر كل طبقة وينتج جدول ملخص:

Terminal window
echo "=== CSD Verification Dashboard ==="
echo ""
# Layer 1: DNS
DNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)
DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# Layers 2-3: LB + TLS
LB=$(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 status
CSD=$(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 config
JS_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"

الحقلالنوعالوصف
@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”
الحقلنقطة النهايةالوصف
isConfiguredstatusCSD مفعّل على مستوى المستأجر
isEnabledstatusCSD نشط لمساحة الاسم هذه
scripts[]scriptsمصفوفة كائنات scripts المكتشفة
.script_namescriptsعنوان URL الكامل لملف JavaScript
.risk_levelscriptsمستوى المخاطرة (No Risk، Low Risk، High Risk)
.statusscriptsAN (إجراء مطلوب) أو NA (لا إجراء مطلوب)
.form_fields_readscriptsعدد حقول النماذج التي يقرأها script
.affected_users_countscriptsعدد المستخدمين/الجلسات الفريدة المتأثرة
domain_summarydetected_domainsأعداد حسب الحالة: .actionNeededCount.count، .mitigatedDomains.count، .allowedDomains.count، .totalDomains.count (لكل منها .count و.lastUpdated)
domains_list[]detected_domainsمصفوفة كائنات النطاقات المكتشفة مع .domain، .status، .category، .firstSeenDate، .latestSeenDate (ثواني epoch كسلاسل نصية)
form_fields[]formFieldsمصفوفة كائنات حقول النماذج المكتشفة
.analysisformFieldsتصنيف الحساسية (Sensitive، Not Sensitive)

استكشاف الأخطاء وإصلاحها

Section titled “استكشاف الأخطاء وإصلاحها”

إذا أعاد TV-1 القيمة 0:

  1. تحقق من حل DNS — تحقق من أن النطاق يتم حله إلى VIP لموازن التحميل:

    Terminal window
    dig +short xF5XC_DOMAINNAMEx A

    إذا كانت النتيجة فارغة، فـ DNS غير مكوّن. انظر أتمتة API — الخطوة 4.

  2. تحقق من حالة موازن التحميل — يجب أن يكون موازن التحميل في حالة 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'
  3. أرسل طلبًا تجريبيًا — أنشئ حركة مرور لتأكيد الاتصال من طرف إلى طرف:

    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

تحقق من وجود السجل:

Terminal window
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT

إذا كان كلاهما فارغًا، فسجل ACME غير مكوّن. يستغرق توفير الشهادة 5–10 دقائق بعد وضع السجل. تحقق من حالة خطأ موازن التحميل للاطلاع على أخطاء التحقق من ACME المحددة:

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 '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'

يجب تمكين CSD على مستوى المستأجر من قِبل مسؤول F5 XC. هذا إعداد على مستوى المستأجر بأكمله ولا يمكن تكوينه عبر API لمساحة الاسم. تواصل مع مسؤولك لتفعيل الدفاع من جهة العميل.

إذا أعاد TEL-1 مصفوفة فارغة:

  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}'
  2. تحقق من حقن JS — تأكد من حقن علامة script الخاصة بـ CSD في الصفحات:

    Terminal window
    curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1

    إذا لم يكن هناك تطابق، فـ JavaScript الخاص بـ CSD لا يتم حقنه. تحقق من تمكين client_side_defense على موازن التحميل.

  3. انتظر وقت المعالجة — بعد تمكين CSD لأول مرة أو تسجيل نطاق محمي جديد، قد يستغرق اكتشاف scripts من 5 إلى 15 دقيقة. أنشئ حركة مرور إلى الموقع وانتظر قبل إعادة الفحص.

الإعدادات المسبقة للنطاق الزمني

Section titled “الإعدادات المسبقة للنطاق الزمني”
الفترةإزاحة EpochISO 8601 (Linux)ISO 8601 (macOS)
ساعة واحدة$(( $(date +%s) - 3600 ))date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-1H +%Y-%m-%dT%H:%M:%SZ
24 ساعة$(( $(date +%s) - 86400 ))date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-24H +%Y-%m-%dT%H:%M:%SZ
7 أيام$(( $(date +%s) - 604800 ))date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-7d +%Y-%m-%dT%H:%M:%SZ
30 يومًا$(( $(date +%s) - 2592000 ))date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-30d +%Y-%m-%dT%H:%M:%SZ
الطبقةالاختباراتما تغطيه
1. حل DNSDNS-1 إلى DNS-4سجل A، CNAME لـ ACME، صلاحية خادم الأسماء، السجلات المُدارة
2. شهادة TLSTLS-1 إلى TLS-4حالة الشهادة، تفاصيلها، المصافحة الحية، هدف ACME
3. موازن تحميل HTTPLB-1 إلى LB-6الحالة، النطاقات، علامة CSD، مجموعات المسارات، النشر، الملخص
4. مجموعة خوادم المصدرOP-1 إلى OP-4التكوين، وضع TLS، ارتباط فحص الصحة، اتصال المصدر
5. فحص الصحةHC-1 إلى HC-2تكوين فحص الصحة، سرد جميع فحوصات الصحة
6. تكوين CSDCSD-1 إلى CSD-5حالة المستأجر، علامة JS، النطاقات المحمية، الحقن الحي
7. التحقق من حركة المرورTV-1 إلى TV-5عدد الطلبات، رموز الحالة، العينات، JS في السجلات، اختبار E2E
8. بيانات قياس CSDTEL-1 إلى TEL-8Scripts، النطاقات، السياسة، حقول النماذج، التعمق، المستخدمون، المخاطر، الحداثة
التشخيصنقطة النهايةالأسلوبتنسيق الوقت
عدد الطلبات/api/data/namespaces/\{ns\}/access_logs/aggregationPOSTISO 8601
رموز الحالة/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
الطلبات الأخيرة/api/data/namespaces/\{ns\}/access_logsPOSTISO 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\}/statusGETلا شيء
تكوين JS/api/shape/csd/namespaces/\{ns\}/js_configurationGETلا شيء
النطاقات المحمية/api/shape/csd/namespaces/\{ns\}/protected_domainsGETلا شيء
قائمة scripts/api/shape/csd/namespaces/\{ns\}/scriptsPOSTثواني Epoch
النطاقات المكتشفة/api/shape/csd/namespaces/\{ns\}/detected_domainsGETلا شيء
حقول النماذج/api/shape/csd/namespaces/\{ns\}/formFieldsGETثواني Epoch (معاملات الاستعلام)
تفاصيل script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboardGETلا شيء
سلوكيات script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviorsGETلا شيء
شبكة script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractionsGETلا شيء
المستخدمون المتأثرون/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsersPOSTثواني Epoch