Cloudflare ile Brute Force Saldırılarına Karşı Koruma

Brute force saldırıları, sistem yöneticilerinin kabusudur. Gece 3’te patlayan bir alarm, log dosyalarında binlerce başarısız giriş denemesi, kaynak IP’leri farklı ülkelerden gelen koordineli saldırılar… Bunlarla uğraşmadıysanız, ya çok şanslısınızdır ya da henüz fark etmediniz. Cloudflare’i sadece CDN veya DDoS koruması için kullananlar için bir haber: Platform, brute force saldırılarına karşı da oldukça güçlü araçlar sunuyor. Bu yazıda Cloudflare’in sunduğu koruma mekanizmalarını, gerçek dünya senaryolarıyla birlikte inceleyeceğiz.

Brute Force Saldırısı Nedir ve Neden Cloudflare Devreye Girmeli?

Brute force, basitçe şifre tahmin etme saldırısıdır. Saldırgan ya bilinen şifre listelerini dener (dictionary attack) ya da tüm kombinasyonları sistematik olarak geçer. Web uygulamalarında login endpoint’leri, API authentication noktaları ve admin panelleri başlıca hedeflerdir.

Normalde bu tür saldırılara karşı sunucu tarafında fail2ban, mod_security veya uygulama katmanında rate limiting kullanırsınız. Ancak bu yaklaşımların bir sorunu var: Saldırı trafiği sunucunuza ulaştıktan sonra devreye giriyor. Yani sunucunuz zaten o yükü kaldırmak zorunda. Cloudflare ise trafiği edge’de yani kendi ağında filtreler, saldırı paketleri hiç sunucunuza ulaşmaz.

Cloudflare’in Temel Koruma Katmanları

Brute force koruması için Cloudflare birkaç farklı mekanizma sunuyor. Bunları katmanlar halinde düşünmek mantıklı:

  • Rate Limiting: Belirli endpoint’lere gelen istek sayısını sınırlama
  • WAF (Web Application Firewall) Kuralları: Zararlı örüntüleri tespit etme
  • Firewall Rules: IP, ülke, ASN bazlı filtreleme
  • Bot Fight Mode: Bilinen bot trafiğini engelleme
  • Turnstile / CAPTCHA: Şüpheli kullanıcıları doğrulama
  • IP Access Rules: Whitelist/blacklist yönetimi

Şimdi bunların her birini nasıl yapılandıracağımıza bakalım.

Rate Limiting ile Login Endpoint’i Koruma

Rate limiting, brute force korumasının bel kemiğidir. Cloudflare dashboard’unda Security > WAF > Rate Limiting Rules bölümünden yapılandırılır.

Ancak Cloudflare API’si üzerinden de yönetebilirsiniz, ki bu production ortamlarında çok daha pratik:

# Cloudflare API ile rate limiting kuralı oluşturma
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rate_limits" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_KEY_BURAYA" 
  -H "Content-Type: application/json" 
  --data '{
    "disabled": false,
    "description": "Login endpoint brute force koruma",
    "match": {
      "request": {
        "methods": ["POST"],
        "schemes": ["HTTPS"],
        "url": "*.ornek.com/wp-login.php"
      },
      "response": {
        "status": [200, 401, 403],
        "headers": []
      }
    },
    "bypass": [],
    "threshold": 5,
    "period": 60,
    "action": {
      "mode": "ban",
      "timeout": 3600,
      "response": {
        "content_type": "text/plain",
        "body": "Cok fazla istek. Lutfen bir saat bekleyin."
      }
    }
  }'

Bu kural şunu yapıyor: /wp-login.php endpoint’ine 60 saniye içinde 5’ten fazla POST isteği gelen IP’yi 1 saat boyunca engelliyor. WordPress kullananlar için bu başlangıç noktası olabilir.

Mevcut Rate Limit Kurallarını Listeleme

# Mevcut rate limiting kurallarını görüntüle
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rate_limits" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_KEY_BURAYA" 
  -H "Content-Type: application/json" | python3 -m json.tool
# Belirli bir kuralı ID ile sil
curl -X DELETE "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rate_limits/RULE_ID" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_KEY_BURAYA"

Terraform ile Cloudflare Kurallarını Kod Olarak Yönetme

