HTTPS güvenliğini artırma yöntemleri

Bu flood’da HTTPS kullanılarak uçtan uca güvenli hale gelen iletişimin ileri düzey ataklara karşı da dayanıklı olmasını sağlayan HSTS ve HPKP yöntemlerini inceleyeceğiz.

Önceki HTTPS nasıl çalışır? başlıklı flood'da (https://medium.com/@gokhansengun/20e27c9f9668) HTTPS ile Confidentiality ve Authenticity özelliklerinin nasıl sağlandığını görmüştük.

HSTS - HTTP Strict Transport Security, kullanıcının tarayıcısıyla bir kere HTTPS ile yüklediği bir siteyi belirli bir süre boyunca (örneğin 1 ay) HTTPS ile yüklemeye zorlayan bir mekanizmadır. HSTS kullanıcıyı Downgrade Attack olarak bilinen ataktan korumaktadır. Kullanıcı ile hedef site arasında bulunan kötü niyetli ekipman, kullanıcının trafiğini HTTPS'ten HTTP'ye yönlendirmeye çalışabilir. Bu durumda tarayıcı HSTS sayesinde ilgili sitenin HTTPS ile yüklenmesi gerektiğini bilmekte ve sayfayı HTTP ile yüklemeyi reddetmektedir.

HSTS'in çalışma mekanizması oldukça basittir. Web sunucu tarayıcıya verdiği cevapta strict-transport-security başlığında HSTS değerini aşağıdaki örnekteki gibi ayarlar. Tarayıcı ilgili web sitesine verilen süre boyunca sadece ve sadece HTTPS ile ulaşmaya çalışır.

Aşağıdaki ekran görüntüsünde, bir önceki ekran görüntüsünde HTTPS ile ziyaret edilen siteye HTTP kullanılarak erişilmeye çalışılmış ve tarayıcı kendi içerisinde 307 Internal Redirect kodu ile sitenin HTTPS versiyonuna yönlendirme yapmıştır.

Anlaşılacağı üzere HSTS header'ı aktifleştirilmiş bir siteye header'da belirtilen süre boyunca HTTP ile bağlanmak normal akışta mümkün değildir. Bu sebeple HTTP'den HTTPS'e geçişlerinde bir problem çıkması ve HTTP'ye geri dönme ihtimaline karşın HSTS header'ındaki süre yavaş yavaş artırılır. stackoverflow'un HTTPS geçişinde HSTS bölüme https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/#hsts-preloading linkinden ulaşılabilir. Yazı HSTS'in yanında HTTPS ile ilgili birçok faydalı deneyim aktarmaktadır.

Test ya da bir hata durumunda müdahale amacıyla tarayıcının kaydettiği HSTS header'larını silmek isteyebiliriz. Google Chrome için chrome://net-internals/#hsts adresinden sorgulama, ekleme ve çıkarma işlemleri yapılabilir.

Görüldüğü gibi HSTS'in tam güvenli fonksiyon gösterebilmesi için kullanıcının ilk isteği yaptığı sırada ağda arada kötü niyetli kişilerin olmaması gerekmektedir çünkü tarayıcı ilk isteğin cevabında HSTS header'ını görmezse sonraki isteklerde gerekli HSTS ayarlarını yapamaz. Bu problemi çözmek için tarayıcılar ön tanımlı olarak birçok web sitesinin HSTS gerektirdiğini bilmektedir. Bu sayede tarayıcı ile yapılan ilk istekte bile HSTS etkin olmakta ve tam bir koruma sağlanmaktadır. hstspreload․org adresinden preload talebi iletilebilir.

HPKP - HTTP Public Key Pinning, web sunucunun Public Key'inin parmak izinin tarayıcıda pinlenmesi ve tarayıcının ilgili site için kendisinde pinli Public Key parmak izinden başka bir Public Key'den oluşan sertifikaları kabul etmemesi üzerine kurulu bir mekanizmadır.

Önceki flood’da HPKP kullanılan web sitesi ve mobil uygulamalarda HTTPS trafiğinin Fiddler'ın Forward Proxy olarak kullanılması ile izlenemeyeceğini belirtmiştik. Bunun sebebi tarayıcının Fiddler'ın ilgili site için ürettiği dummy sertifikanın HPKP'ye takılmasıdır.

HPKP web sunucunun public-key-pins header'ı göndermesi ile aktive edilir. Bu header'da max-age ile pin'in ne kadar süre ile geçerli olacağı belirtilir. report-uri ile ise pin kaynaklı sertifika doğrulama hatalarının tarayıcı tarafından raporlanması sağlanabilir.

Bazı durumlarda tarayıcının açık anahtar pin kontrolü yapması ancak başarısız olduğu durumlarda sayfanın yüklenmesine izin verilmesi ve sadece durumun raporlanması istenebilir. Bu durumda public-key-pins-report-only header'ı kullanılır.

HPKP güçlü, etkili ancak bir o kadar da tehlikeli bir araçtır. Kullanım oranı da günden güne azalmakta ve popülerliğini kaybetmektedir. En yaygın problemlerden biri, HPKP Suicide olarak adlandırılan, açık anahtarı pinleme ancak sonrasında karşılık gelen kapalı anahtarı (Private Key) HPKP'nin süresi dolmadan kaybetme, çaldırma, vb durumlarda ilgili anahtarı değiştirememe veya kullanıcıların siteye erişememesi problemidir.

Bunun yanında HPKP bir siteye ölümcül bir atak düzenlemek için de kullanılabilir. Kötü niyetli bir kişi web sunucuların kontrolünü ele geçirip HPKP header'ı ile kendi ürettiği ve karşılık gelen kapalı anahtarı sadece kendisinin bildiği bir açık anahtarı tarayıcı üzerinde site ile pinletebilir. Belirli bir süre sonra sunucuların kontrolü tekrar ele geçirilse bile HPKP header'ını devre dışı bırakmak veya başka bir pin göndermek çözüm olmayacaktır. Zehirli açık anahtar pinini atak süresince alan kullanıcılar siteye ulaşamayacaktır.