Pazartesi 08:47: Admin Hesabı Ele Geçirilmesinin Anatomisi
Sistem yöneticisi Mehmet, hafta sonu boyunca cep telefonunda iş maillerine göz atmış. Pazartesi sabahı ofise geldiğinde ShamashAi paneline giriş yapmaya çalışıyor — ancak şifresi çalışmıyor. İki kere daha deniyor, sonra "şifreyi unuttum" akışına giriyor. Aynı anda güvenlik operasyon ekibinin ekranında BRUTE_FORCE_DETECTED alarmı yanıyor: Mehmet'in hesabına son 12 saatte 847 başarısız giriş denemesi yapılmış, IP adresleri 14 farklı ülkeye dağılmış. Hafta sonu evden bağlanırken kullandığı Wi-Fi ağında bir Man-in-the-Middle saldırısı gerçekleşmiş ve session token'ı ele geçirilmiş olabilir. Ancak asıl problem şu: Mehmet'in hesabında MFA aktif değildi. Şirket politikası "isteğe bağlı" olarak belirlenmişti ve ekip üyeleri "kullanım zorluğu" gerekçesiyle aktive etmemişti.
Bu senaryo on-premise SIEM kurulumlarında görülen klasik bir açık: MFA opsiyonel kaldığında, yüksek yetkili hesaplar bile temel kimlik doğrulama ile korunuyor. ShamashAi'nin MFA policy motoru bu açığı üç seviyeli bir zorunluluk modeli ile kapatıyor.
ShamashAi MFA Policy Mimarisi: Üç Zorunluluk Seviyesi
ShamashAi Auth modülü, TOTP (Time-based One-Time Password) standardını kullanarak üç farklı policy seviyesi sunar:
Off Modu (Üretim Ortamı İçin Önerilmez)
Policy tamamen devre dışı. Hiçbir kullanıcıdan MFA istenmiyor. Bu mod sadece test ortamları veya ilk kurulum aşaması için tasarlanmış. Üretim ortamında kullanılması compliance perspektifinden kabul edilemez risk taşır.
Teknik detay: /auth/mfa/policy endpoint'inden dönen {"mode": "off"} yanıtı, tüm login akışlarında MFA adımını bypass eder. dbo.audit_log tablosuna MFA_POLICY_DISABLED event'i kaydedilir.
Admins Modu (Varsayılan Yapılandırma)
Sadece admin rolüne sahip kullanıcılar zorunlu olarak MFA kullanır. Bu mod çoğu orta ölçekli kuruluş için ideal denge noktası: yüksek yetkili hesaplar korunurken, read-only viewer kullanıcılar operasyonel sürtünme yaşamaz.
Kimler etkilenir:
dbo.userstablosundarole = 'admin'olan hesaplar- SOAR aksiyonlarını manuel tetikleyebilen kullanıcılar
- Compliance evidence pack'lerini export edebilen hesaplar
/auth/mfa/setup/start endpoint'ine yönlendirilir. Setup tamamlanmadan panel erişimi engellenir.
All Modu (Maksimum Güvenlik)
Viewer dahil tüm kullanıcı hesapları MFA kullanmak zorunda. ISO 27001:2022 Annex A.9.4.2 (Secure Log-on Procedures) ve KVKK Madde 12 uyarınca "teknik tedbirler" kapsamında tercih edilen yapılandırma.
Bu modda ShamashAi, her kullanıcı için dbo.users.mfa_enforced_at timestamp'ini işaretler. Henüz setup yapmamış kullanıcılar bir sonraki login'de enrollment ekranı görür, setup tamamlanana kadar dashboard erişimleri bloke edilir.
TOTP Enrollment Akışı: Teknik Detaylar
ShamashAi, RFC 6238 TOTP standardını şu parametrelerle uygular:
Secret üretimi: javascript // Node.js Fastify endpoint: POST /auth/mfa/setup/start const crypto = require('crypto');
const generateTotpSecret = () => { const buffer = crypto.randomBytes(20); // 160 bit return buffer.toString('base64') .replace(/=/g, '') .substring(0, 32); // 32-char base32 secret };
const secret = generateTotpSecret(); const otpauthUri = otpauth://totp/ShamashAi:${userEmail}?secret=${secret}&issuer=ShamashAi&algorithm=SHA1&digits=6&period=30;
// dbo.users tablosuna mfa_secret (encrypted) kaydedilir await sql.query` UPDATE dbo.users SET mfa_secret = ${encryptSecret(secret)}, mfa_setup_started_at = GETUTCDATE() WHERE user_id = ${userId} `;
return { secret, otpauthUri };
QR code üretimi:
otpauthUri değeri frontend tarafında QR code'a dönüştürülür. Kullanıcı Google Authenticator, Microsoft Authenticator veya benzeri bir TOTP uygulaması ile QR'ı tarar.
Doğrulama adımı:
Kullanıcı TOTP uygulamasından aldığı 6 haneli kodu girer. Backend, 30 saniyelik time window içinde kodu doğrular:
javascript // POST /auth/mfa/setup/verify const verifyUserMfaSetup = async (userId, inputCode) => { const user = await getUser(userId); const secret = decryptSecret(user.mfa_secret); const crypto = require('crypto'); const timeStep = Math.floor(Date.now() / 30000); // 30s window const generateTotp = (secret, step) => { const hmac = crypto.createHmac('sha1', Buffer.from(secret, 'base64')); const timeBuffer = Buffer.alloc(8); timeBuffer.writeBigInt64BE(BigInt(step)); const hash = hmac.update(timeBuffer).digest(); const offset = hash[hash.length - 1] & 0x0f; const truncated = hash.readUInt32BE(offset) & 0x7fffffff; return String(truncated % 1000000).padStart(6, '0'); }; // Saat senkronizasyon toleransı için ±1 window kontrol const validCodes = [ generateTotp(secret, timeStep - 1), generateTotp(secret, timeStep), generateTotp(secret, timeStep + 1) ]; if (validCodes.includes(inputCode)) { await sql.query` UPDATE dbo.users SET mfa_enabled = 1, mfa_verified_at = GETUTCDATE() WHERE user_id = ${userId} `; await sql.query` INSERT INTO dbo.audit_log (user_id, event_type, details) VALUES (${userId}, 'MFA_SETUP_COMPLETED', 'TOTP enrollment verified') `; return { success: true }; } return { success: false, error: 'Invalid code or expired' }; };
SHA-1 algoritması: RFC 6238 standardı gereği SHA-1 kullanılır. TOTP bağlamında collision saldırıları anlamlı olmadığından güvenlik riski taşımaz.
Policy Değişikliği ve Zorunlu Enrollment
IT yöneticisi policy seviyesini değiştirdiğinde, etkilenen kullanıcılar bir sonraki login'de otomatik olarak enrollment akışına girer:
javascript // POST /auth/mfa/policy - Admin endpoint const updateMfaPolicy = async (newMode) => { // newMode: 'off' | 'admins' | 'all' await sql.query` UPDATE dbo.system_config SET config_value = ${newMode} WHERE config_key = 'mfa_policy' `; if (newMode === 'all') { // Henüz MFA aktif olmayan tüm kullanıcıları işaretle await sql.query` UPDATE dbo.users SET mfa_enforcement_pending = 1 WHERE mfa_enabled = 0 `; } else if (newMode === 'admins') { await sql.query` UPDATE dbo.users SET mfa_enforcement_pending = 1 WHERE role = 'admin' AND mfa_enabled = 0 `; } await sql.query` INSERT INTO dbo.audit_log (user_id, event_type, details) VALUES (${adminUserId}, 'MFA_POLICY_CHANGED', 'New mode: ${newMode}') `; };
mfa_enforcement_pending = 1 olan kullanıcılar login sırasında interceptor middleware tarafından yakalanır ve /auth/mfa/setup/start sayfasına redirect edilir.
Kullanıcı Self-Service: MFA Devre Dışı Bırakma
Policy "off" modundaysa, kullanıcılar kendi MFA'larını devre dışı bırakabilir. Ancak bu işlem için mevcut TOTP kodu zorunludur:
javascript // POST /auth/mfa/disable const disableUserMfa = async (userId, totpCode) => { const user = await getUser(userId); if (!user.mfa_enabled) { throw new Error('MFA already disabled'); } // Mevcut TOTP kodunu doğrula const isValid = await verifyTotp(user.mfa_secret, totpCode); if (!isValid) { throw new Error('Invalid TOTP code'); } await sql.query` UPDATE dbo.users SET mfa_enabled = 0, mfa_secret = NULL, mfa_disabled_at = GETUTCDATE() WHERE user_id = ${userId} `; await sql.query` INSERT INTO dbo.audit_log (user_id, event_type, details) VALUES (${userId}, 'MFA_DISABLED_BY_USER', 'Self-service disable') `; };
Bu akış, hesap ele geçirilmesi durumunda saldırganın MFA'yı bypass etmesini engeller. Kod olmadan devre dışı bırakma mümkün değildir.
Admin Müdahalesi: MFA Reset
Kullanıcı TOTP cihazını kaybettiğinde veya uygulamasını sildiğinde, admin manuel reset yapabilir:
javascript // POST /auth/mfa/reset-admin const resetUserMfaAdmin = async (adminUserId, targetUserId, reason) => { // Sadece admin rolü bu endpoint'i çağırabilir const admin = await getUser(adminUserId); if (admin.role !== 'admin') { throw new Error('Unauthorized'); } await sql.query` UPDATE dbo.users SET mfa_enabled = 0, mfa_secret = NULL, mfa_reset_by_admin = ${adminUserId}, mfa_reset_at = GETUTCDATE() WHERE user_id = ${targetUserId} `; // Audit log'a kayıt zorunlu await sql.query` INSERT INTO dbo.audit_log (user_id, event_type, details, actor_user_id) VALUES (${targetUserId}, 'MFA_RESET_BY_ADMIN', 'Reason: ${reason}', ${adminUserId}) `; // Kullanıcıya email bildirimi gönder await sendEmail({ to: targetUser.email, subject: 'ShamashAi MFA Sıfırlandı', body: IT yöneticisi MFA ayarlarınızı sıfırladı. Bir sonraki girişinizde yeniden kurulum yapmanız gerekecek. }); };
Audit trail: Her admin müdahalesi dbo.audit_log tablosuna actor_user_id ile kaydedilir. Bu kayıtlar compliance denetimlerinde kritik öneme sahip.
Policy ve Compliance Entegrasyonu
ShamashAi'nin MFA policy motoru, ISO 27001:2022 ve KVKK gereksinimleriyle şu şekilde entegre çalışır:
ISO 27001:2022 Annex A.9.4.2 - Secure Log-on Procedures:
GET /compliance/evidence endpoint'i, MFA enrollment oranlarını ve policy seviyesini raporlar:
{ "control": "A.9.4.2", "evidence": { "mfa_policy": "admins", "admin_users_total": 8, "admin_users_mfa_enabled": 8, "compliance_rate": 100, "last_policy_change": "2026-09-15T14:22:00Z", "changed_by": "admin@firma.com" } }
KVKK Madde 12 - Teknik Tedbirler:
GET /reports/evidence-pack endpoint'i, denetim için PDF rapor üretir. Rapor şu verileri içerir:
- Policy değişiklik geçmişi (
dbo.audit_logtablosundan) - Kullanıcı bazında MFA aktivasyon tarihleri
- Admin reset müdahaleleri ve nedenleri
- Başarısız MFA doğrulama denemeleri (
AUTH_FAIL_MFAevent'leri)
Real-World Kullanım: 200 Kullanıcılı Finansal Kuruluş
Orta ölçekli bir finans şirketi, ShamashAi'yi 200 kullanıcı + 350 cihaz kapasitesiyle devreye aldı. İlk 30 gün policy "off" modda çalıştırıldı (test aşaması). 31. gün "admins" moduna geçildi:
- 12 admin kullanıcısı bir sonraki login'de enrollment'a yönlendirildi
- 9 kullanıcı ilk denemede başarıyla setup yaptı
- 2 kullanıcı QR code okutma sorunu yaşadı (mobil cihaz kamerası izni), IT destek müdahalesiyle çözüldü
- 1 kullanıcı TOTP uygulaması yerine SMS tabanlı çözüm istedi — ShamashAi TOTP-only desteklediği için eğitim verildi
Ölçülen güvenlik iyileşmesi:
dbo.events tablosunda event_type = 'AUTH_FAIL_USER' olan kayıtlar MFA aktifleşmesi sonrası %87 azaldı. Brute-force saldırıları artık sadece kullanıcı adı/şifre katmanını aşabiliyor, ancak TOTP katmanında duruyor.
Frontend Entegrasyonu: Next.js Login Flow
ShamashAi Next.js web paneli, MFA policy'yi şu şekilde enforce eder:
javascript // pages/login.jsx import { useState } from 'react'; import { useRouter } from 'next/router';
const LoginPage = () => { const [step, setStep] = useState('credentials'); // 'credentials' | 'mfa' | 'setup' const router = useRouter(); const handleCredentialsSubmit = async (email, password) => { const response = await fetch('/auth/login', { method: 'POST', body: JSON.stringify({ email, password }) }); const data = await response.json(); if (data.mfaRequired && !data.mfaSetup) { // Kullanıcının MFA'sı yok ama policy zorunlu kılıyor setStep('setup'); router.push('/auth/mfa/setup'); } else if (data.mfaRequired && data.mfaSetup) { // MFA kurulu, kod iste setStep('mfa'); } else { // MFA zorunlu değil, doğrudan dashboard router.push('/dashboard'); } }; // ... component render };
Policy "admins" veya "all" modundaysa ve kullanıcı henüz setup yapmamışsa, /auth/mfa/setup sayfası açılır. Bu sayfa /auth/mfa/setup/start endpoint'ini çağırarak QR code gösterir.
Limitler ve Dürüst Notlar
- SMS/Email OTP desteği yok: ShamashAi sadece TOTP standardını destekler. SMS tabanlı kod gönderimi veya email-based magic link gibi alternatif yöntemler mevcut değil. Kurumsal güvenlik perspektifinden TOTP daha güvenilir kabul edildiği için bu seçim bilinçli yapıldı.
- Hardware token entegrasyonu yok: YubiKey gibi FIDO2/WebAuthn hardware token'ları şu anda desteklenmiyor. Roadmap'te var ancak pilot programında mevcut değil.
- Backup codes sınırlı: Kullanıcı TOTP cihazını kaybettiğinde otomatik backup code üretimi yok. Admin müdahalesi ile reset gerekiyor. Gelecek sürümlerde self-service backup code özelliği eklenecek.
- Geolocation-based MFA bypass yok: Bazı enterprise SIEM'ler, güvenilir IP aralıklarından gelen login'lerde MFA'yı bypass eder. ShamashAi bu özelliği sunmuyor — policy aktifse her login'de MFA zorunlu.
- Session timeout yapılandırması: MFA doğrulaması sonrası session timeout süresi global ayar olarak 8 saate sabitlenmiş. Kullanıcı bazında veya rol bazında değiştirilemez. Müşteri geri bildirimleri doğrultusunda bu parametre yapılandırılabilir hale gelecek.
