Pazartesi 08:42 — denetçinin sorusu
Bilgi güvenliği denetçisi ShamashAi web panelindeincident_groups ekranını açıyor. Filtreyi severity:critical yapıyor ve ilk satırı işaretliyor: [CRITICAL] user:finans-admin multiple high-risk behaviors detected. Risk skoru 87/100. Denetçi soruyor: "Bu 87 nereden geldi? Hangi kritere göre 'critical' dediniz?"
Ekran sağ tarafında Risk Breakdown bölümünü açıyorsun:
Base Score (BEHAVIORAL_ANOMALY): 40
× Privileged User (domain admin): ×1.5 → 60
× Known Threat IP (AbuseIPDB): ×2.0 → 120
× Off-Hours Access (03:15 / expected 08:00–18:00): ×1.3 → 156
Capped at: 100 → Final Score: 87 (rounding)
Denetçi ekrana bakıyor. "Formül açık, kaynak var. Tamam, kritik olarak kabul ediyorum." ISO 27001:2022 A.8.16 (Monitoring activities) ve KVKK Madde 12 (Veri güvenliği) kapsamında hangi olayın neden yüksek öncelikli olduğunu denetçiye formül ve kaynak göstererek açıklayabiliyorsun. ShamashAi Risk Engine'in tasarım felsefesi budur: deterministik, şeffaf, denetlenebilir.
Vendor SIEM'lerin kapalı kutu problemi
Çoğu kurumsal SIEM ürününde risk skoru şöyle çalışır:- Event gelir → backend'de ML pipeline koşar →
risk_score: 78döner.
- UI'da sadece "High Risk" badge'i görünür.
- Skor hesaplama mantığı proprietary — kaynak kod kapalı.
- Denetçi "neden 78?" diye sorduğunda cevap: "Algoritmamız böyle hesapladı."
ShamashAi Risk Engine formülü
Risk Engine, gelen her event için şu formülü uygular: score = base(event_type) × privileged_user × threat_ip × suspicious_geo × off_hours Final skor 100'de cap'lenir. Formül Node.js Fastify API'da (/api/risk/calculate) şöyle çalışır:
javascript
// ShamashAi Risk Engine — simplified pseudo-code
function calculateRiskScore(event) {
const baseScores = {
BRUTE_FORCE_DETECTED: 50,
BEHAVIORAL_ANOMALY: 40,
M365_RISKY_SIGNIN: 45,
KNOWN_BAD_IP: 60,
AUTH_FAIL_USER: 30,
CERT_EXPIRING: 10,
BACKUP_FAILED: 20
};
let score = baseScores[event.event_type] || 10;
let reasons = [Base (${event.event_type}): ${score}];
// Multiplier 1: Privileged user
if (event.user_is_admin || event.username.includes('admin') || event.username === 'root') {
score *= 1.5;
reasons.push('Privileged user (admin/root): ×1.5');
}
// Multiplier 2: Threat IP
if (event.source_ip_threat_score > 0) {
score *= 2.0;
reasons.push(Known threat IP (AbuseIPDB score ${event.source_ip_threat_score}): ×2.0);
}
// Multiplier 3: Suspicious geo
const expectedCountries = ['TR', 'DE', 'NL']; // env: RISK_ALLOWED_COUNTRIES
if (!expectedCountries.includes(event.source_country)) {
score *= 1.7;
reasons.push(Unexpected country (${event.source_country}): ×1.7);
}
// Multiplier 4: Off-hours
const eventHour = new Date(event.timestamp).getHours();
const businessStart = parseInt(process.env.RISK_BUSINESS_HOUR_START) || 8;
const businessEnd = parseInt(process.env.RISK_BUSINESS_HOUR_END) || 18;
if (eventHour < businessStart || eventHour >= businessEnd) {
score *= 1.3;
reasons.push(Off-hours access (${eventHour}:00 / expected ${businessStart}:00–${businessEnd}:00): ×1.3);
}
// Cap at 100
score = Math.min(score, 100);
return {
final_score: Math.round(score),
severity: getSeverity(score),
reasons: reasons
};
}
function getSeverity(score) {
if (score >= 80) return 'critical';
if (score >= 60) return 'high';
if (score >= 30) return 'medium';
if (score >= 10) return 'low';
return 'info';
}
Bu kod, ShamashAi API'da gerçekte koşan mantığın basitleştirilmiş versiyonu. Her multiplier, reasons[] array'ine ekleniyor — bu array UI'da ve API response'unda döndürülüyor.
Multiplier'ların kaynağı
1. Base score (event_type)
Her event tipi için sabit bir temel skor var:- KNOWN_BAD_IP: 60 — IP zaten kara listede.
- BRUTE_FORCE_DETECTED: 50 — birden fazla başarısız deneme.
- M365_RISKY_SIGNIN: 45 — Microsoft'un risk API'si uyarı vermiş.
- BEHAVIORAL_ANOMALY: 40 — kullanıcı baseline'dan sapma göstermiş.
- AUTH_FAIL_USER: 30 — tek başarısız giriş (henüz brute force değil).
- BACKUP_FAILED: 20 — yedekleme hatası.
- CERT_EXPIRING: 10 — sertifika süresi doluyor (info level).
dbo.events tablosuna yazılırken event_base_score kolonu olarak kaydedilir.
2. Privileged user (×1.5)
Tetikleme koşulu:event.usernameiçindeadmin,root,administrator,sysadmingeçiyorsa.
- Veya
dbo.devices.is_privileged = 1ise (cihaz domain controller, firewall vb.).
- Veya event kaynağı Active Directory'de
Domain Admins,Enterprise Adminsgrubunda ise.
3. Threat IP (×2.0)
Tetikleme koşulu:- Event'in
source_ipadresi, ShamashAi'nin entegre olduğu threat intelligence feed'lerinde (AbuseIPDB, AlienVault OTX, kurumun kendi blacklist'i) bulunuyorsa.
dbo.events.source_ip_threat_score > 0ise.
4. Suspicious geo (×1.7)
Tetikleme koşulu:- Event'in
source_country(GeoIP ile belirlenir), env değişkeninde tanımlıRISK_ALLOWED_COUNTRIESlistesinde yoksa.
- Örnek: kurum sadece Türkiye, Almanya, Hollanda'dan erişim bekliyor; event Nijerya'dan geliyorsa ×1.7 uygulanır.
5. Off-hours (×1.3)
Tetikleme koşulu:- Event timestamp'i, env değişkenlerinde tanımlı
RISK_BUSINESS_HOUR_START(örn. 08:00) ileRISK_BUSINESS_HOUR_END(örn. 18:00) aralığı dışındaysa.
- Timezone env'de
RISK_TZ_OFFSET_HOURSile ayarlanır (Türkiye için +3).
Severity seviyeleri
Final skor hesaplandıktan sonra otomatik severity atanır:- critical: ≥80 →
dbo.incident_groups.severity = 'critical've SOAR otomasyonları tetiklenir (örn. hesap kilitlenir).
- high: ≥60 → SOC ekibine Slack bildirimi gönderilir, ticket oluşturulur.
- medium: ≥30 →
dbo.eventstablosunda flag'lenir, günlük raporda gösterilir.
- low: ≥10 → sadece log'da tutulur.
- info: <10 → audit log'da pasif kayıt.
GET /compliance/evidence endpoint'inde denetçiye sunulan raporlarda renk kodlu şekilde görünür (critical = kırmızı, high = turuncu, vb.).
Tunable environment değişkenleri
ShamashAi Risk Engine, kurumun risk toleransına göre ayarlanabilir: bash # .env dosyası — ShamashAi API container RISK_TZ_OFFSET_HOURS=3 # Türkiye UTC+3 RISK_BUSINESS_HOUR_START=8 # Mesai başlangıcı RISK_BUSINESS_HOUR_END=18 # Mesai bitişi RISK_ALLOWED_COUNTRIES=TR,DE,NL # Kabul edilen ülkeler RISK_PRIVILEGED_MULTIPLIER=1.5 # Admin hesap çarpanı RISK_THREAT_IP_MULTIPLIER=2.0 # Kötü IP çarpanı RISK_GEO_MULTIPLIER=1.7 # Beklenmedik ülke çarpanı RISK_OFFHOURS_MULTIPLIER=1.3 # Mesai dışı çarpanı Örnek senaryo: finans sektöründe kurum, gece hiç erişim olmamasını bekliyor.RISK_OFFHOURS_MULTIPLIER=2.0 yaparak off-hours riski daha agresif skorlayabilir. Veya global bir şirketse RISK_BUSINESS_HOUR_START=0 ve END=24 yaparak off-hours multiplier'ını devre dışı bırakabilir.
Humanize edilmiş reason array
Risk Engine'in en önemli özelliği: her multiplier, insanın okuyabileceği bir açıklama satırı olarak döndürülür. API response örneği: { "event_id": "evt_2026081912345", "event_type": "BEHAVIORAL_ANOMALY", "username": "finans-admin", "source_ip": "185.220.101.45", "source_country": "RU", "timestamp": "2026-08-18T03:15:22Z", "risk_score": 87, "severity": "critical", "risk_breakdown": { "base_score": 40, "multipliers": [ "Privileged user (domain admin): ×1.5", "Known threat IP (AbuseIPDB score 92): ×2.0", "Unexpected country (RU): ×1.7", "Off-hours access (03:15 / expected 08:00–18:00): ×1.3" ], "calculation": "40 × 1.5 × 2.0 × 1.7 × 1.3 = 265.2 → capped at 100", "final_score": 87 } } Bu response'uGET /reports/evidence-pack endpoint'inde denetçiye PDF olarak sunabilirsin. Denetçi, hangi olayın neden kritik sayıldığını formül ve kaynak görerek doğrulayabilir.
SQL sorgusu: yüksek skorlu olayları listeleme
ShamashAi API, risk skorlarınıdbo.events tablosunda tutuyor. Örnek sorgu:
sql
-- Son 7 gündeki critical olaylar
SELECT
event_id,
event_type,
username,
source_ip,
source_country,
timestamp,
risk_score,
severity,
risk_reasons
FROM dbo.events
WHERE
timestamp >= DATEADD(day, -7, GETDATE())
AND severity = 'critical'
ORDER BY risk_score DESC, timestamp DESC;
risk_reasons kolonu JSON array olarak saklanır:
[
"Base (BEHAVIORAL_ANOMALY): 40",
"Privileged user (domain admin): ×1.5",
"Known threat IP (AbuseIPDB score 92): ×2.0",
"Unexpected country (RU): ×1.7",
"Off-hours access (03:15 / expected 08:00–18:00): ×1.3"
]
Bu array, UI'da tooltip veya detay panelinde gösterilir. Kullanıcı olayın üzerine geldiğinde "neden bu skor?" sorusunun cevabını hemen görür.
SOAR entegrasyonu: yüksek skorda otomatik aksiyon
ShamashAi SOAR Engine, risk skorunu tetikleyici olarak kullanabilir. Örnek kural: javascript // SOAR rule: critical events → otomatik hesap kilitleme if (event.severity === 'critical' && event.risk_score >= 80) { await fetch('https://shamashai-api/soar/block', { method: 'POST', body: JSON.stringify({ username: event.username, reason:Critical risk score ${event.risk_score}: ${event.risk_reasons.join(', ')},
duration_minutes: 60
})
});
// Slack bildirim gönder
await notifySlack({
channel: '#security-alerts',
message: 🚨 Critical event: ${event.username} blocked (risk ${event.risk_score})
});
}
Bu örnekte:
- Event risk skoru ≥80 ise
POST /soar/blockendpoint'i çağrılır.
- Kullanıcı hesabı 60 dakika kilitlenir.
- SOC ekibine Slack bildirimi gönderilir.
dbo.soar_actionstablosuna aksiyon kaydedilir.
dbo.soar_actions.reason kolonunda formül ve kaynak görünür.
Compliance: denetçiye ne gösteriyorsun?
ISO 27001:2022 A.8.16 (Monitoring activities) ve KVKK Madde 12 (Veri güvenliği) uyarınca, kurumlar güvenlik olaylarını kayıt altına almalı ve hangi olayın neden kritik sayıldığını açıklayabilmeli. ShamashAiGET /compliance/evidence endpoint'i, denetçiye şu bilgileri sunar:
{
"period": "2026-08-01 to 2026-08-19",
"total_events": 12453,
"critical_events": 3,
"high_events": 17,
"evidence": [
{
"event_id": "evt_2026081912345",
"timestamp": "2026-08-18T03:15:22Z",
"event_type": "BEHAVIORAL_ANOMALY",
"username": "finans-admin",
"source_ip": "185.220.101.45",
"source_country": "RU",
"risk_score": 87,
"severity": "critical",
"risk_formula": "base(40) × privileged(1.5) × threat_ip(2.0) × geo(1.7) × offhours(1.3) = 265.2 → capped 100",
"risk_reasons": [
"Base (BEHAVIORAL_ANOMALY): 40",
"Privileged user (domain admin): ×1.5",
"Known threat IP (AbuseIPDB score 92): ×2.0",
"Unexpected country (RU): ×1.7",
"Off-hours access (03:15 / expected 08:00–18:00): ×1.3"
],
"soar_action_taken": "User finans-admin blocked for 60 minutes",
"soar_action_timestamp": "2026-08-18T03:15:30Z"
}
]
}
Denetçi bu raporu alır, her satırda formül + kaynak + alınan aksiyon görür. Vendor SIEM'lerde böyle bir şeffaflık yok.
Limitler ve dürüst notlar
- Makine öğrenmesi yok — risk skoru deterministik formül ile hesaplanır. Anomali tespiti için
BEHAVIORAL_ANOMALYevent tipi var ama bu da istatistiksel baseline (ortalama ± 2σ) kullanır, ML model değil.
- Threat IP feed'leri manuel eklenmeli — ShamashAi kendi threat intelligence feed'i üretmiyor. AbuseIPDB, AlienVault OTX gibi harici kaynakları entegre ediyoruz; pilot kapsamında bu entegrasyonları kurmamız gerekiyor.
- Geo-IP veritabanı güncellemesi — MaxMind GeoLite2 veritabanı ayda bir manuel güncellenmelidir; otomatik güncelleme henüz yok.
- Multiplier sayısı sabit — şu an 4 multiplier var (privileged, threat_ip, geo, off_hours). Ek multiplier (ör. "cihaz riski", "veri sınıflandırması") için feature request açılması gerekiyor; ShamashAi dokümantasyonu daha fazla bilgi vermiyor; pilot kapsamında detay paylaşılır.
- Real-time hesaplama performansı — yüksek event hacminde (>10k/dk) risk skoru hesaplama latency'si artabilir. Şu an Node.js single-threaded; horizontal scaling için Fastify cluster modu pilot sırasında test edilecek.
ShamashAi Risk Engine, güvenlik olaylarını deterministik formül ve humanize edilmiş reason array ile skorlar. Denetçiye "bu skor nereden geldi?" sorusunun cevabını formül + kaynak göstererek verebilirsin. Pazarlama puanı değil, açıklanabilir risk. Pilot programı 30 gün ücretsiz: shamashai.com.tr/iletisim
