Nginx’i Debian 9 Üzerinde Let’s Encrypt ile Güvenli Hale Getirme
Günümüz dijital dünyasında web sitelerinin güvenliği, kullanıcı gizliliği, veri bütünlüğü ve arama motoru sıralamaları için vazgeçilmez bir öneme sahiptir. HTTPS (Hypertext Transfer Protocol Secure), web trafiğini şifreleyerek bu güvenliği sağlayan temel protokoldür. HTTPS kullanmak, bir web sitesinin kimliğini doğrular, kullanıcıların tarayıcıları ile sunucu arasındaki tüm iletişimi şifreler ve böylece araya girme (man-in-the-middle) saldırılarını, veri sızıntılarını ve kurcalamaları engeller. Nginx, yüksek performansı, ölçeklenebilirliği ve esnekliği sayesinde en popüler web sunucularından biridir. Let’s Encrypt ise, herkesin ücretsiz, otomatik ve açık bir şekilde SSL/TLS sertifikaları almasını sağlayan, kar amacı gütmeyen bir sertifika yetkilisidir (CA). Bu makalede, Debian 9 (Stretch) işletim sistemi üzerinde çalışan bir Nginx web sunucusunu Let’s Encrypt ile nasıl güvenli hale getireceğinizi adım adım detaylı bir şekilde açıklayacağız.
Debian 9, artık yaşam döngüsünün sonuna gelmiş olsa da, birçok sunucuda hala aktif olarak kullanılmaktadır. Bu nedenle, bu platform üzerindeki güvenlik uygulamalarını anlamak ve doğru bir şekilde yapılandırmak hala önemini korumaktadır. Bu rehber, Nginx kurulumundan başlayarak, Let’s Encrypt istemcisi Certbot’un kurulumuna, SSL sertifikası edinme ve Nginx’i HTTPS trafiği için yapılandırma adımlarına kadar her şeyi kapsayacaktır. Ayrıca, otomatik sertifika yenileme ve web sitenizin güvenliğini artırmak için ek ipuçları da sunulacaktır.
Ön Koşullar
Bu rehbere başlamadan önce, aşağıdaki ön koşulların yerine getirildiğinden emin olmanız gerekmektedir:
* Debian 9 (Stretch) Sunucusu: Çalışır durumda bir Debian 9 sunucusuna sahip olmalısınız. Tüm komutlar bu işletim sistemi sürümü için test edilmiştir.
* Nginx Kurulumu: Sunucunuzda Nginx web sunucusu kurulu ve temel bir web sitesini HTTP üzerinden (port 80) sunuyor olmalıdır. Eğer kurulu değilse, ilk adımda kurulumu gerçekleştireceğiz.
* Alan Adı: Sunucunuzun IP adresine yönlendirilmiş kayıtlı bir alan adınız (örneğin, example.com) olmalıdır. Let’s Encrypt sertifikaları IP adresleri için değil, alan adları için verilir. Alan adınızın hem ana sürümü (example.com) hem de www alt alanı (www.example.com) sunucunuzun IP adresine A kaydı veya CNAME kaydı ile yönlendirilmiş olmalıdır.
* SSH Erişimi: Sunucuya SSH üzerinden root ayrıcalıklarıyla veya sudo yetkisine sahip bir kullanıcıyla erişiminiz olmalıdır.
* Güvenlik Duvarı (UFW): Sunucunuzda bir güvenlik duvarı (örneğin, UFW) etkinse, hem HTTP (port 80) hem de HTTPS (port 443) trafiğine izin verildiğinden emin olmalısınız.
Bu ön koşulları sağladıktan sonra, Nginx sunucunuzu Let’s Encrypt ile güvenli hale getirme işlemine başlayabiliriz.
Nginx Kurulumu ve Temel Yapılandırma
Eğer Nginx sunucunuz zaten kurulu ve alan adınız için yapılandırılmışsa, bu adımı atlayabilir ve doğrudan Certbot kurulumuna geçebilirsiniz. Aksi takdirde, aşağıdaki adımları izleyerek Nginx’i kurun ve temel bir yapılandırma yapın.
Nginx Kurulumu
İlk olarak, sistem paket listesini güncelleyelim ve Nginx’i kuralım:
sudo apt update
sudo apt install nginx
Kurulum tamamlandıktan sonra, Nginx servisinin otomatik olarak başlaması ve her sistem başlangıcında etkinleştirilmesi gerekir. Durumunu kontrol edelim:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
systemctl status nginx komutu çıktısında active (running) ibaresini görmelisiniz.
Şimdi güvenlik duvarı ayarlarını yapalım. Debian’da yaygın olarak kullanılan güvenlik duvarı UFW’dir. Eğer UFW kurulu ve etkin değilse, kurup etkinleştirebilirsiniz:
sudo apt install ufw
sudo ufw enable
Uyarı: ufw enable komutunu çalıştırmadan önce SSH portuna (genellikle 22) izin verdiğinizden emin olun, aksi takdirde sunucuya erişiminiz kesilebilir: sudo ufw allow ssh.
Nginx için gerekli portları açalım:
sudo ufw allow 'Nginx HTTP' # Port 80
sudo ufw allow 'Nginx HTTPS' # Port 443
sudo ufw reload # Güvenlik duvarı kurallarını yeniden yükle
sudo ufw status # Kuralları kontrol et
sudo ufw status çıktısında Nginx HTTP ve Nginx HTTPS profillerinin ALLOW olarak listelendiğini görmelisiniz. Artık web tarayıcınızdan sunucunuzun IP adresini ziyaret ettiğinizde varsayılan Nginx “Welcome” sayfasını görmeniz gerekir.
Alan Adı için Nginx Sunucu Bloğu Yapılandırma
Nginx, farklı alan adları için “sunucu blokları” (server blocks) kullanarak birden fazla web sitesini tek bir sunucuda barındırmanıza olanak tanır. Alan adınız için bir sunucu bloğu oluşturalım. example.com yerine kendi alan adınızı kullanmayı unutmayın.
Yeni bir yapılandırma dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/example.com
Dosyanın içine aşağıdaki temel yapılandırmayı ekleyin:
server {
listen 80;
listen [::]:80;
root /var/www/example.com; # Web sitenizin dosyalarının bulunduğu dizin
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com; # Alan adınız
location / {
try_files $uri $uri/ =404;
}
}
* listen 80;: Nginx’in HTTP trafiği için 80 numaralı portu dinlemesini sağlar.
* root /var/www/example.com;: Web sitenizin kök dizinini belirtir. Bu dizini oluşturmanız gerekecektir.
* index ...;: Varsayılan dizin dosyalarını belirtir.
* server_name example.com www.example.com;: Bu sunucu bloğunun hangi alan adları için geçerli olduğunu tanımlar.
* location / { ... };: Gelen isteklerin nasıl işleneceğini belirler. try_files direktifi, dosya veya dizin bulunamazsa 404 hatası döndürür.
Şimdi web sitenizin kök dizinini oluşturalım ve içine basit bir index.html dosyası ekleyelim:
sudo mkdir -p /var/www/example.com
sudo nano /var/www/example.com/index.html
index.html içine basit bir HTML içeriği ekleyin:
Hoş Geldiniz!
Nginx sunucunuz başarıyla yapılandırıldı.
Nginx’in bu yeni sunucu bloğunu kullanabilmesi için, sites-available dizinindeki yapılandırma dosyasından sites-enabled dizinine bir sembolik bağ (symlink) oluşturmamız gerekir:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Varsayılan Nginx sunucu bloğunu devre dışı bırakmak iyi bir uygulamadır:
sudo rm /etc/nginx/sites-enabled/default
Nginx yapılandırmasında herhangi bir sözdizimi hatası olup olmadığını kontrol edelim:
sudo nginx -t
Eğer çıktı test is successful benzeri bir mesaj içeriyorsa, her şey yolundadır. Şimdi Nginx servisini yeniden yükleyerek değişiklikleri uygulayalım:
sudo systemctl reload nginx
Artık web tarayıcınızdan alan adınızı (http://example.com) ziyaret ettiğinizde, oluşturduğunuz index.html dosyasının içeriğini görmelisiniz. Bu, Nginx’in düzgün çalıştığını ve alan adınız için yapılandırıldığını doğrular.
Certbot Kurulumu (Let’s Encrypt İstemcisi)
Let’s Encrypt sertifikalarını sunucunuzda otomatik olarak almak ve yönetmek için Certbot adlı bir istemciye ihtiyacımız var. Certbot, Let’s Encrypt’in ACME (Automated Certificate Management Environment) protokolü ile etkileşime girerek sertifika alma, yenileme ve Nginx gibi web sunucularını otomatik olarak yapılandırma işlemlerini basitleştirir.
Certbot Nedir?
Certbot, EFF (Electronic Frontier Foundation) tarafından geliştirilen ve Let’s Encrypt sertifikalarını Linux sunucularında kolayca almanızı ve yönetmenizi sağlayan bir yazılımdır. Çeşitli web sunucuları (Nginx, Apache) için eklentilere sahiptir ve bu eklentiler sayesinde sunucu yapılandırmasını otomatik olarak güncelleyebilir.
Certbot Kurulumu
Debian 9 (Stretch) için Certbot’un en güncel sürümünü yüklemek için stretch-backports deposunu etkinleştirmemiz gerekebilir. Bu depolar, daha yeni yazılım paketlerini eski Debian sürümlerine taşır.
İlk olarak, stretch-backports deposunu sources.list dosyanıza ekleyin:
echo "deb http://deb.debian.org/debian stretch-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/stretch-backports.list
sudo apt update
Şimdi, Nginx eklentisiyle birlikte Certbot’u backports deposundan yükleyebiliriz:
sudo apt install python-certbot-nginx -t stretch-backports
Bu komut, Certbot’un kendisini ve Nginx ile entegrasyonu sağlayan eklentiyi kuracaktır. Kurulum tamamlandıktan sonra, Certbot’un doğru bir şekilde kurulduğunu doğrulamak için sürümünü kontrol edebilirsiniz:
certbot --version
Eğer komut bir sürüm numarası döndürüyorsa, Certbot başarıyla kurulmuştur.
Let’s Encrypt SSL Sertifikası Alma
Certbot yüklendikten sonra, alan adınız için bir SSL sertifikası almak için kullanabiliriz. Certbot’un Nginx eklentisi, bu süreci oldukça basitleştirir.
Otomatik Yöntem (Nginx Eklentisi ile)
Certbot’un Nginx eklentisi, sertifikayı almanın yanı sıra Nginx yapılandırmanızı otomatik olarak HTTPS’ye yönlendirecek şekilde güncelleyebilir. Bu, çoğu kullanıcı için en kolay ve önerilen yöntemdir.
Aşağıdaki komutu çalıştırın, example.com ve www.example.com yerine kendi alan adlarınızı yazın:
sudo certbot --nginx -d example.com -d www.example.com
Bu komutu çalıştırdıktan sonra, Certbot size birkaç soru soracaktır:
1. E-posta Adresi: Sertifika bildirimleri ve acil durumlar için bir e-posta adresi girmeniz istenecektir. Bu adres, sertifikalarınızın süresi dolmadan önce size uyarılar göndermek için kullanılır.
2. Hizmet Şartları: Let’s Encrypt’in hizmet şartlarını kabul etmeniz gerekecektir. A (Agree) yazıp Enter’a basın.
3. EFF Haber Bülteni: EFF’in haber bültenine abone olmak isteyip istemediğiniz sorulacaktır. Y (Yes) veya N (No) seçeneğini belirleyin.
4. HTTP Trafiğini HTTPS’ye Yönlendirme: Certbot, HTTP trafiğini otomatik olarak HTTPS’ye yönlendirmek isteyip istemediğinizi soracaktır. Genellikle bu önerilir.
* 1: No redirect (Yönlendirme yapma)
* 2: Redirect (Tüm HTTP isteklerini HTTPS’ye yönlendir)
Seçenek 2‘yi seçmeniz şiddetle tavsiye edilir.
Bu adımları tamamladıktan sonra, Certbot sertifikaları alacak, Nginx yapılandırmanızı güncelleyecek ve size başarılı bir mesaj gösterecektir. Mesajda sertifikalarınızın nerede saklandığı (genellikle /etc/letsencrypt/live/example.com/) ve ne zaman sona ereceği belirtilecektir.
Şimdi web tarayıcınızdan alan adınızı (https://example.com) ziyaret ettiğinizde, tarayıcınızın adres çubuğunda bir kilit simgesi görmelisiniz. Bu, sitenizin artık güvenli bir HTTPS bağlantısı üzerinden sunulduğu anlamına gelir. Eğer HTTP’den HTTPS’ye yönlendirmeyi seçtiyseniz, http://example.com adresini ziyaret ettiğinizde otomatik olarak https://example.com adresine yönlendirileceksiniz.
Manuel Yöntem (Webroot Eklentisi ile)
Bazı durumlarda, Certbot’un Nginx eklentisini kullanmak istemeyebilir veya kullanamayabilirsiniz (örneğin, Nginx yapılandırmanız çok özel olduğunda veya sadece sertifikayı almak isteyip yapılandırmayı manuel yapmak istediğinizde). Bu durumda, webroot eklentisini kullanarak sadece sertifikayı alabilirsiniz.
İlk olarak, Nginx sunucu bloğunuzda Certbot’un geçici dosyalarını yerleştireceği bir dizine erişime izin verdiğinizden emin olun. Bu genellikle web sitenizin kök dizini altında .well-known/acme-challenge şeklindedir.
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/example.com; # Sertifika doğrulama dosyalarının bulunduğu kök dizin
}
location / {
try_files $uri $uri/ =404;
}
}
Nginx yapılandırmasını kaydedin, test edin ve yeniden yükleyin:
sudo nginx -t
sudo systemctl reload nginx
Şimdi sertifikayı webroot eklentisi ile alın:
sudo certbot certonly --webroot -w /var/www/example.com -d example.com -d www.example.com
Burada -w parametresi, Certbot’un ACME doğrulama dosyalarını yerleştireceği web kök dizinini belirtir. Bu komut, önceki otomatik yöntemde olduğu gibi e-posta ve hizmet şartları sorularını soracaktır. Başarılı olursa, sertifika dosyalarınız /etc/letsencrypt/live/example.com/ dizinine kaydedilecektir.
Bu yöntemle sertifikayı aldıktan sonra, Nginx’i HTTPS kullanacak şekilde manuel olarak yapılandırmanız gerekecektir.
Nginx’i HTTPS Kullanacak Şekilde Yapılandırma
Eğer Certbot’u --nginx eklentisiyle kullandıysanız, Nginx yapılandırmanız zaten güncellenmiş olmalıdır. Ancak, certonly yöntemini kullandıysanız veya mevcut yapılandırmayı kontrol etmek ve daha da güçlendirmek istiyorsanız, bu bölümdeki adımları izleyin.
Otomatik Yapılandırma Kontrolü
Certbot’un --nginx eklentisi, /etc/nginx/sites-available/example.com dosyanızı (veya ilgili sunucu bloğu dosyanızı) otomatik olarak günceller. Bu dosyayı açarak Certbot’un yaptığı değişiklikleri görebilirsiniz:
sudo nano /etc/nginx/sites-available/example.com
İçerisinde aşağıdaki gibi bir yapılandırma görmelisiniz:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri; # HTTP'den HTTPS'ye yönlendirme
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot'un varsayılan SSL ayarları
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Diffie-Hellman parametreleri
location / {
try_files $uri $uri/ =404;
}
}
Bu yapılandırma, HTTP trafiğini HTTPS’ye yönlendiren bir server bloğu ve HTTPS trafiğini dinleyen, SSL sertifikalarını kullanan ayrı bir server bloğu içerir. include /etc/letsencrypt/options-ssl-nginx.conf; satırı, Certbot’un güçlü SSL/TLS ayarlarını otomatik olarak yüklemesini sağlar. ssl_dhparam direktifi ise Diffie-Hellman parametrelerini kullanarak Perfect Forward Secrecy’yi (PFS) etkinleştirir.
Manuel Yapılandırma
Eğer certonly ile sertifikayı aldıysanız, yukarıdaki yapılandırmayı manuel olarak sunucu bloğunuza eklemeniz gerekecektir.
İlk olarak, Diffie-Hellman parametrelerini oluşturmanız gerekir. Bu, güvenliği artırmak için önemlidir ve bir kerelik bir işlemdir:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Bu komut biraz zaman alabilir.
Şimdi sunucu bloğu dosyanızı açın:
sudo nano /etc/nginx/sites-available/example.com
Dosyanın içeriğini aşağıdaki gibi güncelleyin. Mevcut HTTP bloğunuzu HTTPS’ye yönlendirecek şekilde değiştirin ve yeni bir HTTPS bloğu ekleyin:
# HTTP'den HTTPS'ye yönlendirme
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
HTTPS sunucu bloğu
server {
listen 443 ssl http2; # HTTP/2 desteği ekleyelim
listen [::]:443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm index.nginx-debian.html;
# Let's Encrypt sertifika yolları
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Güçlü SSL/TLS ayarları
ssl_protocols TLSv1.2 TLSv1.3; # Yalnızca güvenli protokolleri kullan
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_dhparam /etc/ssl/certs/dhparam.pem; # Oluşturduğumuz DH parametreleri
ssl_stapling on; # OCSP Stapling etkinleştirme
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # Zincir sertifikası
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS çözümleyici (Google DNS)
resolver_timeout 5s;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
location / {
try_files $uri $uri/ =404;
}
}
Yukarıdaki yapılandırmada birkaç önemli nokta bulunmaktadır:
* listen 443 ssl http2;: HTTPS için 443 numaralı portu dinler ve HTTP/2 protokolünü etkinleştirir. HTTP/2, performansı artırır.
* ssl_certificate ve ssl_certificate_key: Let’s Encrypt tarafından sağlanan sertifika ve özel anahtar dosyalarının yollarını belirtir.
* ssl_protocols ve ssl_ciphers: Yalnızca güvenli ve modern SSL/TLS protokollerini ve şifreleme paketlerini kullanır. Eski ve zayıf protokolleri (TLSv1.0, TLSv1.1) ve şifreleri devre dışı bırakmak güvenlik için kritik öneme sahiptir.
* ssl_dhparam: Daha önce oluşturduğumuz Diffie-Hellman parametre dosyasını kullanır.
* ssl_stapling on; ve ilgili direktifler: OCSP Stapling’i etkinleştirir. Bu, tarayıcıların sertifika iptal durumunu doğrudan sunucudan almasını sağlayarak performansı artırır ve gizliliği iyileştirir.
* add_header Strict-Transport-Security ...: HSTS (HTTP Strict Transport Security) başlığını ekler. Bu, tarayıcılara belirli bir süre boyunca (burada 2 yıl) sitenize yalnızca HTTPS üzerinden erişmeleri gerektiğini bildirir. Bu, ilk HTTP isteğinde bile MITM saldırılarını önlemeye yardımcı olur. preload direktifi, sitenizi HSTS preload listesine eklemenizi sağlar, ancak bunu yapmadan önce HSTS’nin uzun vadeli etkilerini anladığınızdan emin olun.
Yapılandırma dosyasını kaydettikten sonra, Nginx yapılandırmasını test edin ve yeniden yükleyin:
sudo nginx -t
sudo systemctl reload nginx
Şimdi tarayıcınızdan alan adınızı https://example.com olarak ziyaret ettiğinizde, sitenizin güvenli bir bağlantı üzerinden çalıştığını görmelisiniz.
Sertifika Yenileme İşlemi
Let’s Encrypt sertifikaları 90 gün boyunca geçerlidir. Bu kısa süre, güvenlik açıklarının ortaya çıkması durumunda sertifikaların hızlı bir şekilde değiştirilebilmesini sağlar. Ancak, bu aynı zamanda sertifikaların düzenli olarak yenilenmesi gerektiği anlamına gelir. Certbot, bu yenileme işlemini otomatikleştirir.
Let’s Encrypt Sertifika Ömrü
Certbot, sertifikaların süresi dolmadan önce otomatik olarak yenilenmesini sağlamak için bir cron işi veya systemd zamanlayıcısı oluşturur. Bu işlem genellikle sertifikanın süresi dolmadan 30 gün önce çalışır.
Otomatik Yenileme
python-certbot-nginx paketiyle Certbot’u kurduğunuzda, otomatik yenileme için bir systemd zamanlayıcısı veya cron işi otomatik olarak kurulur. Bu, genellikle günde iki kez çalışır ve süresi dolmak üzere olan herhangi bir sertifikayı yeniler.
Yenileme mekanizmasının düzgün çalıştığını test etmek için aşağıdaki komutu kullanabilirsiniz:
sudo certbot renew --dry-run
Bu komut, gerçek bir yenileme işlemi yapmadan yenileme sürecini simüle eder. Eğer çıktı Congratulations, all renewals passed the dry run. benzeri bir mesaj içeriyorsa, otomatik yenilemenin düzgün çalışacağını varsayabiliriz.
Gerçek bir yenileme işlemi sırasında Certbot, sertifikaları başarıyla yeniledikten sonra Nginx servisini otomatik olarak yeniden yükleyerek yeni sertifikaların devreye girmesini sağlar. Bu sayede manuel müdahaleye gerek kalmaz.
Güvenliği Artırıcı Ek Adımlar
SSL/TLS sertifikası kurmak, web sitenizin güvenliğini sağlamanın ilk adımıdır. Ancak, genel güvenliği daha da artırmak için alabileceğiniz ek önlemler vardır.
HSTS (HTTP Strict Transport Security) Uygulama
Daha önce manuel yapılandırma bölümünde bahsettiğimiz HSTS, tarayıcılara sitenize yalnızca HTTPS üzerinden erişmeleri gerektiğini bildiren bir güvenlik mekanizmasıdır. Bu, kullanıcıların yanlışlıkla HTTP sürümüne erişmesini veya bir saldırganın onları HTTP’ye düşürmesini engeller.
Nginx sunucu bloğunuzun HTTPS kısmına (port 443 dinleyen blok) aşağıdaki satırı ekleyin:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
* max-age: Tarayıcının bu kuralı hatırlayacağı saniye cinsinden süreyi belirtir (63072000 saniye = 2 yıl).
* includeSubDomains: Tüm alt alan adlarının da bu kurala tabi olmasını sağlar.
* preload: Sitenizi HSTS preload listesine eklemek için bir isteğe izin verir. Bu, sitenizin ziyaret edilmeden önce bile tarayıcıların HSTS’yi uygulamasını sağlar. Ancak, bu geri dönüşü olmayan bir adımdır ve dikkatli bir şekilde düşünülmelidir.
OCSP Stapling Etkinleştirme
OCSP (Online Certificate Status Protocol) Stapling, bir sunucunun kendi sertifikasının iptal durumunu doğrudan sertifika yetkilisinden alıp, bu bilgiyi istemcilere (tarayıcılara) TLS el sıkışması sırasında sunmasıdır. Bu, tarayıcıların sertifika yetkilisine ayrı bir istek göndermesine gerek kalmadığı için performansı artırır ve kullanıcı gizliliğini iyileştirir.
HTTPS sunucu bloğunuza aşağıdaki satırları ekleyin (eğer Certbot otomatik olarak eklemediyse):
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # Let's Encrypt zincir sertifikası
resolver 8.8.8.8 8.8.4.4 valid=300s; # Güvenilir DNS çözümleyicileri (Google DNS)
resolver_timeout 5s;
ssl_trusted_certificate direktifi, Certbot’un oluşturduğu chain.pem dosyasını işaret etmelidir. resolver direktifi ise Nginx’in OCSP yanıtlarını alabilmesi için kullanacağı bir DNS sunucusunu belirtir.
SSL/TLS Protokol ve Şifreleme Ayarları
Daha önce manuel yapılandırmada verdiğimiz SSL/TLS ayarları, güncel güvenlik standartlarını karşılamak için tasarlanmıştır. Ancak, bu ayarları anlamak ve gelecekteki güvenlik gelişmelerine göre güncellemek önemlidir.
* ssl_protocols TLSv1.2 TLSv1.3;: Yalnızca TLSv1.2 ve TLSv1.3 gibi güçlü ve modern protokolleri kullanın. TLSv1.0 ve TLSv1.1 gibi eski protokoller bilinen güvenlik açıklarına sahiptir ve mümkünse devre dışı bırakılmalıdır.
* ssl_ciphers '...': Güvenli ve modern şifreleme paketlerini tercih edin. ECDHE ve DHE tabanlı şifreler, Perfect Forward Secrecy (PFS) sağladıkları için önerilir. AES-GCM ve ChaCha20-Poly1305 gibi modern şifreleme algoritmalarını kullanın.
* ssl_prefer_server_ciphers on;: Sunucunun, istemcinin tercihleri yerine kendi şifreleme paketi listesini kullanmasını sağlar. Bu, sunucunun her zaman en güvenli şifrelemeyi seçmesini garanti eder.
* ssl_session_cache ve ssl_session_timeout: TLS oturumlarını önbelleğe alarak sonraki bağlantılarda el sıkışma süresini kısaltır.
* ssl_session_tickets off;: TLS oturum biletlerinin kullanımını devre dışı bırakır. Bu, bazı durumlarda güvenlik zafiyetlerine yol açabildiği için önerilir.
Bu ayarları Nginx ana yapılandırma dosyanızdaki (/etc/nginx/nginx.conf içindeki http bloğu) veya her sunucu bloğunuzdaki server bloğu içine ekleyebilirsiniz.
Gereksiz Nginx Bilgilerini Gizleme
Nginx’in varsayılan olarak sürüm numarasını HTTP yanıt başlıklarında göstermesini engellemek, olası saldırganların sunucunuzdaki bilinen güvenlik açıklarını hedeflemesini zorlaştırabilir.
/etc/nginx/nginx.conf dosyasındaki http bloğuna aşağıdaki satırı ekleyin:
server_tokens off;
Bu değişikliği yaptıktan sonra Nginx’i yeniden yüklemeyi unutmayın: sudo systemctl reload nginx.
Güncel Debian ve Nginx Sürümlerini Kullanma
Bu rehber Debian 9 için yazılmış olsa da, genel bir en iyi uygulama olarak her zaman işletim sisteminizin ve kullandığınız tüm yazılımların (Nginx, Certbot vb.) en güncel, desteklenen sürümlerini kullanmanız şiddetle tavsiye edilir. Güncel sürümler, bilinen güvenlik açıklarına karşı yamalar, performans iyileştirmeleri ve yeni özellikler içerir. Debian 9 artık resmi olarak desteklenmemektedir, bu nedenle mümkünse daha yeni bir Debian sürümüne (örneğin Debian 11 veya 12) yükseltmeyi düşünmelisiniz.
Kurulumu Test Etme
Tüm yapılandırmaları tamamladıktan sonra, web sitenizin güvenliğini ve performansını test etmek önemlidir.
1. Tarayıcıdan Erişim: Alan adınızı https://example.com olarak ziyaret edin. Tarayıcınızın adres çubuğunda yeşil bir kilit simgesi veya “Güvenli” ibaresi görmelisiniz. HTTP üzerinden (http://example.com) erişmeye çalıştığınızda otomatik olarak HTTPS’ye yönlendirildiğinizden emin olun.
2. SSL Labs Testi: Qualys SSL Labs’ın ücretsiz SSL Sunucu Test aracını kullanarak sunucunuzun SSL/TLS yapılandırmasının kalitesini kontrol edebilirsiniz: https://www.ssllabs.com/ssltest/. Alan adınızı girin ve testi çalıştırın. İyi yapılandırılmış bir sunucu genellikle “A” veya “A+” derecesi almalıdır. Bu test, kullandığınız protokolleri, şifreleri, HSTS ve OCSP Stapling gibi ek güvenlik özelliklerini detaylı olarak raporlayacaktır.
3. Certbot Yenileme Testi: Otomatik yenileme mekanizmasının düzgün çalıştığından emin olmak için daha önce bahsettiğimiz sudo certbot renew --dry-run komutunu düzenli olarak çalıştırmayı düşünebilirsiniz.
Bu testler, yapılandırmanızın doğru olduğunu ve web sitenizin güvenli bir şekilde sunulduğunu doğrulamanıza yardımcı olacaktır.
Sonuç
Nginx’i Let’s Encrypt ile güvenli hale getirmek, modern web siteleri için temel bir gerekliliktir. Bu makalede, Debian 9 işletim sistemi üzerinde Nginx kurulumundan başlayarak, Let’s Encrypt sertifikalarını Certbot aracılığıyla edinme, Nginx’i HTTPS trafiği için yapılandırma ve otomatik yenileme süreçlerini detaylı bir şekilde inceledik. Ayrıca, HSTS, OCSP Stapling ve güçlü SSL/TLS şifreleme ayarları gibi ek güvenlik önlemlerini de ele aldık.
Bu adımları takip ederek, web sitenizin güvenliğini artıracak, kullanıcılarınızın gizliliğini koruyacak ve arama motoru sıralamalarınız üzerinde olumlu bir etki yaratacaksınız. Unutmayın ki siber güvenlik sürekli gelişen bir alandır; bu nedenle, sunucunuzu ve yazılımlarınızı düzenli olarak güncellemeli, güvenlik yamalarını uygulamalı ve en iyi uygulamaları takip etmelisiniz. Bu rehber, Nginx tabanlı web sitenizi güvenli bir başlangıç noktasına getirmenize yardımcı olacaktır.
