انتقل إلى المحتوى الرئيسي

المراقبة وقابلية الرصد

يستخدم AuroraSOC حزمة متكاملة لقابلية الرصد: OpenTelemetry للتتبّع، وPrometheus للمقاييس، وGrafana للتصور، والتسجيل المهيكل عبر structlog.

حزمة قابلية الرصد

إعداد OpenTelemetry

المجمِّع (infrastructure/otel/otel-collector.yml)

receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"

processors:
memory_limiter:
check_interval: 1s
limit_mib: 512
batch:
timeout: 5s
send_batch_size: 1024

exporters:
prometheus:
endpoint: "0.0.0.0:8889"
namespace: "aurorasoc"
otlp/jaeger:
endpoint: "jaeger:4317"
tls:
insecure: true
logging:
loglevel: info

service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/jaeger, logging]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]

إعداد التتبّع في Python

# aurorasoc/core/tracing.py
def setup_tracing():
resource = Resource.create({"service.name": "aurorasoc-api", "service.version": "2.0.0"})
exporter = OTLPSpanExporter(endpoint=settings.observability.otlp_endpoint, insecure=True)
provider = TracerProvider(resource=resource)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

التسجيل المهيكل

# aurorasoc/core/logging.py
def setup_logging():
structlog.configure(
processors=[
structlog.contextvars.merge_contextvars,
structlog.processors.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.JSONRenderer(),
],
logger_factory=structlog.PrintLoggerFactory(),
)

مثال على المخرجات:

{
"event": "alert_created",
"alert_id": "550e8400-...",
"severity": "critical",
"source": "suricata",
"dedup_hash": "a3f2b8...",
"level": "info",
"timestamp": "2024-01-15T10:30:00Z"
}

أهداف Scrape في Prometheus

الإعداد (infrastructure/prometheus/prometheus.yml)

الهدفالمنفذالمسارالفترة
aurorasoc-api8000/metrics15s
agent-task-worker9201/metrics15s
orchestrator9000/metrics15s
Agent services (10)9001-9012/metrics15s
rust-core50051/metrics15s
Redis6379/metrics15s
NATS8222/varz15s
PostgreSQL5432/metrics15s
Mosquitto1883/metrics15s

مقاييس API الجديدة لربط النتائج (Gap 9)

تقوم خدمة FastAPI الآن بتصدير مقاييس إضافية لتتبع ربط نتائج الوكلاء وفحوصات اتصال A2A عند بدء التشغيل:

المقياسالنوعالوصف
aurora_agent_result_correlation_latency_msHistogramزمن ربط نتيجة العامل مع Future في API
aurora_agent_results_unmatched_totalCounterأحداث نتائج بلا معرف ربط أو بلا Future منتظر
aurora_agent_result_futures_pendingGaugeعدد Futures التحقيق المعلقة بانتظار نتيجة العامل
aurora_a2a_startup_connectivity_totalCounterنتائج فحوصات A2A عند البدء (reachable, server_error, unreachable)
aurora_a2a_startup_connectivity_duration_msHistogramمدة فحص اتصال A2A لكل وكيل

مقاييس عامل مهام الوكلاء (Gap 9)

تقوم عملية agent-task-worker الآن بتصدير نقطة نهاية Prometheus مستقلة (افتراضيًا :9201/metrics) مع مقاييس تنفيذ خاصة بالعامل:

المقياسالنوعالوصف
aurora_agent_task_worker_tasks_totalCounterنتائج المهام بحسب agent_type وoutcome
aurora_agent_task_worker_retries_totalCounterعدد عمليات إعادة وضع المهام في الطابور
aurora_agent_task_worker_dead_letters_totalCounterعدد المهام التي انتقلت إلى dead-letter
aurora_agent_task_worker_failures_totalCounterحالات الفشل بحسب نوع الاستثناء
aurora_agent_task_worker_task_duration_msHistogramزمن معالجة المهمة من البداية للنهاية بحسب النتيجة

قواعد التنبيه

تنبيهات عمليات الأمن

groups:
- name: aurorasoc_alerts
rules:
- alert: HighSeverityAlertSpike
expr: rate(aurorasoc_alerts_total{severity="critical"}[5m]) > 10
for: 2m
labels:
severity: warning
annotations:
summary: "Unusual spike in critical alerts"

