Yazılım ve Mühendislik
HTTP Güvenlik Başlıkları: Hangisi Gerçekte Ne İşe Yarar?
Saldırı türlerini engelleyen 6 güvenlik başlığı, doğru kurulum sırası, olası riskler ve acilen kaldırmanız gereken iki eski başlık.
Güvenlik başlıkları (security headers), bir web sitesini güçlendirmenin en ucuz ve en etkili yoludur. Her biri sadece tek satırlık bir sunucu yapılandırmasıdır, performansa hiçbir olumsuz etkisi yoktur ve birlikte birden fazla siber saldırı kategorisini tamamen engellerler.
Buna rağmen çoğu web sitesi bunların hiçbirini göndermez.
İşte her birinin ne işe yaradığı, uygulanması gereken öncelik sırası ve sunucunuzdan derhal kaldırmanız gereken iki eski başlık:
Buradan başlayın: Asla hiçbir şeyi bozmayan üç temel başlık
Bunları bugün tek bir güncellemede hemen her web sitesine güvenle ekleyebilirsiniz:
X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
Tek bir değer, sıfır ayar karmaşası ve hiçbir dezavantajı yok.
Bu başlık olmadan tarayıcılar dosya içeriğini "koklar" (MIME-sniffing) ve bir dosyanın gerçek türünün sunucunun bildirdiğinden farklı olduğuna karar verebilir. Kullanıcının yüklediği bir resim dosyasının içinde komut dosyası göründüğü için tarayıcı tarafından JavaScript olarak çalıştırıldığı saldırıların arkasındaki mekanizma budur.
Bu başlığı göndermemek için hiçbir geçerli neden yoktur. Sitenizde yoksa, ilk düzelteceğiniz şey budur.
X-Frame-Options
X-Frame-Options: SAMEORIGIN
Sayfalarınızın başka birinin sitesindeki bir iframe içinde yüklenmesini engeller. Tıklama hırsızlığı (Clickjacking) tam olarak böyle çalışır: Saldırganın sayfası, sitenizi görünmez bir çerçeve içinde sahte bir butonun altına yerleştirir ve kurbanın tıklaması sizin arayüzünüze denk gelir.
SAMEORIGIN, sitenizin kendi sayfalarını çerçeve içine almasına izin verir (çoğu zaman istediğiniz budur). DENY ise tüm çerçevelemeyi tamamen engeller.
Modern alternatifi CSP içindeki frame-ancestors direktifidir. İkisini birden göndermek hiçbir şeye mal olmaz ve eski tarayıcıları da kapsar.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Biri sitenizden başka bir siteye giden bir bağlantıya tıkladığında, mevcut URL adresinizin ne kadarının karşı tarafa iletileceğini kontrol eder.
Bu olmadan URL'in tamamı sızar — buna URL parametrelerindeki (query string) her şey dahildir. Şifre sıfırlama anahtarları, oturum kimlikleri, site içi arama terimleri ve müşteri kimlikleri, ziyaretçinin tıkladığı tüm üçüncü taraf sitelere bu yolla sızmıştır.
strict-origin-when-cross-origin, kendi siteniz içinde tam URL'i gönderir, diğer HTTPS sitelere yalnızca alan adını (origin) iletir, güvenli olmayan HTTP'ye geçerken ise hiçbir şey göndermez. Artık tarayıcı varsayılanıdır ancak açıkça göndermek eski istemcileri de korur ve niyeti belgeler.
Sırada: HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains
Tarayıcıya bu alan adına belirtilen süre boyunca YALNIZCA HTTPS üzerinden bağlanmasını, HTTP'yi denemesini bile emreder.
İki büyük faydası vardır: Güvenlik açısından, ilk HTTP isteğinin yönlendirme gerçekleşmeden önce araya girilip güvenliğinin düşürülmesi (downgrade attack) riskini tamamen kapatır. Performans açısından ise genellikle gözden kaçırılır: Siteye tekrar gelen ziyaretçiler için http→https yönlendirmesini tamamen ortadan kaldırır, böylece her sayfa yüklemesinden tam bir gidiş-dönüş süresini (round trip) siler.
Dikkatli uygulayın. HSTS, tarayıcıların zorunlu kıldığı ve anında geri alamayacağınız bir taahhüttür. includeSubDomains ile 1 yıllık bir max-age ayarlar ve ardından yalnızca HTTP ile çalışan dahili bir alt alan adınız olduğunu fark ederseniz, o alt alan adı sitenizi ziyaret eden herkes için 1 yıl boyunca erişilemez kalır.
Güvenli geçiş planı:
- Her alt alan adının HTTPS'i düzgün sunduğunu doğrulayın.
- Birkaç gün boyunca
max-age=300(5 dakika) ile test edin. - Bir hafta boyunca
max-age=86400(1 gün) yapın. - Ardından
max-age=31536000; includeSubDomainsseviyesine çıkarın.
preload direktifi daha da ileri giderek alan adınızı tarayıcıların yerleşik HSTS listesine kalıcı olarak yazar. Oradan silinmek aylar sürer; yalnızca tamamen emin olduğunuzda ekleyin.
En önemlisi: Content-Security-Policy (CSP)
CSP, sayfanın hangi kaynaklardan script, stil, resim, yazı tipi ve bağlantı yükleyebileceğini beyan eder. Doğru yapılandırıldığında, kod enjeksiyonu başarılı olsa bile çoğu Siteler Arası Betik Çalıştırma (XSS) saldırısını durdurur; çünkü enjekte edilen script'in izin verilen bir kaynağı yoktur ve tarayıcı onu çalıştırmayı reddeder.
Aynı zamanda bu listede sitenizi yanlış yapılandırıldığında bozabilecek tek başlıktır; bu yüzden çok az sitede bulunur.
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'
unsafe-inline ikilemi. Çoğu sitede satır içi <script> blokları bulunur — analitik kodları, etiket yöneticileri, küçük sayfa içi işlevler. Katı bir CSP bunların hepsini engeller. script-src alanına 'unsafe-inline' eklemek politikanın hatasız çalışmasını sağlar ama aynı zamanda değerinin çoğunu yok eder; çünkü CSP'nin varlık sebebi tam olarak bu satır içi kodları engellemektir.
Gerçek çözüm nonce (tek kullanımlık rastgele değerler) veya hash kullanmaktır: Her istekte rastgele bir nonce üretin, bunu meşru script'lerinize ekleyin ve CSP politikasında belirtin. Bu sunucu taraflı render gerektirir.
Önce sadece raporlama modunda yayınlayın:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Hiçbir şey engellenmez; kural ihlalleri raporlanır. İki ila dört hafta çalıştırın, nelerin tetiklendiğini görün, meşru olanlara izin verin, ardından başlık adını normal Content-Security-Policy yaparak zorunlu kılın.
Gevşek bir politikada bile mutlaka olması gereken 4 direktif: frame-ancestors (clickjacking engeller), base-uri (enjekte edilen <base> etiketlerinin tüm linkleri yönlendirmesini engeller), form-action (formların sahte adreslere post edilmesini engeller) ve object-src 'none' (eski eklenti açıklarını kapatır).
Permissions-Policy
Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=()
Sayfanın hangi tarayıcı özelliklerini kullanabileceğini bildirir. Kullanmadığınız özellikleri kapatmak, hacklenmiş üçüncü taraf bir script'in erişebileceği yetkileri kısıtlar. Siteniz asla kamera istemiyorsa bunu belirtmek sıfır maliyetlidir ve sayfadaki her script'ten bu yetkiyi alır.
Kaldırmanız gereken iki eski başlık
X-XSS-Protection artık tamamen eskimiştir. Chrome ve Edge'den kaldırılan tarayıcı taraflı bir XSS filtresini açıyordu; çünkü filtrenin kendisi yeni güvenlik açıkları yaratıyordu. Göndermenin hiçbir faydası yoktur; genellikle 10 yıllık eski bir kılavuzdan kopyalanmış ayarların göstergesidir.
Server ve X-Powered-By başlıkları sunucunuzun ve yazılımınızın tam sürüm numaralarını tüm dünyaya ilan eder. Bir güvenlik açığı duyurulduğunda otomatik tarayıcılar tam olarak bu başlıkları arar. Bunları gizleyin:
Header unset X-Powered-By
Header unset Server
ServerTokens Prod
Apache / LiteSpeed yapılandırması (.htaccess)
Çoğu paylaşımlı barındırma ve LiteSpeed sunucuda .htaccess içine şunu eklemeniz yeterlidir:
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
Header unset X-Powered-By
</IfModule>
always kelimesi çok önemlidir — o olmadan başlıklar hata sayfalarında (404, 500 vb.) gönderilmez; oysa güvenlik başlıklarına tam da o anlarda ihtiyacınız vardır.
Nginx üzerinde karşılığı sunucu bloğu içine add_header … always; eklemektir.
Doğrulama
Herhangi bir sitenin canlı yanıt başlıklarını Ücretsiz Güvenlik Başlıkları Kontrol Aracımız ile tarayabilirsiniz. Sunucunuzun döndürdüğü gerçek başlıkları okur ve eksikleri nedenleriyle listeler.
Öncelik sırası
X-Content-Type-Options— tek satır, sıfır riskX-Frame-Options— tek satır, sıfır riskReferrer-Policy— tek satır, sıfır riskX-XSS-Protectionve sürüm başlıklarını kaldırınPermissions-Policy— kullanmadığınız özellikleri kapatın- HSTS — kademeli geçiş
- CSP — önce raporlama, sonra zorunlu kılma
1'den 5'e kadar olan adımlar tek bir güncelleme ve bir öğleden sonradır. 6 ve 7 dikkat gerektirir. Yalnızca ilk 5 adımı yapmak bile sitenizi internetin %90'ından daha güvenli hale getirir.
Dürüst bir not: Bunların hiçbiri doğrudan bir SEO sıralama faktörü değildir. Hiçbir arama motoru CSP başlığınıza puan vermez. Ancak bunları yapmanızın asıl nedeni, hacklenen bir sitenin Google tarafından "Bu site güvenli olmayabilir" damgası yediğinde tüm sıralamalarını bir gecede kaybetmesidir — ve o noktadan sonra temizlik yapmak bir yapılandırma dosyasını düzenlemekten çok daha pahalıya mal olur.