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.