- alert: AgentUnresponsive
expr: up{job="aurorasoc-agents"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Agent service {{ $labels.instance }} is down"

- alert: AgentTaskWorkerDown
expr: up{job="aurorasoc-agent-task-worker"} == 0
for: 2m
labels:
severity: warning

- alert: RustCoreHighLatency
expr: histogram_quantile(0.99, aurora_event_duration_seconds_bucket) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "Rust Core p99 latency exceeds 100ms"

- alert: EventIngestionBackpressure
expr: aurora_redis_stream_lag > 10000
for: 5m
labels:
severity: warning
annotations:
summary: "Redis Stream consumer lag exceeds 10K messages"

- alert: OrchestratorHighErrorRate
expr: rate(aurorasoc_dispatch_errors_total[5m]) / rate(aurorasoc_dispatch_total[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "Orchestrator error rate exceeds 5%"

- alert: MQTTBrokerDown
expr: up{job="mosquitto"} == 0
for: 2m
labels:
severity: critical

- alert: NATSJetStreamStorageHigh
expr: nats_jetstream_storage_bytes / nats_jetstream_storage_limit_bytes > 0.85
for: 10m
labels:
severity: warning

- alert: DatabaseConnectionPoolExhausted
expr: aurorasoc_db_pool_available == 0
for: 1m
labels:
severity: critical

- alert: AgentResultCorrelationLatencyHigh
expr: histogram_quantile(0.95, rate(aurora_agent_result_correlation_latency_ms_bucket[10m])) > 5000
for: 10m
labels:
severity: warning

- alert: AgentResultsUnmatchedGrowing
expr: increase(aurora_agent_results_unmatched_total[15m]) > 20
for: 10m
labels:
severity: warning

- alert: InvestigationFuturesBacklog
expr: aurora_agent_result_futures_pending > 200
for: 10m
labels:
severity: warning

- alert: A2AStartupConnectivityFailures
expr: sum(increase(aurora_a2a_startup_connectivity_total{status=~"unreachable|server_error"}[1h])) > 0
for: 5m
labels:
severity: warning

- alert: AgentTaskWorkerDeadLetterGrowing
expr: increase(aurora_agent_task_worker_dead_letters_total[15m]) > 5
for: 10m
labels:
severity: warning

- alert: AgentTaskWorkerRetrySpike
expr: increase(aurora_agent_task_worker_retries_total[15m]) > 50
for: 10m
labels:
severity: warning

تنبيهات خاصة بـ CPS

- name: aurorasoc_cps
rules:
- alert: CPSAttestationFailureRate
expr: >
rate(aurora_attestation_failures_total[5m]) /
rate(aurora_attestation_total[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "CPS attestation failure rate exceeds 10%"

- alert: CPSDeviceOffline
expr: time() - aurora_device_last_seen_timestamp > 300
for: 5m
labels:
severity: warning
annotations:
summary: "CPS device {{ $labels.device_id }} offline for 5+ minutes"

- alert: CPSTamperDetected
expr: aurora_tamper_events_total > 0
for: 0m
labels:
severity: critical
annotations:
summary: "Physical tamper detected on {{ $labels.device_id }}"

- alert: CPSFirmwareRollback
expr: aurora_device_boot_count < aurora_device_boot_count offset 1h
for: 0m
labels:
severity: critical
annotations:
summary: "Firmware rollback detected on {{ $labels.device_id }}"

لوحات Grafana

يوفّر AuroraSOC لوحات Grafana مُعدّة مسبقًا:

اللوحةاللوحات الفرعيةالغرض
نظرة عامة على SOCمعدلات التنبيه، حالة القضايا، صحة الوكلاءملخص تنفيذي
أداء الوكلاءمدة المهام، معدلات الأخطاء، الإنتاجيةمراقبة وكلاء الذكاء الاصطناعي
CPS/IoTحالة الأجهزة، معدلات attestation، أحداث العبثالأمن الفيزيائي
البنية التحتيةصحة Redis وNATS وPostgreSQL وMQTTصحة النظام

إعداد Mosquitto MQTT

الإنتاج (infrastructure/mosquitto/mosquitto.conf)

# TLS listener (production)
listener 8883
cafile /mosquitto/certs/ca.crt
certfile /mosquitto/certs/server.crt
keyfile /mosquitto/certs/server.key
require_certificate true
use_identity_as_username true # x.509 CN becomes MQTT username
tls_version tlsv1.3

# Dev listener (no auth)
listener 1883
allow_anonymous true

# Persistence
persistence true
persistence_location /mosquitto/data/

# Limits
max_packet_size 262144 # 256KB

ACL (infrastructure/mosquitto/acl.conf)

# Device ACL — each device can only write to its own topics
pattern write aurora/sensors/%u/telemetry
pattern write aurora/sensors/%u/alerts
pattern write aurora/sensors/%u/status
pattern read aurora/command/%u/action

# Service accounts
user rust-core-svc
topic read aurora/sensors/#
topic read aurora/attestation/#

user cps-agent-svc
topic read aurora/sensors/#
topic write aurora/command/#

إعداد NATS JetStream

# infrastructure/nats/nats-server.conf
server_name: aurora-nats-1

jetstream {
store_dir: /data/nats
max_mem: 512MB
max_file: 10GB
}

accounts {
AURORA {
jetstream: enabled
users: [{ user: aurora, password: $NATS_PASSWORD }]
}
SYS {
users: [{ user: sys, password: $NATS_SYS_PASSWORD }]
}
}

max_connections: 1024
max_payload: 1MB