Merhaba arkadaşlar, bugün sizlere yeni bir sunucuya Nginx kurduktan sonra, hemen uygulamanızı tavsiye ettiğim 10 temel güvenlik ve performans kontrolünü anlatacağım. Bu adımlar, sunucunuzu temel saldırı vektörlerine karşı korumanıza ve trafiği daha verimli yönetmenize yardımcı olacak. Benim de yeni kurulumlarımda ilk yaptığım işlemler bunlar.
1. Gereksiz Modülleri Devre Dışı Bırakın
Nginx, varsayılan olarak birçok modülle derlenir. Eğer kendi Nginx'inizi kaynaktan derlediyseniz, ihtiyacınız olmayan modülleri (örneğin autoindex, gzip vs.) derleme aşamasında atlayabilirsiniz. Ancak paket yöneticisiyle kurduysanız, kullanmadığınız modülleri yapılandırma dosyalarında etkisiz hale getirebilirsiniz. Bu, hafif bir güvenlik avantajı ve küçük de olsa bir kaynak tasarrufu sağlar.
2. Sunucu Token'ını (Server Tokens) Gizleyin
Varsayılan olarak Nginx, hata sayfalarında ve sunucu başlığında (header) kendi sürüm numarasını gösterir. Bu, bir saldırganın bilinen açıklardan yararlanmasını kolaylaştırır. Bu bilgiyi gizlemek için ana yapılandırma dosyasında şu ayarı yapın.
Bu ayarı genellikle /etc/nginx/nginx.conf dosyasının `http` bloğuna eklerim.
3. Tehlikeli HTTP Metotlarını Kısıtlayın
Sunucunuz sadece GET, POST, HEAD gibi standart metotlara ihtiyaç duyuyorsa, DELETE, TRACE, TRACK gibi potansiyel olarak tehlikeli metotları engelleyin. Bunun için ilgili `server` bloğuna bir `location` ekleyebilirsiniz.
4. Kök Dizin İçin Otomatik Dizin Listelemesini Kapatın
Eğer bir web sitesi sunuyorsanız, kök dizinde (`/`) veya herhangi bir alt dizinde otomatik dizin listelemesinin açık olmamasına dikkat edin. Bu, yanlışlıkla hassas dosyaların görüntülenmesini önler. Kontrol etmek için `autoindex` direktifinin `off` olduğundan emin olun.
5. Hassas Dosyalara Erişimi Engelleme
`.git`, `.env`, `.sql`, `backup.tar.gz` gibi hassas yapılandırma veya yedek dosyalarınızın web üzerinden erişilebilir olmaması çok önemli. Bunun için yaygın bir pattern kullanabilirsiniz.
6. Worker Süreçlerini ve Bağlantılarını Optimize Edin
Sunucunuzun donanım kaynaklarına göre `worker_processes` ve `worker_connections` değerlerini ayarlamak performansı doğrudan etkiler. `worker_processes` için genelde otomatik (`auto`) bırakırım, ancak `worker_connections` değerini yükseltmek faydalı olur.
7. SSL/TLS Yapılandırmasını Sıkılaştırın (Eğer SSL Kullanıyorsanız)
Modern, güvenli şifreleme paketlerini kullanın ve eski, güvensiz protokolleri (SSLv2, SSLv3, TLS 1.0, TLS 1.1) devre dışı bırakın. Benim genelde kullandığım temel bir yapı şöyle:
8. Gzip/Brotli Sıkıştırmasını Etkinleştirin
Bant genişliğinizden tasarruf etmek ve sayfa yükleme sürelerini kısaltmak için metin tabanlı içerikleri (html, css, js, xml) sıkıştırın. Brotli daha iyi bir sıkıştırma oranı sağlar, ancak Nginx'i özel modülle derlemeniz gerekebilir. Gzip ise hazırdır.
9. Temel Önbellekleme (Caching) Kurallarını Ekleyin
Statik dosyalar (resimler, css, js) için tarayıcı önbellekleme sürelerini belirleyin. Bu, sunucu yükünü azaltır ve kullanıcı deneyimini iyileştirir.
10. Yapılandırma Dosyalarını Test Edip Nginx'i Yeniden Başlatın
Her değişiklikten sonra mutlaka yapılandırma dosyalarının sözdizimini kontrol edin ve hatasızsa servisi yeniden başlatın.
Eğer "syntax is ok" ve "test is successful" mesajlarını görürseniz, güvenle yeniden başlatabilirsiniz.
Benim yeni kurulumlarda ilk baktığım ve uyguladığım kontroller genel olarak bunlar. Tabii ki her sunucunun ihtiyacı farklı olabilir, bu ayarlar temel ve güvenli bir başlangıç noktası sağlar.
Siz bu kontrollerden sonra kendi sunucularınızda hangi ek ayarları yapıyorsunuz? Ya da bu adımlarla ilgili sorusu olan arkadaşlar aşağıya yazsın, elimden geldiğince yardımcı olmaya çalışırım.
Nginx, varsayılan olarak birçok modülle derlenir. Eğer kendi Nginx'inizi kaynaktan derlediyseniz, ihtiyacınız olmayan modülleri (örneğin autoindex, gzip vs.) derleme aşamasında atlayabilirsiniz. Ancak paket yöneticisiyle kurduysanız, kullanmadığınız modülleri yapılandırma dosyalarında etkisiz hale getirebilirsiniz. Bu, hafif bir güvenlik avantajı ve küçük de olsa bir kaynak tasarrufu sağlar.
Varsayılan olarak Nginx, hata sayfalarında ve sunucu başlığında (header) kendi sürüm numarasını gösterir. Bu, bir saldırganın bilinen açıklardan yararlanmasını kolaylaştırır. Bu bilgiyi gizlemek için ana yapılandırma dosyasında şu ayarı yapın.
NGINX:
server_tokens off;
Bu ayarı genellikle /etc/nginx/nginx.conf dosyasının `http` bloğuna eklerim.
Sunucunuz sadece GET, POST, HEAD gibi standart metotlara ihtiyaç duyuyorsa, DELETE, TRACE, TRACK gibi potansiyel olarak tehlikeli metotları engelleyin. Bunun için ilgili `server` bloğuna bir `location` ekleyebilirsiniz.
NGINX:
location / {
limit_except GET POST HEAD {
deny all;
}
# ... diğer kurallarınız
}
Eğer bir web sitesi sunuyorsanız, kök dizinde (`/`) veya herhangi bir alt dizinde otomatik dizin listelemesinin açık olmamasına dikkat edin. Bu, yanlışlıkla hassas dosyaların görüntülenmesini önler. Kontrol etmek için `autoindex` direktifinin `off` olduğundan emin olun.
NGINX:
autoindex off;
`.git`, `.env`, `.sql`, `backup.tar.gz` gibi hassas yapılandırma veya yedek dosyalarınızın web üzerinden erişilebilir olmaması çok önemli. Bunun için yaygın bir pattern kullanabilirsiniz.
NGINX:
location ~ /\.(?!well-known) {
deny all;
access_log off;
log_not_found off;
}
location ~ \.(sql|tar|gz|log|env|bak)$ {
deny all;
access_log off;
log_not_found off;
}
Sunucunuzun donanım kaynaklarına göre `worker_processes` ve `worker_connections` değerlerini ayarlamak performansı doğrudan etkiler. `worker_processes` için genelde otomatik (`auto`) bırakırım, ancak `worker_connections` değerini yükseltmek faydalı olur.
NGINX:
# /etc/nginx/nginx.conf dosyasının başında
worker_processes auto;
events {
worker_connections 4096; # Bu değeri sisteminizin limitlerine göre ayarlayın (ulimit -n ile kontrol edebilirsiniz)
multi_accept on;
}
Modern, güvenli şifreleme paketlerini kullanın ve eski, güvensiz protokolleri (SSLv2, SSLv3, TLS 1.0, TLS 1.1) devre dışı bırakın. Benim genelde kullandığım temel bir yapı şöyle:
NGINX:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
Bant genişliğinizden tasarruf etmek ve sayfa yükleme sürelerini kısaltmak için metin tabanlı içerikleri (html, css, js, xml) sıkıştırın. Brotli daha iyi bir sıkıştırma oranı sağlar, ancak Nginx'i özel modülle derlemeniz gerekebilir. Gzip ise hazırdır.
NGINX:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
Statik dosyalar (resimler, css, js) için tarayıcı önbellekleme sürelerini belirleyin. Bu, sunucu yükünü azaltır ve kullanıcı deneyimini iyileştirir.
NGINX:
location ~ \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
Her değişiklikten sonra mutlaka yapılandırma dosyalarının sözdizimini kontrol edin ve hatasızsa servisi yeniden başlatın.
Bash:
sudo nginx -t
Eğer "syntax is ok" ve "test is successful" mesajlarını görürseniz, güvenle yeniden başlatabilirsiniz.
Bash:
sudo systemctl reload nginx # veya restart
Benim yeni kurulumlarda ilk baktığım ve uyguladığım kontroller genel olarak bunlar. Tabii ki her sunucunun ihtiyacı farklı olabilir, bu ayarlar temel ve güvenli bir başlangıç noktası sağlar.
Siz bu kontrollerden sonra kendi sunucularınızda hangi ek ayarları yapıyorsunuz? Ya da bu adımlarla ilgili sorusu olan arkadaşlar aşağıya yazsın, elimden geldiğince yardımcı olmaya çalışırım.