Birden fazla domain veya ortam yönetiyorsanız, Cloudflare kurallarını Terraform ile kodlamanızı öneririm. Bu sayede değişiklikler versiyon kontrolüne girer, review süreci olur.

# Terraform Cloudflare provider kurulumu
cat > providers.tf << 'EOF'
terraform {
  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "~> 4.0"
    }
  }
}

provider "cloudflare" {
  api_token = var.cloudflare_api_token
}
EOF

# Değişkenler
cat > variables.tf << 'EOF'
variable "cloudflare_api_token" {
  type      = string
  sensitive = true
}

variable "zone_id" {
  type = string
}
EOF
# Rate limiting ve firewall kuralları için Terraform konfigürasyonu
cat > cloudflare_security.tf << 'EOF'
# Login endpoint rate limiting
resource "cloudflare_rate_limit" "login_protection" {
  zone_id   = var.zone_id
  threshold = 5
  period    = 60
  
  match {
    request {
      url_pattern = "${var.domain}/login*"
      schemes     = ["HTTPS"]
      methods     = ["POST"]
    }
  }
  
  action {
    mode    = "ban"
    timeout = 3600
  }
  
  disabled    = false
  description = "Login brute force koruma - POST istekleri"
}

# Admin panel rate limiting (daha agresif)
resource "cloudflare_rate_limit" "admin_protection" {
  zone_id   = var.zone_id
  threshold = 3
  period    = 60
  
  match {
    request {
      url_pattern = "${var.domain}/admin*"
      schemes     = ["HTTPS"]
      methods     = ["POST", "GET"]
    }
  }
  
  action {
    mode    = "ban"
    timeout = 7200
  }
  
  disabled    = false
  description = "Admin panel brute force koruma"
}
EOF

WAF Özel Kuralları ile Gelişmiş Filtreleme

Cloudflare WAF, sadece rate limiting değil, request içeriğine göre de filtreleme yapmanızı sağlar. Örneğin User-Agent bazlı filtreleme veya belirli payload örüntülerini yakalama:

# WAF custom rule - şüpheli User-Agent'ları engelle
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/firewall/rules" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_KEY_BURAYA" 
  -H "Content-Type: application/json" 
  --data '[
    {
      "filter": {
        "expression": "(http.request.uri.path contains "/login" and http.user_agent contains "python-requests") or (http.request.uri.path contains "/login" and http.user_agent contains "curl") or (http.request.uri.path contains "/login" and http.user_agent eq "")",
        "description": "Brute force arac User-Agent engelleme"
      },
      "action": "block",
      "description": "Otomatik brute force araclari engelle"
    }
  ]'

Bu kural, /login endpoint’ine python-requests, curl veya boş User-Agent ile gelen istekleri engelliyor. Gerçek kullanıcılar bu User-Agent’larla gelmiyor zaten.

Ülke Bazlı Kısıtlama

Eğer uygulamanız sadece belirli ülkelere hizmet veriyorsa, diğer ülkelerden gelen login denemelerini challenge’a tabi tutabilirsiniz:

# Sadece Türkiye ve AB ülkelerinden login'e izin ver, diğerlerini challenge et
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/firewall/rules" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_KEY_BURAYA" 
  -H "Content-Type: application/json" 
  --data '[
    {
      "filter": {
        "expression": "(http.request.uri.path contains "/login" or http.request.uri.path contains "/wp-admin") and not (ip.geoip.country in {"TR" "DE" "FR" "GB" "NL" "SE" "NO"})",
        "description": "Yurt disi login challenge"
      },
      "action": "managed_challenge",
      "description": "Izin verilmeyen ulkelerden login challenge"
    }
  ]'

Bot Fight Mode ve Super Bot Fight Mode

Cloudflare’in Bot Fight Mode özelliği, bilinen kötü botları otomatik olarak engeller. Free planda temel bot koruması var, Pro ve üzeri planlarda Super Bot Fight Mode devreye giriyor.

Dashboard üzerinden aktif etmek yerine, API ile de yönetebilirsiniz:

# Bot Fight Mode durumunu kontrol et
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/bot_management" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json"

