Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

Credential Stuffing Saldırılarına Karşı Koruma Yöntemleri

Merhaba değerli okuyucular! Bugün, siber güvenlik dünyasının güncel ve ciddi tehditlerinden biri olan credential stuffing saldırıları ve bunlara karşı alınabilecek koruma yöntemleri hakkında konuşacağız. Bu saldırı türü, kullanıcı hesaplarını hedef alarak ciddi güvenlik ihlallerine yol açabilir. Hadi, bu önemli konuyu derinlemesine inceleyelim!

Credential Stuffing Nedir?

Credential stuffing, saldırganların ele geçirilmiş kullanıcı adı ve şifre kombinasyonlarını kullanarak çeşitli web sitelerinde ve uygulamalarda oturum açmaya çalıştığı bir siber saldırı türüdür. Bu saldırı, kullanıcıların aynı kimlik bilgilerini birden fazla platformda kullanma eğiliminden faydalanır.

Credential Stuffing Saldırılarının Tehlikeleri

  1. Hesap Ele Geçirme: Başarılı bir saldırı, kullanıcı hesaplarının kontrolünü ele geçirebilir.
  2. Veri Hırsızlığı: Saldırganlar, ele geçirilen hesaplardan hassas bilgileri çalabilir.
  3. Finansal Kayıplar: Özellikle e-ticaret ve finans platformlarında maddi zararlara yol açabilir.
  4. İtibar Kaybı: Saldırıya uğrayan şirketler ciddi itibar kaybı yaşayabilir.

Credential Stuffing'e Karşı Koruma Yöntemleri

1. Multi-Factor Authentication (MFA) Uygulama

MFA, credential stuffing saldırılarına karşı en etkili savunma mekanizmalarından biridir.


// Node.js ve Express ile basit bir MFA implementasyonu örneği
const express = require('express');
const speakeasy = require('speakeasy');

const app = express();

app.post('/login', (req, res) => {
  const { username, password, token } = req.body;

  // Kullanıcı adı ve şifre doğrulama
  if (authenticateUser(username, password)) {
    // MFA token doğrulama
    const verified = speakeasy.totp.verify({
      secret: getUserSecret(username),
      encoding: 'base32',
      token: token
    });

    if (verified) {
      res.json({ success: true, message: 'Login successful' });
    } else {
      res.status(401).json({ success: false, message: 'Invalid MFA token' });
    }
  } else {
    res.status(401).json({ success: false, message: 'Invalid credentials' });
  }
});

2. Brute Force Koruması ve Rate Limiting

Kısa sürede çok sayıda giriş denemesini engellemek için rate limiting uygulayın.


// Express.js ile rate limiting örneği
const rateLimit = require("express-rate-limit");

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 dakika
  max: 5, // IP başına maksimum 5 deneme
  message: "Too many login attempts, please try again later."
});

app.post("/login", loginLimiter, (req, res) => {
  // Login işlemleri
});

3. CAPTCHA Uygulaması

CAPTCHA, otomatik giriş denemelerini engellemede etkili bir yöntemdir.


// Google reCAPTCHA v3 ile örnek uygulama
const axios = require('axios');

app.post('/login', async (req, res) => {
  const { username, password, recaptchaToken } = req.body;

  // reCAPTCHA doğrulama
  const recaptchaVerify = await axios.post(
    `https://www.google.com/recaptcha/api/siteverify?secret=${RECAPTCHA_SECRET_KEY}&response=${recaptchaToken}`
  );

  if (recaptchaVerify.data.success) {
    // Login işlemleri
  } else {
    res.status(400).json({ success: false, message: 'CAPTCHA verification failed' });
  }
});

4. Anomali Tespiti ve Davranış Analizi

Kullanıcı davranışlarını analiz ederek şüpheli aktiviteleri tespit edin.


// Basit bir anomali tespit fonksiyonu örneği
function detectAnomaly(user, loginAttempt) {
  const userNormalBehavior = getUserNormalBehavior(user);
  
  if (loginAttempt.location !== userNormalBehavior.usualLocation) {
    return true;
  }
  
  if (loginAttempt.device !== userNormalBehavior.usualDevice) {
    return true;
  }
  
  if (loginAttempt.time > userNormalBehavior.usualLoginTime + 3600000) { // 1 saat fark
    return true;
  }
  
  return false;
}

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  
  if (authenticateUser(username, password)) {
    if (detectAnomaly(username, req.body)) {
      // Ek doğrulama iste veya bildiri gönder
    } else {
      // Normal login işlemi
    }
  } else {
    res.status(401).json({ success: false, message: 'Invalid credentials' });
  }
});

5. Güçlü Şifre Politikaları

Kullanıcıları güçlü ve benzersiz şifreler kullanmaya teşvik edin.


