Tüm yazılar
·7 dk okuma·ShamashAi Ekibi

ShamashAi Topology: External ve Internal görünüm ayrımı

ShamashAi Topology modülü cloud asset'leri LAN'dan ayırarak iki ayrı görünüm sunar: External (M365, Azure, mail) ve Internal (site-bazlı switch/VLAN/server). API seviyesinde leak koruması ile kirlenen şema sorununu çözer.

Pazartesi 09:43'te açılan görünüm kaosu

Şirket IT yöneticisi network topolojisini açtığında 180 cihazlık düğüm ağı ile karşılaşıyor. Ortada fiziksel switch'ler, VLAN'lar, sunucular var — ama aynı grafikte SharePoint Online, Exchange Online, 40 adet Entra-joined laptop, Azure VM'ler de görünüyor. Hangisi Ankara ofisinin fiziksel altyapısı, hangisi Microsoft'un bulutunda? Hangi cihaz firewall arkasında LAN'da, hangisi internet üzerinden bağlanıyor? Grafik bu haliyle güvenlik analizine değil, karmaşa yaratmaya yarıyor.

Bu senaryo ShamashAi'nin 2025 Q4'te pilot müşterilerden aldığı geri bildirimle şekillendi: Cloud asset'ler ve on-prem altyapı aynı topology view'da gösterilince görsel kirlilik oluşuyor, olay analizi zorlaşıyor. Aynı ekranda hem fiziksel switch hem de m365://sharepoint gibi URI'li bulut servisleri olunca IT yöneticisi "bu cihaza ping atabilir miyim?" sorusuna bile cevap veremiyor.

ShamashAi Topology modülü bu soruna iki ayrı görünüm mimarisi ile yanıt veriyor:

  • External Topology: Şirket çapında (company-wide) bulut ve dış servisler — M365, Azure cihazları, mail provider, web servisleri. URI formatı: m365://, azure-device://, entra-device://, web://, mail://.
  • Internal Topology: Site-scoped (şube/ofis bazlı) fiziksel ve mantıksal ağ — firewall, switch, VLAN, server, NAS. site_id ile filtrelenir, external flag kontrolü API seviyesinde yapılır.
Bu yazıda ShamashAi'nin topology mimarisini, External/Internal ayrımının teknik detaylarını, API seviyesinde leak korumasını ve gerçek sorgu örneklerini inceleyeceğiz.

External Topology: Şirket çapı bulut ve dış servis görünümü

External topology company-wide bir perspektif sunar. Şirketin tüm şubelerinin kullandığı ortak bulut servislerini, SaaS uygulamalarını, mail sağlayıcılarını tek bir grafikte gösterir. Bu görünüm fiziksel lokasyona (site) bağlı değildir — çünkü M365 SharePoint veya Azure sanal makine Ankara ofisine değil, Microsoft datacenter'ına aittir.

External asset URI formatı

ShamashAi dbo.devices tablosunda external cihazlar şu URI şemalarıyla kaydedilir:

  • m365://sharepoint.contoso.com
  • m365://exchange.contoso.com
  • azure-device://vm-prod-01.eastus.azure.com
  • entra-device://LAPTOP-7F3A9D (Azure AD joined)
  • web://www.sirketadi.com.tr
  • mail://smtp.office365.com
Bu URI'ler dbo.devices.device_uri kolonunda saklanır ve external_flag = 1 ile işaretlenir. Normal LAN cihazları ise lan://192.168.10.5 veya hostname://dc01.local formatında, external_flag = 0 ile kaydedilir.

External topology endpoint

External görünümü çekmek için:

javascript // Node.js Fastify route fastify.get('/topology/external', async (request, reply) => { const pool = await sql.connect(dbConfig); const result = await pool.request().query(` SELECT device_id, device_uri, device_type, last_seen FROM dbo.devices WHERE external_flag = 1 AND last_seen > DATEADD(day, -30, GETDATE()) `); const edges = await pool.request().query(` SELECT from_device_id, to_device_id, edge_type FROM dbo.topology_edges WHERE from_device_id IN ( SELECT device_id FROM dbo.devices WHERE external_flag = 1 ) `); return { nodes: result.recordset, edges: edges.recordset }; });

Bu sorgu yalnızca external_flag = 1 olan cihazları getirir. LAN switch'leri, dahili sunucular, VLAN'lar bu sonuçta görünmez.

External view kullanım senaryoları

  • M365 olay korelasyonu: event_type = M365_RISKY_SIGNIN olayı tetiklendiğinde hangi Entra cihazlarının etkilendiğini görmek.
  • Mail provider anomali: mail://smtp.office365.com üzerinden giden anormal trafik hacmi (SMTP flood).
  • Azure VM güvenlik durumu: azure-device:// URI'li sanal makinelerin patch durumu, açık portları.
  • Web servisi izleme: web://api.sirket.com endpoint'inin uptime ve sertifika süresi.

Internal Topology: Site-bazlı fiziksel ağ görünümü