# Bot Fight Mode'u aktif et (Enterprise plan)
curl -X PUT "https://api.cloudflare.com/client/v4/zones/ZONE_ID/bot_management" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "enable_js": true,
    "fight_mode": true,
    "optimize_wordpress": true,
    "sbfm_likely_automated": "managed_challenge",
    "sbfm_definitely_automated": "block",
    "sbfm_verified_bots": "allow",
    "sbfm_static_resource_protection": false
  }'

enable_js: JavaScript challenge’ı aktif eder fight_mode: Temel bot engellemeyi açar sbfm_likely_automated: Muhtemelen bot olan trafiğe challenge uygular sbfm_definitely_automated: Kesinlikle bot olan trafiği engeller sbfm_verified_bots: Google, Bing gibi doğrulanmış botlara izin verir

Gerçek Dünya Senaryosu: E-ticaret Sitesi Saldırısı

Birkaç ay önce bir e-ticaret müşterimizin sitesi yoğun bir credential stuffing saldırısına uğradı. Saldırganlar, başka sitelerden sızdırılmış kullanıcı/şifre listelerini deniyordu. Log’lara baktığımızda:

  • 48 saatte 2.3 milyon login denemesi
  • 847 farklı IP adresinden
  • 63 farklı ülkeden koordineli saldırı
  • Her IP’den yaklaşık 2700 deneme

Bu durumda tek bir IP’yi engellemek işe yaramıyor. Şöyle bir strateji uyguladık:

#!/bin/bash
# Cloudflare log analizi ve otomatik engelleme scripti
# Bu script Cloudflare Logpush verilerini analiz eder

ZONE_ID="zone_id_buraya"
API_TOKEN="token_buraya"
THRESHOLD=100  # 1 saatte 100 istek eşiği

# Son 1 saatin loglarını analiz et (Logpush S3/R2'den geldiğini varsayıyoruz)
# Yüksek frekanslı IP'leri bul
cat /var/log/cloudflare/access.log | 
  grep "POST /login" | 
  awk '{print $1}' | 
  sort | uniq -c | sort -rn | 
  awk -v threshold="$THRESHOLD" '$1 > threshold {print $2}' > /tmp/suspicious_ips.txt

echo "Şüpheli IP sayısı: $(wc -l < /tmp/suspicious_ips.txt)"

# Her şüpheli IP için Cloudflare'e engelleme kuralı ekle
while IFS= read -r ip; do
  echo "Engelleniyor: $ip"
  
  curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/access_rules/rules" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data "{
      "mode": "block",
      "configuration": {
        "target": "ip",
        "value": "${ip}"
      },
      "notes": "Otomatik engelleme - brute force - $(date)"
    }" > /dev/null
    
  sleep 0.5  # API rate limit'e takılmamak için
done < /tmp/suspicious_ips.txt

echo "Engelleme tamamlandı."

Bu script’i cron ile her saat çalıştırdık. Saldırının etkisi ilk 2 saatte %94 azaldı.

Cloudflare Turnstile ile CAPTCHA Entegrasyonu

Geleneksel CAPTCHA’lar kullanıcı deneyimini bozuyor. Cloudflare Turnstile, kullanıcıya görünmez bir şekilde bot kontrolü yapıyor. Login formunuza entegre etmek için:

# Turnstile site key ve secret key alma (API ile)
curl -X POST "https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/challenges/widgets" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "label": "Login Form Koruması",
    "domains": ["ornek.com"],
    "mode": "managed",
    "bot_fight_mode": true
  }'

Turnstile token doğrulama (backend tarafında):

# Turnstile token doğrulama - curl ile test
TURNSTILE_SECRET="secret_key_buraya"
TOKEN="kullanicidan_gelen_token"
USER_IP="kullanici_ip_adresi"

curl -X POST "https://challenges.cloudflare.com/turnstile/v0/siteverify" 
  -H "Content-Type: application/json" 
  --data "{
    "secret": "${TURNSTILE_SECRET}",
    "response": "${TOKEN}",
    "remoteip": "${USER_IP}"
  }"

Başarılı doğrulamada şöyle bir yanıt gelir:

# Örnek başarılı doğrulama yanıtı
{
  "success": true,
  "challenge_ts": "2024-01-15T10:30:00.000Z",
  "hostname": "ornek.com",
  "error-codes": [],
  "action": "login",
  "cdata": ""
}