// Şifre gücü kontrol fonksiyonu örneği
function isStrongPassword(password) {
  const minLength = 12;
  const hasUpperCase = /[A-Z]/.test(password);
  const hasLowerCase = /[a-z]/.test(password);
  const hasNumbers = /d/.test(password);
  const hasSpecialChars = /[!@#$%^&*(),.?":{}|<>]/.test(password);

  return password.length >= minLength &&
         hasUpperCase &&
         hasLowerCase &&
         hasNumbers &&
         hasSpecialChars;
}

app.post('/register', (req, res) => {
  const { username, password } = req.body;

  if (!isStrongPassword(password)) {
    return res.status(400).json({ success: false, message: 'Password does not meet security requirements' });
  }

  // Kullanıcı kaydı işlemleri
});

6. Düzenli Güvenlik Denetimleri ve Log Analizi

Sistemlerinizi düzenli olarak denetleyin ve log kayıtlarını analiz edin.


// Log analizi için basit bir örnek
const fs = require('fs');
const readline = require('readline');

async function analyzeLoginLogs() {
  const fileStream = fs.createReadStream('login.log');
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });

  const ipAttempts = new Map();

  for await (const line of rl) {
    const [ip, timestamp, success] = line.split('|');
    if (!ipAttempts.has(ip)) {
      ipAttempts.set(ip, { attempts: 0, failures: 0 });
    }
    ipAttempts.get(ip).attempts++;
    if (success === 'false') {
      ipAttempts.get(ip).failures++;
    }
  }

  for (const [ip, data] of ipAttempts.entries()) {
    if (data.attempts > 100 && data.failures / data.attempts > 0.9) {
      console.log(`Suspicious activity detected from IP: ${ip}`);
      // Alarm veya blok mekanizması
    }
  }
}

analyzeLoginLogs();

İleri Düzey Koruma Yöntemleri

1. Web Application Firewall (WAF) Kullanımı

WAF, credential stuffing saldırılarını tespit edip engelleyebilir.


// AWS WAF için örnek CloudFormation şablonu
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS WAF with Credential Stuffing Protection'

Resources:
  MyWebACL:
    Type: 'AWS::WAF::WebACL'
    Properties:
      Name: 'CredentialStuffingProtection'
      DefaultAction:
        Type: 'ALLOW'
      Rules:
        - Action:
            Type: 'BLOCK'
          Priority: 1
          RuleId: !Ref CredentialStuffingRule

  CredentialStuffingRule:
    Type: 'AWS::WAF::Rule'
    Properties:
      Name: 'DetectCredentialStuffing'
      MetricName: 'DetectCredentialStuffing'
      Predicates:
        - DataId: !Ref CredentialStuffingRateBasedSet
          Negated: false
          Type: 'RateBasedRule'

  CredentialStuffingRateBasedSet:
    Type: 'AWS::WAF::RateBasedRule'
    Properties:
      Name: 'CredentialStuffingRateLimit'
      MetricName: 'CredentialStuffingRateLimit'
      RateKey: 'IP'
      RateLimit: 100

2. Honeypot Hesapları

Sahte hesaplar oluşturarak saldırganları tuzağa düşürün ve tespit edin.


// Honeypot hesap kontrolü örneği
const honeypotAccounts = new Set(['honeypot1', 'honeypot2', 'honeypot3']);

app.post('/login', (req, res) => {
  const { username, password } = req.body;

  if (honeypotAccounts.has(username)) {
    console.log(`Potential credential stuffing attack detected: ${req.ip} tried to access honeypot account ${username}`);
    // Alarm mekanizması veya IP bloklama
    return res.status(401).json({ success: false, message: 'Invalid credentials' });
  }

  // Normal login işlemleri
});

3. Makine Öğrenimi ile Anormal Davranış Tespiti

Makine öğrenimi algoritmaları kullanarak daha sofistike anormal davranış tespiti yapın.


// TensorFlow.js ile basit bir anormal davranış tespit modeli örneği
const tf = require('@tensorflow/tfjs-node');

async function createModel() {
  const model = tf.sequential();
  model.add(tf.layers.dense({ units: 64, activation: 'relu', inputShape: [4] }));
  model.add(tf.layers.dense({ units: 1, activation: 'sigmoid' }));
  model.compile({ optimizer: 'adam', loss: 'binaryCrossentropy' });
  return model;
}

async function trainModel(model, data) {
  const { inputs, labels } = data;
  await model.fit(inputs, labels, { epochs: 100 });
}

async function detectAnomaly(model, loginAttempt) {
  const input = tf.tensor2d([loginAttempt]);
  const prediction = await model.predict(input);
  return prediction.dataSync()[0] > 0.5;
}

// Kullanım
(async () => {
  const model = await createModel();
  await trainModel(model, trainingData);

  app.post('/login', async (req, res) => {
    const loginAttempt = [
      req.body.time,
      req.body.location,
      req.body.device,
      req.body.browser
    ];

    if (await detectAnomaly(model, loginAttempt)) {
      // Şüpheli giriş tespiti
    } else {
      // Normal login işlemi
    }
  });
})();

Çok Katmanlı Güvenlik Yaklaşımı

Credential stuffing saldırılarına karşı etkili bir koruma sağlamak için, yukarıda bahsedilen yöntemlerin birçoğunu bir arada kullanmak en iyi yaklaşımdır. Güvenlik, tek bir önlemle sağlanamaz; çok katmanlı bir savunma stratejisi gerektirir.

Unutmayın ki, siber güvenlik sürekli evrim geçiren bir alandır. Saldırganlar sürekli yeni yöntemler geliştirirken, savunma mekanizmalarımızı da güncel tutmamız gerekir. Düzenli güvenlik değerlendirmeleri yapmak, en son tehditleri takip etmek ve sistemlerimizi sürekli olarak iyileştirmek, güvenli bir dijital ortam sağlamanın anahtarıdır.

Umarım bu yazı, credential stuffing saldırılarına karşı koruma yöntemleri hakkında size değerli bilgiler sunmuştur. Sorularınız veya eklemek istedikleriniz varsa, yorum bölümünde bekliyorum. Güvenli kodlamalar!