Loading...

Güvenlik · 7 dk okuma

HSTS: tarayıcıya sitenizle HTTP konuşmamayı öğretin

Sertifikanız var, HTTP'yi HTTPS'e yönlendiriyorsunuz, kilit simgesi yerinde. Yine de ziyaretçinin düz metin olarak yaptığı bir istek kalıyor — ilki — ve aynı ağdaki bir saldırganın beklediği tam olarak o istek. HSTS onu kapatır: tek bir yanıt başlığı, tarayıcının siz dediğiniz süre boyunca alan adınız için HTTP kullanmayı tamamen reddetmesini sağlar. Bu rehber başlığı, üç ayarının sizi neye bağladığını ve cdn.com.tr üzerinde kendinizi dışarıda bırakmadan nasıl açıp doğrulayacağınızı anlatır.

Güncellendi

HSTS: tarayıcıya sitenizle HTTP konuşmamayı öğretin

Yönlendirmenizin hiç görmediği istek

Sertifikası olan hemen her site aynı şeyi yapar: 80. portu https:// adresine 301 ile yanıtlar. Bu doğrudur ve öyle kalmalıdır. Sadece bir istek geç gerçekleşir.

Biri adres çubuğuna example.com yazdığında, eski bir e-postadaki bağlantıya tıkladığında ya da yıllar önceki bir yer imini açtığında tarayıcının HTTPS varsayması için bir sebebi yoktur. Düz bir HTTP bağlantısı açar ve sayfayı ister. Yönlendirmeniz yanıt verir — ama soru çoktan açık metin olarak, ziyaretçinin o an bulunduğu ağ üzerinden gitmiştir: bir kafe, bir havalimanı, bir otel, bir captive portal, yıllardır güncellenmemiş bir ev modemi.

O isteği okuyabilecek konumdaki biri, ona yanıt verebilecek konumdadır da. 301'inizi iletmek yerine sitenizin kendi kopyasını HTTP üzerinden sunar ve arka planda her şeyi size HTTPS ile taşır. Ziyaretçi doğru görünen bir sayfa görür — neredeyse kimsenin bakmadığı kilit simgesi hariç — ve oraya parolasını yazar. Buna SSL stripping denir ve tam olarak yönlendirmenizin düzeltmek için var olduğu isteği hedefleyen bir düşürme saldırısıdır.

HSTS o isteği ortadan kaldırır. Tarayıcı başlığı bir kez gördükten sonra http://example.com/... adresini cihazdan hiçbir şey çıkmadan, kendi içinde https://... olarak yeniden yazar. Araya girilecek düz metin bir istek de kalmaz, ziyaretçinin tıklayıp geçebileceği bir sertifika uyarısı da.

Başlık ne diyor

Pratikte tamamı şu: Strict-Transport-Security: max-age=31536000. İçinde üç ayar görünebilir ve sizi bağladıkları ölçü birbirinden çok farklıdır.

max-age tek zorunlu olanıdır: tarayıcı bu hostname'in yalnızca HTTPS olduğunu kaç saniye hatırlasın. 31536000 bir yıl demektir. Sayaç her yanıtta sıfırlanır; yani düzenli ziyaret edilen bir site önünde her zaman tam bir yıl taşır, kimsenin uğramadığı bir site ise eninde sonunda unutulur.

includeSubDomains kuralı alan adınızın altındaki her isme genişletir — www, api, shop, staging ve aklınıza gelmeyen o bir tane. Gerçekten daha güçlüdür, çünkü üst alan adına yazılan bir çerez herhangi bir alt alan adı üzerinden hedef alınabilir. Aynı zamanda işleri bozan ayardır, çünkü yönetmediğiniz ya da sertifikası olmayan hostname'lere de uygulanır.

preload, alan adınızın doğrudan tarayıcının içine gömülmesini istemektir; böylece kural ziyaretçi sitenize hiç uğramadan önce de geçerli olur. includeSubDomains ve uzun bir max-age şartı vardır, ve geri alması çok zordur.

Üçünün de altında tek bir kural yatar: başlık yalnızca HTTPS yanıtında geçerlidir. Tarayıcılar düz HTTP üzerinde onu bilerek yok sayar — orada dikkate almak, ağdaki herhangi birinin sahibi olmadığı bir alan adını kilitlemesine izin vermek olurdu.

Neden yalnızca max-age gönderiyoruz

cdn.com.tr'deki preset max-age=31536000 gönderir, başka bir şey göndermez. Bu bir eksiklik değil, bilinçli bir varsayılandır; diğer iki ayarın sizi neye bağlayacağını görmek bunu açıklar.

includeSubDomains, onu açtığınız sayfada gözünüzün önünde olmayan isimlere uzanır: eski bir sunucudaki mail. hostu, bir status. sayfası, yıllardır düz HTTP yanıtlayan bir alt alan adındaki iç araç. Tarayıcı kuralı aldığı anda bunların hepsi o tarayıcıda erişilemez hale gelir — uyarı değil, kesin hata — ve başlığı kaldırmak bunu düzeltmez, çünkü tarayıcı kuralı çoktan defterine yazmıştır.