Log Analizi ve Monitoring

Brute force saldırısı olup olmadığını nasıl anlarsınız? Cloudflare Analytics API’si ile bunu izleyebilirsiniz:

# GraphQL ile Cloudflare güvenlik olaylarını sorgula
curl -X POST "https://api.cloudflare.com/client/v4/graphql" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "query": "{ viewer { zones(filter: {zoneTag: "ZONE_ID"}) { firewallEventsAdaptive(filter: { datetime_geq: "2024-01-15T00:00:00Z", datetime_leq: "2024-01-15T23:59:59Z", action: "block" }, limit: 1000, orderBy: [datetime_DESC]) { action clientAsn clientCountryName clientIP clientRequestHTTPHost clientRequestHTTPMethodName clientRequestPath datetime rayName userAgent } } } }"
  }' | python3 -m json.tool

Bu sorgu, son 24 saatte engellenen tüm istekleri getiriyor. Hangi IP’lerden, hangi ülkelerden, hangi endpoint’lere saldırı geldiğini görebilirsiniz.

Fail2ban ile Cloudflare Entegrasyonu

Sunucu tarafındaki fail2ban ile Cloudflare’i entegre ederek katmanlı bir koruma oluşturabilirsiniz. Fail2ban bir IP tespit ettiğinde otomatik olarak Cloudflare’e de eklesin:

# /etc/fail2ban/action.d/cloudflare.conf dosyası
cat > /etc/fail2ban/action.d/cloudflare-ban.conf << 'EOF'
[Definition]
actionban = curl -s -X POST "https://api.cloudflare.com/client/v4/zones/<zone_id>/firewall/access_rules/rules" 
            -H "X-Auth-Email: <cfuser>" 
            -H "X-Auth-Key: <cftoken>" 
            -H "Content-Type: application/json" 
            --data '{"mode":"block","configuration":{"target":"ip","value":"<ip>"},"notes":"fail2ban auto-block"}'

actionunban = CF_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<zone_id>/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>" 
              -H "X-Auth-Email: <cfuser>" -H "X-Auth-Key: <cftoken>" | python3 -c "import sys,json; data=json.load(sys.stdin); print(data['result'][0]['id']) if data['result'] else print('')") && 
              [ -n "$CF_ID" ] && curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/<zone_id>/firewall/access_rules/rules/$CF_ID" 
              -H "X-Auth-Email: <cfuser>" -H "X-Auth-Key: <cftoken>"

[Init]
cfuser = [email protected]
cftoken = api_key_buraya
zone_id = zone_id_buraya
EOF
# Jail konfigürasyonu - fail2ban ile web uygulaması koruması
cat >> /etc/fail2ban/jail.local << 'EOF'
[web-login-brute]
enabled  = true
port     = http,https
filter   = web-login-brute
logpath  = /var/log/nginx/access.log
maxretry = 10
findtime = 300
bantime  = 86400
action   = cloudflare-ban[zone_id="ZONE_ID", cfuser="[email protected]", cftoken="API_KEY"]
           iptables-multiport[name=web, port="80,443"]
EOF

Güvenlik Seviyesini Dinamik Olarak Ayarlama

Cloudflare’de “Under Attack Mode” adı verilen bir özellik var. Saldırı altındayken bunu otomatik devreye alabilirsiniz:

#!/bin/bash
# Saldırı tespitinde otomatik koruma modu scripti

ZONE_ID="zone_id"
API_TOKEN="api_token"
THRESHOLD=1000  # dakikada 1000 istek eşiği
LOG_FILE="/var/log/nginx/access.log"

