Cloudflare Transform Rules ile HTTP Header Yönetimi

Web uygulamalarını yönetirken en sık karşılaşılan sorunlardan biri, HTTP header’larını doğru şekilde yapılandırmaktır. Güvenlik header’ları, önbellekleme direktifleri, CORS ayarları… Bunların hepsini uygulama katmanında yönetmek hem karmaşık hem de zaman alıcı olabiliyor. İşte tam bu noktada Cloudflare Transform Rules devreye giriyor ve hayatı ciddi anlamda kolaylaştırıyor.

Cloudflare Transform Rules, trafik uygulamanıza ulaşmadan önce veya uygulamanızdan çıktıktan sonra HTTP header’larını manipüle etmenizi sağlayan güçlü bir araç. Hem istek (request) hem de yanıt (response) header’larını ekleyebilir, değiştirebilir veya tamamen silebilirsiniz. Bunu yaparken sunucunuza tek bir satır kod yazmak zorunda kalmıyorsunuz.

Transform Rules Nedir ve Neden Kullanmalısınız?

Cloudflare’in WAF (Web Application Firewall) ekosistemi içinde bulunan Transform Rules, temel olarak iki farklı iş yapıyor: URL yönlendirme/yeniden yazma ve header yönetimi. Biz bu yazıda header yönetimine odaklanacağız.

Peki neden Cloudflare üzerinden header yönetimi yapalım ki? Bunun birkaç güçlü nedeni var:

  • Merkezi yönetim: Onlarca sunucunuz varsa, her birine ayrı ayrı header konfigürasyonu yapmak yerine tek bir noktadan yönetirsiniz.
  • Uygulama bağımsızlığı: PHP, Node.js, Python fark etmez. Uygulama hangi dilde yazılmış olursa olsun header’ları Cloudflare katmanında eklersiniz.
  • Hız: Değişiklikler anında devreye girer, sunucu yeniden başlatmanız gerekmez.
  • Test kolaylığı: Farklı kuralleri kolayca aktif/pasif yapabilirsiniz.
  • Maliyet: Free plan dışındaki planlarda kapsamlı kural desteği gelir, ancak temel özellikler ücretsizdir.

Dashboard Üzerinden Transform Rules Oluşturma

Cloudflare dashboard’una giriş yaptıktan sonra ilgili domain’i seçin. Sol menüden Rules > Transform Rules yolunu izleyin. Karşınıza iki ana sekme gelecek: Modify Request Header ve Modify Response Header.

Her kural için temel bileşenler şunlardır:

  • Rule name: Kuralınıza anlamlı bir isim verin
  • When incoming requests match: Filtreleme koşulları (hangi isteklere uygulanacak)
  • Then: Ne yapılacağı (set, add veya remove)

Kural İfadelerini Anlamak

Cloudflare, kural koşullarını kendi expression diliyle yazmanıza izin veriyor. Bu dil oldukça okunabilir ve güçlü. Örneğin:

# Tüm isteklere uygulamak için
(http.request.uri != "")

# Sadece belirli bir path için
(http.request.uri.path matches "^/api/.*")

# Belirli bir subdomain için
(http.host eq "api.orneksite.com")

# Hem path hem host kombinasyonu
(http.host eq "orneksite.com" and http.request.uri.path matches "^/admin/.*")

Güvenlik Header’larını Eklemek

En yaygın kullanım senaryolarından biri güvenlik header’larını response’a eklemek. Özellikle HSTS, Content Security Policy, X-Frame-Options gibi header’ları manuel olarak her uygulamaya eklemek yerine Cloudflare üzerinden merkezi şekilde yönetmek çok daha pratik.

HSTS ve Temel Güvenlik Header’ları

# Response header'larına eklenecek güvenlik başlıkları
# Bu değerleri Cloudflare Transform Rules > Modify Response Header bölümüne eklersiniz

# 1. Strict-Transport-Security (HSTS)
Header-Name: Strict-Transport-Security
Value: max-age=31536000; includeSubDomains; preload

# 2. X-Content-Type-Options
Header-Name: X-Content-Type-Options
Value: nosniff

# 3. X-Frame-Options
Header-Name: X-Frame-Options
Value: SAMEORIGIN

# 4. Referrer-Policy
Header-Name: Referrer-Policy
Value: strict-origin-when-cross-origin

# 5. Permissions-Policy
Header-Name: Permissions-Policy
Value: camera=(), microphone=(), geolocation=(self)

