22:18'de bir brute-force alarmı, ama kim kime bağlanıyor?
Cuma akşamı 22:18'de ShamashAi BRUTE_FORCE_DETECTED event'i tetikledi.dbo.events tablosuna düşen kayıt: 192.168.10.45 IP'sinden dc01.santral.local domain controller'a son 3 dakikada 187 başarısız NTLM denemesi. Ekip hızla dbo.devices sorgusunu açıyor, ama 192.168.10.45 bilinen bir asset değil — DHCP loglarda da yok. Oysa aynı anda Palo Alto firewall log'unda aynı IP, VPN gateway'e IPsec tunnel kurmuş ve içeriden erişim alıyor. Sorular çoğalıyor: Bu IP hangi cihazdan NAT'lanıyor? VPN'e kimlik doğrulaması hangi LDAP bind'la yapıldı? Domain controller ile arasında hangi switch port'ları var? Grafana panelindeki statik topoloji diyagramı sadece fiziksel VLAN'ları gösteriyor; saldırı anında hangi protokol katmanlarından geçtiğini, hangi güvenlik kontrol noktalarını atladığını anlamak için birden fazla ekran, birden fazla SIEM sorgusu gerekiyor.
Bu senaryo, geleneksel SIEM ve statik topoloji çizimlerinin en büyük kör noktasını açığa çıkarır: cihazlar arası ilişkiler tiplenemediğinde, her olay analizi manuel korelasyon haline döner. ShamashAi Topology modülü bu problemi, ağdaki tüm cihaz çiftleri arasındaki bağlantıları 9 typed edge kategorisi altında keşfederek ve dbo.device_edges tablosunda audit edilebilir graf olarak sunarak çözer. Yazının geri kalanında bu 9 edge tipinin nasıl keşfedildiğini, hangi connector'ların hangi kaynaklardan beslediğini ve incident analiz sırasında nasıl sorgulandığını teknik detaylarıyla inceleyeceğiz.
9 edge tipi: neden kategorizasyon zorunlu?
Bir IP'nin başka bir IP'ye "bağlandığını" söylemek, analist için yeterli değildir. Bağlantı layer-2 switch port üzerinden mi, yoksa layer-3 WAN link üzerinden mi? Kimlik doğrulaması Active Directory member ilişkisi üzerinden mi, yoksa LDAP bind çağrısı üzerinden mi? ShamashAi bu soruları yanıtlamak için her edge'e edge_type atıfı verir ve connector'lar farklı kaynaklardan farklı tipleri besler. Dokümantasyonda tanımlanan 9 kategori:1. network
Fiziksel veya sanal ağ katmanı bağlantıları:- wan_uplink: Router veya SD-WAN edge'lerinin ISP/MPLS provider'a bağlantısı.
- switch_port: LLDP, CDP veya SNMP sorgularıyla keşfedilen switch-port ve port-device mapping.
- lldp_neighbor: LLDP protokolü üzerinden ilan edilen komşuluk ilişkileri (örneğin iki switch arası trunk).
dbo.device_edges tablosuna edge_type='switch_port' ve metadata={'port':'Gi0/12','vlan':100} olarak yazar.
2. identity
Kimlik doğrulama ve yetkilendirme ilişkileri:- ad_member: Bir cihazın Active Directory domain'ine join olması (computer object).
- ldap_bind: Uygulamaların veya cihazların LDAP/LDAPS üzerinden DC'ye bind çağrısı.
dbo.events üzerinden edge_type='ad_member' olarak device_edges'e yansıtılır.
3. tunnel
Şifreli veya overlay tünel bağlantıları:- ipsec: Site-to-site VPN tüneli.
- ssl_vpn: Remote access SSL VPN oturumu.
- mpls: MPLS label-switched path (ISP tarafından sağlanıyorsa BGP session loglarda).
- expressroute: Azure ExpressRoute veya AWS Direct Connect gibi dedicated WAN.
edge_type='ipsec', metadata={'peer_ip':'203.0.113.5','spi':'0xabcd1234'} olarak kaydedilir.
4. compute
Virtüalizasyon ve container orkestrasyon ilişkileri:- vmware_host: Bir VM'nin hangi ESXi host üzerinde çalıştığı.
- k8s_node: Bir pod'un hangi Kubernetes worker node'unda schedule edildiği.
/api/v1/pods endpoint) sürekli polling yapar, her VM veya pod için device_edges insert eder. Örnek metadata: {'cluster':'prod-k8s','namespace':'payment','node':'worker03'}.
5. security
Güvenlik kontrol noktası ilişkileri:- siem_log_source: Bir cihazın ShamashAi'ye syslog veya agent üzerinden log gönderdiği ilişki.
- edr_managed: Bir endpoint'in EDR agent'ı tarafından yönetildiği ilişki.
dbo.devices tablosuna kaydeder ve device_edges içine edge_type='siem_log_source', source_device_id=<agent_id>, target_device_id=<shamashai_server_id> satırı ekler. Bu, audit log için kritiktir: hangi cihazdan log akışı kesildi?
6. storage
Depolama ve veri akış ilişkileri:- nfs_mount / smb_share: Bir sunucunun hangi file server share'ine bağlı olduğu.
- iscsi_lun: SAN storage LUN mapping.
/proc/mounts parse'ı üzerinden SMB/NFS edge'leri keşfedilebilir.
7. app / SaaS
Uygulama katmanı bağımlılıkları:- api_consumer: Bir uygulama sunucusunun başka bir API'ye sürekli HTTP/HTTPS çağrısı.
- saas_integration: Microsoft 365, Salesforce, AWS gibi SaaS platformlarına OAuth/SAML üzerinden bağlantı.
M365_RISKY_SIGNIN event'lerini çeker ve aynı zamanda edge_type='saas_integration', metadata={'tenant_id':'...','app':'outlook.office365.com'} kaydı oluşturur.
8. mail / web
Mail routing ve web hosting ilişkileri:- mail_route: Bir mail sunucusunun hangi MX gateway üzerinden dış dünyaya mail gönderdiği.
- web_hosted_at: Bir web uygulamasının hangi reverse proxy veya CDN arkasında olduğu.
- waf_protected: Bir web sitesinin hangi WAF (Web Application Firewall) tarafından korunduğu.
X-Forwarded-For header'larını ve upstream server IP'lerini parse ederek edge_type='web_hosted_at' edge'i oluşturur. WAF ilişkisi de Cloudflare veya F5 BIG-IP syslog'larından keşfedilir.
9. device_edges tablosu yapısı ve audit
Tüm bu edge'lerdbo.device_edges tablosunda şu şemada saklanır:
sql
CREATE TABLE dbo.device_edges (
edge_id BIGINT IDENTITY PRIMARY KEY,
source_device_id INT NOT NULL, -- dbo.devices.device_id
target_device_id INT NOT NULL,
edge_type NVARCHAR(50) NOT NULL, -- 'switch_port', 'ad_member', 'ipsec', ...
metadata NVARCHAR(MAX), -- JSON: port, VLAN, tunnel SPI, vb.
discovered_at DATETIME2 NOT NULL DEFAULT GETUTCDATE(),
last_seen DATETIME2 NOT NULL,
status NVARCHAR(20) DEFAULT 'active', -- 'active', 'stale', 'removed'
CONSTRAINT FK_source FOREIGN KEY (source_device_id) REFERENCES dbo.devices(device_id),
CONSTRAINT FK_target FOREIGN KEY (target_device_id) REFERENCES dbo.devices(device_id)
);
CREATE INDEX IX_edge_type ON dbo.device_edges(edge_type, status);
Her edge audit edilebilir: discovered_at ilk keşif zamanı, last_seen son güncellenme zamanı. Eğer bir edge 7 gün boyunca yeniden görülmezse (örneğin VPN tüneli kapandı), background job status='stale' işaretler. Bu, incident retrospective analizinde kritik: saldırı anında hangi edge'ler aktifti?
Connector'lar edge'leri nasıl keşfeder?
ShamashAi Topology modülü pasif değildir; connector'lar sürekli çalışan Node.js Fastify mikroservislerdir ve her biri farklı kaynaklardan edge bilgisi toplar:SNMP Connector → network edge'leri
javascript // ShamashAi Node.js Fastify SNMP Connector pseudo-code const snmp = require('net-snmp'); const session = snmp.createSession('192.168.1.1', 'public'); const oids = [ '1.0.8802.1.1.2.1.4.1.1.9', // LLDP remote system name '1.3.6.1.2.1.17.4.3.1.2' // Bridge port to MAC ]; session.get(oids, (error, varbinds) => { if (!error) { const remoteName = varbinds[0].value.toString(); // dbo.device_edges INSERT: db.query(` INSERT INTO dbo.device_edges (source_device_id, target_device_id, edge_type, metadata, last_seen) VALUES (@source, @target, 'lldp_neighbor', @meta, GETUTCDATE()) `, { source: localDeviceId, target: resolveDevice(remoteName), meta: JSON.stringify({port: 'Gi0/1'}) }); } });Windows Event Connector → identity edge'leri
.NET 8 Agent, her domain-joined Windows cihazda Event ID 4624'ü dinler: csharp // ShamashAi .NET 8 Agent (C#) - Windows Event Watcher using System.Diagnostics.Eventing.Reader; var query = new EventLogQuery("Security", PathType.LogName, "*[System[(EventID=4624)]]"); var watcher = new EventLogWatcher(query); watcher.EventRecordWritten += (s, e) => { var record = e.EventRecord; var logonType = record.Properties[8].Value.ToString(); if (logonType == "3") { // Network logon var targetUser = record.Properties[5].Value.ToString(); var sourceIP = record.Properties[18].Value.ToString(); // POST /topology/edge endpoint'ine gönder: httpClient.PostAsJsonAsync("https://shamashai.local/topology/edge", new { source_device_id = ResolveDeviceByIP(sourceIP), target_device_id = localDeviceId, edge_type = "ad_member", metadata = new { user = targetUser, logon_type = 3 } }); } };Firewall API Connector → tunnel edge'leri
Fortigate REST API'sinden aktif VPN tünellerini çeker: javascript // ShamashAi Fortigate Connector (Node.js Fastify) const axios = require('axios'); setInterval(async () => { const res = await axios.get('https://firewall.local/api/v2/monitor/vpn/ipsec', { headers: { 'Authorization':Bearer ${apiToken} }
});
res.data.results.forEach(tunnel => {
if (tunnel.status === 'up') {
db.query(`
MERGE dbo.device_edges AS target
USING (SELECT @source AS source_device_id, @target AS target_device_id, 'ipsec' AS edge_type) AS source
ON target.source_device_id = source.source_device_id AND target.target_device_id = source.target_device_id AND target.edge_type = source.edge_type
WHEN MATCHED THEN UPDATE SET last_seen = GETUTCDATE(), status = 'active'
WHEN NOT MATCHED THEN INSERT (source_device_id, target_device_id, edge_type, metadata, last_seen)
VALUES (source.source_device_id, source.target_device_id, source.edge_type, @meta, GETUTCDATE());
`, { source: localFWDeviceId, target: resolvePeerIP(tunnel.proxyid[0].remote_subnet), meta: JSON.stringify({spi: tunnel.spi}) });
}
});
}, 60000); // Her 60 saniyede poll
Incident analiz sırasında edge sorgulama
Başta verdiğimiz senaryo:192.168.10.45 IP'sinden DC'ye brute-force. Analist şu T-SQL sorgusunu çalıştırır:
sql
-- Saldırgan IP'nin hangi edge'lerden geçtiğini bul
WITH attacker_device AS (
SELECT device_id FROM dbo.devices WHERE last_seen_ip = '192.168.10.45'
),
edge_chain AS (
SELECT
e.edge_type,
e.metadata,
e.discovered_at,
e.last_seen,
src.hostname AS source_host,
tgt.hostname AS target_host
FROM dbo.device_edges e
JOIN dbo.devices src ON e.source_device_id = src.device_id
JOIN dbo.devices tgt ON e.target_device_id = tgt.device_id
WHERE e.source_device_id IN (SELECT device_id FROM attacker_device)
OR e.target_device_id IN (SELECT device_id FROM attacker_device)
)
SELECT * FROM edge_chain
ORDER BY last_seen DESC;
Sonuç:
| edge_type | source_host | target_host | metadata | last_seen |
|-----------------|-------------------|--------------------|-------------------------------------------|---------------------|
| ssl_vpn | vpn-gw01 | client-unknown-45 | {"user":"ahmet@santral.local"} | 2026-09-16 22:15:33 |
| ad_member | client-unknown-45 | dc01.santral.local | {"computer":"DESKTOP-XYZ"} | 2026-09-16 22:16:10 |
| switch_port | sw-core01 | client-unknown-45 | {"port":"Gi0/23","vlan":100} | 2026-09-16 22:14:58 |
| siem_log_source | dc01.santral.local| shamashai-srv | {"agent_version":"2.1.0"} | 2026-09-16 22:18:44 |
Bu çıktı, saldırganın:
1. ssl_vpn edge'i üzerinden ahmet@santral.local kimliğiyle VPN'e bağlandığını,
2. DHCP'den dinamik IP aldığını (metadata'da computer name var),
3. sw-core01 switch'inin Gi0/23 portuna fiziksel bağlı olduğunu,
4. DC'ye yapılan brute-force'un siem_log_source edge'i sayesinde ShamashAi'ye ulaştığını
anında gösterir. Statik topoloji diyagramı bu 4 katmanı gösteremezdi.
SOAR entegrasyonu: edge-aware otomatik aksiyon
ShamashAi SOAR Engine,dbo.device_edges'i kullanarak akıllı karantina kararları alabilir. Örnek playbook:
javascript
// ShamashAi SOAR Playbook (Node.js Fastify)
fastify.post('/soar/playbook/brute-force-isolate', async (req, reply) => {
const { event_id } = req.body;
const event = await db.query('SELECT * FROM dbo.events WHERE event_id = @id', { id: event_id });
const attackerIP = event[0].source_ip;
// Edge zincirini bul
const edges = await db.query(`
SELECT e.edge_type, e.source_device_id, e.target_device_id, e.metadata
FROM dbo.device_edges e
JOIN dbo.devices d ON e.source_device_id = d.device_id
WHERE d.last_seen_ip = @ip AND e.edge_type IN ('ssl_vpn', 'switch_port')
`, { ip: attackerIP });
for (const edge of edges) {
if (edge.edge_type === 'ssl_vpn') {
// VPN oturumunu sonlandır
await axios.post('https://firewall.local/api/vpn/terminate', {
session_id: JSON.parse(edge.metadata).session_id
});
await db.query(`
INSERT INTO dbo.soar_actions (event_id, action_type, target_device_id, result)
VALUES (@eid, 'vpn_terminate', @did, 'success')
`, { eid: event_id, did: edge.source_device_id });
}
if (edge.edge_type === 'switch_port') {
// Switch port'u shutdown et
const meta = JSON.parse(edge.metadata);
await snmpSet(edge.target_device_id, ifAdminStatus.${meta.port}, 'down');
await db.query(`
INSERT INTO dbo.soar_actions (event_id, action_type, target_device_id, result, metadata)
VALUES (@eid, 'port_shutdown', @did, 'success', @meta)
`, { eid: event_id, did: edge.target_device_id, meta: JSON.stringify({port: meta.port}) });
}
}
reply.send({ status: 'isolated', edges_affected: edges.length });
});
Bu playbook, edge tiplerine göre farklı aksiyonlar alır: VPN edge varsa oturumu sonlandırır, switch_port edge varsa port'u kapatır. Statik kurallarla bu seviyede granüler kontrol mümkün değildir.
Compliance ve kanıt toplama
KVKK Madde 12 (veri güvenliği) ve ISO 27001:2022 Annex A.8.16 (log izleme), bir güvenlik olayında "hangi sistemler etkilendi?" sorusunu yanıtlamayı gerektirir. ShamashAi'ninGET /compliance/evidence endpoint'i, bir event_id için tüm edge zincirini ve değişiklik tarihçesini ZIP paketi olarak döner:
sql
-- Compliance evidence pack query
DECLARE @event_id BIGINT = 123456;
SELECT
e.event_id,
e.event_type,
e.source_ip,
e.target_device_id,
d.hostname AS target_hostname,
edges.edge_type,
edges.metadata AS edge_metadata,
edges.discovered_at,
edges.last_seen,
soar.action_type AS soar_action,
soar.result AS soar_result,
audit.change_user,
audit.change_timestamp
FROM dbo.events e
JOIN dbo.devices d ON e.target_device_id = d.device_id
LEFT JOIN dbo.device_edges edges ON edges.source_device_id = d.device_id OR edges.target_device_id = d.device_id
LEFT JOIN dbo.soar_actions soar ON soar.event_id = e.event_id
LEFT JOIN dbo.audit_log audit ON audit.entity_type = 'device_edge' AND audit.entity_id = edges.edge_id
WHERE e.event_id = @event_id
ORDER BY edges.last_seen DESC;
Denetçi bu raporu aldığında, saldırı anında hangi edge'lerin aktif olduğunu, SOAR'ın hangi edge'lere müdahale ettiğini, ve edge keşif tarihçesini tek bir dokümanda görür.
Limitler ve dürüst notlar
- Connector kapsamı: ShamashAi dokümantasyonu storage kategorisinde yalnızca genel "storage" başlığını veriyor; NFS/iSCSI gibi spesifik sub-type'lar pilot kapsamında detaylandırılır. Eğer ortamda exotic storage protokolleri (FC, FCoE) varsa custom connector geliştirilmesi gerekir.
- Edge stale süresi: Varsayılan 7 gün hardcoded; bu süre henüz UI'dan yapılandırılamaz. Kısa ömürlü VPN oturumları için (1 saatlik user VPN) manuel tuning gerekir.
- Graph scale:
dbo.device_edgestablosu 100-500 cihazlı ortamlar için optimize edilmiştir. 10,000+ cihazda edge sayısı milyonları bulursa, SQL Server partition stratejisi ve index tuning pilot aşamasında ele alınır.
- Gerçek zamanlı olmayan connector'lar: SNMP ve VMware API polling 60 saniye interval'de çalışır. Sub-second edge değişikliklerini yakalamaz; kritik sistemlerde SNMP trap forwarding veya vCenter alarm webhook yapılandırılmalıdır.
- Edge silme politikası: Stale edge'ler otomatik silinmez, sadece
status='stale'işaretlenir. Uzun vadede disk kullanımını optimize etmek için retention policy henüz yoktur.
ShamashAi Topology modülü, ağdaki her cihaz çiftini 9 typed edge kategorisinde modeller ve
dbo.device_edges tablosunda audit edilebilir graf olarak sunar. Connector'lar SNMP, Windows Event, Firewall API, VMware vCenter gibi kaynaklardan edge'leri sürekli keşfeder; SOAR Engine bu edge'lere göre akıllı karantina kararları alır; compliance raporları edge zincirini tarihçesiyle birlikte kanıt paketi olarak sunar. Statik topoloji diyagramlarının gösteremediği protokol-seviye ilişkiler, incident response süresini dakikalardan saniyelere indirir.
Pilot programı 30 gün ücretsiz: shamashai.com.tr/iletisim