HTTP Strict Transport Security (HSTS) web tarayıcılarına bir siteye yalnızca HTTPS üzerinden bağlanmaları gerektiğini bildiren güvenlik mekanizmasıdır. Normalde bir kullanıcı tarayıcıya http://example.com yazdığında tarayıcı bu isteği HTTP üzerinden başlatır ve daha sonra HTTPS’e yönlendirilir. Bu kısa süreçte saldırganlar araya girip:
- SSL Stripping (HTTPS bağlantısını HTTP’ye düşürme),
- Session Hijacking (çerezleri çalarak oturum ele geçirme),
- Downgrade Attack (kullanıcıyı zayıf veya eski protokollere yönlendirme) gibi saldırılar gerçekleştirebilir.
HSTS etkinleştirildiğinde tarayıcı ilk başarılı HTTPS bağlantısından sonra siteyi yalnızca HTTPS üzerinden ziyaret etmeyi zorunlu kılar.
Özetle: HSTS, HTTPS’i “opsiyonel” değil “zorunlu” hale getirir.
Zafiyetin Ciddiyet Derecesi
- Severity Rating: Orta (Medium)
- HSTS olmaması HTTPS’i tamamen işlevsiz kılmaz; ancak kullanıcılar aktif saldırılara karşı savunmasız kalır.
- Özellikle bankacılık, sağlık, e-ticaret gibi hassas veriler işleyen sitelerde HSTS eksikliği büyük bir risk oluşturur.
Zafiyetin Tespiti
1. Nessus ile Tespit
- Nessus Plugin ID 142960 kullanılarak sunucuda HSTS eksikliği kolayca saptanabilir.
2. testssl.sh ile Manuel Kontrol
- Aracı indirin: testssl.sh
- Aşağıdaki komutu çalıştırın:
testssl.sh –headers yourdomain.com:443 - Eğer çıktıdaki “Strict Transport Security” satırı boşsa veya “not configured” yazıyorsa → HSTS devre dışı demektir.
Çözüm: HSTS Nasıl Etkinleştirilir?
HSTS, sunucuya basit bir HTTP header eklenerek aktif hale getirilir.
Apache için
- Konfigürasyon dosyasını açın
sudo nano /etc/httpd/conf/httpd.conf(Alternatif:/etc/httpd/conf.d/ssl.confveya sanal host dosyası olabilir.) - HSTS Header ekleyin
<VirtualHost *:443>bloğuna ekleyin:Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"max-age=31536000→ 1 yıl boyunca HTTPS zorunlu tutulur.includeSubDomains→ Alt alan adları da HTTPS zorunluluğuna dahil edilir.
- Servisi yeniden başlatın
sudo systemctl restart httpd
Nginx için
- Konfigürasyon dosyasını açın
sudo nano /etc/nginx/nginx.confveya/etc/nginx/sites-available/example.conf - Server bloğuna ekleyin
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - Servisi yeniden başlatın
sudo systemctl restart nginx
Rollback (Geri Alma İşlemi)
Yanlış ayar sonrası erişim sorunu yaşarsanız, HSTS satırını kaldırarak geri dönüş yapabilirsiniz.
Apache’de:
sudo nano /etc/httpd/conf/httpd.conf
HSTS satırını silin:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Servisi yeniden başlatın:
sudo systemctl restart httpd
Nginx’te:
sudo nano /etc/nginx/nginx.conf
HSTS satırını silin:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Servisi yeniden başlatın:
sudo systemctl restart nginx
Fix Sonrası Doğrulama
Nessus ile
- Plugin ID 85582 kullanılarak tarama yapılır. Artık HSTS’nin etkin olduğu görülmelidir.
testssl.sh ile
testssl.sh –headers yourdomain.com:443
Beklenen çıktı:
Strict Transport Security (HSTS) max-age=31536000; includeSubDomains
En İyi Uygulamalar (Best Practices)
HSTS’yi etkinleştirmek tek başına yeterli değildir. Güvenliği artırmak için şu önerileri dikkate alın:
- Kısa süreli max-age ile test edin
İlk denemelerdemax-age=300(5 dakika) gibi kısa bir değer verin. Sorun olmadığından emin olduktan sonra31536000(1 yıl) değerine yükseltin. - Preload listesine eklenin
Tarayıcı üreticilerinin yönettiği HSTS preload list’e sitenizi ekleyin. Böylece tarayıcı, siteye ilk bağlantıda bile HTTP üzerinden deneme yapmaz.
https://hstspreload.org/ - Alt alan adlarını unutmayın
includeSubDomainsparametresi ilewww,api,mailgibi alt alan adlarını da kapsayın. - HTTPS yönlendirmelerini HSTS ile pekiştirin
Tüm HTTP trafiğini HTTPS’e yönlendirin. HSTS, bu güvenliği tamamlayıcı rol oynar.