Internal topology site-scoped (şube/ofis özelinde) fiziksel ve mantıksal ağ altyapısını gösterir. Her site (site_id) kendi firewall, switch, VLAN, server, NAS cihazlarına sahiptir. Bu görünüm yalnızca o site'a ait ve external_flag = 0 olan cihazları listeler.

Site-bazlı filtreleme

ShamashAi'de her cihaz dbo.devices.site_id ile bir şubeye atanır. Örneğin:

  • site_id = 1 → Ankara Ofis
  • site_id = 2 → İstanbul Ofis
  • site_id = 3 → İzmir Ofis
Internal topology endpoint:

javascript fastify.get('/topology', async (request, reply) => { const { site_id } = request.query; if (!site_id) { // Tüm site'ların özet görünümü const sites = await pool.request().query(` SELECT s.site_id, s.site_name, COUNT(d.device_id) as device_count FROM dbo.sites s LEFT JOIN dbo.devices d ON s.site_id = d.site_id AND d.external_flag = 0 GROUP BY s.site_id, s.site_name `); return { sites: sites.recordset }; } // Belirli bir site'ın internal topology'si const devices = await pool.request() .input('siteId', sql.Int, site_id) .query(` SELECT device_id, device_uri, device_type, vlan_id, last_seen FROM dbo.devices WHERE site_id = @siteId AND external_flag = 0 AND last_seen > DATEADD(day, -7, GETDATE()) `); const edges = await pool.request() .input('siteId', sql.Int, site_id) .query(` SELECT from_device_id, to_device_id, edge_type, port FROM dbo.topology_edges WHERE from_device_id IN ( SELECT device_id FROM dbo.devices WHERE site_id = @siteId AND external_flag = 0 ) `); return { site_id, nodes: devices.recordset, edges: edges.recordset }; });

Internal topology cihaz örnekleri

  • lan://192.168.10.1 (Fortigate firewall, site_id=1)
  • hostname://sw-core-01.local (Cisco switch, VLAN trunk, site_id=1)
  • hostname://dc01.ankara.local (Active Directory sunucu, site_id=1)
  • lan://192.168.20.50 (NAS, VLAN 20, site_id=1)
Bu cihazlar fiziksel olarak Ankara ofisinde, güvenlik duvarı arkasında. M365 veya Azure cihazları bu grafikte görünmez.

API seviyesinde leak koruması: fetchTopology fonksiyonu

ShamashAi'nin kritik güvenlik katmanlarından biri API seviyesinde external/cloud leak filtrelemesidir. Bu mekanizma fetchTopology fonksiyonunda uygulanır ve yanlışlıkla Internal görünüme External cihaz karışmasını engeller.

Leak koruması mantığı

javascript // lib/topology.js async function fetchTopology(site_id = null, include_external = false) { const pool = await sql.connect(dbConfig); let whereClause = 'WHERE 1=1'; if (site_id !== null) { // Internal topology: site_id filtresi + external_flag kontrolü whereClause += AND site_id = ${site_id} AND external_flag = 0; } if (!include_external) { // Explicit external_flag = 0 kontrolü whereClause += ' AND external_flag = 0'; } else { // External-only: external_flag = 1 whereClause += ' AND external_flag = 1'; } const query = ` SELECT device_id, device_uri, device_type, site_id, external_flag FROM dbo.devices ${whereClause} `; const result = await pool.request().query(query); return result.recordset; }

Bu fonksiyon şu kuralları garanti eder:

1. site_id parametresi verildiğinde mutlaka external_flag = 0 kontrolü eklenir. 2. include_external = true ise yalnızca external_flag = 1 cihazlar döner. 3. Hiçbir durumda Internal ve External cihazlar aynı response'da karışmaz.

Audit log doğrulaması (2026-05-14)

ShamashAi 2026-05-14 tarihli audit raporunda external_leaks=0 doğrulandı. 30 günlük log incelemesinde:

sql SELECT COUNT(*) as leak_count FROM dbo.audit_log WHERE action = 'TOPOLOGY_FETCH' AND request_params LIKE '%site_id%' AND response_data LIKE '%external_flag":1%' AND created_at > '2026-04-14'; -- Sonuç: 0

Yani site-bazlı topology çağrılarında hiçbir external cihaz leak etmemiş. API seviyesinde filtre işliyor.


Route yapısı ve kullanım senaryoları

ShamashAi Topology modülü 3 ana route ile çalışır:

1. /topology (all sites overview)

Parametresiz çağrıldığında tüm site'ların özet bilgisini döner:

bash GET https://shamashai.local/topology

Response:

{ "sites": [ {"site_id": 1, "site_name": "Ankara Ofis", "device_count": 45}, {"site_id": 2, "site_name": "İstanbul Ofis", "device_count": 78}, {"site_id": 3, "site_name": "İzmir Ofis", "device_count": 32} ] }

IT yöneticisi bu özetten hangi şubeyi detaylı inceleyeceğine karar verir.

2. /topology?site_id=X (internal detail)

Belirli bir site'ın internal topology'si:

bash GET https://shamashai.local/topology?site_id=1

Response, yalnızca Ankara ofisinin switch, server, VLAN cihazlarını içerir. M365 veya Azure asset'leri asla bu response'da olmaz.

3. /topology/external (company-wide cloud)

Şirket çapında external asset'ler:

bash GET https://shamashai.local/topology/external

Response, tüm m365://, azure-device://, entra-device:// cihazları içerir. Site ayrımı yoktur — çünkü bunlar fiziksel lokasyona bağlı değil.


External/Internal ayrımının olay analizindeki rolü

Bir güvenlik olayı tetiklendiğinde hangi topology görünümüne bakılacağı event_type ve device_uri formatından anlaşılır.

Senaryo 1: M365 Risky Sign-In

sql SELECT TOP 1 * FROM dbo.events WHERE event_type = 'M365_RISKY_SIGNIN' ORDER BY event_time DESC;

Sonuç:

event_id: 1847293 event_type: M365_RISKY_SIGNIN device_uri: entra-device://LAPTOP-8H3K2F user: ahmet.yilmaz@sirket.com.tr risk_level: HIGH

Bu olayda entra-device:// URI'si External Topology'de incelenir. IT yöneticisi /topology/external açar, ilgili Entra cihazını bulur, hangi M365 servislerine bağlandığını görür.

Senaryo 2: Internal Brute-Force

sql SELECT TOP 1 * FROM dbo.events WHERE event_type = 'BRUTE_FORCE_DETECTED' ORDER BY event_time DESC;

Sonuç:

event_id: 1847301 event_type: BRUTE_FORCE_DETECTED device_uri: lan://192.168.10.50 target: hostname://dc01.ankara.local attempts: 140

Bu olayda lan:// URI'si Internal Topology'de incelenir. IT yöneticisi /topology?site_id=1 açar, 192.168.10.50 cihazının hangi switch portunda, hangi VLAN'da olduğunu görür. Gerekirse SOAR ile o switch portunu kapatır:

javascript // SOAR action await fetch('https://shamashai.local/soar/block', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ device_uri: 'lan://192.168.10.50', action: 'BLOCK_PORT', switch_uri: 'hostname://sw-core-01.local', port: 'GigabitEthernet1/0/12' }) });


.NET 8 agent'ın topology discovery rolü

ShamashAi .NET 8 agent'ı client cihazlarda çalışır ve bulut asset'leri keşfeder. Örneğin:

csharp // ShamashAgent/Services/CloudDiscovery.cs using System.Net.Http; using Microsoft.Graph;

public class CloudDiscoveryService { private readonly GraphServiceClient _graphClient; public async Task DiscoverEntraDevices() { var devices = await _graphClient.Devices .Request() .Filter("trustType eq 'AzureAd'") .GetAsync(); foreach (var device in devices) { var payload = new { device_uri = $"entra-device://{device.DisplayName}", device_type = "ENTRA_DEVICE", external_flag = 1, site_id = (int?)null, // External cihazlar site'a atanmaz last_seen = DateTime.UtcNow }; await _httpClient.PostAsJsonAsync( "https://shamashai.local/api/devices/register", payload ); } } }

Agent, Azure AD joined cihazları otomatik keşfeder ve external_flag = 1, site_id = null ile kaydeder. Bu cihazlar Internal topology'de asla görünmez.


Limitler ve dürüst notlar

  • Hybrid cihaz desteği henüz pilot aşamasında: Aynı anda hem LAN'a hem Azure'a bağlı cihazlar (hybrid-joined) şu an External olarak işaretleniyor. Site-bazlı dual görünüm henüz yok.
  • Edge kaynağı keşfi sınırlı: External topology'de M365 servisleri arası bağlantılar (örn. SharePoint → Exchange bağlantısı) manuel tanımlanmalı. Otomatik keşif yalnızca Azure VM'ler arası NSG kurallarında çalışıyor.
  • Site değişikliği geçmişi yok: Bir cihaz site_id değiştirdiğinde (ör. laptop İstanbul'dan Ankara'ya taşındı) eski topology görünümünde trace kalmıyor. Cihaz yeni site'da görünür, eski site'dan silinir.
  • External asset sayısı 500+ olunca performans düşer: Graph API pagination şu an tek seferde 500 cihaz çekiyor. Daha fazlası için manuel batch import gerekli.
  • Cloud provider desteği şimdilik M365 ve Azure ile sınırlı: AWS, GCP asset'leri için URI şeması tanımlı ama discovery agent henüz geliştirilmedi.

ShamashAi Topology modülünün External/Internal ayrımı, IT yöneticisine bulut ve fiziksel altyapıyı ayrı düzlemlerde görme imkanı verir. API seviyesinde leak koruması ile data integrity garanti edilir. Pilot programı 30 gün ücretsiz: shamashai.com.tr/iletisim

Paylaş

Bu konuyu projenize uygulayalım

Pilot programı kapsamında ürünü gerçek altyapınızda 30 gün ücretsiz deneyin.