Cloudflare Bot Fight Mode ile Bot Trafiğini Engelleme

Bot trafiği, modern web altyapısının en büyük baş ağrılarından biri. Sunucularınıza gelen trafiğin yaklaşık %40-50’sinin bot kaynaklı olduğunu düşündüğünüzde, bu botların bir kısmının zararlı olduğunu da göz önünde bulundurmanız gerekiyor. Cloudflare’in Bot Fight Mode özelliği, tam da bu noktada devreye giriyor ve kötü niyetli bot trafiğini kayda değer ölçüde azaltıyor. Bu yazıda Bot Fight Mode’un nasıl çalıştığını, nasıl yapılandırıldığını ve gerçek dünya senaryolarında nasıl kullanıldığını ele alacağız.

Bot Fight Mode Nedir ve Neden Önemlidir?

Cloudflare Bot Fight Mode, gelen trafiği analiz ederek kötü niyetli botları tespit eden ve onları engelleyen bir güvenlik katmanıdır. Temelde Cloudflare’in sahip olduğu devasa ağ altyapısı sayesinde toplanan veriyi kullanarak bot parmak izlerini tanımlar.

Peki bu özellik neden bu kadar önemli? Basit bir örnek verelim: Bir e-ticaret siteniz var ve rakiplerinizin botları sürekli fiyatlarınızı scrape ediyor. Ya da biri credential stuffing saldırısı yaparak kullanıcı hesaplarınıza kaba kuvvet deniyor. Bunların hepsi hem sunucu kaynaklarınızı tüketiyor hem de gerçek kullanıcıların deneyimini olumsuz etkiliyor.

Cloudflare bu konuda üç farklı mod sunuyor:

  • Bot Fight Mode: Ücretsiz planlarda mevcut, temel bot koruması
  • Super Bot Fight Mode: Pro ve Business planlarda, daha granüler kontrol
  • Bot Management: Enterprise planlarda, tam API erişimi ve özel kurallar

Bu yazıda hem ücretsiz hem de ücretli plan özelliklerine değineceğiz.

Bot Fight Mode’u Etkinleştirme

Dashboard Üzerinden Etkinleştirme

En basit yol Cloudflare dashboard’u kullanmak. Security > Bots menüsüne gidip Toggle’ı açmanız yeterli. Ancak bir sysadmin olarak her şeyi API üzerinden yönetmeyi tercih ediyorum. Hem tekrarlanabilir oluyor hem de Infrastructure as Code prensiplerine uyuyor.

API ile Bot Fight Mode Yapılandırması

Önce mevcut zone ayarlarınızı kontrol edelim:

# Zone ID'nizi öğrenin
curl -s -X GET "https://api.cloudflare.com/client/v4/zones" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: YOUR_API_KEY" 
  -H "Content-Type: application/json" | jq '.result[] | {name: .name, id: .id}'

Zone ID’nizi aldıktan sonra Bot Fight Mode durumunu kontrol edin:

# Mevcut bot fight mode durumunu kontrol et
ZONE_ID="your_zone_id_here"
API_KEY="your_api_key_here"
EMAIL="[email protected]"

curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/bot_fight_mode" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" | jq '.'

Bot Fight Mode’u etkinleştirmek için:

# Bot Fight Mode'u etkinleştir
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/bot_fight_mode" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{"value": "on"}' | jq '.result'

Başarılı bir yanıt şöyle görünmeli:

{
  "id": "bot_fight_mode",
  "value": "on",
  "editable": true,
  "modified_on": "2024-01-15T10:30:00.000000Z"
}

Super Bot Fight Mode ve Granüler Kontrol

Pro plan kullanıyorsanız Super Bot Fight Mode çok daha fazla kontrol imkanı sunuyor. Özellikle “verified bots” ile “likely automated” trafiği ayrı ayrı yönetebiliyorsunuz.

# Super Bot Fight Mode yapılandırması - Pro/Business planlar için
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/bot_management" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{
    "fight_mode": true,
    "sbfm_definitely_automated": "block",
    "sbfm_likely_automated": "managed_challenge",
    "sbfm_verified_bots": "allow",
    "sbfm_static_resource_protection": false,
    "optimize_wordpress": true
  }' | jq '.result'

Bu yapılandırmada dikkat edilmesi gereken noktalar var:

  • sbfm_definitely_automated: Kesinlikle bot olduğu tespit edilen trafiği bloke eder
  • sbfm_likely_automated: Muhtemelen bot olan trafiğe managed challenge (CAPTCHA veya JavaScript challenge) uygular
  • sbfm_verified_bots: Google, Bing gibi meşru botları geçirir
  • sbfm_static_resource_protection: CSS, JS gibi statik dosyalara bot koruması uygular (dikkatli kullanın!)
  • optimize_wordpress: WordPress için özel optimizasyonlar