preload aynı yönde, sadece daha yavaş bozulur: geri çekilmek üçüncü taraf bir listeye başvurup tarayıcı sürümlerinin yayılmasını beklemek demektir, ayla ölçülür.

Gerçekten sunduğunuz hostname için bir yıllık max-age, o hostname'in güvenlik kazancının tamamını daha ilk ziyaretten itibaren verir. Güçlü bayrakları sonradan, alan adınızın altındaki her isim envanterlenip HTTPS'e taşındıktan sonra bilinçli olarak eklemek en doğrusu. Pişman olabileceğiniz yerden değil, emin olabileceğiniz yerden başlayın.

Açmadan önceki kontrol listesi

HSTS riskli değildir. Hazır olmayan bir sitede açmak risklidir. Önce şunları geçin.

Her sayfa HTTPS ile açılıyor. Yalnızca ana sayfa değil: yönetim paneli, API, yükleme uçları, webhook hedefleri, eski kampanya adresleri. Yalnızca 80. portta çalışan ne varsa, başlığı görmüş herkes için çalışmayı bırakır.

Sertifika geçerli ve kendini yeniliyor. HSTS devredeyken süresi dolmuş bir sertifika ziyaretçinin geçebileceği bir uyarı değil, duvardır. cdn.com.tr'de sertifikalar otomatik alınır ve yenilenir; HSTS'in zaten varsaydığı özellik tam olarak budur.

Karışık içerik kalmadı. http:// ile çağrılan script, stil dosyası, görsel ve iframe'lerin çoktan düzelmiş olması gerekir; HSTS yalnızca onların hatasını daha gürültülü hale getirir.

Alt alan adlarınızın ne yaptığını biliyorsunuz. Bugün includeSubDomains açacağınız için değil, eninde sonunda isteyeceğiniz için — ve asıl iş o envanterdir.

HTTP'den HTTPS'e yönlendirmeniz yerinde kalıyor. HSTS başlığı görmüş tarayıcıları korur; yönlendirme geri kalan herkesi yakalar. Birbirinin alternatifi değildirler.

Nasıl açılır

Panelde Yayınlama Kuralları → Güvenlik Varsayılanları bölümünü açın. "Güvenlik Ayarı" alanı, hesaba uygulanan edge preset'lerinin çoklu seçim listesidir: Hsts'i seçip kaydedin. Sayfanın adresi /management/cdn/advanced-management.

Ayar hesap bazlıdır; yani henüz hazır olmayan bir hostname, hazır olanları bekletmek yerine kendi hesabında bekleyebilir.

Kaydettikten sonra edge, o hesabın HTTPS yanıtlarına başlığı ekler — ve yalnızca HTTPS yanıtlarına. Düz HTTP isteği hâlâ yönlendirmenizi alır, başlık eklenmeden; standardın gerektirdiği davranış budur. Origin tarafında hiçbir şey değişmez: nginx'e, Apache'ye ya da uygulamanıza eklenecek bir başlık yoktur, çünkü ziyaretçiye giden yanıta karar veren yer edge'dir.

On saniyede doğrulama

Başlıkları isteyip tek satırı arayın. İki sonuç önemlidir; ikincisi genellikle atlanan kontroldür.

Başlığın yeri HTTPS yanıtlarıdır, başka hiçbir yer değil

# şunu yazdırmalı: strict-transport-security: max-age=31536000
curl -sI https://example.com/ | grep -i strict-transport

# hiçbir şey yazdırmamalı
curl -sI http://example.com/ | grep -i strict-transport

Tarayıcının hatırladığı

Komut satırı size ne gönderdiğinizi söyler. Başlığın asıl işini yaptığı yer ise tarayıcıdır; kuralın yerine oturduğunu bir kez görmek işe yarar.

Siteyi HTTPS ile ziyaret edin, sonra yeni bir sekmede yalnızca hostname'i yazın. Adres çubuğu doğrudan https:// adresine atlamalı — yeniden yazma tarayıcının içinde olur, yani hatta araya girilecek bir istek de yoktur, izlenecek bir yönlendirme de. Chrome sakladığını chrome://net-internals/#hsts altında, bitiş tarihiyle birlikte gösterir; tahmin etmek yerine test etmek istediğinizde işinizi görür.

Burada iki alışkanlık kafa karışıklığını önler: ilk ziyaret davranışını görmek istiyorsanız siteye hiç girmemiş bir tarayıcı profilinden deneyin, ve kuralı siz bir şey değiştirmeden önce öğrenmiş bir tarayıcının ona göre davranmaya devam edeceğini unutmayın — bir sonraki bölümün konusu tam olarak bu.

Geri alma ve geri almanın yapamadığı

Aynı çoklu seçimde Hsts'i kaldırıp kaydedin. Edge başlığı göndermeyi anında bırakır ve başlığı hiç görmemiş her tarayıcı o andan itibaren normal davranır.