Burada dikkat etmeniz gereken nokta şu: Eğer uygulamanız zaten bu header’ları gönderiyorsa ve siz set kullanırsanız, Cloudflare mevcut değerin üzerine yazar. Add kullanırsanız, aynı isimde iki header olabilir ki bu bazı durumlarda istenmeyen davranışlara yol açabilir. Bunu kontrol etmek için:

# curl ile header'ları kontrol etme
curl -I https://orneksite.com

# Veya verbose modda
curl -v https://orneksite.com 2>&1 | grep -i "< "

# Belirli bir header'ı aramak için
curl -sI https://orneksite.com | grep -i "x-frame-options"

Content Security Policy Yönetimi

CSP header’ı, XSS saldırılarına karşı en etkili savunma mekanizmalarından biri. Ancak doğru yapılandırmak gerçekten zahmetli olabiliyor. Cloudflare Transform Rules ile bunu merkezi olarak yönetmek çok daha kolay.

# CSP header örneği - production ortamı için
Header-Name: Content-Security-Policy
Value: default-src 'self'; script-src 'self' 'nonce-{random}' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.orneksite.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'

# Test ortamı için daha gevşek bir CSP
Header-Name: Content-Security-Policy-Report-Only
Value: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; report-uri /csp-report

CSP geliştirirken Report-Only modunu kullanmak altın kural. Bu şekilde kuralı uygulamadan önce ne kadar şeyi kıracağınızı görebilirsiniz.

CORS Header’larını Cloudflare Üzerinden Yönetmek

CORS yönetimi, özellikle API’ler için kritik. Yanlış yapılandırılmış CORS hem güvenlik açığı oluşturur hem de meşru istekleri engeller.

# API subdomain'i için CORS kuralı
# Koşul: http.host eq "api.orneksite.com"

# Tüm kaynaklardan gelen preflight isteklerini handle etmek için
# Method: OPTIONS isteklerine özel kural yazabilirsiniz

# Access-Control-Allow-Origin için dinamik değer
Header-Name: Access-Control-Allow-Origin
Value: https://orneksite.com

# Credentials desteği için
Header-Name: Access-Control-Allow-Credentials
Value: true

# İzin verilen metodlar
Header-Name: Access-Control-Allow-Methods
Value: GET, POST, PUT, DELETE, OPTIONS, PATCH

# İzin verilen header'lar
Header-Name: Access-Control-Allow-Headers
Value: Content-Type, Authorization, X-Requested-With, X-API-Key

# Preflight cache süresi (saniye)
Header-Name: Access-Control-Max-Age
Value: 86400

Gerçek dünya senaryosunda CORS’u test etmek için:

# CORS preflight isteği simüle etme
curl -X OPTIONS https://api.orneksite.com/endpoint 
  -H "Origin: https://orneksite.com" 
  -H "Access-Control-Request-Method: POST" 
  -H "Access-Control-Request-Headers: Content-Type, Authorization" 
  -v 2>&1 | grep -i "access-control"

# Gerçek bir cross-origin isteği test etme
curl -X GET https://api.orneksite.com/data 
  -H "Origin: https://orneksite.com" 
  -H "Authorization: Bearer test-token" 
  -I

Request Header’larını Manipüle Etmek

Sadece response header’ları değil, request header’larını da manipüle edebilirsiniz. Bu özellikle backend uygulamanıza ek bağlam bilgisi geçirmek istediğinizde çok işe yarıyor.

Gerçek IP Adresini Backend’e İletmek

Load balancer veya proxy arkasında çalışan uygulamalar için kullanıcının gerçek IP adresini doğru şekilde iletmek kritik:

# Cloudflare'in zaten eklediği header'lar var, ama özel header ekleyebilirsiniz
# Modify Request Header > Set

Header-Name: X-Real-IP
Value: cf.connecting_ip  # Dynamic değer - Cloudflare expression

# Veya custom bir header ismiyle
Header-Name: X-Client-IP
Value: ip.src

# Ülke bilgisini backend'e iletmek
Header-Name: X-Client-Country
Value: ip.geoip.country

# Şehir bilgisi
Header-Name: X-Client-City
Value: ip.geoip.city

Uygulama Versiyonu ve Environment Bilgisi

# Backend'e ortam bilgisi geçirmek
# Örneğin staging subdomain'iniz için farklı header
# Koşul: http.host contains "staging"

Header-Name: X-Environment
Value: staging

Header-Name: X-Debug-Mode
Value: true

# Production için
# Koşul: http.host eq "orneksite.com"
Header-Name: X-Environment
Value: production

Hassas Header’ları Temizlemek