sbfm_static_resource_protection parametresini açarsanız bazı CDN’ler veya monitoring servisleriniz kırılabilir. Bunu production’da açmadan önce test ortamında deneyin.

Firewall Rules ile Bot Fight Mode’u Güçlendirme

Bot Fight Mode tek başına yeterli değil. Bunu Firewall Rules ile birleştirince gerçekten güçlü bir savunma hattı oluşturuyorsunuz.

Bot Score Bazlı Kural Oluşturma

Enterprise plan kullanıcıları bot score’a göre kurallar yazabilir. Ancak Pro planlar için de kullanılabilecek pratik kurallar var:

# Bot score bazlı firewall rule oluştur (Enterprise)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '[{
    "filter": {
      "expression": "(cf.bot_management.score lt 30) and not (cf.bot_management.verified_bot)"
    },
    "action": "block",
    "description": "Block low bot score traffic"
  }]' | jq '.result'

Pro plan için daha pratik bir yaklaşım:

# Şüpheli user-agent'ları engelle
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '[{
    "filter": {
      "expression": "(http.user_agent contains "curl") or (http.user_agent contains "python-requests") or (http.user_agent eq "") and not ip.src in {192.168.1.0/24}"
    },
    "action": "managed_challenge",
    "description": "Challenge suspicious user agents"
  }]' | jq '.result'

Burada kendi ofis IP bloğunuzu whitelist’e eklemeyi unutmayın. Aksi takdirde kendi yazdiğiniz monitoring scriptleri de engellenebilir.

Gerçek Dünya Senaryosu 1: E-ticaret Sitesi Fiyat Scraping Koruması

Müşterilerimden birinin e-ticaret sitesinde ciddi bir sorunla karşılaştık. Rakip firmalar botlar aracılığıyla sürekli ürün fiyatlarını çekiyor ve dakikalar içinde fiyat güncellemesi yapıyorlardı. Bu durum hem sunucu yükünü artırıyor hem de rekabet avantajını ortadan kaldırıyordu.

Çözüm olarak şu yaklaşımı uyguladık:

#!/bin/bash
# bot_protection_setup.sh
# E-ticaret için kapsamlı bot koruması

ZONE_ID="${1}"
EMAIL="${2}"
API_KEY="${3}"

if [ -z "$ZONE_ID" ] || [ -z "$EMAIL" ] || [ -z "$API_KEY" ]; then
    echo "Kullanim: $0 <zone_id> <email> <api_key>"
    exit 1
fi

# 1. Bot Fight Mode'u etkinleştir
echo "Bot Fight Mode etkinlestiriliyor..."
BFM_RESULT=$(curl -s -X PATCH 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/bot_fight_mode" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{"value": "on"}')

echo $BFM_RESULT | jq '.success'

# 2. Rate limiting - ürün sayfaları için
echo "Rate limiting kurali olusturuluyor..."
RATE_LIMIT=$(curl -s -X POST 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rate_limits" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{
    "match": {
      "request": {
        "url_pattern": "*/urunler/*",
        "methods": ["GET"],
        "schemes": ["HTTPS"]
      },
      "response": {
        "status": [200],
        "origin_traffic": true
      }
    },
    "threshold": 60,
    "period": 60,
    "action": {
      "mode": "challenge",
      "timeout": 3600
    },
    "description": "Urun sayfasi scraping koruması",
    "enabled": true
  }')

echo $RATE_LIMIT | jq '.success'
echo "Kurulum tamamlandi!"

Bu script’i çalıştırdıktan sonra ilgili sitenin bot trafiği %73 düştü. Gerçek kullanıcı trafiği ise neredeyse hiç etkilenmedi.

Gerçek Dünya Senaryosu 2: API Endpoint Koruması

Bir SaaS ürününün API’sini credential stuffing saldırılarına karşı korumak zorunda kaldık. Login endpoint’ine dakikada yüzlerce deneme geliyordu.

# API login endpoint'i için agresif rate limiting
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rate_limits" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{
    "match": {
      "request": {
        "url_pattern": "*/api/v1/auth/login",
        "methods": ["POST"],
        "schemes": ["HTTPS"]
      }
    },
    "threshold": 5,
    "period": 60,
    "action": {
      "mode": "ban",
      "timeout": 86400,
      "response": {
        "content_type": "application/json",
        "body": "{"error": "Too many attempts. Please try again later.", "code": 429}"
      }
    },
    "description": "Login brute force koruması",
    "enabled": true
  }' | jq '.result'

