CDN Güvenliği ve DDoS Koruması: Kapsamlı Bir Rehber

Bir sabah işe geliyorsunuz, monitoring ekranları kırmızı, telefon çalmaya başlamış ve web siteniz yerle bir olmuş. Saldırı saniyede milyonlarca istek gönderiyor, origin sunucunuz çökmüş durumda. İşte tam bu noktada CDN güvenliğinin ve DDoS korumasının neden bu kadar kritik olduğunu anlıyorsunuz. Bu yazıda CDN güvenliğini en ince ayrıntısına kadar ele alacağız ve gerçek dünya senaryolarıyla nasıl yapılandırılacağını göstereceğiz.

CDN Güvenliği Neden Bu Kadar Önemli?

CDN (Content Delivery Network) sadece içerik dağıtımı için değil, aynı zamanda sitenizin önünde duran ilk savunma hattı olarak da çalışır. Cloudflare, AWS CloudFront, Fastly veya Akamai gibi büyük CDN sağlayıcıları günde trilyonlarca isteği filtreler ve kötü niyetli trafiği durdurur.

Ancak burada kritik bir nokta var: CDN’i yanlış yapılandırırsanız güvenlik değil, güvenlik açığı elde edersiniz. Origin sunucunuzun IP adresini gizlememişseniz, saldırganlar CDN’i bypass edip direkt sunucunuza saldırabilir. SSL yapılandırmanız hatalıysa man-in-the-middle saldırılarına kapı açarsınız.

DDoS Saldırı Türlerini Anlamak

Koruma mekanizmalarına geçmeden önce neyle savaştığımızı anlamalıyız:

  • Volumetric saldırılar: UDP flood, ICMP flood gibi bant genişliğini tüketen saldırılar
  • Protocol saldırıları: SYN flood, ACK flood gibi sunucu kaynaklarını tüketen saldırılar
  • Application layer saldırıları (L7): HTTP flood, Slowloris gibi uygulama katmanını hedef alan saldırılar
  • Amplification saldırıları: DNS amplification, NTP amplification gibi küçük istek büyük yanıt prensibine dayanan saldırılar

L7 saldırıları en tehlikelisi çünkü meşru HTTP isteklerine benziyorlar ve tespitleri çok daha zor. Saniyede 1000 istek gönderen bir bot ile saniyede 1000 istek gönderen flash sale trafiği arasındaki farkı bulmak gerçekten zorlu bir iş.

Cloudflare ile DDoS Koruması Yapılandırma

Cloudflare en yaygın kullanılan CDN/DDoS koruma çözümü olduğu için buradan başlayalım. Önce temel yapılandırmayı Cloudflare API üzerinden yapalım:

# Cloudflare Zone ID ve API Token ile DDoS koruma seviyesini ayarlama
ZONE_ID="your_zone_id_here"
API_TOKEN="your_api_token_here"

# Security Level'ı "High" olarak ayarla
curl -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":"high"}'

# Bot Fight Mode'u aktifleştir
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 '{"fight_mode": true}'

# Under Attack Mode için (aktif saldırı sırasında)
curl -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"}'

Bu komutları bir script haline getirip monitoring sisteminize bağlayabilirsiniz. Threshold aşıldığında otomatik olarak “under_attack” moduna geçebilirsiniz.

Origin Sunucu IP Adresini Gizleme

CDN kullanmanın en önemli güvenlik faydası origin sunucunuzu gizlemektir. Ama bunu doğru yapmazsanız hiçbir anlamı olmaz:

# Nginx'i sadece Cloudflare IP'lerinden gelen trafiği kabul edecek şekilde yapılandır
# /etc/nginx/conf.d/cloudflare-ips.conf

# Bu scripti cron ile düzenli çalıştırın, Cloudflare IP listesi güncellenir
#!/bin/bash

CLOUDFLARE_IPS_V4=$(curl -s https://www.cloudflare.com/ips-v4)
CLOUDFLARE_IPS_V6=$(curl -s https://www.cloudflare.com/ips-v6)

CONFIG_FILE="/etc/nginx/conf.d/cloudflare-whitelist.conf"

echo "# Cloudflare IP Whitelist - $(date)" > $CONFIG_FILE
echo "# Otomatik oluşturuldu, manuel düzenleme" >> $CONFIG_FILE

for ip in $CLOUDFLARE_IPS_V4; do
    echo "allow $ip;" >> $CONFIG_FILE
done

for ip in $CLOUDFLARE_IPS_V6; do
    echo "allow $ip;" >> $CONFIG_FILE
done

echo "deny all;" >> $CONFIG_FILE

# Nginx'i reload et
nginx -t && systemctl reload nginx

echo "Cloudflare IP listesi güncellendi: $(date)"

Bu scripti /etc/cron.d/cloudflare-update dosyasına ekleyin:

# Cron job ile günlük güncelleme
0 3 * * * root /usr/local/bin/update-cloudflare-ips.sh >> /var/log/cloudflare-ip-update.log 2>&1

Nginx yapılandırmanızda bu whitelist’i kullanın:

# /etc/nginx/sites-available/your-site.conf
server {
    listen 80;
    listen 443 ssl;
    server_name example.com;

    # Cloudflare whitelist'ini dahil et
    include /etc/nginx/conf.d/cloudflare-whitelist.conf;

    # Gerçek IP'yi Cloudflare header'ından al
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    real_ip_header CF-Connecting-IP;

    # Rate limiting zone
    limit_req zone=api burst=20 nodelay;
    limit_conn conn_limit_per_ip 20;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header CF-Connecting-IP $http_cf_connecting_ip;
    }
}

AWS CloudFront ile WAF Entegrasyonu

AWS ekosistemindeyseniz CloudFront + AWS WAF kombinasyonu güçlü bir koruma sağlar:

# AWS CLI ile WAF Web ACL oluşturma ve CloudFront'a bağlama
# Önce rate-based rule oluştur (IP başına 2000 istek/5 dakika)
aws wafv2 create-web-acl 
  --name "CDN-DDoS-Protection" 
  --scope CLOUDFRONT 
  --region us-east-1 
  --default-action Allow={} 
  --rules '[
    {
      "Name": "RateLimitRule",
      "Priority": 1,
      "Statement": {
        "RateBasedStatement": {
          "Limit": 2000,
          "AggregateKeyType": "IP"
        }
      },
      "Action": {
        "Block": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "RateLimitRule"
      }
    },
    {
      "Name": "AWSManagedRulesCommonRuleSet",
      "Priority": 2,
      "OverrideAction": {"None": {}},
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesCommonRuleSet"
        }
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "CommonRuleSet"
      }
    }
  ]' 
  --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=CDNProtection

# CloudFront distribution'a WAF Web ACL'i bağla
DISTRIBUTION_ID="E1EXAMPLE12345"
WAF_ACL_ARN="arn:aws:wafv2:us-east-1:123456789:global/webacl/CDN-DDoS-Protection/abc123"

aws cloudfront update-distribution 
  --id $DISTRIBUTION_ID 
  --distribution-config file://distribution-config-with-waf.json

Gerçek Zamanlı DDoS Tespit Scripti

Production ortamında bir DDoS saldırısı başladığında ne kadar hızlı müdahale ettiğiniz kritik önem taşır. İşte basit ama etkili bir monitoring scripti:

#!/bin/bash
# ddos-detector.sh - Nginx access log'larından DDoS tespiti

LOG_FILE="/var/log/nginx/access.log"
THRESHOLD=500  # 1 dakikada bu kadar istek yapan IP'yi engelle
BLOCK_DURATION=3600  # Saniye cinsinden engelleme süresi
WHITELIST_FILE="/etc/ddos-whitelist.txt"
BLOCKED_IPS_FILE="/tmp/ddos-blocked-ips.txt"

check_and_block() {
    # Son 1 dakikanın loglarını analiz et
    CURRENT_TIME=$(date +%s)
    ONE_MINUTE_AGO=$(date -d "1 minute ago" "+%d/%b/%Y:%H:%M")

    # IP başına istek sayısını hesapla
    grep "$ONE_MINUTE_AGO" $LOG_FILE | 
    awk '{print $1}' | 
    sort | 
    uniq -c | 
    sort -rn | 
    while read COUNT IP; do
        if [ "$COUNT" -gt "$THRESHOLD" ]; then
            # Whitelist kontrolü
            if [ -f "$WHITELIST_FILE" ] && grep -q "$IP" "$WHITELIST_FILE"; then
                echo "$(date): $IP whitelist'te, atlanıyor ($COUNT istek)"
                continue
            fi

            # Daha önce bloklanmış mı kontrol et
            if ! iptables -L INPUT -n | grep -q "$IP"; then
                echo "$(date): DDoS tespit edildi! IP: $IP - $COUNT istek/dakika"
                
                # iptables ile engelle
                iptables -I INPUT -s "$IP" -j DROP
                
                # Log kaydet
                echo "$(date): $IP engellendi ($COUNT req/min)" >> $BLOCKED_IPS_FILE
                
                # Slack/PagerDuty bildirimi gönder
                curl -s -X POST "$SLACK_WEBHOOK_URL" 
                  -H 'Content-type: application/json' 
                  --data "{"text":"DDoS Alert: $IP adresi $COUNT istek/dakika ile engellendi!"}"
                
                # Belirli süre sonra engeli kaldırmak için at komutu kullan
                echo "iptables -D INPUT -s $IP -j DROP" | at now + ${BLOCK_DURATION} seconds 2>/dev/null
            fi
        fi
    done
}

# Ana döngü
while true; do
    check_and_block
    sleep 30
done

Bu scripti systemd service olarak çalıştırın:

# /etc/systemd/system/ddos-detector.service
[Unit]
Description=DDoS Detection and Blocking Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ddos-detector.sh
Restart=always
RestartSec=10
Environment="SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

[Install]
WantedBy=multi-user.target
systemctl enable ddos-detector
systemctl start ddos-detector
systemctl status ddos-detector

Fail2Ban ile CDN Entegrasyonu

Fail2Ban’i Cloudflare API ile entegre ederek saldırı tespitinde otomatik IP engelleme yapabilirsiniz:

# /etc/fail2ban/action.d/cloudflare-ban.conf

[Definition]
actionstart =
actionstop =
actioncheck =

actionban = 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":"Fail2Ban auto-block: <name>"}'

actionunban = RULE_ID=$(curl -s "https://api.cloudflare.com/client/v4/zones/<zone_id>/firewall/access_rules/rules?configuration.value=<ip>" 
              -H "Authorization: Bearer <api_token>" | python3 -c "import sys,json; data=json.load(sys.stdin); print(data['result'][0]['id'] if data['result'] else '')") && 
              [ -n "$RULE_ID" ] && 
              curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/<zone_id>/firewall/access_rules/rules/$RULE_ID" 
              -H "Authorization: Bearer <api_token>"

[Init]
zone_id = YOUR_ZONE_ID
api_token = YOUR_API_TOKEN

Cache Poisoning ve Cache Bypass Saldırılarına Karşı Önlemler

CDN güvenliğinin çok konuşulmayan ama kritik bir boyutu da cache manipülasyonu:

# Nginx'te cache güvenlik başlıklarını düzgün ayarla
# /etc/nginx/conf.d/security-headers.conf

add_header X-Cache-Status $upstream_cache_status;
add_header Vary "Accept-Encoding, User-Agent" always;

# Cache key'i manipüle edilemesin diye strict ayarlar
proxy_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding";

# Şüpheli query parametrelerini cache'e alma
map $query_string $no_cache {
    default 0;
    "~*admin" 1;
    "~*debug" 1;
    "~*test" 1;
    "~*bypass" 1;
}

proxy_no_cache $no_cache;
proxy_cache_bypass $no_cache $http_pragma $http_authorization;

# Güvenlik başlıkları
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

Gerçek Dünya Senaryosu: E-ticaret Flash Sale Koruması

Bir e-ticaret sitesinde büyük indirim günü gelince trafiğiniz 50 kat artabilir. Bunu DDoS saldırısından ayırt etmek ve her ikisine de hazırlıklı olmak gerekiyor. İşte production’da kullandığımız bir yaklaşım:

Senaryo: Black Friday’de saniyede 50.000 meşru istek bekliyorsunuz ama aynı zamanda rakip firmalar DDoS saldırısı gönderebilir.

Çözüm yaklaşımı:

  • Cloudflare’de waiting room özelliğini aktifleştirin: Trafik spike’larında kullanıcıları sıraya koyar
  • Rate limiting’i ülke bazlı ayarlayın: Türkiye’den gelen trafiğe farklı limit, bilinmeyen ülkelerden gelene daha kısıtlayıcı limit
  • Bot skorunu kullanın: Cloudflare’in bot skoru 1-99 arasında, 30’un altındakileri challenge’a takın
  • Origin’e giden trafiği monitörleyin: CDN cache hit oranı düşüyorsa origin’e aşırı yük bindiriyor demektir
  • Statik içeriklerin TTL’ini artırın: Flash sale döneminde ürün görselleri ve CSS dosyaları için TTL’i 24 saate çıkarın

CDN Güvenlik Monitoring ve Alerting

#!/bin/bash
# cdn-health-monitor.sh - CDN güvenlik metriklerini izle

CLOUDFLARE_API="https://api.cloudflare.com/client/v4"
ZONE_ID="your_zone_id"
API_TOKEN="your_token"
ALERT_THRESHOLD_RPS=10000  # Saniyede istek sayısı eşiği

# Son 5 dakikanın analytics verilerini çek
get_analytics() {
    SINCE=$(date -u -d "5 minutes ago" +"%Y-%m-%dT%H:%M:%SZ")
    UNTIL=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    
    curl -s "${CLOUDFLARE_API}/zones/${ZONE_ID}/analytics/dashboard" 
      -H "Authorization: Bearer ${API_TOKEN}" 
      -G 
      --data-urlencode "since=${SINCE}" 
      --data-urlencode "until=${UNTIL}" 
      --data-urlencode "continuous=true"
}

# Tehditleri analiz et
analyze_threats() {
    ANALYTICS=$(get_analytics)
    
    THREATS=$(echo $ANALYTICS | python3 -c "
import sys, json
data = json.load(sys.stdin)
totals = data.get('result', {}).get('totals', {})
threats = totals.get('threats', {}).get('all', 0)
requests = totals.get('requests', {}).get('all', 0)
threat_ratio = (threats / requests * 100) if requests > 0 else 0
print(f'Threats: {threats}, Total: {requests}, Ratio: {threat_ratio:.2f}%')
")
    
    echo "$(date): $THREATS"
}

# Cloudflare firewall event'lerini kontrol et
check_firewall_events() {
    curl -s "${CLOUDFLARE_API}/zones/${ZONE_ID}/firewall/events" 
      -H "Authorization: Bearer ${API_TOKEN}" | 
      python3 -c "
import sys, json
data = json.load(sys.stdin)
events = data.get('result', [])
blocked = [e for e in events if e.get('action') == 'block']
print(f'Son firewall engelleme sayisi: {len(blocked)}')
for e in blocked[:5]:
    print(f'  - IP: {e.get("clientIP", "N/A")}, Country: {e.get("clientCountryName", "N/A")}, Rule: {e.get("ruleId", "N/A")}')
"
}

echo "=== CDN Güvenlik Raporu: $(date) ==="
analyze_threats
check_firewall_events

SSL/TLS Yapılandırması ve Şifreleme

CDN güvenliğinin önemli bir parçası da doğru TLS yapılandırması. Origin ile CDN arasındaki iletişim şifrelenmezse saldırganlar araya girebilir:

  • Full (Strict) SSL modunu kullanın: Cloudflare ile origin arasındaki bağlantıyı da şifreleyin
  • Origin sertifikanızı Cloudflare Origin CA ile imzalayın: Bu şekilde sadece Cloudflare ile origin’iniz güvende haberleşir
  • TLS 1.3’ü zorunlu kılın: Eski protokoller güvenlik açığı içerir
  • HSTS preload listesine ekleyin: Tarayıcılar sitenize her zaman HTTPS ile bağlanır
  • Certificate pinning değerlendirin: API endpoint’leriniz için ekstra güvenlik katmanı ekler

Sonuç

CDN güvenliği ve DDoS koruması tek seferlik kurduğunuz ve unuttuğunuz bir şey değil. Tehdit ortamı sürekli değişiyor, saldırı teknikleri gelişiyor ve altyapınız büyüdükçe saldırı yüzeyi de büyüyor.

En önemli çıkarımlar:

  • Defense in depth uygulayın: CDN, WAF, rate limiting, fail2ban, iptables katmanlarını birlikte kullanın
  • Origin IP’nizi gizli tutun: CDN’in asıl değeri buradan geliyor, sızdırmayın
  • Baseline oluşturun: Normal trafiğinizi bilmeden anormal olanı tespit edemezsiniz
  • Otomasyonu doğru kurun: Saldırı anında elle müdahale çok yavaş kalır
  • Düzenli tatbikat yapın: DDoS simülasyonu veya chaos engineering ile sistemlerinizi test edin
  • Log ve monitoring ihmal etmeyin: CDN loglarını SIEM sisteminize gönderin

Gerçek bir saldırı geldiğinde paniğe kapılmamak için bugünden hazırlığınızı yapın. “Bize saldırı gelmez” diye düşünüyorsanız, henüz hedef olmak için yeterince büyümemişsinizdir. Büyüdüğünüzde geç kalmayın.

Bir yanıt yazın

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