GCP Cloud Armor ile DDoS ve WAF Koruması: Kapsamlı Rehber

Üretim ortamında çalışan bir uygulamanın aniden yavaşladığını, logların anormal isteklerle dolup taştığını ve monitoring panelinin kırmızıya döndüğünü hayal edin. Bu tablo, pek çok sysadmin’in kabusudur. GCP Cloud Armor, tam da bu noktada devreye girerek hem DDoS saldırılarına karşı hem de uygulama katmanı tehditlerine karşı güçlü bir kalkan oluşturur. Bu yazıda Cloud Armor’ı sıfırdan yapılandırmayı, gerçek dünya senaryolarıyla WAF kuralları yazmayı ve maliyeti kontrol altında tutmayı ele alacağız.

Cloud Armor Nedir ve Neden Kullanmalısınız?

Cloud Armor, Google Cloud’un ağ katmanında çalışan bir güvenlik servisidir. Google’ın küresel altyapısı üzerinde konumlandığı için trafik, backend’lerinize ulaşmadan çok önce filtrelenir. Bu önemli bir ayrımdır. Klasik on-premise WAF çözümlerinde trafik önce sunucunuza gelir, sonra filtrelenir. Cloud Armor’da ise Google’ın edge noktalarında, yani dünya genelindeki PoP’larda (Point of Presence) temizlenir.

Temel kullanım senaryoları şunlardır:

  • L3/L4 DDoS koruması: Volumetrik saldırılara karşı otomatik koruma
  • L7 WAF koruması: SQL injection, XSS, RCE gibi uygulama katmanı saldırıları
  • IP kısıtlaması: Belirli IP aralıklarını veya ülkeleri engelleme
  • Rate limiting: Kaynak başına istek hızını sınırlama
  • Bot yönetimi: Zararlı bot trafiğini tespit ve engelleme

Cloud Armor, Google Cloud Load Balancing ile entegre çalışır. Yani önünde bir HTTPS Load Balancer olan her uygulama için kullanılabilir. GKE, Cloud Run, App Engine, Compute Engine fark etmeksizin.

Ön Koşullar ve Temel Kavramlar

Cloud Armor’ı yapılandırmadan önce birkaç temel kavramı netleştirmek gerekiyor.

Security Policy: Cloud Armor’ın temel yapı taşıdır. İçinde kurallar (rules) barındırır ve bir ya da daha fazla backend service’e bağlanır.

Rule: Her kural bir öncelik numarası, bir koşul (match condition) ve bir aksiyon (allow/deny/redirect) içerir. Düşük öncelik numarası daha önce değerlendirilir.

Preview Mode: Kuralı aktif etmeden önce ne kadar trafik etkileneceğini görmek için kullanılır. Production’da değişiklik yapmadan önce mutlaka kullanın.

Adaptive Protection: Makine öğrenmesi tabanlı L7 DDoS tespiti. Anormal trafik paterni gördüğünde otomatik kural önerir.

Başlamak için gcloud CLI’yi ve gerekli izinleri ayarlayalım:

# gcloud CLI güncelle ve gerekli component'leri yükle
gcloud components update
gcloud components install beta

# Aktif proje ve hesabı kontrol et
gcloud config list

# Gerekli API'leri etkinleştir
gcloud services enable compute.googleapis.com
gcloud services enable networksecurity.googleapis.com

# Cloud Armor için gerekli IAM rolü
# compute.securityAdmin rolü yeterlidir
gcloud projects add-iam-policy-binding PROJECT_ID 
  --member="user:[email protected]" 
  --role="roles/compute.securityAdmin"

İlk Security Policy’yi Oluşturma

Temel bir security policy oluşturmak oldukça basittir. Ancak production ortamı için düşünülmüş, katmanlı bir yapı kurmak daha doğrudur.

# Temel bir security policy oluştur
gcloud compute security-policies create web-uygulama-policy 
  --description "Web uygulamasi icin ana guvenlik politikasi" 
  --type CLOUD_ARMOR

