المراقبة وقابلية الرصد
يستخدم 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-api | 8000 | /metrics | 15s |
agent-task-worker | 9201 | /metrics | 15s |
orchestrator | 9000 | /metrics | 15s |
| Agent services (10) | 9001-9012 | /metrics | 15s |
rust-core | 50051 | /metrics | 15s |
| Redis | 6379 | /metrics | 15s |
| NATS | 8222 | /varz | 15s |
| PostgreSQL | 5432 | /metrics | 15s |
| Mosquitto | 1883 | /metrics | 15s |
مقاييس API الجديدة لربط النتائج (Gap 9)
تقوم خدمة FastAPI الآن بتصدير مقاييس إضافية لتتبع ربط نتائج الوكلاء وفحوصات اتصال A2A عند بدء التشغيل:
| المقياس | النوع | الوصف |
|---|---|---|
aurora_agent_result_correlation_latency_ms | Histogram | زمن ربط نتيجة العامل مع Future في API |
aurora_agent_results_unmatched_total | Counter | أحداث نتائج بلا معرف ربط أو بلا Future منتظر |
aurora_agent_result_futures_pending | Gauge | عدد Futures التحقيق المعلقة بانتظار نتيجة العامل |
aurora_a2a_startup_connectivity_total | Counter | نتائج فحوصات A2A عند البدء (reachable, server_error, unreachable) |
aurora_a2a_startup_connectivity_duration_ms | Histogram | مدة فحص اتصال A2A لكل وكيل |
مقاييس عامل مهام الوكلاء (Gap 9)
تقوم عملية agent-task-worker الآن بتصدير نقطة نهاية Prometheus مستقلة (افتراضيًا :9201/metrics) مع مقاييس تنفيذ خاصة بالعامل:
| المقياس | النوع | الوصف |
|---|---|---|
aurora_agent_task_worker_tasks_total | Counter | نتائج المهام بحسب agent_type وoutcome |
aurora_agent_task_worker_retries_total | Counter | عدد عمليات إعادة وضع المهام في الطابور |
aurora_agent_task_worker_dead_letters_total | Counter | عدد المهام التي انتقلت إلى dead-letter |
aurora_agent_task_worker_failures_total | Counter | حالات الفشل بحسب نوع الاستثناء |
aurora_agent_task_worker_task_duration_ms | Histogram | زمن معالجة المهمة من البداية للنهاية بحسب النتيجة |
قواعد التنبيه
تنبيهات عمليات الأمن
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