Olmayan şey ise insanları şaşırtan kısım: kuralı zaten kaydetmiş tarayıcılar, kendi max-age süreleri dolana kadar uygulamayı sürdürür. Preset'i kapatmak onların içine uzanmaz. Bir yıllık max-age ile, başlığı dün görmüş bir ziyaretçi sunucunuz bugün ne derse desin bir yıl boyunca HTTPS'i zorlamaya devam eder.

Standart bu durum için bir geri çekilme yolu tanımlar: başlığın max-age=0 ile gönderilmesi, tarayıcıya bir dahaki HTTPS ziyaretinde kuralı unutmasını söyler. Yalnızca site hâlâ HTTPS üzerinden erişilebilirken işe yarar ve önemsediğiniz tarayıcılar geri gelene kadar gönderilmeye devam etmesi gerekir; yani bir düğme değil, planlı bir geri çekilmedir.

Kontrol listesinin geri alma planından daha önemli olmasının sebebi de bu. Gerçekçi başarısızlık asla "HSTS bize uymadı" değildir; "bir URL yalnızca HTTP üzerinde çalışıyormuş, sonradan öğrendik"tir. O URL'i düzeltmek neredeyse her zaman daha hızlı yoldur.

HSTS diğer korumaların neresinde duruyor

HSTS tek bir iş yapar: düz metin isteği ortadan kaldırır. Bunu net söylemekte fayda var, çünkü "bizde HSTS var" cümlesi bazen güvenlik sorusu artık yanıtlanmış gibi kuruluyor.

Sertifika değildir — geçerli bir sertifika varsayar ve geçersiz olanı ölümcül hale getirir. Şifreleme de değildir; onu TLS yapar, HSTS yalnızca TLS'in kullanılmasını garanti eder. Hiçbir şeyi incelemez, dolayısıyla hiçbir enjeksiyonu, istismarı ya da zararlı yükü durdurmaz: o iş WAF işidir. Hiçbir şey saymaz, yani brute force ve kazıma rate limiting alanında kalır. Ve size kimin ulaşabileceği hakkında bir şey söylemez; orası da ülke ve ASN engellemenin alanıdır.

Beş dakikaya değmesini sağlayan şey orandır: tek bir başlık, tek bir ayar, sıfır bakım — ve koca bir düşürme saldırısı sınıfı ziyaretçilerinize karşı uygulanamaz hale geliyor.

Sık sorulan sorular

HSTS tek başına yeterli mi?

Hayır, öyle olması da amaçlanmadı. HSTS bağlantının şifreli olduğunu garanti eder; üzerinden neyin geçtiği hakkında bir şey söylemez. SQL enjeksiyonu taşıyan bir istek HTTPS üzerinden de en az HTTP kadar rahat ulaşır. Yeri geçerli bir sertifikanın, WAF'ın, rate limiting'in ve makul erişim kurallarının yanıdır; onların yerine değil.

HSTS, HTTP'den HTTPS'e yönlendirmemin yerine geçer mi?

Hayır. Yönlendirmeyi bırakın. HSTS ancak tarayıcı başlığı HTTPS üzerinden en az bir kez gördükten sonra devreye girer; yani her ilk ziyaretçi, her yeni cihaz ve her tarayıcı botu hâlâ 80. porta gelir ve 301'e ihtiyaç duyar. İkisi aynı sorunun farklı yarısını kapatır.

Alt alan adlarımı da kapsıyor mu?

Bu preset ile hayır. Yalnızca max-age gönderildiği için kural, yanıtı veren hostname'in tam kendisi için geçerlidir. Alt alan adlarını kapsamak includeSubDomains ister; o çok daha büyük bir taahhüttür, tarayıcıda anında yürürlüğe girer ve oradan geri alınamaz. Yani önce alan adınızın altındaki her ismin HTTPS üzerinde sorunsuz çalışması gerekir.

Alan adımı HSTS preload listesine göndermeli miyim?

Her yerde HTTPS aylardır sıkıcı hale geldiyse, evet. Preload alan adınızı tarayıcının içine koyar; böylece ziyaretçinin en ilk isteğini bile korur. Ama listeden çıkmak üçüncü tarafa başvuru ve tarayıcı sürümlerini beklemek demektir, yani hata uzun sürer. Bir yıllık max-age faydanın çoğunu verir ve geri dönüş yolunu açık bırakır.

Birinin siteye ilk kez girişini de korur mu?

Tek başına hayır; bıraktığı tek açık bu. İlk ziyaret, tarayıcıya kuralı öğreten ziyarettir ve onu HSTS değil, yönlendirmeniz ile geçerli sertifikanız korur. O açığı kapatmanın tek yolu preload'dır; listenin var olma sebebi de budur.

Performansı etkiler mi?

Az da olsa lehinize. Başlık birkaç düzine bayttır ve tarayıcı onu aldıktan sonra sitenize giden her http:// bağlantısı, yönlendirmenize gidip gelmek yerine tarayıcının içinde yeniden yazılır. Daha önce 301 üzerinden gelen ziyaretçiler o adımı tamamen atlar.