Güvenlik açısından kritik bir konu: Bazı header’ları backend’iniz ekliyor olabilir ve bunların son kullanıcıya ulaşmaması gerekiyor. Örneğin sunucu teknolojinizi açıklayan header’lar.

# Remove işlemi ile hassas header'ları sil
# Response header'dan kaldırılacaklar:

# Sunucu bilgisini gizle
Header-Name: Server
Action: Remove

# PHP versiyonu gibi bilgileri gizle
Header-Name: X-Powered-By
Action: Remove

# Uygulama framework bilgisi
Header-Name: X-AspNet-Version
Action: Remove

# Debug bilgilerini production'da gizle
Header-Name: X-Debug-Info
Action: Remove

Bu işlemi test etmek için:

# Header temizleme öncesi ve sonrası karşılaştırma
# Önce Cloudflare bypass ederek direkt sunucuya bak (eğer IP biliyorsan)
curl -I http://SUNUCU-IP/ -H "Host: orneksite.com"

# Sonra Cloudflare üzerinden
curl -I https://orneksite.com

# Server header farklı mı kontrol et
curl -sI https://orneksite.com | grep -i server

Cache-Control Header’larını Yönetmek

Önbellekleme stratejinizi Cloudflare üzerinden merkezi olarak yönetmek, hem performansı artırır hem de yanlış cache davranışlarını düzeltmenizi kolaylaştırır.

# Statik dosyalar için agresif cache
# Koşul: http.request.uri.path matches ".(css|js|jpg|jpeg|png|gif|ico|woff|woff2)$"

Header-Name: Cache-Control
Value: public, max-age=31536000, immutable

# HTML sayfalar için daha kısa cache
# Koşul: http.request.uri.path matches ".html$" or http.request.uri.path eq "/"

Header-Name: Cache-Control
Value: public, max-age=3600, must-revalidate

# API endpoint'leri için cache devre dışı
# Koşul: http.request.uri.path matches "^/api/.*"

Header-Name: Cache-Control
Value: no-store, no-cache, must-revalidate, private

# Cloudflare CDN cache direktifi
Header-Name: CDN-Cache-Control
Value: max-age=86400

Çoklu Kural Yönetimi ve Öncelik Sırası

Birden fazla kural oluşturduğunuzda, kuralların hangi sırayla uygulandığı kritik önem taşıyor. Cloudflare, kuralları yukarıdan aşağıya doğru işler ve varsayılan olarak eşleşen ilk kuralı uygular.

Örneğin bir e-ticaret sitesi için katmanlı bir strateji:

# Kural 1 - En yüksek öncelik: Admin panel güvenlik header'ları
# Koşul: http.request.uri.path matches "^/admin/.*"
# Headers:
#   X-Frame-Options: DENY (SAMEORIGIN yerine daha kısıtlayıcı)
#   Cache-Control: no-store, private

# Kural 2 - API güvenlik header'ları
# Koşul: http.request.uri.path matches "^/api/.*"
# Headers:
#   Content-Type: application/json (varsayılan)
#   X-Content-Type-Options: nosniff

# Kural 3 - Genel site header'ları
# Koşul: (http.request.uri != "")
# Headers:
#   Strict-Transport-Security: max-age=31536000
#   X-XSS-Protection: 1; mode=block

Kural sıralamasını test etmek için Cloudflare’in Test with a simulated request özelliğini kullanabilirsiniz. Dashboard’da kural oluştururken bu seçenek mevcut.

Terraform ile Transform Rules Yönetimi (IaC Yaklaşımı)

Production ortamında kurallarınızı kod olarak yönetmek en iyi pratik. Cloudflare’in Terraform provider’ı bunu mümkün kılıyor:

# terraform/cloudflare_transform_rules.tf

resource "cloudflare_ruleset" "transform_security_headers" {
  zone_id     = var.cloudflare_zone_id
  name        = "Security Headers Transform Rules"
  description = "Guvenlik header yonetimi icin transform rules"
  kind        = "zone"
  phase       = "http_response_headers_transform"

  rules {
    action = "rewrite"
    action_parameters {
      headers {
        name      = "Strict-Transport-Security"
        operation = "set"
        value     = "max-age=31536000; includeSubDomains; preload"
      }
      headers {
        name      = "X-Content-Type-Options"
        operation = "set"
        value     = "nosniff"
      }
      headers {
        name      = "X-Frame-Options"
        operation = "set"
        value     = "SAMEORIGIN"
      }
      headers {
        name      = "X-Powered-By"
        operation = "remove"
      }
      headers {
        name      = "Server"
        operation = "remove"
      }
    }
    expression  = "true"
    description = "Temel guvenlik headerlari"
    enabled     = true
  }
}