# Policy'yi listele ve dogrula
gcloud compute security-policies list

# Policy detaylarini goster
gcloud compute security-policies describe web-uygulama-policy

Policy oluştuktan sonra bunu backend service’e bağlamanız gerekir. Bu adımı atlayanlar “neden hiçbir şey çalışmıyor” diye uzun saatler harcayabilir:

# Mevcut backend service'leri listele
gcloud compute backend-services list --global

# Security policy'yi backend service'e bagla
gcloud compute backend-services update backend-service-adi 
  --security-policy web-uygulama-policy 
  --global

# Baglantiyi dogrula
gcloud compute backend-services describe backend-service-adi 
  --global 
  --format="value(securityPolicy)"

IP Tabanlı Kurallar

En yaygın kullanım senaryolarından biri belirli IP adreslerini veya aralıklarını engellemek ya da yalnızca belirli IP’lere izin vermektir. Özellikle admin panelleri, internal API’ler veya B2B entegrasyonlar için kritiktir.

# Belirli bir IP'yi engelle (ornegin bilinen saldirgan IP)
gcloud compute security-policies rules create 1000 
  --security-policy web-uygulama-policy 
  --src-ip-ranges "185.220.101.0/24" 
  --action "deny-403" 
  --description "Bilinen kotu IP araligi engelle"

# Ofis IP'lerine admin paneli icin izin ver
gcloud compute security-policies rules create 100 
  --security-policy web-uygulama-policy 
  --src-ip-ranges "203.0.113.10/32,203.0.113.11/32" 
  --action "allow" 
  --description "Ofis IP'leri - tam erisim"

# Turkiye disindaki tum IP'leri engelle (cografi kural)
# Bu kural tum diger kurallardan once degerlendirilmeli
gcloud compute security-policies rules create 900 
  --security-policy web-uygulama-policy 
  --expression "origin.region_code != 'TR'" 
  --action "deny-403" 
  --description "Turkiye disini engelle"

# Default kural (her policy'de olmali, oncelik 2147483647)
gcloud compute security-policies rules update 2147483647 
  --security-policy web-uygulama-policy 
  --action "allow" 
  --description "Default - izin ver"

Burada öncelik sırasına dikkat edin. Kural 100 önce değerlendirilir, kural 900 sonra gelir. Eğer ofis IP’niz TR’de ise kural 100 zaten allow diyeceği için kural 900 devreye girmez. Ancak mantığı karıştırmamak için her zaman şema üzerinde test edin.

OWASP Tabanlı WAF Kuralları

Cloud Armor, OWASP Core Rule Set’e dayalı önceden tanımlanmış kural setleri (preconfigured rules) sunar. Bunlar manuel kural yazmaktan çok daha hızlı ve kapsamlıdır.

# Mevcut preconfigured rule'lari listele
gcloud compute security-policies list-preconfigured-expression-sets

# SQLi korumasini ekle (paranoia level 1)
gcloud compute security-policies rules create 2000 
  --security-policy web-uygulama-policy 
  --expression "evaluatePreconfiguredExpr('sqli-v33-stable')" 
  --action "deny-403" 
  --description "SQL injection koruması"

# XSS korumasini ekle
gcloud compute security-policies rules create 2001 
  --security-policy web-uygulama-policy 
  --expression "evaluatePreconfiguredExpr('xss-v33-stable')" 
  --action "deny-403" 
  --description "Cross-site scripting koruması"

# Remote code execution koruması
gcloud compute security-policies rules create 2002 
  --security-policy web-uygulama-policy 
  --expression "evaluatePreconfiguredExpr('rce-v33-stable')" 
  --action "deny-403" 
  --description "Remote code execution koruması"

# Local file inclusion koruması
gcloud compute security-policies rules create 2003 
  --security-policy web-uygulama-policy 
  --expression "evaluatePreconfiguredExpr('lfi-v33-stable')" 
  --action "deny-403" 
  --description "LFI koruması"