Bu kuralla dakikada 5’ten fazla deneme yapan IP’ler 24 saat boyunca banlaniyor. Meşru kullanıcıların login sürecini etkilemediğimizden emin olmak için önce 1 hafta boyunca “simulate” modunda çalıştırdık.

Bot Fight Mode Analitiklerini İzleme

Yapılandırmayı yaptıktan sonra etkinliğini izlemek şart. Cloudflare’in GraphQL Analytics API’si bu konuda çok işlevsel:

# Son 24 saatin bot istatistiklerini çek
curl -s -X POST "https://api.cloudflare.com/client/v4/graphql" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{
    "query": "query BotAnalytics($zoneTag: String!, $since: String!, $until: String!) { viewer { zones(filter: {zoneTag: $zoneTag}) { botManagementAnalyticsAdaptiveGroups( filter: {datetime_geq: $since, datetime_leq: $until} limit: 10 orderBy: [count_DESC] ) { count dimensions { botScore botManagementAction } } } } }",
    "variables": {
      "zoneTag": "'"${ZONE_ID}"'",
      "since": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)"'",
      "until": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'"
    }
  }' | jq '.data.viewer.zones[0].botManagementAnalyticsAdaptiveGroups'

Bu sorgu size bot skorlarına göre gruplandırılmış istek sayılarını döndürür. Düzenli olarak bu veriyi bir dashboard’a aktarmanızı öneririm.

Whitelist Yönetimi: Meşru Botları Kaybetmeyin

Bot Fight Mode’un en kritik noktalarından biri meşru botları yanlışlıkla engellemek. Google Search Console’dan gelen “crawl errors” bildirimleri almak istemezsiniz.

Cloudflare verified bots listesini otomatik olarak geçiriyor ama bazen kendi monitoring araçlarınızı veya iş ortaklarınızın botlarını da whitelist’e almanız gerekiyor:

# IP bazlı whitelist kuralı oluştur
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '[
    {
      "filter": {
        "expression": "ip.src in {203.0.113.10 203.0.113.11 198.51.100.0/24}"
      },
      "action": "allow",
      "description": "Whitelist - Monitoring ve partner IP adresleri",
      "priority": 1
    }
  ]' | jq '.result'

Önemli not: Allow kurallarını her zaman yüksek priority ile tanımlayın. Cloudflare kuralları priority sırasına göre işler, priority 1 en önce değerlendirilen kuraldır.

Terraform ile Infrastructure as Code Yaklaşımı

Production ortamlarında her şeyi Terraform ile yönetmeyi tercih ediyorum. Hem versiyon kontrolü oluyor hem de değişiklikleri kolayca geri alabiliyor.

# terraform/cloudflare_bot_protection.tf içeriğini oluştur
cat > cloudflare_bot_protection.tf << 'EOF'
terraform {
  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "~> 4.0"
    }
  }
}

variable "zone_id" {
  description = "Cloudflare Zone ID"
  type        = string
}

# Bot Fight Mode etkinleştir
resource "cloudflare_zone_setting" "bot_fight_mode" {
  zone_id = var.zone_id
  setting_id = "bot_fight_mode"
  value   = "on"
}

# Scraping koruması için rate limit
resource "cloudflare_rate_limit" "scraping_protection" {
  zone_id   = var.zone_id
  threshold = 60
  period    = 60
  
  match {
    request {
      url_pattern = "${var.domain}/urunler/*"
      schemes     = ["HTTPS"]
      methods     = ["GET"]
    }
  }
  
  action {
    mode    = "challenge"
    timeout = 3600
  }
  
  description = "Urun sayfasi bot koruması"
  enabled     = true
}

# Whitelist firewall rule
resource "cloudflare_firewall_rule" "monitoring_whitelist" {
  zone_id     = var.zone_id
  description = "Monitoring IP whitelist"
  filter_id   = cloudflare_filter.monitoring_ips.id
  action      = "allow"
  priority    = 1
}

resource "cloudflare_filter" "monitoring_ips" {
  zone_id     = var.zone_id
  description = "Monitoring IP adresleri"
  expression  = "(ip.src in {203.0.113.10 203.0.113.11})"
}
EOF

echo "Terraform dosyasi olusturuldu"

# Plan'i kontrol et
terraform init
terraform plan -var="zone_id=${ZONE_ID}"

Sık Karşılaşılan Sorunlar ve Çözümleri

False Positive Sorunu

Bot Fight Mode bazen meşru kullanıcıları da engelleyebiliyor, özellikle kurumsal ağlardan gelen trafik veya shared IP kullanan mobil operatörler söz konusu olduğunda. Bunu tespit etmek için Cloudflare Firewall Events log’larını düzenli izleyin.

