Ana içeriğe geç

Kaynak: docs/API.md — bu sayfa her build'de otomatik senkronize edilir.

API Referansı

Tüm uçlar /api altındadır. Kimlik doğrulama açıkken (-auth-password) korumalı uçlar şunlardan birini ister:

  • Cookie: nm_session (login yanıtında HttpOnly olarak set edilir; tarayıcı otomatik taşır, WS handshake'i dahil)
  • Header: Authorization: Bearer <token> (login yanıtındaki token)

Yetkisiz istek: 401 + {"error":"oturum gerekli","auth_required":true} Çok fazla hatalı giriş: 429 + Retry-After: 60

Makine-okunur şema (OpenAPI)​

Bu dokümanın makine-okunur karşılığı api/openapi.yaml'dedir (OpenAPI 3.1) ve hub tarafından kimlik doğrulaması gerektirmeden sunulur:

Uçİçerik
GET /api/openapi.yamlHam şema (YAML)
GET /api/openapi.jsonAynı şema JSON'a çevrilmiş — Postman/Insomnia/editor.swagger.io
GET /api/docsTarayıcıda gezilebilir uç listesi (tek dosya, harici CDN yok)

internal/server içindeki TestOpenAPICoversRouter sözleşme testi şema ile gerçek yönlendiricinin birebir örtüştüğünü doğrular — yeni bir uç eklenip şemaya işlenmezse (veya tersi) CI kırılır.


Kimlik Doğrulama​

POST /api/login (korumasız)​

{"password": "gizliSifre123"}

200: {"ok":true,"token":"<hex>"} + Set-Cookie: nm_session=...; HttpOnly; SameSite=Lax; Max-Age=604800 401: hatalı şifre · 429: bloklandı

POST /api/logout​

Cookie ve/veya Bearer oturumunu iptal eder. → {"ok":true}

GET /api/auth/status (korumasız)​

{"required": true, "authenticated": false}

Canlı Veri​

WS /ws​

Her saniye bir tick gönderir:

{
"type": "tick",
"stats": { "running": true, "device": "en0", "bps_in": 52000.0, "...": "..." },
"connections": [ { "proto": "tcp", "local_addr": "...", "remote_addr": "...", "...": "" } ],
"alert_events": [ { "id": 1, "ts": 1787938964, "kind": "bw", "key": "in", "message": "..." } ],
"record": { "recording": false, "packets": 0, "bytes": 0 }
}

stats alanının tam şeması GET /api/status ile aynıdır.


Yakalama​

GET /api/status​

Anlık yakalama anlık görüntüsü (Snapshot):

AlanTipAçıklama
runningboolyakalama açık mı
devicestringaktif arayüz
errorstringyakalama döngüsü hatası (varsa)
total_packets / total_bytes / droppedintoturum toplamları
bps_in / bps_out / bps_localfloatson saniyenin hızı (bit/sn)
ppsintson saniyenin paket/sayısı
protocolsobject"TCP": n, "UDP": n, ...
top_endpointsarrayip, hostname, local, country, asn, in, out, total, packets (en fazla 50)
top_portsarrayport, name, bytes, packets (25)
top_domainsarraydomain, queries, responses, ips[] (30)
historyarrayson 120 saniyelik kova: ts, in, out, local, packets (bayt)

GET /api/interfaces​

Ağ arayüzleri: name, hw_addr, mtu, up, loopback, can_sniff, addresses[], rx_bytes, tx_bytes, rx_packets, tx_packets

POST /api/capture/start​

{"device": "en0"}

200: {"ok":true} — hata: {"ok":false,"error":"... (root/admin yetkisi gerekli olabilir)"}

POST /api/capture/stop​

Yakalamayı durdurur; açık PCAP kaydı da temizce kapanır. → {"ok":true}


Geçmiş ve Karşılaştırma​

GET /api/history?minutes=60​

DB'den dakikalık seriler:

{
"range_minutes": 60,
"db_bytes": 106936,
"totals": { "avg_bps_in": 0, "avg_bps_out": 0, "peak_bps_in": 0, "peak_bps_out": 0, "seconds": 0, "samples": 0 },
"buckets": [ { "ts": 1787900000, "in": 2500.0, "out": 625.0, "local": 0, "pps": 12 } ]
}

buckets[i].in/out bayt/sn cinsindendir (dakikalık ortalama). minutes 1–10080.

GET /api/compare?days=7​

{
"days": [ { "day": 1787864400, "avg_bps_in": 0, "avg_bps_out": 0, "peak_bps_in": 0, "peak_bps_out": 0, "samples": 0 } ],
"today_hours": [ { "hour": 0, "bps_in": 0, "bps_out": 0 } ],
"yesterday_hours": [ { "hour": 0, "bps_in": 0, "bps_out": 0 } ]
}

days[].day yerel gece yarısı (unix). Saat dizileri her zaman 24 kayıttır; olmayan saatler 0'dır. days 2–30.


Rapor​

GET /api/report?days=7&format=html|pdf​

  • format=html: text/html — tarayıcıda görüntülenir, yazdırılabilir
  • format=pdf: application/pdf + Content-Disposition: attachment

İçerik: yönetici özeti, günlük trafik (+grafik), en yoğun hedefler (ülke/ASN), süreçler, DNS, protokoller, uyarılar, son 3 AI analizi. days 1–90.


PCAP Kayıt​

UçAçıklama
POST /api/record/startKaydı başlat. Yakalama açık değilse hata: kayit için önce yakalama açık olmalı
POST /api/record/stopKaydı kapat: {"ok":true,"file":"2026-08-28_20-05-00_en0.pcap","packets":12345,"bytes":987654}
GET /api/record/status{recording, file, packets, bytes, error}
GET /api/record/files{name, bytes, mod_time} dizini (yeni→eski)
GET /api/record/download?file=<ad>.pcap indirir. Yalnızca kayıt dizinindeki .pcap dosyaları; yoksa 400/404

Uyarılar​

GET /api/alerts​

{
"enabled": true,
"cooldown_min": 10,
"bandwidth": { "enabled": true, "in_mbps": 100, "out_mbps": 50, "seconds": 10 },
"ports": { "enabled": true, "ports": [23, 4444, 1337, 31337] },
"new_proc": { "enabled": true, "ignore": ["bazntms"] },
"new_target": { "enabled": true, "min_total_mb": 10 },
"notifiers": {
"desktop": true, "generic_url": "", "discord_url": "",
"slack_url": "", "telegram_token": "", "telegram_chat_id": ""
}
}

PUT /api/alerts​

Aynı şemayla gövde; kaydeder ve anında uygular. → {"ok":true}

GET /api/alerts/events?limit=50​

[ { "id": 1, "ts": 1787939000, "kind": "port", "key": "23", "message": "Şüpheli porta bağlantı: ..." } ]

kind: bw (bant genişliği) · port (şüpheli port) · proc (yeni süreç) · target (yeni hedef)


AI Analizi (Faz 26 — -ai ile açık)​

Çok-turlu sohbet + çoklu sağlayıcı (yerel + bulut). Sohbet yetki:analyze, sağlayıcı CRUD yetki:global-admin. api_key hiçbir yanıtta düz görünmez. Tam şema: GET /api/openapi.yaml (ai tag). AI danışmandır — otomatik aksiyon yok (bkz. docs/decisions/0014).

GET /api/v1/ai/status​

{"enabled":true,"providers":[…],"default_provider":1,"default_model":"…","has_ready_provider":true} — AI kapalıysa {"enabled":false}.

GET /api/v1/ai/presets​

Sunucu-tanımlı hazır analiz butonları: {"presets":[{"id","label","scopes","task"}]}

GET /api/v1/ai/conversations?scope=&ref=&source=&archived=​

Sohbet oturumları (site-kapsamlı süzülür). POST ile oluştur: {"scope_kind":"fleet","scope_ref":"","provider_id":0} → {"ok":true,"id":N}

GET /api/v1/ai/conversations/{id} · DELETE (= arşivle)​

{"conversation":{…},"messages":[{role,content,tokens_in,tokens_out,error,created_ts}]}

POST /api/v1/ai/conversations/{id}/messages — SSE​

{"content": "filo nasıl görünüyor?", "preset": "fleet_summary", "refresh_context": false}

text/event-stream döner; her satır data: {"delta":"…"}, sonda data: {"done":true,"tokens_in":N,"tokens_out":M} ya da data: {"error":"…"}. Kullanıcı + asistan mesajı kalıcı yazılır; ilk turda kapsam bağlamı eklenir.

GET /api/v1/ai/providers · POST · PUT /{id} · DELETE /{id} — yetki:global-admin​

Liste: {id,name,kind,base_url,default_model,enabled,has_key,is_local} — api_key YOK. Yazma gövdesi: {name,kind,base_url,api_key,default_model,enabled,no_think,max_tokens,temperature}. kind: openai | anthropic | ollama | lmstudio | openai-compat. api_key boş + PUT → mevcut anahtar korunur.

POST /api/v1/ai/providers/{id}/test · GET /api/v1/ai/providers/{id}/models​

Test: {"ok":true,"latency_ms":120,"models":["…"]} ya da {"ok":false,"error":"…"}.


Agent Filosu​

Agent uçları UI oturumundan bağımsızdır. İki kimlik yolu:

  • Bearer token — Authorization: Bearer <agent_token>. Token enrollment ile verilir, diskte (bazntms-agent.state.json) saklanır; hub yalnızca SHA-256 hash'ini tutar.
  • Karşılıklı TLS (mTLS) — hub -tls ile çalışıyorsa: agent'ın enrollment'ta aldığı istemci sertifikası (CN=bazntms-agent-<id>, hub CA'sınca imzalı) TLS el sıkışmasında sunulur ve Bearer'a eşdeğer kimlik sayılır. Silinmiş agent'ın sertifikası reddedilir (CRL yok, agent_id çözümü yeterli).

POST /api/v1/agent/hello (UI auth muaf)​

Enrollment: header X-Enroll-Token: <hub -enroll-token VEYA aşağıdaki /api/v1/enroll-tokens ile üretilmiş bir token> zorunlu.

{"name":"workstation-01","site":"merkezi-ofis","version":"0.1.0","protocol_version":1,"os":"darwin","arch":"arm64","csr_pem":"-----BEGIN CERTIFICATE REQUEST-----\n…"}

csr_pem opsiyoneldir; verilir ve hub -tls ile çalışıyorsa yanıt client_cert_pem

  • ca_cert_pem içerir (mTLS). CSR'daki CN yok sayılır — hub bazntms-agent-<id> koyar.

200: {"accepted":true,"agent_id":1,"agent_token":"<hex>","telemetry_interval_seconds":30,"pcap_enabled":false,"client_cert_pem":"…","ca_cert_pem":"…"}

IP başına deneme sınırlaması vardır (login sayfasıyla aynı politika: 1 dakikada 5 başarısız denemeden sonra 1 dakika bloklanır) — token tahmin etmeye çalışan istekleri engeller. Bloklandığında 429 + Retry-After: 60 döner; başarılı bir enrollment sayacı sıfırlar.

POST /api/v1/agent/cert (Bearer/mTLS agent kimliği)​

İstemci sertifikasını yeniler (agent ömrünün yarısı geçince çağırır). Gövde: {"csr_pem":"-----BEGIN CERTIFICATE REQUEST-----\n…"} → 200: {"client_cert_pem":"…","ca_cert_pem":"…"}. Hub -tls kapalıysa 404.

POST /api/v1/agent/telemetry (Bearer agent token veya mTLS)​

{
"ts": 1788021229,
"interfaces": [{"name":"en0","rx_bytes":123456,"tx_bytes":9876,"rx_packets":100,"tx_packets":90}],
"connections": [{"proto":"tcp","local_addr":"192.168.1.43:5000","remote_addr":"1.2.3.4:443","status":"ESTABLISHED","pid":123,"process":"chrome"}]
}

200: {"ok":true,"interval":30} — interval, hub politikası (değişirse agent uyar).

Filo yönetimi (UI auth ile korunur)​

UçAçıklama
GET /api/v1/agents{id, name, site, online, last_seen, version, remote_ip, attr_method, attr_iface, attr_note, rates[{name, rx_bps, tx_bps, pps, rx_bytes, tx_bytes, rx_packets, tx_packets}], conns} — attr_method: süreç-atıf arka ucu (ebpf|pcap|etw|off); attr_iface: pcap yakalama arayüzü (yalnız pcap); attr_note: motor kapalı/başlatılamadıysa neden
GET /api/v1/agents/{id}{agent: <yukarıdaki şema>, connections: [{proto, local_addr, remote_addr, status, pid, process}]} — son telemetri anındaki gerçek bağlantı envanteri
GET /api/v1/agents/{id}/history?minutes=60[{ts, in, out, local, pps}] — tüm arayüzlerin toplamı, ardışık örnekler arası bayt/sn + paket/sn (Agent Detay throughput grafiği)
DELETE /api/v1/agents/{id}Agent'ı ve telemetrisini sil
PATCH /api/v1/agents/{id}Gövde {name} — agent'ın hub'taki görüntü adını değiştir (agent tarafında hiçbir şey değişmez)

GET /api/v1/processes?minutes=60&agent_id=0&limit=20 (UI auth)​

Süreç bazlı trafik top-listesi (nethogs yöntemi: agent'ta pcap + soket→PID eşlemesi; agent_iface_samples gibi ts filtresiyle):

[ { "process": "chrome", "bytes_in": 900, "bytes_out": 100, "total": 1000, "agent_count": 1 } ]

Hub -agent-pcap politikası + agent'ta -pcap ikisi de açık olmalı; ham PCAP kaydı için ek olarak agent'ta -record.

GET /api/v1/l7?minutes=60&agent_id=0&limit=30 (UI auth)​

Süreç bazlı uygulama görünürlüğü: agent, yakaladığı giden TCP payload'larında TLS ClientHello SNI'sini ve HTTP istek satırındaki Host'u çıkarır ve sürece atfeder (-pcap gerekir; imza tabanlı DPI değil, yalnızca açıkça görünen alan adı). host+kind+process bazlı gruplanır.

[ { "host": "api.github.com", "kind": "tls", "process": "chrome", "bytes": 4200, "hits": 12, "agent_count": 2 } ]

GET /api/v1/dns?minutes=60&agent_id=0&limit=30 (UI auth)​

Süreç bazlı DNS görünürlüğü: agent, UDP/53 sorgu/yanıtlarındaki alan adlarını (ters arama / .local hariç) sürece atfeder (-pcap gerekir). Fleet raporundaki "DNS Görünürlüğü" bölümünü de bu besler. domain+process bazlı gruplanır.

[ { "domain": "www.google.com", "process": "chrome", "queries": 8, "responses": 8, "agent_count": 2 } ]

Agent çalıştırma:

# hub tarafı
sudo ./bazntms -enroll-token gizli-token

# uç tarafı (ilk çalıştırma enrollment yapar, token diskte saklanır)
./bazntms-agent -hub-url https://hub.example.com -enroll-token gizli-token -name ws-01 -site ofis

Offline iken batch'ler disk kuyruğuna yazılır (*.state.json.queue.jsonl, en fazla 100 batch) ve bağlantı geri gelince otomatik bosaltilir.


RBAC, Kullanıcılar, Token'lar ve Denetim (admin yetkisi gerekir)​

Giriş yolları:

  • Legacy: POST /api/login {"password":"..."} → admin kimliği (geriye uyumlu)
  • Kullanıcı (RBAC): POST /api/login {"username":"bob","password":"..."} → rol + site scope
  • SSO (OIDC): GET /api/auth/oidc/login → sağlayıcı → callback → oturum
  • API token: Authorization: Bearer bnt_... (entegrasyonlar için)

Roller ve yetkiler:

Yetkiadminnetopsanalystviewer
görüntüleme (view)✓✓✓✓
yakalama/kayıt kontrolü (operate)✓✓✗✗
AI analiz/rapor (analyze)✓✓✓✗
cihaz ekle/sil (devices)✓✓✗✗
agent sil (agents)✓✗✗✗
kullanıcı/token/audit (admin)✓✗✗✗

GET /api/v1/users · POST /api/v1/users​

Kullanıcı listesi ve oluşturma. Oluşturma: {username, password (≥8), role, site}. site doluysa kullanıcı/token yalnızca o siteye ait agent'ları, cihazları (devices.site), NetFlow'u (exporter cihazının sitesi), syslog'u (kaynak IP'nin cihazının sitesi) ve topolojiyi görür; başka sitenin agent/device detayına 404 alır. Site-sınırlı bir kullanıcı cihaz eklerken site alanı otomatik kendi sitesine sabitlenir.

PUT /api/v1/users/{id} · DELETE /api/v1/users/{id}​

Rol/site/enabled/sifre güncelleme: {role?, site?, enabled?, password?}. Kendi hesabını silme/kilitleme korumalıdır.

GET /api/v1/tokens · POST /api/v1/tokens · DELETE /api/v1/tokens/{id}​

Entegrasyon API token'ları. Oluşturma: {name, role, site} → düz token yalnızca bir kez döner ({"token":"bnt_..."}); sunucuda yalnız hash tutulur. Silme = revoke (Bearing anında geçersizleşir).

GET /api/v1/enroll-tokens · POST /api/v1/enroll-tokens · DELETE /api/v1/enroll-tokens/{id}​

Hub'ın -enroll-token bayrağındaki tek statik sırra ek, DB'de saklanan ve hub yeniden başlatılmadan oluşturulup iptal edilebilen enrollment token'ları — statik sır sızarsa hub'ı yeniden başlatmadan onu değiştirmenin yolu yoktu; bu, o sırra dokunmadan ayrı, kolayca iptal edilebilir token'lar eklemenin yoludur. Agent'lar -enroll-token/hub.token alanına statik sır yerine bunlardan birini de verebilir — ikisi de X-Enroll-Token başlığında aynı şekilde kabul edilir.

Oluşturma: {name, site?, expires_in_days?} (site şu an yalnız bilgi amaçlıdır, zorlanmaz; expires_in_days 0/boş = süresiz) → düz token yalnızca bir kez döner ({"ok":true,"id":1,"token":"ent_..."}). Silme = revoke (bir sonraki enrollment denemesinde 401 döner). Liste: [{id, name, site, created_at, expires_at, last_used, revoked}].

GET /api/v1/audit?limit=100​

Append-only denetim kayıtları: {id, ts, username, role, action, target, detail, ip, prev_hash, hash}. Her kayıt bir öncekinin hash'ini taşır (SHA-256 zinciri).

GET /api/v1/audit/verify​

Zincir bütünlüğü: {"ok":true,"broken_at":0,"checked":N}. ok:false ise broken_at ID'sinden itibaren veri tabanı dışarıdan değiştirilmiştir.

GET /api/auth/oidc/login · GET /api/auth/oidc/callback​

SSO akışı (config'te oidc.issuer tanımlıysa aktif). Grup→rol eşlemesi oidc.group_roles ile yapılır; eşleşmeyen kullanıcılar default_role alır.


İleri Analiz (UI auth ile korunur)​

GET /api/v1/topology​

Canlı ağ haritası modeli: {generated_at, devices[], agents[], links[]}. Kenar kaynakları: LLDP/CDP (SNMP keşfi), ARP (cihaz port uç noktaları), subnet (agent'ların bildirdiği yerel ağlar — CIDR). Kenarlar dedupe edilir; ts = son görülme.

GET /api/v1/geo?minutes=60 (UI auth)​

Son minutes dakikadaki uzak uç noktalar (NetFlow flows + agent süreç trafiği) GeoIP ile ülkeye toplanır ve dünya haritasında balon olarak gösterilir. minutes üst sınırı 7 gün. Sıralama bytes azalan.

[ { "country": "DE", "name": "Almanya", "lat": 51.2, "lon": 10.4, "bytes": 40998410, "sessions": 3 } ]

sessions = o ülkeye eşleşen farklı uzak IP sayısı. GeoIP kaynağı yoksa (MMDB dosyaları yok ve -ip-api-lookup=false) boş liste döner. Merkez koordinatı internal/geoip/centroids.go'daki ~120 ülkelik tablodan gelir; listede olmayan ülke haritada çizilmez (API yine de sayar → toplam eksilir).


FortiGate REST API (UI auth ile korunur)​

Cihaz vendor: "fortigate" ile eklendiğinde poller SNMP yerine FortiOS REST API'yi kullanır. Cihaz ekleme isteğine ek alanlar:

{
"name": "fgt-ofis", "host": "10.9.9.1", "kind": "firewall", "vendor": "fortigate",
"api_url": "https://10.9.9.1", "api_token": "REST-API-TOKEN",
"api_verify_tls": true, "vdom": "root", "poll_seconds": 60
}
  • api_token vault'ta AES-256-GCM ile şifreli saklanır ve hiçbir API yanıtında döndürülmez. Read-only REST API admin profili önerilir.
  • vdom: boş/root → tek VDOM; all → tüm VDOM'lar taranır (veri VDOM etiketli saklanır).
  • api_verify_tls: false → self-signed sertifika kabul edilir.
  • Toplanan veriler: monitor/system/status|resource/usage|interface, monitor/vpn/ipsec|ssl, monitor/virtual-wan/health-check, cmdb/firewall/policy (hit sayaçları).

Cihaz veri uçları (?minutes= pencere parametreli):

Uçİçerik
GET /api/v1/devices/{id}/resourcesCPU/RAM/disk % + oturum sayısı zaman serisi
GET /api/v1/devices/{id}/vpnIPsec tüneller + SSL kullanıcıları (durum, uptime, trafiği)
GET /api/v1/devices/{id}/sdwanSD-WAN health-check: member bazlı latency/jitter/loss
GET /api/v1/devices/{id}/policiesPenceredeki en aktif politika hit'leri (delta)

FortiGate uyarı tipleri: vpn_down, sdwan_sla_breach, high_sessions — PUT /api/alerts ile forti bölümünden yönetilir: {"forti":{"vpn_down":true,"sdwan_latency_ms":200,"sdwan_jitter_ms":50,"sdwan_loss_pct":5,"max_sessions":20000}}.


5651 Uyumluluk (imzalama -compliance ile açılır)​

GET /api/v1/compliance/status (view)​

Panel durumu: {config, records, last_record_ts, last_hourly?, last_daily?}. last_daily.tsa_status: ok (nitelikli zaman damgası alındı), none (TSA yapılandırılmamış) veya error:<mesaj>.

GET /api/v1/compliance/evidence?from=2026-08-01&to=2026-09-01&mask=true (admin)​

Delil paketi (A.5.28): {generated_at, from, to, masked, logs[], checkpoints[], verification}. Paket, kayıt hash zinciri + saatlik Merkle checkpoint'leri + günlük mühür (TSA token + imza) içerir. mask=true → IP/MAC/kullanıcı PII maskeleme (A.5.34/A.8.11; paket düzeyinde, ham kayıt değişmez). Doğrulama:

bazntmsctl verify -bundle paket.json -pubkey compliance.key.pub

GET /api/v1/compliance/reviews?limit=50 (admin) · POST (admin)​

İnceleme tutanakları: {"kind":"log"|"access","period":"2026-08","notes":"...","finding":""}. Tutanaklar audit zincirine de işlenir (A.8.15 log incelemesi / A.8.2 erişim incelemesi).

GET /api/report?type=compliance (view)​

ISO 27001:2022 Annex A kontrol haritası + 5651 motoru durumu (HTML) — denetçiye sunulabilir uyum raporu.


Uyarı tipleri (anomali)​

GET /api/alerts/events içinde kind:"anomaly": saat-of-day istatistiksel baseline (son 7 gün) ile 5 dakikalık pencere verimi arasındaki z-skoru sapması. Eşik/duyarlılık PUT /api/alerts ile anomaly bölümünden yönetilir: {"anomaly":{"enabled":true,"sensitivity":3.0,"min_samples":120,"window_min":5}}.

IOC / tehdit istihbaratı eşleştirmesi​

Hub -ioc-file <yol> ile başlatılırsa (domain kara listesi — hosts / AdBlock / düz metin formatları, mtime değişince otomatik yeniden yüklenir), agent'ların gözlemlediği TLS SNI / HTTP Host (l7_endpoints) ve DNS sorgu (agent_dns) alan adları ~30 sn'de bir bu listeye karşı eşleştirilir. Eşleşme (üst alan dahil: x.evil.com, listede evil.com varsa yakalar) → kind:"ioc" uyarısı:

{ "kind": "ioc", "key": "42|cdn.evil-c2.example",
"message": "IOC eşleşmesi: cdn.evil-c2.example (kural: evil-c2.example) — agent ws-01, süreç powershell, kaynak TLS SNI / HTTP Host" }

PUT /api/alerts → {"ioc":{"enabled":true}} ile çalışma anında kapatılabilir. İmza tabanlı tam DPI değil — düşük maliyetli "bilinen kötü domain'e temas" tespiti (bir hash-set lookup).

Bildirim kanalları​

PUT /api/alerts → notifiers bölümüne yeni kanallar:

{
"notifiers": {
"teams_url": "https://outlook.office.com/webhook/...",
"webhook_v2_url": "https://siem.example.com/bazntms",
"webhook_v2_secret": "paylastiginiz-gizli",
"email_host": "smtp.kurum.local",
"email_port": 587,
"email_from": "bazntms@kurum.local",
"email_to": ["noc@kurum.local"],
"email_user": "bazntms",
"email_pass": "gizli"
}
}

Webhook v2, gövdeyi X-BazNTMS-Signature: sha256=<hmac> ile imzalar.

SIEM / ITSM push connector​

notifiers.siem — her uyarı olayını standart bir formatta bir SIEM/ITSM sistemine iletir:

{
"notifiers": {
"siem": {
"enabled": true,
"format": "cef",
"transport": "syslog-udp",
"target": "siem.kurum.local:514",
"token": "",
"insecure": false
}
}
}
AlanDeğerlerNot
formatcef (ArcSight) · leef (QRadar) · json · text (düz syslog satırı)boş → cef
transportsyslog-udp · syslog-tcp · httpboş → syslog-udp
targetsyslog: host:port · http: tam URL—
tokenhttp: Authorization başlığı olarak yollanır (ör. Splunk <HEC-token>)boş → gönderilmez
insecurehttp: TLS sunucu doğrulamasını atlaself-signed toplayıcı
  • CEF: CEF:0|bazNTMS|bazNTMS|1.0|<kind>|<etiket>|<severity>|rt=… cat=<kind> cs1Label=key cs1=<key> msg=<mesaj>
  • LEEF: LEEF:1.0|bazNTMS|bazNTMS|1.0|<kind>|devTime=…⇥sev=…⇥cat=<kind>⇥key=…⇥msg=…
  • syslog taşımasında satır RFC3164 çerçevesine alınır (<PRI> = facility local0 + önem 0-7).
  • Önem eşlemesi (CEF/LEEF 0-10): port 9 · vpn_down 8 · anomaly/sdwan_sla_breach 6 · bw/high_sessions 5 · proc/target 4.

Kurumsal rapor​

GET /api/report?type=enterprise&days=30 — SLA (agent uptime, cihaz sağlığı, paket düşme), kapasite (büyüme, toplam trafik) ve banding (p50/p95/p99) tablo­ları; HTML olarak üretilir.


Cihazlar, NetFlow ve Syslog (UI auth ile korunur)​

GET /api/v1/devices​

Kayıtlı cihazlar: {id, name, host, kind, site, snmp_version, poll_seconds, enabled, sys_name, sys_descr, last_poll, last_error}. Kimlik bilgileri yanıtta maskelenir. Site-sınırlı kimlik yalnızca kendi sitesinin cihazlarını görür.

POST /api/v1/devices​

{
"name": "core-sw", "host": "10.0.0.2", "kind": "switch", "site": "sube-a",
"snmp_version": 2, "community": "gizli",
"poll_seconds": 60
}

site opsiyoneldir (RBAC scope + filo organizasyonu). Site-sınırlı kimlikte otomatik kullanıcının sitesine sabitlenir.

v3 için: "v3_user", "v3_auth_proto" (SHA/SHA256/SHA512/MD5), "v3_auth_pass", "v3_priv_proto" (AES/AES256/DES), "v3_priv_pass". Hassas alanlar AES-256-GCM kasada şifrelenir (vault.key dosyası, ilk çalıştırmada üretilir — kaybedilirse cihaz kimlikleri kurtarılamaz).

Cihaz verileri​

UçAçıklama
DELETE /api/v1/devices/{id}Cihazı ve örneklerini sil
GET /api/v1/devices/{id}/interfacesSon örneklerden arayüz listesi + ↓/↑ verimleri + hata sayaçları

GET /api/v1/flows?minutes=15&limit=20​

Akışlar: {ts, device, src, dst, src_port, dst_port, proto, packets, octets} (octets'e göre azalan). Collector: -flow-port 2055 — NetFlow v5/v9, IPFIX ve sFlow v5 aynı portta, datagram versiyonundan ayrılır. sFlow "flow sample" içindeki ham paket başlığı (Ethernet→IPv4→TCP/UDP) çözülür ve örnekleme oranıyla ölçeklenir: packets = oran, octets = çerçeve boyu × oran (istatistiksel tahmin). sFlow'u ayrı bir portta dinlemek için -sflow-port 6343.

GET /api/v1/syslog?limit=100​

RFC3164 olayları: {id, ts, host, severity (0-7), tag, message}. Alıcı: -syslog-port 5514.


Sysmon​

GET /api/connections​

Aktif soketler (gopsutil): {proto, local_addr, remote_addr, status, pid, process, count, country, asn}

PID/süreç bilgisi platform yetkilerine bağlıdır: Linux'ta aynı kullanıcıya ait veya root; Windows'ta tam; macOS'ta root gerekir.


Örnek: curl ile uçtan uca​

TOKEN=$(curl -s -X POST localhost:8080/api/login \
-H 'Content-Type: application/json' \
-d '{"password":"gizliSifre123"}' | jq -r .token)

curl -s -H "Authorization: Bearer $TOKEN" localhost:8080/api/v1/agents | jq length

# AI sohbet (SSE) — yeni oturum aç, filo özeti preset'i gönder
CID=$(curl -s -H "Authorization: Bearer $TOKEN" -X POST localhost:8080/api/v1/ai/conversations \
-H 'Content-Type: application/json' -d '{"scope_kind":"fleet"}' | jq -r .id)
curl -sN -H "Authorization: Bearer $TOKEN" -X POST \
localhost:8080/api/v1/ai/conversations/$CID/messages \
-H 'Content-Type: application/json' -d '{"preset":"fleet_summary"}'