Preconfigured kuralları direkt deny olarak açmak yerine önce preview modunda test etmek çok daha güvenlidir. False positive oranını görmeden production’a almak istek kayıplarına yol açabilir:

# Once preview modunda ac
gcloud compute security-policies rules create 2000 
  --security-policy web-uygulama-policy 
  --expression "evaluatePreconfiguredExpr('sqli-v33-stable')" 
  --action "deny-403" 
  --preview 
  --description "SQLi koruması - PREVIEW modunda"

# 24-48 saat sonra Cloud Logging'den sonuclari kontrol et
# Sonra preview'u kaldir
gcloud compute security-policies rules update 2000 
  --security-policy web-uygulama-policy 
  --no-preview

Rate Limiting ile DDoS Koruması

Rate limiting, özellikle L7 DDoS saldırılarında ve brute force denemelerinde hayat kurtarır. Login endpoint’i, API gateway ya da kayıt formları için mutlaka yapılandırılmalıdır.

# Genel rate limit - IP basina dakikada 1000 istek
gcloud compute security-policies rules create 3000 
  --security-policy web-uygulama-policy 
  --expression "true" 
  --action "rate-based-ban" 
  --rate-limit-threshold-count 1000 
  --rate-limit-threshold-interval-sec 60 
  --ban-duration-sec 300 
  --conform-action "allow" 
  --exceed-action "deny-429" 
  --enforce-on-key "IP" 
  --description "Genel rate limit - IP basina 1000/dakika"

# Login endpoint'i icin agresif rate limit
gcloud compute security-policies rules create 2500 
  --security-policy web-uygulama-policy 
  --expression "request.path.matches('/api/login') || request.path.matches('/auth/.*')" 
  --action "rate-based-ban" 
  --rate-limit-threshold-count 20 
  --rate-limit-threshold-interval-sec 60 
  --ban-duration-sec 600 
  --conform-action "allow" 
  --exceed-action "deny-429" 
  --enforce-on-key "IP" 
  --description "Login endpoint brute force koruması"

Rate limiting’de kullanabileceğiniz --enforce-on-key seçenekleri:

  • IP: Her IP adresi için ayrı sayaç
  • ALL: Tüm trafiği bir sayaçta topla
  • HTTP-HEADER: Belirli bir header değerine göre
  • XFF-IP: X-Forwarded-For header’ındaki IP’ye göre
  • HTTP-COOKIE: Belirli cookie değerine göre

Gelişmiş CEL İfadeleri ile Custom Kurallar

Cloud Armor, Common Expression Language (CEL) kullanır. Bu sayede çok karmaşık koşullar yazabilirsiniz.

# Belirli User-Agent'lari engelle
gcloud compute security-policies rules create 1500 
  --security-policy web-uygulama-policy 
  --expression "request.headers['user-agent'].matches('.*sqlmap.*') || 
                request.headers['user-agent'].matches('.*nikto.*') ||
                request.headers['user-agent'].matches('.*nmap.*')" 
  --action "deny-403" 
  --description "Bilinen saldiri araclari engelle"

# Boş User-Agent'lari engelle (genellikle bot veya scanner)
gcloud compute security-policies rules create 1600 
  --security-policy web-uygulama-policy 
  --expression "!has(request.headers['user-agent']) || 
                request.headers['user-agent'].size() == 0" 
  --action "deny-403" 
  --description "Bos User-Agent engelle"

# Belirli path + IP kombinasyonu
gcloud compute security-policies rules create 800 
  --security-policy web-uygulama-policy 
  --expression "request.path.startsWith('/admin') && 
                !inIpRange(origin.ip, '203.0.113.0/24')" 
  --action "deny-403" 
  --description "Admin paneline sadece ofis IP'sinden erisim"

# Content-Type olmayan POST isteklerini engelle
gcloud compute security-policies rules create 1700 
  --security-policy web-uygulama-policy 
  --expression "request.method == 'POST' && 
                !has(request.headers['content-type'])" 
  --action "deny-400" 
  --description "Content-Type olmayan POST engelle"

Gerçek Dünya Senaryosu: E-Ticaret Uygulaması Koruması

Bir e-ticaret uygulamasını ele alalım. Checkout sayfasına kart deneme saldırıları, ürün sayfalarına scraping, admin paneline brute force ve genel olarak bot trafiği ile mücadele etmek gerekiyor.

#!/bin/bash
# eticaret-guvenlik-policy.sh
# E-ticaret uygulamasi icin kapsamli Cloud Armor yapilandirmasi

POLICY_NAME="eticaret-production-policy"
BACKEND_SERVICE="eticaret-backend-service"

echo "Security policy olusturuluyor..."
gcloud compute security-policies create $POLICY_NAME 
  --description "E-ticaret production guvenlik politikasi" 
  --type CLOUD_ARMOR

# 1. Bilinen kotu IP listesi
gcloud compute security-policies rules create 100 
  --security-policy $POLICY_NAME 
  --src-ip-ranges "192.0.2.0/24,198.51.100.0/24" 
  --action "deny-403" 
  --description "Kara liste IP'leri"

# 2. Admin paneli - sadece VPN IP'si
gcloud compute security-policies rules create 200 
  --security-policy $POLICY_NAME 
  --expression "request.path.startsWith('/admin') && 
                !inIpRange(origin.ip, '10.0.0.0/8')" 
  --action "deny-403" 
  --description "Admin sadece VPN"

# 3. Checkout rate limit - kart deneme saldirisi engeli
gcloud compute security-policies rules create 300 
  --security-policy $POLICY_NAME 
  --expression "request.path.matches('/checkout/payment.*')" 
  --action "rate-based-ban" 
  --rate-limit-threshold-count 10 
  --rate-limit-threshold-interval-sec 60 
  --ban-duration-sec 1800 
  --conform-action "allow" 
  --exceed-action "deny-429" 
  --enforce-on-key "IP" 
  --description "Checkout kart deneme koruması"

# 4. SQLi korumasi (preview'da baslat)
gcloud compute security-policies rules create 1000 
  --security-policy $POLICY_NAME 
  --expression "evaluatePreconfiguredExpr('sqli-v33-stable')" 
  --action "deny-403" 
  --preview 
  --description "SQLi koruması - preview"

# 5. XSS korumasi (preview'da baslat)
gcloud compute security-policies rules create 1001 
  --security-policy $POLICY_NAME 
  --expression "evaluatePreconfiguredExpr('xss-v33-stable')" 
  --action "deny-403" 
  --preview 
  --description "XSS koruması - preview"

# 6. Scraper bot engeli
gcloud compute security-policies rules create 1500 
  --security-policy $POLICY_NAME 
  --expression "request.path.startsWith('/urunler') && 
                !has(request.headers['accept-language'])" 
  --action "deny-403" 
  --description "Scraper bot engeli"

# 7. Genel rate limit
gcloud compute security-policies rules create 2000 
  --security-policy $POLICY_NAME 
  --expression "true" 
  --action "rate-based-ban" 
  --rate-limit-threshold-count 2000 
  --rate-limit-threshold-interval-sec 60 
  --ban-duration-sec 120 
  --conform-action "allow" 
  --exceed-action "deny-429" 
  --enforce-on-key "IP" 
  --description "Genel rate limit"

# Policy'yi backend'e bagla
gcloud compute backend-services update $BACKEND_SERVICE 
  --security-policy $POLICY_NAME 
  --global

echo "Yapilandirma tamamlandi!"
echo "Simdi 48 saat preview loglarini izleyin:"
echo "gcloud logging read 'resource.type=http_load_balancer AND jsonPayload.enforcedSecurityPolicy.outcome=PREVIEW_DENY'"

Monitoring ve Alerting

Cloud Armor kuralları oluşturdunuz, ancak bunların çalışıp çalışmadığını ve ne kadar trafik engellediğini izlemek de kritiktir.

# Son 1 saatte engellenen istekleri goster
gcloud logging read 
  'resource.type="http_load_balancer" AND 
   jsonPayload.enforcedSecurityPolicy.outcome="DENY"' 
  --limit 100 
  --format "table(timestamp, jsonPayload.enforcedSecurityPolicy.name, 
                  jsonPayload.enforcedSecurityPolicy.priority,
                  httpRequest.remoteIp,
                  httpRequest.requestUrl)"

# Preview modundaki kurallarin sonuclarini goster
gcloud logging read 
  'resource.type="http_load_balancer" AND 
   jsonPayload.previewSecurityPolicy.outcome="PREVIEW_DENY"' 
  --limit 50

# Belirli bir IP'nin ne kadar engellendigi
HEDEF_IP="185.220.101.45"
gcloud logging read 
  "resource.type="http_load_balancer" AND 
   httpRequest.remoteIp="$HEDEF_IP"" 
  --limit 20 
  --format "table(timestamp, jsonPayload.enforcedSecurityPolicy.outcome, httpRequest.requestUrl)"

Cloud Monitoring üzerinden alert policy oluşturmak için:

# Cloud Armor metriklerine bakilacak alerting policy olustur
# (JSON formatinda alert policy)
cat > cloud-armor-alert.json << 'EOF'
{
  "displayName": "Cloud Armor Yuksek Engelleme Orani",
  "conditions": [
    {
      "displayName": "Engellenen istek orani yuksek",
      "conditionThreshold": {
        "filter": "metric.type="networksecurity.googleapis.com/https/request_count" AND metric.labels.blocked="true"",
        "comparison": "COMPARISON_GT",
        "thresholdValue": 500,
        "duration": "60s",
        "aggregations": [
          {
            "alignmentPeriod": "60s",
            "perSeriesAligner": "ALIGN_RATE"
          }
        ]
      }
    }
  ],
  "alertStrategy": {
    "notificationRateLimit": {
      "period": "300s"
    }
  },
  "notificationChannels": ["projects/PROJECT_ID/notificationChannels/CHANNEL_ID"]
}
EOF

gcloud alpha monitoring policies create --policy-from-file=cloud-armor-alert.json

Adaptive Protection Yapılandırması

Adaptive Protection, ML tabanlı anomali tespiti sunar ve özellikle L7 DDoS saldırılarında çok değerlidir. Enterprise katmanında gelir ama maliyeti attack’ların yarattığı downtime maliyetiyle kıyaslandığında mantıklıdır.

# Adaptive Protection'i policy uzerinde etkinlestir
gcloud compute security-policies update web-uygulama-policy 
  --enable-layer7-ddos-defense

# Adaptive Protection eşik degerini ayarla (0.1 - 0.99 arasi, 
# dusuk = daha hassas ama fazla false positive)
gcloud compute security-policies update web-uygulama-policy 
  --layer7-ddos-defense-auto-deploy-load-threshold 0.7 
  --layer7-ddos-defense-auto-deploy-confidence-threshold 0.8 
  --layer7-ddos-defense-auto-deploy-impacted-baseline-threshold 0.01

# Adaptive Protection uyarilarini izle
gcloud logging read 
  'resource.type="network_security_policy" AND 
   logName:"cloudarmor.googleapis.com/adaptive_protection"' 
  --limit 20

Terraform ile Infrastructure as Code

Production ortamlarında değişiklikleri manuel yapmak yerine Terraform ile yönetmek hem tekrarlanabilirlik hem de versiyon kontrolü açısından çok daha sağlıklıdır.

# main.tf icin Cloud Armor resource ornegi
# Bunu bir .tf dosyasina kopyalayin