# Son 1 dakikadaki istek sayısını hesapla
CURRENT_RPS=$(tail -n 5000 "$LOG_FILE" | 
  awk 'BEGIN{cmd="date -d "1 minute ago" +"%d/%b/%Y:%H:%M""} 
  {cmd | getline threshold; close(cmd)} 
  $4 > "["threshold {count++} END{print count}')

echo "Mevcut istek oranı: ${CURRENT_RPS}/dk"

if [ "$CURRENT_RPS" -gt "$THRESHOLD" ]; then
  echo "UYARI: Yüksek trafik tespit edildi! Under Attack Mode aktif ediliyor..."
  
  curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/security_level" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"value": "under_attack"}'
    
  # Slack/Telegram bildirim gönder
  curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" 
    --data "chat_id=${CHAT_ID}&text=UYARI: Site saldırı altında! Under Attack Mode aktif edildi. RPS: ${CURRENT_RPS}"
    
else
  # Normal seviyeye dön
  curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/security_level" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"value": "medium"}'
fi

Bu script’i crontab’a /5 * şeklinde ekleyerek her 5 dakikada bir çalıştırabilirsiniz.

Whitelist Yönetimi: Meşru Trafiği Koruma Altına Alma

Brute force koruması kurarken en büyük sorun meşru kullanıcıları yanlışlıkla engellemek. Bunu önlemek için:

# Meşru IP aralıklarını whitelist'e ekle (ofis IP'leri, VPN, vb.)
#!/bin/bash

ZONE_ID="zone_id"
API_TOKEN="api_token"

# Whitelist edilecek IP'ler
WHITELIST_IPS=(
  "85.123.45.0/24"    # Ankara ofis
  "176.234.56.0/24"   # İstanbul ofis
  "10.0.0.0/8"        # VPN ağı
)

for ip in "${WHITELIST_IPS[@]}"; do
  echo "Whitelist'e ekleniyor: $ip"
  
  curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/access_rules/rules" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data "{
      "mode": "whitelist",
      "configuration": {
        "target": "ip_range",
        "value": "${ip}"
      },
      "notes": "Ofis/VPN whitelist - $(date)"
    }"
    
  sleep 0.3
done

echo "Whitelist güncelleme tamamlandı."

Dikkat Edilmesi Gereken Noktalar

Cloudflare yapılandırmasında sıkça yapılan hatalar ve bunları nasıl önleyeceğiniz:

  • Orange Cloud olmayan kayıtlar korunmaz: DNS kaydı Cloudflare üzerinden geçmiyorsa hiçbir kural uygulanmaz. Tüm A ve AAAA kayıtlarının proxied durumda olduğunu kontrol edin.
  • Cache ile rate limiting çakışması: Cloudflare cache’den dönen yanıtlar rate limiting sayacına dahil edilmez. Login endpoint’lerinin cache’lenmediğinden emin olun, Cache-Control: no-store header’ı ekleyin.
  • IP adresi tespiti sorunu: Eğer uygulamanız gerçek kullanıcı IP’sini almak istiyorsa CF-Connecting-IP header’ını kullanmalısınız. X-Forwarded-For Cloudflare’in kendi IP’sini gösterebilir.
  • Free plan kısıtlamaları: Free planda rate limiting kuralı sayısı sınırlıdır. Kritik endpoint’lere odaklanın, her şeyi kapsamaya çalışmayın.
  • Yanlış eşik değerleri: Çok agresif rate limiting meşru kullanıcıları etkiler. Önce log modunda başlatın, istatistikleri inceleyin, sonra block moduna geçin.

Sonuç

Cloudflare, brute force saldırılarına karşı gerçekten güçlü bir araç seti sunuyor. Ancak bu araçları doğru yapılandırmak ve birbirleriyle uyumlu çalışmalarını sağlamak kritik önem taşıyor. Özetlemek gerekirse:

  • Rate limiting ile login endpoint’lerinizi koruyun, eşik değerlerini gerçek trafik verilerine göre ayarlayın
  • WAF kurallarıyla bilinen saldırı araçlarını ve örüntülerini engelleyin
  • Bot Fight Mode’u aktif edin, otomatik trafik büyük ölçüde azalacak
  • Turnstile ile kullanıcı deneyimini bozmadan bot doğrulaması yapın
  • Fail2ban entegrasyonuyla sunucu ve CDN katmanlarını birleştirin
  • Whitelist’i ihmal etmeyin, meşru trafiği koruma altına alın
  • Monitoring ve alerting kurun, saldırıdan haberdar olmak için beklemek olmaz

Tüm bu katmanları birlikte kullandığınızda, brute force saldırıları sunucunuza ulaşmadan Cloudflare’in edge ağında eritilip gidiyor. Sunucunuz rahat nefes alıyor, siz de gece 3’te alarm yerine uyku sesi duyuyorsunuz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir