30 Dakikada Canlı SIEM: Wizard ile Kurulum Gerçeği
Perşembe sabahı 10:15. IT müdürü Ahmet, yönetim kurulu toplantısından çıkmış, notebook'unda ShamashAi portal ekranını açmıştır. Yönetim kurulu ISO 27001 sertifikasyon sürecinde SIEM zorunluluğu koymuş, Ahmet'e 2 hafta süre vermiştir. Ahmet klasik SIEM tedarikçilerinden aldığı tekliflerde "6-8 hafta implementasyon, 2 danışman, 80.000 TL profesyonel hizmet" satırlarını okuyunca çaresizlik hissetmiştir. Şimdi ShamashAi Setup Wizard açılış ekranını görüyor: "12 adımda 30 dakikada canlı pano — istediğiniz adımı atlayın, sonra tamamlayın". Kahvesini yudumlayıp "Başla" tuşuna bastığında saat 10:17. İlk log'lar 10:43'te panoya düşmeye başlayacak.
Bu yazı ShamashAi Setup Wizard'ın teknik mimarisini, 12 adımlı onboarding sürecini ve klasik SIEM kurulum çıkmazına nasıl alternatif sunduğunu inceliyor.
Klasik SIEM Kurulum Çıkmazı
Orta ölçekli Türk firmaları (100-500 cihaz) için SIEM kurulumu yapısal bir handikap taşır:
- Danışman bağımlılığı: Splunk/QRadar/ArcSight kurulumu sistem entegratörü gerektirir. Firma kendi IT ekibiyle kurulum yapamaz.
- Zaman: İlk log'un platforma düşmesi 3-6 hafta sürer. Bu sürede log kaynaklarının parse rule yazımı, normalization, connector konfigürasyonu yapılır.
- Maliyet: Lisans + profesyonel hizmet 60.000-120.000 TL aralığındadır.
- Bilgi asimetrisi: Danışman firma üzerinde teknik tekel oluşturur; yeni kural ekleme bile ticket açmayı gerektirir.
Setup Wizard Mimarisi: 12 Adım, 2 Mod, Hybrid State
ShamashAi Setup Wizard iki modda çalışır:
Mode: new_company
İlk şirket kurulumu. Kullanıcı sıfırdan başlar:
javascript // Next.js Wizard page component const WizardPage = () => { const [wizardState, setWizardState] = useState({ mode: 'new_company', currentStep: 1, completed: [], skipped: [] });
useEffect(() => { // localStorage + server sync const localState = localStorage.getItem('shamashai_wizard_state'); if (localState) { const parsed = JSON.parse(localState); // Server'dan son durumu çek fetch('/api/wizard/state', { method: 'POST', body: JSON.stringify({ localState: parsed }) }).then(res => res.json()) .then(serverState => { setWizardState(serverState.merged); }); } }, []);
const handleStepComplete = async (stepData) => { // Hem localStorage hem server'a yaz const newState = { ...wizardState, completed: [...wizardState.completed, wizardState.currentStep], currentStep: wizardState.currentStep + 1 }; localStorage.setItem('shamashai_wizard_state', JSON.stringify(newState)); await fetch('/api/wizard/save-step', { method: 'POST', body: JSON.stringify({ step: wizardState.currentStep, data: stepData }) }); setWizardState(newState); };
return <WizardContainer state={wizardState} onComplete={handleStepComplete} />; };
Mode: new_site
Mevcut şirkete yeni site (şube/lokasyon) ekleme:
javascript const existingSiteWizard = { mode: 'new_site', project_id: 'prj_a8f2c901', currentStep: 8, // Office network adımından başla inheritedSteps: [1, 2, 3, 4, 5, 6, 7] // Admin, license, company vb. mevcut };
Bu modda kullanıcı sadece yeni site'a özgü adımları (office network, firewall, classify) doldurur. Şirket admin, mail domain, M365 gibi global ayarlar zaten mevcuttur.
Hybrid State Yönetimi
Wizard state hem client-side (localStorage) hem server-side (dbo.wizard_sessions tablosu) tutulur:
- localStorage: Kullanıcı sayfayı kapatıp açtığında kaldığı adımdan devam eder.
- Server: Kullanıcı farklı cihazdan giriş yaptığında state senkronize edilir.
- Conflict resolution: Server timestamp > localStorage timestamp ise server kazanır.
12 Adımın Anatomisi
Setup Wizard aşağıdaki sırayı takip eder. Her adım skip + back navigation özelliklerine sahiptir.
Adım 1-4: Temel Kurulum
1. Admin: İlk admin kullanıcı oluşturma. Email, şifre, telefon. 2. License: Lisans anahtarı girme. Trial = 30 gün 100 cihaz limiti. 3. Company: Şirket adı, vergi no, KVKK sorumlusu bilgisi. 4. Welcome: Hızlı tanıtım videosu (2 dakika). Atlanabilir.
Adım 5-7: Kimlik ve Entegrasyon
5. Mail Domain: Şirket mail domain'i (orn. @afnteknoloji.com). Bu bilgi M365 ve user anomaly tespitinde kullanılır. 6. M365: Microsoft 365 entegrasyonu. Kullanıcı Azure AD'de app registration yapar, client_id + client_secret girer. ShamashAi bu credential'ı dbo.integrations tablosuna şifreli kaydeder.
sql -- M365 credential storage INSERT INTO dbo.integrations (project_id, type, config_json, encrypted) VALUES ( 'prj_a8f2c901', 'M365', '{ "tenant_id": "...", "client_id": "...", "client_secret_hash": "..." }', 1 );
7. Websites: Şirket web varlıkları. Kullanıcı domain listesi girer (orn. portal.firma.com.tr, crm.firma.com.tr). ShamashAi bu domain'leri dbo.monitored_assets tablosuna kaydeder. Daha sonra SSL sertifika süresi izlenir (CERT_EXPIRING eventi).
Adım 8-9: Network Topology
8. Office: Ofis network IP blokları. Kullanıcı CIDR girer (orn. 10.20.0.0/16, 172.16.5.0/24). Bu bilgi behavioral anomaly tespitinde kullanılır: Kullanıcı office IP dışından oturum açarsa M365_RISKY_SIGNIN tetiklenir.
csharp // .NET 8 Agent - Office IP kontrolü public class OfficeNetworkValidator { private readonly List<IPNetwork> _officeNetworks;
public OfficeNetworkValidator(List<string> cidrBlocks) { _officeNetworks = cidrBlocks.Select(cidr => IPNetwork.Parse(cidr)).ToList(); }
public bool IsOfficeIP(string ipAddress) { var ip = IPAddress.Parse(ipAddress); return _officeNetworks.Any(network => network.Contains(ip)); } }
var validator = new OfficeNetworkValidator(new List<string> { "10.20.0.0/16", "172.16.5.0/24" }); if (!validator.IsOfficeIP(loginEvent.SourceIP)) { await _eventBus.PublishAsync(new Event { EventType = "M365_RISKY_SIGNIN", Severity = "HIGH", Details = $"User {loginEvent.Username} logged in from non-office IP: {loginEvent.SourceIP}" }); }
9. Firewall: Firewall/gateway IP adresi. Agent bu IP'ye syslog/SNMP bağlantısı kurar. ShamashAi şu firewall markalarını destekler: pfSense, OPNsense, Fortigate, Cisco ASA, Sophos XG.
Adım 10-11: Varlık Sınıflandırma
10. Classify: Kritik sunucular. Kullanıcı hostname listesi girer (orn. dc01.local, sql-prod, erp-server). Bu cihazlar dbo.devices.criticality = HIGH işaretlenir. Bu cihazlarda oluşan BRUTE_FORCE_DETECTED veya AUTH_FAIL_USER eventleri öncelik kazanır.
sql -- Kritik cihaz marking UPDATE dbo.devices SET criticality = 'HIGH', tags = JSON_MODIFY(tags, '$.wizard_marked', 1) WHERE hostname IN ('dc01.local', 'sql-prod', 'erp-server');
11. Categories: Compliance kategorileri. Kullanıcı hangi uyumluluk gereksinimlerini takip edeceğini seçer: ISO 27001 Annex A, KVKK Madde 12, PCI-DSS (opsiyonel). ShamashAi bu seçime göre ilgili compliance rule'ları aktive eder.
Adım 12: Otomatik Keşif
12. Discover: Wizard son adımda otomatik 4-katmanlı discovery koşturur:
- Layer 1 - Network Scan: Office IP bloklarında ping sweep + port scan (22, 80, 443, 3389, 445). Bulunan cihazlar
dbo.devicestablosuna kaydedilir. - Layer 2 - Active Directory Query: M365 entegrasyonu varsa Azure AD kullanıcı/grup listesi çekilir.
dbo.usersvedbo.groupstabloları doldurulur. - Layer 3 - Agent Deployment: Discovery'de bulunan Windows/Linux cihazlara agent install komutu üretilir. Kullanıcıya PowerShell/Bash script sunulur.
- Layer 4 - Log Collection Test: Firewall ve M365'ten 5 dakika boyunca log akışı test edilir. Başarılı ise
dbo.audit_log'a "DISCOVERY_SUCCESS" kaydı düşer.
Skip ve Resume Mantığı
Her adım atlanabilir. Örneğin kullanıcı M365 entegrasyonunu şimdi yapmak istemiyorsa "Skip" tuşuna basar. Wizard bir sonraki adıma geçer. Atlanan adımlar wizardState.skipped array'ine kaydedilir.
Kullanıcı wizard'ı tamamladıktan sonra Settings > Onboarding menüsünden atlanan adımları tamamlayabilir:
javascript // Fastify API - Resume endpoint fastify.post('/api/wizard/resume', async (request, reply) => { const { project_id, step } = request.body; const session = await db.query( 'SELECT * FROM dbo.wizard_sessions WHERE project_id = @project_id', { project_id } ); if (!session || !session.skipped.includes(step)) { return reply.code(400).send({ error: 'Invalid step or already completed' }); } return reply.send({ step_config: getStepConfig(step), mode: 'resume', previous_data: session.step_data[step] || null }); });
İlk Log'ların Panoya Düşmesi
Wizard tamamlandığında (veya discover fazı bittiğinde) kullanıcı ana panoya yönlendirilir. 2-5 dakika içinde ilk event'ler dbo.events tablosuna düşmeye başlar:
- M365 audit log'ları (oturum açma, dosya erişimi)
- Firewall connection log'ları
- Agent'tan gelen Windows Event Log (4624, 4625, 4672, 4688)
AUTH_FAIL_USER: Başarısız oturum açma denemeleriM365_RISKY_SIGNIN: Office IP dışından M365 girişiBEHAVIORAL_ANOMALY: Gece 03:00'te dosya erişimi gibi normal dışı aktivitelerCERT_EXPIRING: SSL sertifikası 30 gün içinde sona erecek web varlıklar
Setup Wizard Teknik Stack
Wizard aşağıdaki bileşenlerle çalışır:
Frontend: Next.js
- React Hook Form ile form validasyonu
- Zod schema ile input doğrulama
- TanStack Query ile server state yönetimi
- localStorage + IndexedDB hybrid cache
Backend: Node.js Fastify
javascript // Fastify route - Step save fastify.post('/api/wizard/save-step', { schema: { body: { type: 'object', required: ['step', 'data'], properties: { step: { type: 'integer', minimum: 1, maximum: 12 }, data: { type: 'object' } } } } }, async (request, reply) => { const { step, data } = request.body; const project_id = request.user.project_id; // Validation const validator = getStepValidator(step); const validationResult = validator(data); if (!validationResult.valid) { return reply.code(400).send({ errors: validationResult.errors }); } // Save to SQL Server await db.query( `UPDATE dbo.wizard_sessions SET step_data = JSON_MODIFY(step_data, '$.step${step}', @data), updated_at = GETDATE() WHERE project_id = @project_id`, { project_id, data: JSON.stringify(data) } ); // Trigger side effects (örn. M365 credential test) if (step === 6) { await testM365Connection(data.client_id, data.client_secret); } return reply.send({ success: true, next_step: step + 1 }); });
Agent: .NET 8
Discover fazında agent deployment script'leri üretilir:
powershell # Windows agent install (PowerShell) Invoke-WebRequest -Uri "https://portal.shamashai.com.tr/agent/win-x64/setup.exe" -OutFile "C:\Temp\shamashai-agent.exe" Start-Process -FilePath "C:\Temp\shamashai-agent.exe" -ArgumentList "/quiet /project=prj_a8f2c901 /key=agt_k8f2x9p1"
Agent kurulumdan sonra dbo.devices tablosuna otomatik register olur:
csharp // .NET 8 Agent - Auto-registration public class AgentRegistration { public async Task RegisterAsync(string projectId, string agentKey) { var deviceInfo = new { Hostname = Environment.MachineName, OS = Environment.OSVersion.ToString(), IPAddresses = GetLocalIPAddresses(), AgentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString() };
var response = await _httpClient.PostAsJsonAsync( "https://portal.shamashai.com.tr/api/agent/register", new { ProjectId = projectId, AgentKey = agentKey, Device = deviceInfo } );
if (response.IsSuccessStatusCode) { var result = await response.Content.ReadFromJsonAsync<RegistrationResult>(); _logger.LogInformation($"Agent registered: device_id={result.DeviceId}"); } } }
Database: SQL Server
Wizard state dbo.wizard_sessions tablosunda tutulur:
sql CREATE TABLE dbo.wizard_sessions ( id INT IDENTITY(1,1) PRIMARY KEY, project_id VARCHAR(50) NOT NULL, mode VARCHAR(20) NOT NULL, -- 'new_company' | 'new_site' current_step INT NOT NULL, completed_steps NVARCHAR(100), -- JSON array: [1,2,3,5,8] skipped_steps NVARCHAR(100), -- JSON array: [4,6] step_data NVARCHAR(MAX), -- JSON object: { "step1": {...}, "step2": {...} } created_at DATETIME2 DEFAULT GETDATE(), updated_at DATETIME2 DEFAULT GETDATE(), completed_at DATETIME2 NULL );
CREATE INDEX idx_wizard_project ON dbo.wizard_sessions(project_id);
Real-World Senaryo: 30 Dakikalık Kurulum
Ahmet'in (IT müdürü) kurulum timeline'ı:
10:17 - Wizard başlatıldı. Admin kullanıcı + lisans girişi (Adım 1-2). 2 dakika.
10:19 - Şirket bilgileri (Adım 3). Vergi no, KVKK sorumlusu email. 1 dakika.
10:20 - Welcome video skip edildi (Adım 4).
10:21 - Mail domain: @firmaadi.com.tr (Adım 5). 30 saniye.
10:22 - M365 entegrasyonu. Ahmet Azure Portal'de app registration yapmış, client_id ve client_secret'ı kopyalayıp yapıştırmış (Adım 6). 4 dakika.
10:26 - Web varlıkları: portal.firmaadi.com.tr, webmail.firmaadi.com.tr (Adım 7). 1 dakika.
10:27 - Office network: 192.168.1.0/24 (tek şube) (Adım 8). 1 dakika.
10:28 - Firewall IP: 192.168.1.1 (pfSense) (Adım 9). Syslog portu: 514. 2 dakika.
10:30 - Kritik sunucular: dc01, sql-prod, file-server (Adım 10). 2 dakika.
10:32 - Compliance: ISO 27001 + KVKK seçildi (Adım 11). 1 dakika.
10:33 - Discover başlatıldı (Adım 12). Progress bar gösterildi. 8 dakika sürdü (65 cihaz bulundu).
10:41 - Wizard tamamlandı. Ahmet ana panoya yönlendirildi.
10:43 - İlk log'lar (M365 audit + pfSense connection) panoya düşmeye başladı.
10:45 - İlk anomaly: M365_RISKY_SIGNIN - Muhasebe müdürü Ayşe saat 10:30'da ev IP'sinden (85.x.x.x) oturum açmış. Office IP dışı.
Toplam süre: 28 dakika. Danışman ihtiyacı: sıfır.
Limitler ve Dürüst Notlar
- M365 dışında SaaS entegrasyonu yok: Setup Wizard şu an sadece M365 destekliyor. Google Workspace, Salesforce gibi SaaS'ler için manuel connector kurulumu gerekiyor (dokümantasyon: /docs/connectors).
- Karmaşık network topology: 10+ subnet, VLAN segmentasyonu, multi-site VPN olan firmalar için Office adımı (Adım 8) yetersiz kalıyor. Bu durumda wizard'ı tamamlayıp Settings > Network Topology'den detaylı girişim yapılması gerekiyor.
- Agent deployment otomasyon sınırlı: Discover fazı agent install script'i üretiyor ama otomatik deployment yapmıyor. 100+ cihazlı ortamlarda GPO (Group Policy) veya SCCM ile toplu yükleme öneriliyor; Setup Wizard bunu otomatize etmiyor.
- Discover fazı pasif: Active Directory domain join bilgisi çekmiyor. Sadece Azure AD (M365) entegrasyonu varsa kullanıcı listesi geliyor. On-prem AD entegrasyonu için LDAP connector manuel kurulumu gerekiyor (wizard dışı).
- Rollback yok: Wizard tamamlandıktan sonra "sıfırdan başlat" seçeneği yok. Yanlış girilen bilgiler (örn. yanlış office IP bloğu) Settings menüsünden manuel düzeltilmeli.