cat > cloud-armor.tf << 'TERRAFORM'
resource "google_compute_security_policy" "web_policy" {
  name        = "web-uygulama-policy"
  description = "Web uygulamasi guvenlik politikasi"

  # Adaptive Protection
  adaptive_protection_config {
    layer_7_ddos_defense_config {
      enable = true
      rule_visibility = "STANDARD"
    }
  }

  # IP kara liste kurali
  rule {
    action   = "deny(403)"
    priority = "1000"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["192.0.2.0/24"]
      }
    }
    description = "Kara liste IP'leri"
  }

  # SQLi korumasi
  rule {
    action   = "deny(403)"
    priority = "2000"
    match {
      expr {
        expression = "evaluatePreconfiguredExpr('sqli-v33-stable')"
      }
    }
    description = "SQL injection koruması"
    preview = true
  }

  # Default kural
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "Default - izin ver"
  }
}

# Backend service'e bagla
resource "google_compute_backend_service" "web_backend" {
  name            = "web-backend-service"
  security_policy = google_compute_security_policy.web_policy.id
}
TERRAFORM

echo "Terraform dosyasi olusturuldu"
echo "terraform init && terraform plan && terraform apply"

Maliyet Optimizasyonu

Cloud Armor maliyeti iki bileşenden oluşur: aktif policy başına aylık ücret ve incelenen istek sayısı başına ücret. Maliyeti kontrol altında tutmak için şu pratikleri uygulayın:

  • Gereksiz policy silme: Kullanılmayan security policy’leri aktif tutmak bile ücret kesilmesine yol açar. Düzenli audit yapın.
  • Preview mode süresi: Preview modundaki kurallar da ücretlendirilir. 48-72 saatten uzun tutmayın.
  • Kural konsolidasyonu: 20 ayrı kural yerine CEL ile birleşik koşullar yazmak hem performans hem maliyet açısından iyidir.
  • Log örnekleme: Her isteği loglamak Cloud Logging maliyetini artırır. Log sampling’i yapılandırın.
  • Tier seçimi: Standard ve Managed Protection Plus arasında uygulamanızın gerçek ihtiyacına göre seçim yapın. Adaptive Protection her uygulama için gerekli olmayabilir.
# Aktif policy'leri ve bagli backend'leri audit et
gcloud compute security-policies list 
  --format="table(name,description,type,fingerprint)"

# Hicbir backend'e bagli olmayan policy'leri bul
for policy in $(gcloud compute security-policies list --format="value(name)"); do
  backends=$(gcloud compute backend-services list --global 
    --filter="securityPolicy:$policy" 
    --format="value(name)")
  if [ -z "$backends" ]; then
    echo "KULLANIMDA DEGIL: $policy"
  fi
done

Sonuç

Cloud Armor, doğru yapılandırıldığında uygulamalarınızın önünde son derece etkili bir güvenlik katmanı oluşturur. Ancak şunu unutmamak gerekir: hiçbir WAF çözümü sihirli bir kalkan değildir. Cloud Armor’ı uygulama güvenliğinin yerini tutacak bir araç olarak değil, katmanlı güvenlik stratejisinin bir parçası olarak konumlandırmalısınız.

Pratik önerim şudur: Yeni kuralları her zaman preview modunda başlatın, en az 48 saat boyunca logları inceleyin, false positive oranını ölçün ve ancak sonra kural aktif hale getirin. Rate limiting değerlerini gerçek trafik analizine dayandırın, yoksa meşru kullanıcıları da bloklarsınız. Terraform veya benzeri bir IaC aracıyla tüm kural değişikliklerini versiyonlayın; production’da elle yapılan değişiklikler er ya da geç karışıklığa yol açar.

Adaptive Protection gibi ML tabanlı özellikler gerçekten işe yarıyor, ancak eşik değerlerini uygulamanızın trafik profiline göre ayarlamak zaman alır. İlk kurulumdan sonra sistemi “kur unut” modunda bırakmayın; aylık en az bir kez kural etkinliğini ve maliyet raporunu gözden geçirin. Cloud Armor logları Cloud Logging üzerinden SIEM sisteminize akıtılabilir, bu entegrasyonu kurmak uzun vadede olay müdahale sürenizi ciddi oranda kısaltır.

Bir yanıt yazın

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