Pazartesi 09:42: "Logları gönderebilir misiniz?"
Cumartesi gece 03:15'te ShamashAi'nin SOAR motoru bir FortiGate kuralını yanlış yorumladı ve /soar/block çağrısı 500 döndü. Pazartesi sabahı destek talebi açıyorsun, vendor ekibi 10:30'da yanıt veriyor: "Sorun için şu bilgileri gönderir misiniz: son 48 saatlik SOAR logları, config.json, SQL Server query plan'leri, aktif agent sayısı, lisans durumu, Redis queue derinliği, .NET runtime versiyonu, son migration hatası (varsa)." Klasik senaryo: BT yöneticisi 3 farklı sunucuya SSH açıyor, elle dosya topluyor,民敏 alanları temizliyor, ZIP'liyor, mail kutasının 25 MB limitine sığdırmaya çalışıyor. Süreç 2-3 gün sürüyor, vendor meanwhile talebi "bilgi bekliyor" statüsüne alıyor.
ShamashAi'nin Support Bundle özelliği bu döngüyü 30 saniyeye indirgiyor. GET /operations/support-bundle endpoint'ine tek çağrı ile anonimleştirilmiş environment, son 200 satır log, health snapshot, queue durumu, DB indeks istatistikleri, license + heartbeat geçmişini içeren tek bir ZIP üretir. Credential, AI prompt içeriği, customer event payload'u kasıtlı olarak dışta tutulur; dosya mail ekine sığar, audit_log'da support.bundle.generated action ile zincirde saklanır. Vendor lisans yenileme döneminde aktif olarak kullanılan bu mekanizma, destek süreçlerini hızlandırırken KVKK Madde 12 uyumluluğunu korur.
Support Bundle içeriği
ShamashAi Support Bundle şu bileşenleri otomatik toplar:
1. Anonimleştirilmiş environment
- Node.js versiyonu, npm paket listesi (package-lock.json hash'i)
- .NET 8 runtime versiyonu, agent build numarası
- SQL Server edition, compatibility level, tempdb yapılandırması
- Redis versiyon + maxmemory ayarı
- OS bilgisi: Windows Server veya Linux dağıtımı, kernel versiyonu
- Disk kullanımı:
/opt/shamashaiveyaC:\Program Files\ShamashAipartition'ı doluluk oranı - Network: bind adresleri (IP'ler
10.x.x.xformatına maskelenir), aktif port listesi
MSSQL_PASSWORD, REDIS_AUTH, SMTP_USER) *REDACTED* ile değiştirilir.
2. Son 200 satır log
ShamashAi,dbo.audit_log tablosundan son 200 action kaydını alır:
sql -- Support Bundle SQL sorgusu (ShamashAi dahili) SELECT TOP 200 timestamp, action, user_id, details, status_code FROM dbo.audit_log WHERE timestamp > DATEADD(HOUR, -48, GETDATE()) ORDER BY timestamp DESC;
user_idalanı hash'lenir (örn.user_id: 42→user_hash: a3f5c8...).detailsJSON içinde IP adreslerix.x.x.xformatına döner.- AI prompt içeriği (
/ai/investigate-eventçağrılarındakipromptfield) dahil edilmez. - Customer event payload'u (örn.
dbo.eventstablosundakiraw_logkolonu) dahil edilmez.
3. Health snapshot
ShamashAi Health API'sinin anlık çıktısı:{ "timestamp": "2026-11-11T09:15:11Z", "api_status": "healthy", "db_connection": "ok", "redis_connection": "ok", "soar_engine_running": true, "last_event_ingested": "2026-11-11T09:14:58Z", "queue_depth": { "soar_pending": 3, "ai_analysis": 0, "notification": 12 }, "agent_heartbeat": { "total_devices": 147, "online_last_5min": 143, "offline_over_10min": 4 }, "license": { "type": "enterprise", "device_limit": 500, "used_devices": 147, "expiry_date": "2027-03-15", "days_remaining": 124 } }
Vendor bu snapshot'tan sistemin anlık sağlığını görebilir. Örneğin queue_depth.soar_pending: 3 ise SOAR motoru yoğunluk altında değil; problem muhtemelen konfigürasyondan kaynaklanıyordur.
4. Queue durumu
Redis'te bekleyen job'ların detayı:- soar_pending: Bekleyen SOAR action'ları (event_id, action_type, created_at)
- ai_analysis: AI investigate kuyruğundaki event sayısı
- notification: Gönderilmeyi bekleyen e-posta/SMS bildirimleri
soar_pending: - event_id: evt_2026_11_11_09_12_35_abc123 | action: block_ip | created_at: 2026-11-11T09:12:35Z | age: 3m - event_id: evt_2026_11_11_09_10_22_def456 | action: quarantine_device | created_at: 2026-11-11T09:10:22Z | age: 5m - event_id: evt_2026_11_11_09_08_17_ghi789 | action: block_user | created_at: 2026-11-11T09:08:17Z | age: 7m
Eğer queue derinliği 100'ü geçiyorsa ve yaş 10 dakikayı aşıyorsa, vendor Redis memory limiti veya worker thread sayısını kontrol eder.
5. DB indeks istatistikleri
SQL Server,dbo.events ve dbo.incident_groups tablolarında indeks fragmentasyonunu raporlar:
sql -- Fragmentation sorgusu (ShamashAi dahili) SELECT OBJECT_NAME(ips.object_id) AS table_name, i.name AS index_name, ips.avg_fragmentation_in_percent, ips.page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips INNER JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE OBJECT_NAME(ips.object_id) IN ('events', 'incident_groups', 'behavior_baselines') ORDER BY ips.avg_fragmentation_in_percent DESC;
Örnek çıktı:
table_name: events | index_name: IX_events_timestamp | fragmentation: 42.3% | page_count: 18472 table_name: incident_groups | index_name: PK_incident_groups | fragmentation: 8.1% | page_count: 3201 table_name: behavior_baselines | index_name: IX_baselines_device_id | fragmentation: 15.7% | page_count: 940
Eğer events tablosu fragmentasyonu %40'ı geçiyorsa, vendor "index rebuild öneririz" notu düşer. ShamashAi on-prem ürün olduğu için index maintenance müşteri DBA'sinin sorumluluğundadır, ama Support Bundle bu bilgiyi önceden vererek destek sürecini hızlandırır.
6. Schema versiyon hash + running migration listesi
ShamashAi, SQL Server migration'larını Entity Framework Core ile yönetir. Support Bundle içinde:- Mevcut schema hash:
schema_version: 20261015_1423_add_topology_links(son migration'ın timestamp'i) - Bekleyen migration: Örneğin
20261101_0930_add_soar_retry_countmigration henüz uygulanmadıysa, bundle içindepending_migrations: [20261101_0930_add_soar_retry_count]olarak görünür. - Failed migration: Eğer bir migration yarıda kaldıysa,
dbo.__EFMigrationsHistorytablosundaki son kayıtapplied: falseile işaretlenir ve bundle'a dahil edilir.
20261101_0930 migration ile ekleniyorsa ve bu migration uygulanmamışsa, retry hatalarının nedeni bellidir.
7. License + heartbeat geçmişi
ShamashAi lisansı on-prem olarak validate edilir (internet bağlantısı gerektirmez), ama vendor destek taleplerinde lisans geçmişine bakar:{ "license_history": [ { "activation_date": "2025-11-10", "expiry_date": "2026-11-10", "device_limit": 300, "renewed_at": "2026-10-25", "new_expiry": "2027-03-15", "new_device_limit": 500 } ], "heartbeat_summary": { "last_7_days_avg_device_count": 145, "peak_device_count": 152, "offline_incidents": 2 } }
Eğer müşteri lisans yenileme dönemindeyse (kalan gün < 30) ve destek talebi açıyorsa, vendor proaktif olarak yenileme sürecini başlatır. Heartbeat geçmişi ise agent kapsama sorunlarını gösterir: offline_incidents: 2 → iki kez agent'lar toplu olarak offline olmuş, network veya policy sorunu olabilir.
Support Bundle oluşturma: API çağrısı
IT yöneticisi ShamashAi Web UI'den Operations > Support menüsüne girer, "Yeni Destek Paketi Oluştur" butonuna tıklar. Arka planda:
javascript // ShamashAi API (Node.js Fastify) fastify.get('/operations/support-bundle', async (request, reply) => { const bundleId = bundle_${Date.now()}; const bundlePath = /tmp/${bundleId}.zip;
// 1. Environment topla const env = await collectEnvironment();
// 2. Son 200 satır audit log const logs = await db.query(` SELECT TOP 200 timestamp, action, user_id, details, status_code FROM dbo.audit_log WHERE timestamp > DATEADD(HOUR, -48, GETDATE()) ORDER BY timestamp DESC `); const anonymizedLogs = anonymizeLogs(logs);
// 3. Health snapshot const health = await getHealthSnapshot();
// 4. Queue durumu const queueStats = await redis.getQueueStats();
// 5. DB indeks istatistikleri const indexStats = await db.query(/* fragmentation sorgusu */);
// 6. Schema hash + migration const schemaInfo = await db.query(SELECT * FROM dbo.__EFMigrationsHistory ORDER BY migration_id DESC);
// 7. License + heartbeat const licenseInfo = await getLicenseHistory(); const heartbeat = await db.query(` SELECT AVG(device_count) as avg_devices, MAX(device_count) as peak_devices FROM dbo.heartbeat_log WHERE timestamp > DATEADD(DAY, -7, GETDATE()) `);
// ZIP oluştur const zip = new AdmZip(); zip.addFile('environment.json', Buffer.from(JSON.stringify(env, null, 2))); zip.addFile('logs.json', Buffer.from(JSON.stringify(anonymizedLogs, null, 2))); zip.addFile('health.json', Buffer.from(JSON.stringify(health, null, 2))); zip.addFile('queue.txt', Buffer.from(formatQueue(queueStats))); zip.addFile('db_indexes.txt', Buffer.from(formatIndexStats(indexStats))); zip.addFile('schema.json', Buffer.from(JSON.stringify(schemaInfo, null, 2))); zip.addFile('license.json', Buffer.from(JSON.stringify({ licenseInfo, heartbeat }, null, 2))); zip.writeZip(bundlePath);
// Audit log'a kaydet await db.query(` INSERT INTO dbo.audit_log (timestamp, action, user_id, details) VALUES (GETDATE(), 'support.bundle.generated', @userId, @bundleId) `, { userId: request.user.id, bundleId });
reply.header('Content-Type', 'application/zip'); reply.header('Content-Disposition', attachment; filename="${bundleId}.zip"); return reply.sendFile(bundlePath); });
Bu kod örneği, ShamashAi'nin Node.js Fastify stack'ini kullanır. Gerçek implementasyonda collectEnvironment(), anonymizeLogs(), getHealthSnapshot() gibi helper fonksiyonlar ayrı modüllerde tanımlanır.
Anonimleştirme: hangi veriler maskelenir?
ShamashAi Support Bundle, KVKK Madde 12 uyumluluğu için kritik alanları otomatik maskeler:
1. Credential: config.json içinde MSSQL_PASSWORD, REDIS_AUTH, SMTP_PASSWORD, LDAP_BIND_DN gibi secret'lar *REDACTED* ile değiştirilir. 2. AI prompt içeriği: /ai/investigate-event endpoint'ine gönderilen prompt metinleri bundle'da yer almaz. Sadece "AI analiz çağrısı yapıldı" action kaydı tutulur. 3. Customer event payload'u: dbo.events tablosundaki raw_log kolonu (örn. FortiGate'in ham syslog satırı) bundle'a dahil edilmez. Sadece event_type (örn. BRUTE_FORCE_DETECTED) ve timestamp saklanır. 4. IP adresleri: Private IP'ler (10.x.x.x, 192.168.x.x) son oktet maskelenir → 10.20.30.x. Public IP'ler tamamen maskelenir → x.x.x.x. 5. Kullanıcı adları: dbo.audit_log içindeki user_id hash'lenir. Örneğin user_id: 42 → user_hash: a3f5c8e1b2d4f9c7. 6. Domain bilgisi: Active Directory domain adı, LDAP base DN gibi bilgiler *DOMAIN* placeholder'ı ile değiştirilir.
Vendor ekibi bundle'ı açtığında müşteri verisi görmez, ama sistemin teknik durumunu tam olarak analiz edebilir.
Audit log zinciri
Her Support Bundle oluşturma işlemi dbo.audit_log tablosunda support.bundle.generated action ile kaydedilir:
sql SELECT timestamp, action, user_id, details FROM dbo.audit_log WHERE action = 'support.bundle.generated' ORDER BY timestamp DESC;
Örnek çıktı:
timestamp: 2026-11-11 09:15:23 | action: support.bundle.generated | user_id: 7 | details: {"bundle_id": "bundle_1731315323421", "size_kb": 342} timestamp: 2026-11-08 14:22:10 | action: support.bundle.generated | user_id: 3 | details: {"bundle_id": "bundle_1731074530128", "size_kb": 298}
Bu zincir, ISO 27001:2022 Annex A.12.4.1 (Event logging) gereksinimine uyumludur. Denetim sırasında "vendor'a hangi tarihte hangi bilgiler gönderildi?" sorusu bu log ile yanıtlanır. Ayrıca, bundle içeriği hiçbir zaman ShamashAi sunucusunda kalıcı saklanmaz; oluşturulduktan sonra /tmp dizininden 1 saat içinde otomatik silinir.
Vendor lisans yenileme döneminde kullanım
ShamashAi lisansı on-prem validate edilir (internet gerektirmez), ancak yenileme döneminde (kalan < 30 gün) vendor müşteriyle iletişime geçer. Bu süreçte Support Bundle proaktif olarak kullanılır:
- Kullanım analizi:
heartbeat_summary.last_7_days_avg_device_countile müşterinin kaç cihaz kullandığı görülür. Eğer limit doluyorsa (örn. 300 lisanslı, 298 kullanımda), yenileme teklifinde artırım önerilir. - Sağlık kontrolü: Lisans yenilenmeden önce sistemin sağlıklı çalıştığı doğrulanır.
db_indexesfragmentasyonu yüksekse, yenileme öncesi maintenance önerilir. - Migration durumu: Pending migration varsa, yenileme öncesi güncelleme yapılması önerilir.
Limitler ve dürüst notlar
ShamashAi Support Bundle şu kısıtlamalara sahiptir:
- Son 48 saat sınırı: Audit log sadece son 48 saatlik kayıtları içerir. Daha eski log'lar gerekiyorsa, manuel olarak
dbo.audit_logsorgusu çalıştırılmalıdır. - Büyük event payload'ları dahil değil:
dbo.eventstablosu milyonlarca satır içerebilir; Support Bundle sadece son 200 audit action'ını alır, event tablosuna dokunmaz. Spesifik event analizi için vendor ayrı SQL sorgusu talep edebilir. - Gerçek zamanlı değil: Bundle oluşturma anındaki snapshot'tır. Sistemde anlık değişiklik (örn. yeni agent online oluyor) bundle'a yansımaz.
- Windows Event Log dahil değil: ShamashAi Agent .NET 8 ile çalışır ve Windows Event Log'u ShamashAi API'sine gönderir, ama Support Bundle agent'tan raw Windows log toplamaz. Sadece ShamashAi'nin kendi audit_log tablosunu kullanır.
- Network paket yakalama yok: FortiGate, Cisco ASA gibi network cihazlardan gelen raw syslog bundle'a dahil edilmez. Sadece ShamashAi'nin bu log'ları nasıl parse ettiği (event_type, timestamp) görünür.
