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-storeheader’ı ekleyin.
- IP adresi tespiti sorunu: Eğer uygulamanız gerçek kullanıcı IP’sini almak istiyorsa
CF-Connecting-IPheader’ını kullanmalısınız.X-Forwarded-ForCloudflare’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
logmodunda başlatın, istatistikleri inceleyin, sonrablockmoduna 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.