# Son 1 saatteki engellenen istekleri kontrol et
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/security/events?since=3600&action=block&limit=50" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" | jq '.result[] | {
    clientIP: .clientIP,
    action: .action,
    ruleId: .ruleId,
    userAgent: .userAgent,
    timestamp: .occurredAt
  }'

Bu komutla engellenen isteklere baktığınızda gerçek kullanıcıların engellenip engellenmediğini görebilirsiniz. Eğer belirli bir IP bloğundan meşru trafik geliyorsa hemen whitelist’e ekleyin.

WordPress ile Uyumluluk

WordPress siteleri özellikle hassas. WP-Cron, WooCommerce stok güncellemeleri, yedekleme pluginleri gibi araçlar bazen bot olarak işaretlenebiliyor.

# WordPress admin ve cron için özel kural
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '[{
    "filter": {
      "expression": "(http.request.uri.path contains "/wp-admin") or (http.request.uri.path eq "/wp-cron.php") or (http.request.uri.path contains "/wp-json")"
    },
    "action": "allow",
    "description": "WordPress core bypass",
    "priority": 2
  }]' | jq '.result'

Monitoring ve Alerting Kurulumu

Tüm bu koruma mekanizmalarını kurduktan sonra bir de alerting sistemi kurmanız gerekiyor. Cloudflare Notifications özelliğini kullanarak önemli olaylar için email veya webhook bildirimi alabilirsiniz:

# Bot aktivitesi için notification policy oluştur
curl -s -X POST "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/alerting/v3/policies" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json" 
  --data '{
    "name": "Yuksek Bot Trafiği Uyarısı",
    "description": "Bot engelleme sayisi esigi astığında bildir",
    "enabled": true,
    "alert_type": "security_events_alert",
    "mechanisms": {
      "email": [{"id": "your-email-destination-id"}],
      "webhooks": [{"id": "your-webhook-destination-id"}]
    },
    "filters": {
      "zones": ["'"${ZONE_ID}"'"],
      "actions": ["block", "managed_challenge"]
    }
  }' | jq '.result'

Bu sayede bot saldırısı ani olarak artış gösterdiğinde hemen haberdar oluyorsunuz ve gerekirse ek önlemler alabiliyorsunuz.

Performans Etkisi ve Dikkat Edilmesi Gerekenler

Bot Fight Mode’un performans üzerindeki etkisi genellikle minimal, ancak göz önünde bulundurmanız gereken birkaç nokta var:

  • Cache bypass: Bot olarak işaretlenen trafik Cloudflare cache’ini atlar, bu da origin sunucunuza daha fazla yük bindiriyor. Eğer botlarınız yoğunsa ve çoğu blocked yerine challenged oluyorsa, origin’inize giden trafik artabilir.
  • JavaScript challenge gecikmesi: Managed challenge veya JS challenge uygulandığında sayfa yüklenme süresine 1-2 saniyelik gecikme ekleniyor. Bu normal kullanıcılar için kabul edilebilir ama mobil kullanıcılar için deneyimi etkileyebiliyor.
  • API client’ları: REST API’nizi tüketen mobil uygulamalar veya third-party servisler, bot score’ları düşük çıkabilir. Bu yüzden API subdomainlerinizi ayrı bir zone’da yönetip farklı kurallar uygulamayı düşünebilirsiniz.
  • Static resource protection: Bu özelliği açarsanız CDN ortaklarınız veya image lazy loading servisleriniz etkilenebilir. Test etmeden production’da açmayın.

Sonuç

Cloudflare Bot Fight Mode, doğru yapılandırıldığında ciddi bir güvenlik katmanı oluşturuyor. Ücretsiz plan için bile temel Bot Fight Mode açmak sizi önemli miktarda kötü niyetli trafikten koruyor. Pro veya Business planındaysanız Super Bot Fight Mode’un granüler ayarlarını kullanmak çok daha etkili bir koruma sağlıyor.

Özetlemek gerekirse başarılı bir bot koruması için şu adımları izlemenizi öneririm: İlk olarak Bot Fight Mode’u etkinleştirin ve birkaç gün log’ları izleyin. Sonra false positive’leri tespit edip whitelist kurallarınızı oluşturun. Ardından rate limiting kurallarıyla korumanızı derinleştirin. Son olarak monitoring ve alerting sistemi kurarak her şeyi otomatik izlemeye alın.

Terraform veya Infrastructure as Code kullanan ortamlarda tüm bu yapılandırmaları kod olarak tutmak, hem audit trail sağlıyor hem de hata yapma ihtimalini azaltıyor. Bot trafiğiyle mücadele süregelen bir süreç, bu yüzden düzenli olarak analytics verilerinizi incelemeniz ve kurallarınızı güncellemeniz gerekiyor.

Bir yanıt yazın

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