Ana içeriğe geç

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

Yapılandırma Referansı

Komut Satırı Bayrakları​

BayrakVarsayılanAçıklama
-port8080HTTP sunucu portu (0.0.0.0'a bağlanır)
-devfalseFrontend embed'ini atla; Vite dev server ile geliştirme
-dbbazntms.dbSQLite dosya yolu veya postgres:// DSN (DSN verilirse PostgreSQL/TimescaleDB modu)
-retention-hours168 (7 gün)Ham zaman-serisi saklama süresi. TimescaleDB modunda native chunk-drop retention politikası, ayrıca 15 dk'da bir Maintainer (capture'dan bağımsız) siler
-agent-archive-days30Bu kadar gün çevrimdışı kalan agent'lar Maintainer tarafından tam cascade ile silinir (kayıt + iface/conn/process/L7/DNS/subnet/alert_seen). 0 = kapalı. Makine kimliği (machine_id) sayesinde geri dönen bir makine temiz bir kayıt olarak yeniden enroll olur
-multi-sitefalseÇoklu-saha (MSP) modu: site sert bir yetki sınırı olur. Agent kaydı site-bağlı enroll token ister (statik -enroll-token ve site'siz DB token'ları reddedilir); enroll token üretimi site alanı zorunlu; site-admin rolü yalnız kendi sahasını yönetir. Bkz. DEPLOYMENT-MODEL.md
-session-storememoryPanel oturum deposu. memory = süreç-içi (tek controller replikası). db = paylaşımlı sessions tablosu — birden çok controller replikası aynı oturumları görür, biri yeniden başlasa kullanıcı düşmez, logout replikalar arası anında. Yalnızca sha256(çerez token'ı) saklanır. Postgres modu önerilir (A4). Bkz. decisions/0004-shared-sessions.md
-queue-max-age-hours24JetStream stream mesaj yaşı sınırı. Tüketilmeyen mesajlar bu süreden sonra düşer. MaxDeliver (10) denemeden sonra da başarısız kalan mesaj ingest.dead DLQ konusuna taşınır (bazntms_ingest_dead_total{subject} metriği; nats stream view ile incelenir). (C4)
-public-url—Panelin dış adresi (ör. https://ntms.example.com). İki yerde kullanılır: (1) WebSocket handshake origin izin listesi (Cross-Site WebSocket Hijacking'e karşı — -tls-hosts + localhost/127.0.0.1/[::1] de eklenir; ikisi de boşsa tüm origin'ler kabul edilir + uyarı loglanır). (2) OIDC redirect_url boşsa <public-url>/api/auth/oidc/callback varsayılır. (B5)
-nats—NATS JetStream adresi. Boşsa kuyruk kapalı: ingest doğrudan store'a yazar. Örn: nats://localhost:4222
-capturetrueHub'ın kendi paket yakalaması/collector'u. Çoklu replika ingest'te kapatılır
-agent-pcaptrueAgent'larda derin toplama (süreç trafiği + DNS + L7/SNI) ve ham PCAP kaydı politikası. v1.3.0'dan beri varsayılan açık. Filo genelinde kapatmak: -agent-pcap=false (veya hub.yaml / Helm agent_pcap: false). Agent tarafında ayrıca collect.method: off ile tek tek kapatılır
-alertstrueUyarı kural motoru. Çoklu replikada yalnızca bir replikada açık olmalı
-pollertrueSNMP cihaz poller'ı. Çoklu replikada yalnızca bir replikada açık olmalı
-prunetrueVeritabanı bakımı (eski satır temizliği + retention). Çoklu replikada yalnızca bir hub'da açık olmalı
-tlsfalseHTTPS + agent karşılıklı TLS (mTLS). Hub kendi CA'sını üretir, agent CSR'larını enrollment'ta imzalar. -tls-dir/-tls-hosts/-tls-cert/-tls-key
-vault-key-filevault.keyKimlik kasası master anahtar dosyası (32 bayt hex; yoksa üretilir). -vault-key-source=file iken kullanılır
-vault-key-sourcefileMaster anahtar kaynağı. file = -vault-key-file. env = BAZNTMS_VAULT_MASTER_KEY (hex/base64, 32 bayt) — anahtar diske hiç yazılmaz; k8s Secret / AWS Secrets Manager / GCP Secret Manager / HashiCorp Vault agent tarafından ortam değişkeni olarak enjekte edilir. (B8, decisions/0006)
-flow-port—NetFlow v5/v9 + IPFIX + sFlow v5 UDP dinleme portu (örn. 2055). Üçü de datagram versiyonundan ayrılır; v9/IPFIX şablonları exporter başına önbelleklenir
-sflow-port—sFlow v5 için ayrı UDP portu (örn. 6343). -flow-port zaten sFlow'u da kabul eder; bu yalnızca farklı portta dinlemek için
-ioc-file—Tehdit istihbaratı domain kara listesi. Eşleşen L7 (SNI/Host) veya DNS trafiği kind:"ioc" uyarısı üretir. hosts / AdBlock / düz metin formatları; dosya mtime değişince otomatik yeniden yüklenir (2 dk yoklama)
-update-github-repogokayybaz/bazntmsAgent binary'lerini çekecek GitHub deposu (owner/name). Hub bu deponun en son release'ini -update-github-interval'da bir yoklar, yeni sürümde bazntms-agent-* asset'lerini -updates-dir'e indirir, SHA-256 hesaplar, manifest.json yazar → agent'lar otomatik günceller. Boş = GitHub senkronu kapalı; yalnızca elle hazırlanmış (bazntmsctl update sign) -updates-dir içeriği sunulur. Rate-limit için GITHUB_TOKEN ortam değişkeni okunur
-update-github-interval30mGitHub release yoklama aralığı
-updates-dir— (repo doluysa updates)Agent güncelleme kanalı dizini (<dir>/<channel>/manifest.json + binary'ler). Boş bırakılırsa -update-github-repo doluyken updates, değilse kanal kapalı. Bkz. UPGRADE-RUNBOOK.md §2
-auth-password—Arayüz şifresi (bootstrap). Boşsa kimlik doğrulama kapalı. AUTH_PASSWORD de geçerli. Etkin bir admin RBAC kullanıcısı oluşunca devre dışı kalır (bkz. RBAC)
-enroll-token—Bootstrap agent enrollment token'ı. Boşsa rastgele üretilip loglanır. Yalnızca ilk kurulum için — sızarsa hub'ı yeniden başlatmadan iptal edilemez. Kalıcı token'lar: panel > Yönetim > Agent Ekle (bkz. aşağıda)
-aifalseAI analiz sekmesi + /api/v1/ai/* uçları (Faz 26). Sağlayıcılar: panel > Yönetim > AI Sağlayıcı
-ai-allow-cloudtruefalse → yalnız yerel (loopback/RFC1918) model adresleri kabul edilir — bulut sağlayıcı egress kilidi (self-hosted / hava boşluklu)
-llm-base-url—Bootstrap AI sağlayıcısı adresi (OpenAI-uyumlu; http://localhost:11434/v1 Ollama). ai_providers tablosu boşsa ilk açılışta bir kez seed edilir
-llm-api-key—Bootstrap sağlayıcı API anahtarı. Yerel modeller için gerekmez
-llm-model—Bootstrap sağlayıcı varsayılan modeli (gemma3, qwen2.5:7b, gpt-4o-mini …)
-record-dircapturesPCAP kayıt dosyalarının yazılacağı dizin
-record-max-mb100PCAP dosya başına üst boyut; aşıldığında otomatik yeni dosyaya geçer (rotasyon)
-geoip-dirgeoipMaxMind GeoLite2 .mmdb dosyalarının aranacağı dizin
-ip-api-lookuptrueMMDB yoksa ip-api.com batch servisiyle IP çözümleme (internet kullanır)

Ortam Değişkenleri​

DeğişkenKarşılığıNot
AUTH_PASSWORD-auth-password
LLM_BASE_URL / OPENAI_BASE_URL-llm-base-urlbootstrap sağlayıcı
LLM_API_KEY / OPENAI_API_KEY-llm-api-keybootstrap sağlayıcı
LLM_MODEL-llm-modelbootstrap sağlayıcı
BAZNTMS_AI__*ai.* YAMLBAZNTMS_AI__NIGHTLY__ENABLED vb.

Bayraklar ortam değişkenlerinden önceliklidir.

AI Kurulumu (Faz 26)​

-ai ile aç. Sağlayıcılar panelden eklenir (Yönetim > AI Sağlayıcı); API anahtarları vault ile şifreli saklanır. -llm-* bayrakları yalnız bootstrap için (tablo boşsa ilk sağlayıcıyı seed eder — geriye uyum).

Yerel model (önerilen — veri ağdan çıkmaz)​

ollama pull gemma3
./bazntms-hub -ai -ai-allow-cloud=false -llm-base-url http://localhost:11434/v1 -llm-model gemma3

Yerel adreslerde (localhost / 127.0.0.1 / RFC1918) API anahtarı gerekmez. LM Studio: http://localhost:1234/v1. vLLM / llama.cpp / OpenRouter: kind=openai-compat.

Bulut sağlayıcı​

-ai-allow-cloud=true (varsayılan) iken panelden ekleyin: kind=openai (api_key gir) veya kind=anthropic. Egress kilidi açıksa (=false) bulut adresleri hem kayıtta hem çalışma anında reddedilir.

Reasoning modelleri (Qwen3, DeepSeek-R1)​

<think>…</think> blokları ve reasoning_content yedeği otomatik temizlenir. Sağlayıcı opts.no_think (Qwen3 düşünmeyi kapat) + opts.max_tokens panelden ayarlanır.

YAML örneği (ai: bloğu)​

ai:
enabled: true
allow_cloud: false # yalnız yerel model adresleri
max_context_kb: 24
nightly:
enabled: true
spec: "daily:06:00" # daily:HH:MM | weekly:gün:HH:MM | interval:dk
recipients: ["ops@example.com"]
triage:
enabled: true
min_severity: crit # yeni kritik incident → otomatik triyaj notu
max_per_hour: 10

GeoIP Kurulumu​

1) MaxMind GeoLite2 (offline, önerilen)​

  1. maxmind.com üzerinden ücretsiz hesap açın
  2. GeoLite2 Country ve GeoLite2 ASN veri tabanlarını indirin
  3. .mmdb dosyalarını geoip/ dizinine koyun:
geoip/
├── GeoLite2-Country.mmdb
└── GeoLite2-ASN.mmdb

Sunucu başlarken otomatik algılanır (-geoip-dir ile değiştirilebilir). Kullanım tamamen offline'dur.

2) ip-api.com (anahtarsız fallback)​

MMDB dosyaları yoksa devreye girer:

  • Bilinmeyen genel IP'ler 3 saniyede bir ≤100'lük gruplar hâlinde sorgulanır
  • Sonuçlar bellek önbelleğine yazılır (100.000 girdiye kadar)
  • 429 yanıtında 1 dakika geri çekilme
  • Gizlilik: uzak IP'leri üçüncü taraf servise gönderir; -ip-api-lookup=false ile kapatın

Özel, loopback ve link-local adresler (192.168.x.x, 127.x, fe80:: vb.) hiçbir zaman çözümlenmez.

Veri Saklama​

TabloYazım periyoduİçerik
samplessaniyebps in/out/local, pps, düşen paket, protokol dağılımı (JSON)
endpoint_statsdakikauç nokta bazlı transfer farkları (delta)
connection_eventsdakikaaktif bağlantılar (süreç adı + PID)
dns_queriesdakikadomain bazlı sorgu/yanıt sayaçları
alert_eventsolay anındauyarı geçmişi
alert_seenkalıcıyeni süreç/hedef kurallarının "görüldü" işaretleri
alert_configPUT ileuyarı ayarları (JSON, tek satır)
ai_conversations / ai_messagessohbet anındaAI analiz oturumları (arşiv; prune 90 gün)
ai_providerspaneldenAI sağlayıcı profilleri (api_key vault-şifreli)

Saklama süresi: -retention-hours (varsayılan 168 saat = 7 gün). DB dosyası -db ile taşınabilir; boyut kontrolü için ls -la <db>* (WAL dahil).

RBAC, SSO ve Denetim​

Roller​

Tek-şifre modu (-auth-password) bir kurulum önyükleme (bootstrap) mekanizmasıdır: admin kimliği verir ve /api/v1/users üzerinden ilk kalıcı kullanıcılar açılır (bcrypt saklanır). Etkin bir admin rollü RBAC kullanıcısı oluşturulduğu an tek-şifre girişi otomatik olarak devre dışı kalır (giriş 401 + "RBAC etkin" mesajı; hub logunda RBAC aktif uyarısı). Etkin admin kullanıcı kalmazsa (hepsi pasifleştirilirse) tek-şifre girişi "break-glass" olarak geri döner.

RolGörüntülemeYakalama/kayıtAI/raporCihaz yönetimiAgent silmeKullanıcı/token/audit
admin✓✓✓✓✓✓
netops✓✓✓✓✗✗
analyst✓✗✓✗✗✗
viewer✓✗✗✗✗✗

site alanı dolu kullanıcılar yalnızca kendi sitelerinin agent'larını görür.

SSO (OIDC)​

oidc:
issuer: https://keycloak.kurum.local/realms/bazntms
client_id: bazntms
client_secret: gizli
group_roles:
bazntms-admin: admin
bazntms-netops: netops
bazntms-analyst: analyst
default_role: viewer

Giriş: GET /api/auth/oidc/login (arayüz oturum açma sayfasından da bağlanır). Grup/rol claim'i groups veya roles okunur.

Agent kaydı (enrollment) token'ları​

İki yol vardır:

  • Bootstrap — -enroll-token bayrağı (veya config enroll_token). Tek statik sır; verilmezse rastgele üretilip loglanır. Sızarsa hub'ı yeniden başlatmadan iptal edilemez. Yalnızca ilk kurulum / otomasyonsuz senaryolar için.
  • Kalıcı (DB) token'lar — panel > Yönetim > Agent Ekle (POST /api/v1/enroll-tokens). İsimli, opsiyonel site kapsamlı, opsiyonel son kullanma tarihli; DELETE /api/v1/enroll-tokens/{id} ile hub yeniden başlatılmadan iptal edilir. Agent'lar -enroll-token/hub.token alanına statik sır yerine bunlardan birini verir. Üretildikten sonra düz değer bir kez gösterilir (hash saklanır).

Sihirbaz, hub adresini location.origin'den alıp seçilen işletim sistemine göre kopyalanabilir kurulum komutu üretir.

Entegrasyon API token'ları​

POST /api/v1/tokens {"name":"grafana","role":"analyst"} → düz token (bnt_...) bir kez döner; Authorization: Bearer bnt_... ile kullanılır. DELETE /api/v1/tokens/{id} ile iptal edilir.

Denetim kaydı (audit log)​

Tüm kritik işlemler (giriş/başarısız giriş, kullanıcı/token/cihaz/agent değişiklikleri, yakalama başlat/durdur, AI analizi, yetki reddi) append-only audit_events tablosuna yazılır. Her kayıt önceki kaydın hash'ini taşır (SHA-256 zinciri); GET /api/v1/audit/verify zinciri yeniden hesaplayarak bütünlüğü kanıtlar.

İleri Analiz​

FortiGate REST API entegrasyonu​

Arayüzde cihaz eklerken vendor: FortiGate seçilir; alanlar:

AlanAçıklama
api_urlhttps://<cihaz>[:port] — REST API, web GUI ile aynı HTTPS portundadır (varsayılan 443; admin-sport değiştirilmişse :8443 gibi). Ayrı API portu yoktur.
api_tokenSystem > Administrators > REST API Admin token'ı — vault'ta şifreli saklanır. Read-only profil + ihtiyaç duyulan scope'lara (System, Network, VPN, Policy & Objects) okuma izni. Trusted Hosts doluysa hub'ın kaynak IP'si listede olmalı.
api_verify_tlsSelf-signed sertifika kullanıyorsanız kapatın
vdomboş/root → tek VDOM; all → tüm VDOM'lar taranır (Global kapsamlı API admin gerekir)
profileFortiOS sürüm profili: auto (varsayılan — yanıt zarfındaki version'dan tespit) veya 7.0/7.2/7.4/7.6/default. Yanlış tespit durumunda elle sabitleyin.

Bağlantıyı Sına — cihaz eklerken (kaydetmeden) ve cihaz satırında "yeniden sına" ile: her uca gerçek istek atılır, dönen yanıt raporlanır (bağlanabilirlik · HTTP kodu · parser'ın anladığı kayıt sayısı · yanıt biçimi) ve FortiOS sürümü + VDOM modu çıkarılır. ✕ = yetki/erişim sorunu, ~ = bağlandı ama veri yok, ✓ = çalışıyor. "ham yanıt" ile ucun ilk ~2 KB'ı görülür.

Sürüm uyumu — FortiOS monitor/* uçları canlı şema vermez ve results biçimi sürümler arası değişir (dizi ↔ ada-anahtarlı obje; user↔user_name; link bool↔obje; hız Mbps sayı↔"1000FDX"). İstemci (internal/fortigate/parse.go) bu biçimleri toleranslı yutar; toleransla çözülemeyen az sayıda fark (endpoint yolu, param değeri) sürüm profilinden gelir. Politika hit sayaçları monitor/firewall/policy'den, ad/aksiyon cmdb/firewall/policy'den birleştirilir.

Toplanan veriler: sistem durumu (serial/firmware/uptime), CPU/RAM/disk, oturum sayısı, arayüz sayaçları, IPsec/SSL VPN, SD-WAN health-check, politika hit sayaçları. Uyarı eşikleri uyarı ayarlarında forti bölümünden yönetilir (vpn_down, sdwan_latency_ms, sdwan_loss_pct, max_sessions).

İstekler arasında hız koruması (varsayılan 150 ms) uygulanır; yönetim CPU bütçesini korumak için poll aralığını 60 sn altına düşürmeyin.

Anomali tespiti (AI'sız)​

Uyarı ayarlarından (PUT /api/alerts veya arayüz) yönetilir:

"anomaly": {
"enabled": true,
"sensitivity": 3.0,
"min_samples": 120,
"window_min": 5
}

Son 7 günün saatlik (hour-of-day) baseline'ı ile güncel 5 dakikalık pencere karşılaştırılır; z-skoru eşiği aşarsa "Anomali" uyarısı üretilir ve tüm bildirim kanallarına dağıtılır. Eski config'lerde alan yoksa varsayılanla açılır (sensitivity: 0 geçersiz kabul edilir).

Bildirim kanalları​

notifiers bölümüne eklenen kurumsal kanallar:

AlanAçıklama
teams_urlMicrosoft Teams incoming webhook (MessageCard)
webhook_v2_url + webhook_v2_secretHMAC-SHA256 imzalı webhook (X-BazNTMS-Signature başlığı)
email_host, email_port (0→587), email_from, email_to[], email_user, email_passSMTP e-posta (STARTTLS otomatik)

Topoloji keşfi​

  • Cihazlarda: SNMP poller her turda LLDP-MIB, CISCO-CDP-MIB ve IP-MIB (ARP) tablolarını yürütür; desteklenmeyen cihazlarda sessizce atlanır
  • Agentlarda: yerel ağlar (CIDR) telemetriyle hub'a taşınır
  • Kenarlar 24 saat görünmezse temizlenir (PruneTopology)
  • Harita: arayüz "Ağ Topolojisi" kartı

Kurumsal rapor​

/api/report?type=enterprise&days=30 — SLA (agent uptime, cihaz sağlığı, paket düşme oranı), kapasite (dönem büyümesi) ve banding (p50/p95/p99).

5651 Uyumlu Log İmzalama​

./bazntms-hub -compliance \
-tsa-url https://tsa.saglayici.com/tsa \
-compliance-key compliance.key \
-worm-dir /var/worm/bazntms \
-mask-pii -compliance-retention-days 730
BayrakAçıklama
-complianceMotoru açar: syslog/uyum kayıtları hash-zincirli compliance_logs tablosuna yazılır
-tsa-urlRFC 3161 nitelikli zaman damgası servisi (KamuSM, e-Tugra, TurkTrust vb.). Boşsa mühürleme TSA'sız yapılır (tsa_status: none)
-compliance-keyed25519 manifest imza anahtarı (PEM; yoksa üretilir, .pub dosyası doğrulama için ayrılır)
-worm-dirGünlük imzalı paket dizini (YIL/AY/gün yapısı; O_EXCL ile üzerine yazılmaz)
-mask-piiDelil paketinde IP/MAC/kullanıcı maskeleme (A.5.34/A.8.11)
-compliance-retention-daysHam log saklama (varsayılan 730 gün = 5651 2 yıl)

İmza modeli: her kayıt prev_hash zinciri taşır → saatlik Merkle checkpoint'leri → günün saatlik köklerinden günlük kök → RFC 3161 TSA + ed25519 manifest imzası → WORM paketi.

Delil paketi: arayüzde tarih aralığı seçip indirin (veya GET /api/v1/compliance/evidence?from=&to=&mask=), sonra offline doğrulayın:

bazntmsctl verify -bundle bazntms-delil-20260801-20260901.json \
-pubkey compliance.key.pub -out rapor.txt

Uyarı: time_drift (A.8.17) — checkpoint saatleri sistem saatinden ileri saptığında üretilir; NTP senkronizasyonunu doğrulayın. Uyumluluk beyanı için hukuki danışmanlık gereklidir; bu özellik teknik kanıt üretir.

Ölçek Altyapısı​

PostgreSQL / TimescaleDB​

-db postgres://... verildiğinde store otomatik PostgreSQL moduna geçer:

  • Şema açılışta migrasyonla kurulur; postgres:// DSN'de driver pgx'tir
  • TimescaleDB eklentisi kuruluysa (CREATE EXTENSION timescaledb) açılışta hypertable'lar, samples_1m / samples_1h continuous aggregate'ları ve retention politikaları otomatik ayarlanır: ham 7 gün → 1 dk 90 gün → 1 saat 2 yıl
  • Eklenti yoksa düz PostgreSQL çalışır; temizlik Prune ile yapılır
  • Sorgu p95 hedefi için 1 dakikalık panel sorguları continuous aggregate üzerinden okunur (gerçek-zamanlı agregasyon: yeni veri anında görünür)
./bazntms-hub -db "postgres://bazntms:bazntms@localhost:5432/bazntms?sslmode=disable"

NATS JetStream kuyruğu​

-nats verildiğinde ingest → processor ayrışması devreye girer:

  • POST /api/v1/agent/telemetry batch'i BAZNTMS akışına (ingest.telemetry) yayınlar ve hemen yanıt döner; yazımı store-writer adlı durable consumer yapar
  • NetFlow ve syslog olayları da kuyruğa alınır (ingest.flows, ingest.syslog)
  • Yazım hatasında mesaj 2 sn gecikmeli Nak edilir (replay); 10. denemede atılır. Akış diskte tutulur (24 saat MaxAge, 5M mesaj sınırı)
  • Çoklu hub replikası aynı kuyruğu paylaşabilir

Çoklu replika rolleri​

Stateless ingest ölçeklemesi için hub yeniden başlatılabilir (SIGTERM → graceful shutdown). Node-yerel bileşenler bayraklarla ayrılır:

# ingest replikası (N adet, LB arkası)
./bazntms-hub -capture=false -alerts=false -poller=false -nats nats://...

# controller replikası (1 adet: yakalama + uyarı + poller)
./bazntms-hub -capture -alerts -poller

Yük testi​

Bkz. loadtest/README.md — bazntms-loadgen sentetik filosu ve k6 senaryosu (hedef: ≥170 ist/sn sürekli ingest).

Dağıtım​

  • Tek-node demo: docker compose -f deploy/docker-compose.yml up --build
  • Kubernetes: deploy/helm/bazntms (Helm chart, değerler values.yaml)