Merhaba arkadaşlar, bugün sizlere sunucu güvenliğini bir üst seviyeye taşıyacak, çok sık atlanan ama bir o kadar da kritik bir konudan bahsedeceğim. Bir sunucuyu sadece UFW gibi bir güvenlik duvarı ile kapatmak yetmez. Web uygulamanızı ziyaret eden tarayıcılara da "bu sayfayı nasıl koruyacağını" söylemeniz gerekir. İşte bu noktada Nginx veya Apache üzerinden ekleyeceğimiz güvenlik başlıkları (Security Headers) devreye giriyor. Bu rehberde, UFW'nin temel korumasını, X-Frame-Options, Content-Security-Policy (CSP) gibi başlıklarla nasıl güçlendireceğimizi adım adım anlatacağım.
Neden Güvenlik Başlıkları Bu Kadar Önemli?
UFW ile sunucunuzun kapılarını (portlarını) kontrol edersiniz. Ancak, 80 ve 443 portları açık kaldığı sürece, dünya ile iletişim halindesinizdir. Güvenlik başlıkları ise, bu açık kapıdan gelen ziyaretçinin tarayıcısına bir dizi talimat verir. Örneğin, "bu sayfayı bir başka sitenin içinde gösterme (clickjacking'e karşı)" veya "sadece şu adreslerden gelen scriptleri yükle" gibi. Bu, XSS (Cross-Site Scripting), clickjacking, veri enjeksiyonu gibi birçok web tabanlı saldırıya karşı ekstra ve pasif bir koruma katmanı oluşturur.
Adım 1: Mevcut Güvenlik Başlıklarını Kontrol Edelim
İşe, mevcut durumumuzu analiz ederek başlayalım. Aşağıdaki komutla sunucunuzdaki bir sitenin (örneğin bingunluk.com) hangi güvenlik başlıklarını gönderdiğine bakabilirsiniz.
Çıktıda `X-Frame-Options`, `Content-Security-Policy`, `X-Content-Type-Options` gibi başlıkları göremiyorsanız, bu rehber tam size göre.
Adım 2: Nginx için Güvenlik Başlıklarını Ekleyelim
Eğer Nginx kullanıyorsanız, site konfigürasyon dosyanıza (`/etc/nginx/sites-available/bingunluk.com` gibi) aşağıdaki direktifleri ekleyin. Benim genelde tercih ettiğim ve güvenli bir başlangıç seti şudur:
/etc/nginx/sites-available/bingunluk.com dosyasını düzenledikten sonra, mutlaka yapılandırmayı test edin ve Nginx'i yeniden başlatın.
Adım 3: Apache için Güvenlik Başlıklarını Ekleyelim
Apache kullanıcıları ise, `.htaccess` dosyasına veya sanal host konfigürasyonuna aşağıdaki satırları ekleyebilir. Apache'de mod_headers modülünün aktif olduğundan emin olun (`sudo a2enmod headers`).
Apache'yi yeniden başlatarak ayarlarınızı aktif hale getirin.
En Kritik Uyarı: CSP (Content-Security-Policy)
Arkadaşlar, yukarıda verdiğim CSP kuralı örnektir ve büyük ihtimalle sitenizi bozacaktır! CSP, sitenizin hangi kaynaklardan ne tür içerik (script, stil, resim, font) yükleyebileceğini belirler. `'unsafe-inline'` gibi kuralları güvenli hale getirerek kademeli olarak eklemelisiniz. En iyi yöntem, önce sadece `default-src 'self'` ile başlayıp, tarayıcının konsolundaki (F12) hatalara bakarak politikayı yavaş yavaş genişletmektir. Bu konuda çok sabırlı olmalısınız.
Adım 4: Kurulumu Doğrulayalım
Tekrar `curl -I` komutunu çalıştırarak veya tarayıcınızın Geliştirici Araçları (F12) -> Network sekmesinden bir sayfayı yenileyip başlıkları kontrol edin. Artık yeni güvenlik başlıklarınızı görmelisiniz. Ayrıca,
gibi ücretsiz araçlarla sitenizi taratıp notunuzun A veya A+ seviyesine yükseldiğini görebilirsiniz.
Sonuç ve Öneriler
Gördüğünüz gibi, UFW ile başlattığımız katmanlı güvenlik modeline, birkaç satır konfigürasyonla çok güçlü bir katman daha ekledik. Bu başlıklar, modern tarayıcılar tarafından desteklenen ve saldırganın işini oldukça zorlaştıran önlemler.
Ben genelde yeni kurduğum her sunucuda bu başlıkları standart olarak ekliyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle CSP politikasını oluştururken hangi yöntemleri izliyorsunuz? Ya da takıldığınız bir nokta oldu mu? Aşağıya yorumlarınızı bekliyorum. Hep birlikte daha güvenli bir ortam inşa edelim.
UFW ile sunucunuzun kapılarını (portlarını) kontrol edersiniz. Ancak, 80 ve 443 portları açık kaldığı sürece, dünya ile iletişim halindesinizdir. Güvenlik başlıkları ise, bu açık kapıdan gelen ziyaretçinin tarayıcısına bir dizi talimat verir. Örneğin, "bu sayfayı bir başka sitenin içinde gösterme (clickjacking'e karşı)" veya "sadece şu adreslerden gelen scriptleri yükle" gibi. Bu, XSS (Cross-Site Scripting), clickjacking, veri enjeksiyonu gibi birçok web tabanlı saldırıya karşı ekstra ve pasif bir koruma katmanı oluşturur.
İşe, mevcut durumumuzu analiz ederek başlayalım. Aşağıdaki komutla sunucunuzdaki bir sitenin (örneğin bingunluk.com) hangi güvenlik başlıklarını gönderdiğine bakabilirsiniz.
Bash:
curl -I https://www.bingunluk.com
Çıktıda `X-Frame-Options`, `Content-Security-Policy`, `X-Content-Type-Options` gibi başlıkları göremiyorsanız, bu rehber tam size göre.
Eğer Nginx kullanıyorsanız, site konfigürasyon dosyanıza (`/etc/nginx/sites-available/bingunluk.com` gibi) aşağıdaki direktifleri ekleyin. Benim genelde tercih ettiğim ve güvenli bir başlangıç seti şudur:
NGINX:
server {
...
# Güvenlik Başlıkları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Content Security Policy (CSP) - DİKKAT: Sitene özel ayarlamalısın!
# Bu örnek, sadece kendi kaynaklarından ve güvenilir CDN'lerden içerik yükler.
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
...
}
/etc/nginx/sites-available/bingunluk.com dosyasını düzenledikten sonra, mutlaka yapılandırmayı test edin ve Nginx'i yeniden başlatın.
Bash:
sudo nginx -t
sudo systemctl reload nginx
Apache kullanıcıları ise, `.htaccess` dosyasına veya sanal host konfigürasyonuna aşağıdaki satırları ekleyebilir. Apache'de mod_headers modülünün aktif olduğundan emin olun (`sudo a2enmod headers`).
Kod:
# .htaccess veya VirtualHost içine ekleyin
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy (CSP)
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;"
Apache'yi yeniden başlatarak ayarlarınızı aktif hale getirin.
Bash:
sudo systemctl restart apache2
Arkadaşlar, yukarıda verdiğim CSP kuralı örnektir ve büyük ihtimalle sitenizi bozacaktır! CSP, sitenizin hangi kaynaklardan ne tür içerik (script, stil, resim, font) yükleyebileceğini belirler. `'unsafe-inline'` gibi kuralları güvenli hale getirerek kademeli olarak eklemelisiniz. En iyi yöntem, önce sadece `default-src 'self'` ile başlayıp, tarayıcının konsolundaki (F12) hatalara bakarak politikayı yavaş yavaş genişletmektir. Bu konuda çok sabırlı olmalısınız.
Tekrar `curl -I` komutunu çalıştırarak veya tarayıcınızın Geliştirici Araçları (F12) -> Network sekmesinden bir sayfayı yenileyip başlıkları kontrol edin. Artık yeni güvenlik başlıklarınızı görmelisiniz. Ayrıca,
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
Gördüğünüz gibi, UFW ile başlattığımız katmanlı güvenlik modeline, birkaç satır konfigürasyonla çok güçlü bir katman daha ekledik. Bu başlıklar, modern tarayıcılar tarafından desteklenen ve saldırganın işini oldukça zorlaştıran önlemler.
Ben genelde yeni kurduğum her sunucuda bu başlıkları standart olarak ekliyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle CSP politikasını oluştururken hangi yöntemleri izliyorsunuz? Ya da takıldığınız bir nokta oldu mu? Aşağıya yorumlarınızı bekliyorum. Hep birlikte daha güvenli bir ortam inşa edelim.