Cloudflare API ile Programatik Yönetim

Otomasyon yapmak istiyorsanız veya CI/CD pipeline’ınıza entegre etmek istiyorsanız, Cloudflare API’yi doğrudan kullanabilirsiniz:

# Zone ID'nizi alın
curl -X GET "https://api.cloudflare.com/client/v4/zones" 
  -H "Authorization: Bearer YOUR_API_TOKEN" 
  -H "Content-Type: application/json" | jq '.result[] | {id: .id, name: .name}'

# Mevcut transform rules'u listele
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rulesets/phases/http_response_headers_transform/entrypoint" 
  -H "Authorization: Bearer YOUR_API_TOKEN" 
  -H "Content-Type: application/json" | jq '.result.rules'

# Yeni bir ruleset oluştur veya güncelle
curl -X PUT "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rulesets/phases/http_response_headers_transform/entrypoint" 
  -H "Authorization: Bearer YOUR_API_TOKEN" 
  -H "Content-Type: application/json" 
  -d '{
    "rules": [
      {
        "action": "rewrite",
        "action_parameters": {
          "headers": {
            "Strict-Transport-Security": {
              "operation": "set",
              "value": "max-age=31536000; includeSubDomains"
            },
            "X-Frame-Options": {
              "operation": "set",
              "value": "SAMEORIGIN"
            },
            "Server": {
              "operation": "remove"
            }
          }
        },
        "expression": "true",
        "description": "Guvenlik headerlari",
        "enabled": true
      }
    ]
  }'

Yaygın Hatalar ve Çözümleri

Cloudflare Transform Rules kullanırken sıkça karşılaşılan sorunlar:

Duplicate Header Sorunu: Set yerine Add kullandığınızda, backend’iniz de aynı header’ı gönderiyorsa iki kez görünebilir. Çözüm olarak her zaman Set kullanın veya önce Remove, sonra Set yapın.

Expression Syntax Hatası: Kural ifadelerini yazarken sözdizimi hatası yapılabiliyor. Cloudflare dashboard’undaki expression builder görsel arayüzü ile başlamak, sonra manuel düzenlemeye geçmek daha güvenli.

Kural Sırası Karmaşası: Kurallar sıralı çalışır. Eğer genel bir kural spesifik bir kuralın önündeyse, spesifik kural hiç çalışmayabilir. Daha özel kuralları her zaman üste taşıyın.

Cache ile Çakışma: Header değişikliklerinin Cloudflare cache’indeki eski içeriklere uygulanmadığını görürsünüz. Cache’i temizlemek (Purge Everything) veya Cache-Control ayarlarını gözden geçirmek gerekebilir:

# Cloudflare cache temizleme
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" 
  -H "Authorization: Bearer YOUR_API_TOKEN" 
  -H "Content-Type: application/json" 
  -d '{"purge_everything": true}'

Plan Kısıtlamaları

Transform Rules’un ne kadarını kullanabileceğiniz Cloudflare planınıza göre değişiyor:

  • Free: 10 kural, temel header manipülasyonu
  • Pro: 25 kural, gelişmiş expression desteği
  • Business: 50 kural, regex desteği dahil
  • Enterprise: Sınırsız kural, tüm özellikler

Eğer free plandaysanız, birden fazla header işlemini tek bir kuralda birleştirerek kural limitini verimli kullanabilirsiniz.

Sonuç

Cloudflare Transform Rules, header yönetimini uygulama katmanından çıkarıp ağ katmanına taşımanın en etkili yollarından biri. Güvenlik header’larını merkezi olarak yönetmek, geliştirici hatalarını minimize eder ve tutarlılığı garanti altına alır.

Özellikle microservice mimarilerinde, her servis için ayrı ayrı header konfigürasyonu yapmak yerine Cloudflare üzerinden tek noktadan yönetim hem operasyonel yükü azaltır hem de güvenlik politikalarını tutarlı kılar. Terraform ile kod olarak yönettiğinizde, konfigürasyon drift’i de önlemiş olursunuz.

Başlangıç için en azından güvenlik header’larını (HSTS, X-Content-Type-Options, X-Frame-Options) ve hassas sunucu bilgilerini temizleyen kuralları (Server, X-Powered-By header’larını kaldırma) ekleyin. Bu basit adımlar bile güvenlik postürünüzü önemli ölçüde iyileştirir. İlerledikçe CSP, CORS ve önbellekleme stratejilerini de bu sisteme entegre edebilirsiniz.

Bir yanıt yazın

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