İçindekiler
Bir web sunucusu her yanıtta sayfanın kendisiyle birlikte bir dizi başlık (header) gönderir. Bu başlıkların bir kısmı, tarayıcıya güvenlikle ilgili talimatlar verir: "Bu siteye yalnızca HTTPS ile bağlan", "Beni başka bir sitenin içinde gösterme", "Yalnızca şu kaynaklardan script çalıştır."
Bu başlıklar ücretsizdir, birkaç satırla eklenir ve pek çok saldırı türünü tarayıcı seviyesinde engeller.
Sitenizde hangileri var?
curl -sI https://ornek.com
Çıktıda aşağıdaki başlıkları arayın. Eksik olanları ekleyeceğiz.
1. Strict-Transport-Security (HSTS)
Strict-Transport-Security: max-age=31536000; includeSubDomains
Tarayıcıya "Bu siteye bir yıl boyunca yalnızca HTTPS ile bağlan" der. Kullanıcı adres çubuğuna http:// yazsa bile tarayıcı isteği daha göndermeden HTTPS'e çevirir. Bu, araya girip ilk HTTP isteğini yakalamaya dayanan saldırıları engeller.
Dikkat: HSTS'i eklemeden önce sitenin ve includeSubDomains kullanıyorsanız bütün alt alan adlarının HTTPS ile sorunsuz çalıştığından emin olun. Tarayıcı bu talimatı belirtilen süre boyunca hatırlar ve geri almak zordur. İlk denemede max-age=300 gibi kısa bir süreyle başlayın, sorun yoksa artırın.
2. X-Content-Type-Options
X-Content-Type-Options: nosniff
Tarayıcının dosya türünü "tahmin etmesini" engeller. Örneğin bir kullanıcının yüklediği ve içinde script bulunan bir dosya, görsel olarak sunulduğu hâlde tarayıcı tarafından JavaScript olarak çalıştırılamaz. Hiçbir yan etkisi yoktur; gözünüz kapalı ekleyebilirsiniz.
3. Sitenin başka bir sitede gösterilmesini engellemek
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Clickjacking saldırısında, sitenizin görünmez bir kopyası başka bir sitenin üstüne yerleştirilir. Kullanıcı masum bir butona tıkladığını sanırken aslında sizin sitenizde bir işlem yapar. Bu iki başlık sitenizin yalnızca kendi sayfalarınızda çerçeve içinde gösterilebilmesini sağlar. Modern yöntem CSP'deki frame-ancestors yönergesidir. X-Frame-Options ise eski tarayıcılar için eklenir.
4. Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Ziyaretçi sitenizden başka bir siteye geçtiğinde, karşı tarafa hangi adresten geldiğinin ne kadarının söyleneceğini belirler. Bu değer başka sitelere yalnızca alan adınızı gönderir, sayfa yolunu ve parametreleri göndermez. Adreste oturum anahtarı ya da kişisel bilgi taşıyan uygulamalarda önemlidir. Modern tarayıcıların varsayılanı zaten budur, ama açıkça belirtmek iyidir.
5. Permissions-Policy
Permissions-Policy: camera=(), microphone=(), geolocation=()
Sayfanın ve içine gömülen üçüncü taraf içeriklerin kamera, mikrofon ve konum gibi özelliklere erişmesini kapatır. Siteniz bunları kullanmıyorsa kapalı olmaları en iyisidir.
6. Content-Security-Policy (CSP)
En güçlü ama ayarlaması en zor başlık budur. Sayfada hangi kaynaklardan script, stil, görsel ve font yüklenebileceğini tek tek belirler:
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'
Doğru ayarlanmış bir CSP, XSS açığı olsa bile saldırganın script'inin çalışmasını engelleyebilir. Ama yanlış ayarlanmış bir CSP sitenizi bozar: analitik kodu çalışmaz, harici fontlar yüklenmez, gömülü videolar görünmez.
Bu yüzden önce yalnızca raporlama modunda başlayın:
Content-Security-Policy-Report-Only: default-src 'self'; ...
Bu modda hiçbir şey engellenmez, yalnızca tarayıcı konsolunda ihlaller gösterilir. Birkaç gün boyunca sitenizin bütün sayfalarını gezip hangi kaynakların gerektiğini listeleyin, politikayı genişletin ve ancak ondan sonra asıl başlığa geçin.
WordPress gibi pek çok eklentinin satır içi script kullandığı sistemlerde katı bir CSP yazmak zordur. Orada en azından frame-ancestors, object-src 'none' ve base-uri 'self' gibi riski düşük yönergelerle başlamak bile değerlidir.
Apache ile eklemek
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
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 "camera=(), microphone=(), geolocation=()"
</IfModule>
Nginx ile eklemek
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Nginx'te bir tuzak var: Bir location bloğunda tek bir add_header bile tanımlarsanız, üst bloktaki add_header satırlarının hiçbiri o location için geçerli olmaz. Başlıkları bir dosyaya koyup her yerde include etmek bu sorunu çözer.
Artık kullanmayın
X-XSS-Protection: Tarayıcılar bu özelliği kaldırdı. Eski tarayıcılarda ise yeni açıklara yol açabildiği için ya hiç göndermeyin ya da0değeriyle gönderin.Public-Key-Pins(HPKP): Kaldırıldı ve yanlış kullanıldığında siteyi tamamen erişilemez hâle getirebiliyordu.
Bu başlıkları eklemek on dakikanızı alır. Sitenizi tamamen güvenli yapmaz, ama tarayıcıyı sizin tarafınızda çalışan bir bekçiye dönüştürür.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.