Web sitenizi yaygın saldırılara karşı korumak için güvenlik başlıklarını uygulamaya yönelik, küresel kitle için güvenliği artıran kapsamlı bir rehber.
Web Güvenlik Başlıkları: Pratik Bir Uygulama Rehberi
Günümüzün dijital dünyasında, web güvenliği her şeyden önemlidir. Web siteleri sürekli olarak siteler arası betik çalıştırma (XSS), tıklama tuzağı (clickjacking) ve veri enjeksiyonu gibi çeşitli saldırıların hedefi olmaktadır. Web güvenlik başlıklarını uygulamak, bu riskleri azaltmada ve kullanıcılarınızı ve verilerinizi korumada çok önemli bir adımdır. Bu rehber, temel güvenlik başlıklarına kapsamlı bir genel bakış sunar ve bunların nasıl etkili bir şekilde uygulanacağını anlatır.
Web Güvenlik Başlıkları Nedir?
Web güvenlik başlıkları, web tarayıcılarına web sitenizin içeriğini işlerken nasıl davranmaları gerektiğini bildiren HTTP yanıt başlıklarıdır. Tarayıcıya hangi eylemlere izin verildiğini ve hangilerinin yasak olduğunu söyleyen bir dizi kural olarak işlev görürler. Bu başlıkları doğru bir şekilde ayarlayarak, web sitenizin saldırı yüzeyini önemli ölçüde azaltabilir ve genel güvenlik duruşunu iyileştirebilirsiniz. Güvenlik başlıkları, mevcut güvenlik önlemlerini güçlendirir ve yaygın web güvenlik açıklarına karşı ekstra bir savunma katmanı sağlar.
Güvenlik Başlıkları Neden Önemlidir?
- Yaygın Saldırıları Azaltma: Güvenlik başlıkları, XSS, tıklama tuzağı ve MIME sniffing gibi birçok yaygın web saldırısını etkili bir şekilde engelleyebilir veya azaltabilir.
- Kullanıcı Gizliliğini Artırma: Bazı başlıklar, yönlendiren bilgilerini kontrol ederek ve tarayıcı özelliklerine erişimi sınırlayarak kullanıcı gizliliğini korumaya yardımcı olabilir.
- Web Sitesi Güvenlik Duruşunu İyileştirme: Güvenlik başlıklarını uygulamak, güvenliğe olan bağlılığınızı gösterir ve web sitenizin itibarını artırabilir.
- Uyum Gereksinimleri: GDPR ve PCI DSS gibi birçok güvenlik standardı ve yönetmeliği, güvenlik başlıklarının kullanılmasını gerektirir veya önerir.
Temel Güvenlik Başlıkları ve Uygulamaları
İşte en önemli güvenlik başlıklarının ve nasıl uygulanacaklarının bir dökümü:
1. Content-Security-Policy (CSP)
Content-Security-Policy (CSP) başlığı en güçlü güvenlik başlıklarından biridir. Tarayıcının betikler, stil sayfaları, resimler ve yazı tipleri gibi kaynakları hangi kaynaklardan yüklemesine izin verildiğini kontrol etmenizi sağlar. Bu, tarayıcının web sitenize enjekte edilen kötü amaçlı kodu çalıştırmasını önleyerek XSS saldırılarını önlemeye yardımcı olur.
Uygulama:
CSP başlığı, `Content-Security-Policy` yönergesi ile ayarlanır. Değer, her biri belirli bir kaynak türü için izin verilen kaynakları belirten bir yönergeler listesidir.
Örnek:
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:; font-src 'self'; connect-src 'self' wss://example.com;
Açıklama:
- `default-src 'self'`: Daha spesifik bir yönerge ile aksi belirtilmedikçe, tüm kaynakların belgeyle aynı kaynaktan yüklenmesi gerektiğini belirtir.
- `script-src 'self' https://example.com`: Betiklerin aynı kaynaktan ve `https://example.com` adresinden yüklenmesine izin verir.
- `style-src 'self' https://example.com`: Stil sayfalarının aynı kaynaktan ve `https://example.com` adresinden yüklenmesine izin verir.
- `img-src 'self' data:`: Resimlerin aynı kaynaktan ve data URI'lerinden (satır içi resimler) yüklenmesine izin verir.
- `font-src 'self'`: Yazı tiplerinin aynı kaynaktan yüklenmesine izin verir.
- `connect-src 'self' wss://example.com`: Bağlantıların (ör. AJAX, WebSockets) aynı kaynağa ve `wss://example.com` adresine yapılmasına izin verir.
Önemli CSP Yönergeleri:
- `default-src`: Başka bir yönerge belirtilmemişse tüm kaynak türleri için geçerli olan bir yedek yönergedir.
- `script-src`: JavaScript için kaynakları kontrol eder.
- `style-src`: Stil sayfaları için kaynakları kontrol eder.
- `img-src`: Resimler için kaynakları kontrol eder.
- `font-src`: Yazı tipleri için kaynakları kontrol eder.
- `media-src`: Ses ve video için kaynakları kontrol eder.
- `object-src`: Flash gibi eklentiler için kaynakları kontrol eder.
- `frame-src`: Çerçeveler ve iframe'ler için kaynakları kontrol eder.
- `connect-src`: Bir betiğin bağlanabileceği URL'leri kontrol eder (ör. AJAX, WebSockets).
- `base-uri`: Bir belgenin <base> öğesinde kullanılabilecek URL'leri kısıtlar.
- `form-action`: Formların gönderilebileceği URL'leri kısıtlar.
CSP Sadece Raporlama Modu:
Bir CSP politikasını zorunlu kılmadan önce, sadece raporlama modunu kullanmanız önerilir. Bu, herhangi bir kaynağı engellemeden politikanın etkisini izlemenizi sağlar. Bu amaçla `Content-Security-Policy-Report-Only` başlığı kullanılır.
Örnek:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://example.com; report-uri /csp-report-endpoint;
Bu örnekte, CSP politikasının herhangi bir ihlali `/csp-report-endpoint` URL'sine raporlanacaktır. Bu raporları almak ve analiz etmek için sunucu tarafında bir uç nokta kurmanız gerekir. Sentry ve Google CSP Evaluator gibi araçlar, CSP politikası oluşturma ve raporlama konusunda yardımcı olabilir.
2. X-Frame-Options
X-Frame-Options başlığı, tıklama tuzağı (clickjacking) saldırılarına karşı koruma sağlamak için kullanılır. Tıklama tuzağı, bir saldırganın, genellikle meşru bir web sitesini kötü amaçlı bir iframe içine yerleştirerek, bir kullanıcıyı algıladığından farklı bir şeye tıklaması için kandırmasıyla meydana gelir.
Uygulama:
X-Frame-Options başlığının üç olası değeri olabilir:
- `DENY`: Kaynağı ne olursa olsun sayfanın bir çerçeve içinde görüntülenmesini engeller.
- `SAMEORIGIN`: Sayfanın yalnızca çerçevenin kaynağı sayfanın kaynağıyla aynıysa bir çerçeve içinde görüntülenmesine izin verir.
- `ALLOW-FROM uri`: (Kullanımdan kaldırılmıştır ve tavsiye edilmez) Sayfanın yalnızca çerçevenin kaynağı belirtilen URI ile eşleşiyorsa bir çerçeve içinde görüntülenmesine izin verir.
Örnekler:
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
Çoğu web sitesi için `SAMEORIGIN` seçeneği en uygun olanıdır. Web siteniz asla çerçevelenmemeliyse, `DENY` kullanın. `ALLOW-FROM` seçeneği, tarayıcı uyumluluk sorunları nedeniyle genellikle önerilmez.
Önemli: `X-Frame-Options` eski kabul edildiğinden, daha iyi kontrol ve uyumluluk için bunun yerine CSP'nin `frame-ancestors` yönergesini kullanmayı düşünün. `frame-ancestors`, kaynağı yerleştirmesine izin verilen kaynakların bir listesini belirtmenize olanak tanır.
3. Strict-Transport-Security (HSTS)
Strict-Transport-Security (HSTS) başlığı, tarayıcıları web sitenizle yalnızca HTTPS üzerinden iletişim kurmaya zorlar. Bu, bir saldırganın güvensiz HTTP trafiğini ele geçirip kullanıcıları kötü amaçlı bir web sitesine yönlendirebileceği ortadaki adam (man-in-the-middle) saldırılarını önler.
Uygulama:
HSTS başlığı, tarayıcının siteye yalnızca HTTPS üzerinden erişmeyi ne kadar süre (saniye cinsinden) hatırlaması gerektiğini belirten `max-age` yönergesini belirtir. HSTS politikasını tüm alt alan adlarına uygulamak için `includeSubDomains` yönergesini de ekleyebilirsiniz.
Örnek:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Açıklama:
- `max-age=31536000`: Tarayıcının siteye yalnızca HTTPS üzerinden erişmeyi bir yıl boyunca (31.536.000 saniye) hatırlaması gerektiğini belirtir. Üretim ortamları için genellikle daha uzun bir `max-age` önerilir.
- `includeSubDomains`: HSTS politikasını web sitesinin tüm alt alan adlarına uygular.
- `preload`: Alan adınızın tarayıcının HSTS önyükleme listesine eklenmesini istediğinizi belirtir. Bu, alan adınızı Google tarafından yönetilen HSTS önyükleme listesine göndermenizi gerektiren isteğe bağlı bir yönergedir. Önyükleme, sitenize ilk kez bağlanan kullanıcıların HTTPS kullanmasını sağlar.
Önemli: HSTS'yi etkinleştirmeden önce, tüm web sitenizin ve tüm alt alan adlarının HTTPS üzerinden erişilebilir olduğundan emin olun. Aksi takdirde, kullanıcılar web sitenize erişemeyebilir.
4. X-Content-Type-Options
X-Content-Type-Options başlığı, MIME sniffing saldırılarını önler. MIME sniffing, sunucu farklı bir içerik türü belirtmiş olsa bile tarayıcının bir kaynağın içerik türünü tahmin etmeye çalıştığı bir tekniktir. Bu, tarayıcının bir dosyayı yanlışlıkla çalıştırılabilir kod olarak yorumlaması durumunda güvenlik açıklarına yol açabilir.
Uygulama:
X-Content-Type-Options başlığının yalnızca bir olası değeri vardır: `nosniff`.
Örnek:
X-Content-Type-Options: nosniff
Bu başlık, tarayıcıya bir kaynağın içerik türünü tahmin etmeye çalışmamasını ve yalnızca sunucu tarafından belirtilen `Content-Type` başlığına güvenmesini söyler.
5. Referrer-Policy
Referrer-Policy başlığı, bir kullanıcı web sitenizden ayrıldığında diğer web sitelerine ne kadar yönlendiren bilgisi (önceki sayfanın URL'si) gönderileceğini kontrol eder. Bu, hassas bilgilerin üçüncü taraf sitelere sızmasını önleyerek kullanıcı gizliliğini korumaya yardımcı olabilir.
Uygulama:
Referrer-Policy başlığının birkaç olası değeri olabilir, her biri gönderilecek farklı bir yönlendiren bilgisi seviyesini belirtir:
- `no-referrer`: Referer başlığını asla gönderme.
- `no-referrer-when-downgrade`: HTTPS'den HTTP'ye giderken Referer başlığını gönderme.
- `origin`: Yalnızca belgenin kaynağını gönder (ör. `https://example.com`).
- `origin-when-cross-origin`: Farklı bir kaynağa giderken kaynağı gönder, aynı kaynağa giderken tam URL'yi gönder.
- `same-origin`: Aynı kaynaklı istekler için Referer başlığını gönder, ancak çapraz kaynaklı istekler için gönderme.
- `strict-origin`: Yalnızca protokol güvenlik seviyesi aynı kaldığında (HTTPS'den HTTPS'ye) kaynağı gönder, ancak daha az güvenli bir hedefe (HTTPS'den HTTP'ye) gönderme.
- `strict-origin-when-cross-origin`: Farklı bir kaynağa giderken kaynağı gönder, ancak yalnızca protokol güvenlik seviyesi aynı kalırsa (HTTPS'den HTTPS'ye). Aynı kaynağa giderken tam URL'yi gönder.
- `unsafe-url`: (Tavsiye edilmez) Referer başlığı olarak her zaman tam URL'yi gönder. Bu en az güvenli seçenektir.
Örnekler:
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: no-referrer
`strict-origin-when-cross-origin` politikası genellikle güvenlik ve işlevsellik arasında iyi bir denge sağlar. Tam URL'yi farklı kaynaklara göndermeyerek kullanıcı gizliliğini korurken, web sitelerinin temel yönlendirme bilgilerini izlemesine olanak tanır.
6. Permissions-Policy (eski adıyla Feature-Policy)
Permissions-Policy başlığı (eski adıyla Feature-Policy), web siteniz ve gömülü iframe'ler tarafından hangi tarayıcı özelliklerinin (ör. kamera, mikrofon, coğrafi konum) kullanılmasına izin verildiğini kontrol etmenizi sağlar. Bu, kötü amaçlı kodun kullanıcının açık onayı olmadan hassas tarayıcı özelliklerine erişmesini önlemeye yardımcı olabilir.
Uygulama:
Permissions-Policy başlığı, her biri belirli bir tarayıcı özelliğine erişimi kontrol eden bir yönergeler listesi belirtir. Her yönerge, bir özellik adı ve izin verilen kaynakların bir listesinden oluşur.
Örnek:
Permissions-Policy: geolocation 'self' https://example.com; camera 'none'; microphone (self)
Açıklama:
- `geolocation 'self' https://example.com`: Web sitesinin ve `https://example.com` adresinin coğrafi konum özelliğini kullanmasına izin verir.
- `camera 'none'`: Web sitesi ve tüm gömülü iframe'ler için kamera özelliğini devre dışı bırakır.
- `microphone (self)`: Web sitesinin mikrofon özelliğini kullanmasına izin verir. Bireysel kaynaklar için parantezli farklı sözdizimine dikkat edin.
Yaygın Permissions-Policy Özellikleri:
- `geolocation`: Coğrafi konum API'sine erişimi kontrol eder.
- `camera`: Kameraya erişimi kontrol eder.
- `microphone`: Mikrofona erişimi kontrol eder.
- `autoplay`: Medyanın otomatik olarak oynatılıp oynatılamayacağını kontrol eder.
- `fullscreen`: Web sitesinin tam ekran moduna girip giremeyeceğini kontrol eder.
- `accelerometer`: İvmeölçere erişimi kontrol eder.
- `gyroscope`: Jiroskopa erişimi kontrol eder.
- `magnetometer`: Manyetometreye erişimi kontrol eder.
- `speaker`: Hoparlöre erişimi kontrol eder.
- `vibrate`: Titreşim API'sine erişimi kontrol eder.
- `payment`: Ödeme İsteği API'sine erişimi kontrol eder.
7. Diğer Güvenlik Başlıkları
Yukarıda tartışılan başlıklar en yaygın kullanılan ve önemli olanlar olsa da, diğer güvenlik başlıkları ek koruma sağlayabilir:
- X-Permitted-Cross-Domain-Policies: Bu başlık, Adobe Flash Player ve diğer eklentilerin alanlar arası istekleri nasıl işlediğini kontrol eder. Önerilen değer genellikle `none`'dir.
- Clear-Site-Data: Bir web sitesinin, kullanıcı siteden ayrıldığında tarama verilerini (çerezler, depolama, önbellek) temizlemesine olanak tanır. Bu, gizliliğe duyarlı uygulamalar için yararlı olabilir.
- Expect-CT: Hileli olarak düzenlenmiş SSL sertifikalarının kullanılmasını önlemeye yardımcı olan Sertifika Şeffaflığı'nı etkinleştirir.
Güvenlik Başlıklarını Uygulama
Güvenlik başlıkları, web sunucunuza veya içerik dağıtım ağınıza (CDN) bağlı olarak çeşitli şekillerde uygulanabilir.
1. Web Sunucusu Yapılandırması
Web sunucunuzu (ör. Apache, Nginx) HTTP yanıtına güvenlik başlıkları ekleyecek şekilde yapılandırabilirsiniz. Bu genellikle güvenlik başlıklarını uygulamanın en doğrudan ve verimli yoludur.
Apache:
Güvenlik başlıklarını ayarlamak için Apache yapılandırma dosyanızda (`.htaccess` veya `httpd.conf`) `Header` yönergesini kullanabilirsiniz.
Örnek:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com;"
Header set X-Frame-Options "SAMEORIGIN"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Permissions-Policy "geolocation 'self'"
Nginx:
Güvenlik başlıklarını ayarlamak için Nginx yapılandırma dosyanızda (`nginx.conf`) `add_header` yönergesini kullanabilirsiniz.
Örnek:
add_header Content-Security-Policy "default_src 'self'; script-src 'self' https://example.com;";
add_header X-Frame-Options "SAMEORIGIN";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Permissions-Policy "geolocation 'self';";
2. İçerik Dağıtım Ağı (CDN)
Cloudflare, Akamai ve Fastly gibi birçok CDN, güvenlik başlıklarını yapılandırmak için özellikler sunar. Bu, özellikle zaten bir CDN kullanıyorsanız, güvenlik başlıklarını uygulamanın kolay bir yolu olabilir.
Örnek (Cloudflare):
Cloudflare'de, "Rules" veya "Transform Rules" özelliklerini kullanarak güvenlik başlıklarını yapılandırabilirsiniz. URL veya istek türü gibi çeşitli kriterlere göre HTTP başlıkları eklemek, değiştirmek veya kaldırmak için kurallar tanımlayabilirsiniz.
3. Sunucu Taraflı Kod
Güvenlik başlıklarını sunucu taraflı kodunuzda da ayarlayabilirsiniz (ör. PHP, Python, Node.js kullanarak). Bu yaklaşım, isteğe veya kullanıcı bağlamına göre başlıkları dinamik olarak ayarlamak için size daha fazla esneklik sağlar.
Örnek (Node.js ile Express):
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' https://example.com;");
res.setHeader('X-Frame-Options', 'SAMEORIGIN');
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
res.setHeader('Permissions-Policy', "geolocation 'self'");
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
Test ve Doğrulama
Güvenlik başlıklarını uyguladıktan sonra, doğru çalıştıklarını test etmek ve doğrulamak çok önemlidir. Birkaç çevrimiçi araç bu konuda size yardımcı olabilir:
- SecurityHeaders.com: Bu web sitesi, web sitenizi tarar ve uygulanan güvenlik başlıkları ve olası sorunlar hakkında bir rapor sunar.
- Mozilla Observatory: Bu çevrimiçi araç, web sitenizde güvenlik başlıkları da dahil olmak üzere bir dizi test gerçekleştirir ve iyileştirme için önerilerle birlikte ayrıntılı bir rapor sunar.
- Tarayıcı Geliştirici Araçları: HTTP yanıt başlıklarını incelemek ve güvenlik başlıklarının mevcut olduğunu ve doğru değerlere sahip olduğunu doğrulamak için tarayıcınızın geliştirici araçlarını (ör. Chrome DevTools, Firefox Developer Tools) kullanabilirsiniz.
Chrome DevTools kullanarak örnek:
- Chrome Geliştirici Araçları'nı açın (sayfaya sağ tıklayıp "İncele"yi seçin).
- "Ağ" (Network) sekmesine gidin.
- Sayfayı yeniden yükleyin.
- Ana belge isteğini seçin (genellikle listedeki ilk istek).
- "Başlıklar" (Headers) sekmesine gidin.
- Güvenlik başlıklarını görmek için "Yanıt Başlıkları" (Response Headers) bölümüne gidin.
Yaygın Hatalar ve En İyi Uygulamalar
İşte güvenlik başlıklarını uygularken kaçınılması gereken bazı yaygın hatalar:
- Yeterince test etmemek: Güvenlik başlıklarınızı üretime dağıtmadan önce her zaman bir hazırlık (staging) ortamında test edin.
- Aşırı izin veren CSP politikaları kullanmak: Kısıtlayıcı bir CSP politikasıyla başlayın ve gerektiğinde kademeli olarak gevşetin.
- HSTS'ye alt alan adlarını dahil etmeyi unutmak: Tüm alt alan adlarını korumak istiyorsanız, HSTS başlığına `includeSubDomains` yönergesini eklediğinizden emin olun.
- Kullanımdan kaldırılmış başlıkları kullanmak: `X-Download-Options` ve `X-Powered-By` gibi kullanımdan kaldırılmış başlıklardan kaçının.
- Güvenlik başlığı ihlallerini izlememek: Herhangi bir sorunu belirlemek ve çözmek için CSP sadece raporlama ihlallerini izlemek için bir sistem kurun.
En İyi Uygulamalar:
- Güçlü bir temel ile başlayın: En azından temel güvenlik başlıklarını uygulayın (CSP, X-Frame-Options, HSTS, X-Content-Type-Options, Referrer-Policy, Permissions-Policy).
- İçerik Güvenliği Politikası (CSP) kullanın: İçerik Güvenliği Politikası, tarayıcının kaynakları yüklemek için hangi kaynaklara güvenmesi gerektiğini tanımlayarak XSS saldırılarını önlemeye yardımcı olur.
- Güvenlik başlıklarınızı düzenli olarak gözden geçirin ve güncelleyin: Yeni güvenlik açıkları keşfedildikçe ve tarayıcı teknolojileri geliştikçe, güvenlik başlıklarınızı buna göre gözden geçirmek ve güncellemek önemlidir.
- Bir CDN kullanın: CDN'ler, güvenlik başlıklarının uygulanmasını ve yönetimini basitleştirebilir.
- Güvenlik başlığı dağıtımını otomatikleştirin: Güvenlik başlıklarının tüm ortamlarda tutarlı bir şekilde dağıtılmasını sağlamak için otomasyon araçları kullanın.
- Bilgili kalın: Güvenlik bloglarını takip ederek, güvenlik konferanslarına katılarak ve güvenlik topluluklarına katılarak en son güvenlik tehditleri ve en iyi uygulamalar hakkında güncel kalın. OWASP (Açık Web Uygulama Güvenliği Projesi), web güvenliği hakkında bilgi için harika bir kaynaktır.
Sonuç
Web güvenlik başlıklarını uygulamak, web sitenizi ve kullanıcılarınızı yaygın saldırılardan korumak için önemli bir adımdır. Her başlığın amacını anlayarak ve bu kılavuzda belirtilen en iyi uygulamaları takip ederek, web sitenizin güvenlik duruşunu önemli ölçüde iyileştirebilir ve kullanıcılarınızla güven oluşturabilirsiniz. Güvenlik başlıklarınızın etkili bir şekilde çalıştığından emin olmak ve gelişen güvenlik tehditlerine uyum sağlamak için düzenli olarak test etmeyi ve izlemeyi unutmayın. Güvenlik başlıklarını uygulamak için harcanan zaman ve çaba, uzun vadede web sitenizi ve kullanıcılarınızı zarardan koruyarak karşılığını verecektir. Son bir not olarak, web sitenizin güvenliğini değerlendirmek ve herhangi bir güvenlik açığını belirlemek için bir güvenlik uzmanına danışmayı veya bir güvenlik denetim hizmeti kullanmayı düşünün.