Tomcat 8 Bağlantılarını Apache veya Nginx ile Şifreleme: Ubuntu 16.04 Üzerinde Kapsamlı Bir Rehber
Giriş
Günümüzün dijital dünyasında, web uygulamalarının güvenliği her zamankinden daha kritik bir öneme sahiptir. Kullanıcı verilerinin korunması, veri bütünlüğünün sağlanması ve yasal düzenlemelere uyum, şifreli bağlantıları bir lüks olmaktan çıkarıp bir zorunluluk haline getirmiştir. Apache Tomcat, Java tabanlı web uygulamaları için yaygın olarak kullanılan güçlü bir uygulama sunucusudur. Ancak Tomcat’i doğrudan internete açık bir şekilde çalıştırmak, güvenlik risklerini beraberinde getirebilir. Bu nedenle, Tomcat’in önünde bir ters proxy (reverse proxy) görevi görecek Apache HTTP Sunucusu veya Nginx gibi popüler web sunucuları kullanmak, hem performansı artırmak hem de güvenlik katmanları eklemek için yaygın bir uygulamadır.
Bu makale, Ubuntu 16.04 işletim sistemi üzerinde çalışan bir Tomcat 8 uygulamasının bağlantılarını Apache veya Nginx kullanarak nasıl şifreleyeceğinizi ayrıntılı bir şekilde açıklamaktadır. Ubuntu 16.04, eski bir sürüm olmasına rağmen, hala birçok üretim ortamında kullanılmaktadır ve bu rehber, bu tür sistemler için değerli bir kaynak olacaktır. Let’s Encrypt gibi ücretsiz ve otomatik sertifika sağlayan servisler sayesinde HTTPS (Hypertext Transfer Protocol Secure) uygulamak artık çok daha kolay ve erişilebilirdir. Bu rehberde, SSL/TLS sertifikası edinme, Tomcat’i ters proxy arkasında çalışacak şekilde yapılandırma ve Apache veya Nginx’i bu sertifikalarla birlikte Tomcat trafiğini şifrelemek üzere yapılandırma adımları adım adım ele alınacaktır. Amacımız, uygulamanızın güvenliğini artırmak ve kullanıcılarınıza güvenli bir deneyim sunmaktır.
Ön Koşullar
Bu rehbere başlamadan önce aşağıdaki ön koşulların yerine getirilmiş olması gerekmektedir:
Ubuntu 16.04 Sunucusu
* SSH erişimi olan ve sudo yetkilerine sahip bir kullanıcıya sahip, temiz bir Ubuntu 16.04 sunucusu.
Tomcat 8 Kurulumu
* Sunucunuzda Apache Tomcat 8’in kurulu ve çalışır durumda olması gerekmektedir. Tomcat’in varsayılan HTTP portu (genellikle 8080) üzerinden erişilebilir olduğundan emin olun.
* Tomcat’in kurulumu hakkında bilgiye ihtiyacınız varsa, ilgili Tomcat dokümantasyonuna başvurabilirsiniz. Genellikle apt-get install tomcat8 komutu ile veya Tomcat web sitesinden indirilerek manuel kurulum yapılabilir.
Alan Adı ve DNS Yapılandırması
* Uygulamanız için bir alan adına (örneğin, uygulama.alanadiniz.com) sahip olmanız ve bu alan adının DNS kayıtlarının sunucunuzun IP adresine işaret ettiğinden emin olmanız gerekmektedir. Bu, SSL sertifikası alımı için zorunludur.
Gerekli Paketler
* Apache veya Nginx henüz kurulu değilse, kurulum adımları rehberde belirtilecektir.
* curl, wget, nano veya vim gibi temel komut satırı araçlarının yüklü olması faydalı olacaktır.
Bu ön koşullar tamamlandığında, Tomcat bağlantılarını güvenli hale getirme sürecine başlayabiliriz.
Tomcat 8 Yapılandırması
Tomcat’i bir ters proxy arkasında çalıştırmak için genellikle doğrudan HTTPS yapılandırmasına gerek yoktur. Ters proxy (Apache veya Nginx) SSL sonlandırmasını yapacak ve şifrelenmiş trafiği şifresiz (HTTP) veya AJP (Apache JServ Protocol) üzerinden Tomcat’e iletecektir. Bu yaklaşım, Tomcat’in yükünü azaltır ve SSL yönetimini merkezi hale getirir.
Tomcat’i HTTP veya AJP için Yapılandırma
Tomcat’in yapılandırma dosyası server.xml genellikle /etc/tomcat8/server.xml veya Tomcat kurulum dizininin conf/server.xml yolunda bulunur. Bu dosyayı düzenleyerek Tomcat’i ters proxy ile iletişim kuracak şekilde ayarlayacağız.
sudo nano /etc/tomcat8/server.xml
Aşağıdaki Connector tanımlarının mevcut olduğundan ve doğru yapılandırıldığından emin olun:
1. HTTP Connector (Port 8080):
Bu konektör, Tomcat’in HTTP trafiğini dinlemesini sağlar. Ters proxy’niz HTTP üzerinden Tomcat ile iletişim kuracaksa bu gereklidir.
Bu konektörün varsayılan haliyle bırakılması genellikle yeterlidir. redirectPort="8443" ayarı, Tomcat’in şifresiz HTTP isteği aldığında, secure="true" olarak işaretlenmiş bir sayfaya yönlendirme yapması gerektiğinde bu portu kullanmasını sağlar.
2. AJP Connector (Port 8009):
AJP (Apache JServ Protocol), Apache HTTP Sunucusu ile Tomcat arasında daha verimli bir iletişim sağlar. Eğer Apache’yi ters proxy olarak kullanacaksanız, bu konektörü etkinleştirmeniz önerilir.
* secretRequired="true" ve secret="YOUR_AJP_SECRET_KEY": Bu ayarlar, AJP konektörünün güvenliğini artırmak için kritik öneme sahiptir. YOUR_AJP_SECRET_KEY yerine güçlü, benzersiz bir parola belirleyin. Bu parola, Apache yapılandırmanızda da belirtilmelidir. Bu sayede sadece doğru anahtara sahip Apache sunucusu Tomcat ile AJP üzerinden iletişim kurabilir.
* Eğer secretRequired yerine address="127.0.0.1" gibi bir ayar kullanılarak sadece yerel bağlantılara izin verilirse, bu da bir güvenlik katmanı sağlar. Ancak secret kullanımı daha güçlü bir güvenlik sağlar.
Yapılandırma dosyasını kaydettikten sonra Tomcat’i yeniden başlatın:
sudo systemctl restart tomcat8
sudo systemctl status tomcat8
Tomcat’in doğru şekilde çalıştığından emin olun.
Tomcat’i HTTPS için Doğrudan Yapılandırma (Tavsiye Edilmez)
Bazı durumlarda Tomcat’i doğrudan HTTPS için yapılandırmak isteyebilirsiniz (örneğin, ters proxy kullanmadan veya ters proxy’nin Tomcat ile şifreli iletişim kurmasını isterseniz). Ancak genel olarak, bu makalede ele alınan ters proxy yaklaşımı tercih edilir.
Eğer yine de Tomcat’i HTTPS için doğrudan yapılandırmanız gerekirse:
1. Keystore Oluşturma: Java Keytool kullanarak bir anahtar deposu (keystore) oluşturmanız gerekir.
sudo keytool -genkey -alias tomcat -keyalg RSA -keystore /etc/tomcat8/conf/keystore.jks -keysize 2048
Bu komut, sizden bir parola ve sertifika bilgileri isteyecektir. Parolayı unutmayın.
2. Sertifika İmzalama İsteği (CSR) Oluşturma:
sudo keytool -certreq -alias tomcat -file /tmp/certreq.csr -keystore /etc/tomcat8/conf/keystore.jks
Bu CSR dosyasını bir sertifika yetkilisine (CA) göndererek imzalı bir sertifika almanız gerekir.
3. İmzalı Sertifikayı Keystore’a Aktarma: CA’dan aldığınız sertifikayı (genellikle .crt veya .cer uzantılı) ve varsa CA zincirini (chain certificate) keystore’a aktarın.
sudo keytool -import -trustcacerts -alias root -file /path/to/root.crt -keystore /etc/tomcat8/conf/keystore.jks
sudo keytool -import -trustcacerts -alias intermediate -file /path/to/intermediate.crt -keystore /etc/tomcat8/conf/keystore.jks
sudo keytool -import -alias tomcat -file /path/to/your_domain.crt -keystore /etc/tomcat8/conf/keystore.jks
4. server.xml içinde HTTPS Connector’ı Etkinleştirme:
server.xml dosyasında aşağıdaki gibi bir HTTPS konektörünü etkinleştirin ve keystore bilgilerini girin:
Bu adımlar, Tomcat’i doğrudan HTTPS için yapılandırmak içindir. Ancak bu makalenin ana odağı ters proxy üzerinden şifrelemedir.
SSL Sertifikası Edinme ve Yönetimi
Web sitenizin güvenliğini sağlamanın temel adımı, güvenilir bir SSL/TLS sertifikası edinmektir. Bu bölümde, ücretsiz ve otomatik bir sertifika sağlayıcısı olan Let’s Encrypt ile sertifika almayı ve yönetmeyi ele alacağız.
Let’s Encrypt ile Sertifika Alma (Önerilen Yöntem)
Let’s Encrypt, Certbot aracı aracılığıyla ücretsiz SSL/TLS sertifikaları sağlar ve sertifika yönetimini büyük ölçüde basitleştirir.
1. Certbot Kurulumu:
Ubuntu 16.04 için Certbot’u yüklemenin en kolay yolu, Certbot PPA’sını eklemektir.
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot -y
sudo apt-get update
sudo apt-get install certbot -y
Eğer Apache veya Nginx’i hemen kurup Certbot’un otomatik yapılandırma özelliğini kullanacaksanız, python-certbot-apache veya python-certbot-nginx paketlerini de yüklemeniz gerekebilir:
# Apache için:
sudo apt-get install python-certbot-apache -y
# Nginx için:
sudo apt-get install python-certbot-nginx -y
2. Sertifika Alma:
Certbot, farklı kimlik doğrulama yöntemleri sunar. Biz burada web sunucunuzun (Apache veya Nginx) zaten çalışır durumda olduğunu ve alan adınızın bu sunucuya yönlendirilmiş olduğunu varsayacağız.
* Apache ile Certbot:
Eğer Apache’yi ters proxy olarak kullanacaksanız ve Apache’nin otomatik yapılandırma özelliğini kullanmak isterseniz:
sudo certbot --apache -d uygulama.alanadiniz.com -d www.uygulama.alanadiniz.com
Certbot, Apache yapılandırmanızı otomatik olarak algılayacak, bir sanal host oluşturacak/düzenleyecek ve sertifikayı kuracaktır. Ayrıca HTTP’den HTTPS’ye yönlendirme (redirect) ayarlamayı da teklif edebilir.
* Nginx ile Certbot:
Eğer Nginx’i ters proxy olarak kullanacaksanız ve Nginx’in otomatik yapılandırma özelliğini kullanmak isterseniz:
sudo certbot --nginx -d uygulama.alanadiniz.com -d www.uygulama.alanadiniz.com
Certbot, Nginx yapılandırmanızı otomatik olarak algılayacak, bir server bloğu oluşturacak/düzenleyecek ve sertifikayı kuracaktır. Ayrıca HTTP’den HTTPS’ye yönlendirme ayarlamayı da teklif edebilir.
* Sadece Sertifika Alma (Webroot Yöntemi):
Eğer Certbot’un web sunucunuzu otomatik olarak yapılandırmasını istemiyorsanız veya web sunucunuz henüz kurulu değilse, webroot yöntemini kullanabilirsiniz. Bu yöntem için, web sunucunuzun kök dizinini belirtmeniz gerekir. Örneğin, Apache için /var/www/html veya Nginx için /usr/share/nginx/html.
sudo certbot certonly --webroot -w /var/www/html -d uygulama.alanadiniz.com -d www.uygulama.alanadiniz.com
Sertifikalarınız başarıyla alındığında, /etc/letsencrypt/live/uygulama.alanadiniz.com/ dizininde bulunacaktır. Bu dizinde fullchain.pem (sertifika zinciri) ve privkey.pem (özel anahtar) dosyalarını bulacaksınız.
3. Otomatik Yenileme:
Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, sertifikaları otomatik olarak yenilemek için bir cron job veya systemd timer ayarlar. Yenileme işlemini test etmek için aşağıdaki komutu kullanabilirsiniz:
sudo certbot renew --dry-run
Bu komut herhangi bir hata vermezse, otomatik yenilemenin düzgün çalıştığı anlamına gelir.
Mevcut Sertifikayı Kullanma
Eğer ticari bir SSL sertifikasına sahipseniz veya kendinden imzalı bir sertifika kullanmak istiyorsanız, sertifika dosyalarınızı sunucunuza kopyalamanız ve doğru izinleri ayarlamanız gerekir.
1. Sertifika Dosyalarını Kopyalama:
Sertifika yetkilisinden aldığınız sertifika dosyalarını (genellikle .crt, .pem, .key uzantılı) güvenli bir konuma kopyalayın. Örneğin:
* Özel Anahtar (private.key)
* Alan Adı Sertifikası (domain.crt)
* CA Zincir Sertifikası (ca_bundle.crt veya chain.crt)
Bu dosyaları genellikle /etc/ssl/private/ ve /etc/ssl/certs/ gibi dizinlere veya /etc/apache2/ssl/ veya /etc/nginx/ssl/ gibi özel bir dizine kopyalayabilirsiniz.
2. İzinleri Ayarlama:
Özel anahtar dosyasının sadece root kullanıcısı tarafından okunabilir olduğundan emin olun.
sudo chown root:root /etc/ssl/private/private.key
sudo chmod 600 /etc/ssl/private/private.key
Diğer sertifika dosyaları için daha geniş okuma izinleri verilebilir (örneğin, 644).
Sertifikalarınız hazır olduğunda, Apache veya Nginx’i yapılandırma adımlarına geçebiliriz.
Apache HTTP Sunucusu ile Enkripsiyon
Apache HTTP Sunucusu, Tomcat için popüler bir ters proxy seçeneğidir. SSL sonlandırmayı Apache’de yaparak, Tomcat’i daha güvenli bir şekilde arka planda çalıştırabiliriz.
Apache Kurulumu (Gerekliyse)
Eğer Apache henüz kurulu değilse, aşağıdaki komutlarla kurabilirsiniz:
sudo apt-get update
sudo apt-get install apache2 -y
Gerekli Apache Modüllerini Etkinleştirme
Tomcat ile iletişim kurmak ve SSL’i işlemek için Apache’nin bazı modüllere ihtiyacı vardır.
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_ajp # AJP protokolü kullanılıyorsa
sudo a2enmod ssl
sudo a2enmod headers # Güvenlik başlıkları için
sudo a2enmod rewrite # HTTP'den HTTPS'ye yönlendirme için
sudo systemctl restart apache2
Apache Sanal Host Yapılandırması
Şimdi Apache için bir sanal host (VirtualHost) yapılandırma dosyası oluşturalım. Bu dosya, alan adınız için HTTP ve HTTPS isteklerini nasıl işleyeceğini belirleyecektir.
sudo nano /etc/apache2/sites-available/uygulama.alanadiniz.com.conf
Aşağıdaki içeriği dosyaya ekleyin. uygulama.alanadiniz.com ve sertifika yollarını kendi bilgilerinizle değiştirin.
ServerName uygulama.alanadiniz.com
ServerAlias www.uygulama.alanadiniz.com
Redirect permanent / https://uygulama.alanadiniz.com/
ServerName uygulama.alanadiniz.com
ServerAlias www.uygulama.alanadiniz.com
# SSL Ayarları
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/uygulama.alanadiniz.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/uygulama.alanadiniz.com/privkey.pem
# Eğer ayrı bir chain file'ınız varsa: SSLCertificateChainFile /etc/letsencrypt/live/uygulama.alanadiniz.com/chain.pem
# Güvenlik ve Performans için Ek SSL Ayarları
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets Off
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "no-referrer-when-downgrade"
# HSTS Preload için
#
# Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
#
# Log Ayarları
ErrorLog ${APACHE_LOG_DIR}/uygulama.alanadiniz.com-error.log
CustomLog ${APACHE_LOG_DIR}/uygulama.alanadiniz.com-access.log combined
# Tomcat'e Yönlendirme (AJP Kullanımı)
# Eğer Tomcat'in AJP konektörünü (8009) kullanıyorsanız:
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
# Tomcat'e Yönlendirme (HTTP Kullanımı)
# Eğer Tomcat'in HTTP konektörünü (8080) kullanıyorsanız:
# ProxyPass / http://localhost:8080/
# ProxyPassReverse / http://localhost:8080/
# Proxy Başlıkları
ProxyRequests Off
ProxyPreserveHost On
Order deny,allow
Allow from all
# Tomcat'e gönderilecek başlıklar
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
# AJP Secret Key (Eğer AJP kullanıyorsanız ve secret tanımladıysanız)
#
# ProxySet secret=YOUR_AJP_SECRET_KEY
#
Önemli Notlar:
* SSLCertificateFile ve SSLCertificateKeyFile yollarını Let’s Encrypt sertifikalarınızın veya kendi sertifikalarınızın yollarıyla güncelleyin.
* ProxyPass ve ProxyPassReverse direktiflerinden sadece birini (AJP veya HTTP) seçin. AJP genellikle daha verimli olduğu için önerilir.
* Eğer AJP kullanıyorsanız ve Tomcat’te secret tanımladıysanız, bloğunu etkinleştirerek ProxySet secret=YOUR_AJP_SECRET_KEY satırını kendi anahtarınızla güncelleyin.
* Strict-Transport-Security (HSTS) başlığı, tarayıcılara sitenize her zaman HTTPS üzerinden erişmeleri gerektiğini bildirir ve gelecekteki güvenlik açıklarını önler. preload seçeneği, HSTS listesine sitenizi eklemek için kullanılabilir (ancak bunun için özel bir başvuru süreci vardır).
* Diğer güvenlik başlıkları (X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy) web uygulamanızın çeşitli saldırılara karşı korunmasına yardımcı olur.
Yapılandırmayı Etkinleştirme ve Yeniden Başlatma
Yapılandırma dosyasını kaydettikten sonra, sanal host’u etkinleştirin ve Apache yapılandırmasını test edip yeniden başlatın:
sudo a2ensite uygulama.alanadiniz.com.conf
sudo apachectl configtest
sudo systemctl restart apache2
configtest komutu herhangi bir hata vermezse, Apache’nin yeni yapılandırmayla başarıyla başlatılması gerekir. Artık https://uygulama.alanadiniz.com adresinden Tomcat uygulamanıza güvenli bir şekilde erişebiliyor olmalısınız.
Nginx HTTP Sunucusu ile Enkripsiyon
Nginx, yüksek performanslı ve hafif bir web sunucusu ve ters proxy olarak bilinir. Tomcat bağlantılarını şifrelemek için Nginx’i kullanmak da popüler bir yaklaşımdır.
Nginx Kurulumu (Gerekliyse)
Eğer Nginx henüz kurulu değilse, aşağıdaki komutlarla kurabilirsiniz:
sudo apt-get update
sudo apt-get install nginx -y
Nginx Yapılandırması
Nginx için bir sunucu bloğu (server block) yapılandırma dosyası oluşturalım. Bu dosya, alan adınız için HTTP ve HTTPS isteklerini nasıl işleyeceğini belirleyecektir.
sudo nano /etc/nginx/sites-available/uygulama.alanadiniz.com
Aşağıdaki içeriği dosyaya ekleyin. uygulama.alanadiniz.com ve sertifika yollarını kendi bilgilerinizle değiştirin.
# HTTP'den HTTPS'ye Yönlendirme
server {
listen 80;
listen [::]:80;
server_name uygulama.alanadiniz.com www.uygulama.alanadiniz.com;
return 301 https://$host$request_uri;
}
HTTPS Yapılandırması
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name uygulama.alanadiniz.com www.uygulama.alanadiniz.com;
# SSL Sertifika Yolları
ssl_certificate /etc/letsencrypt/live/uygulama.alanadiniz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/uygulama.alanadiniz.com/privkey.pem;
# SSL Ayarları (Güvenlik ve Performans için)
ssl_protocols TLSv1.2 TLSv1.3; # Yalnızca güçlü protokolleri kullanın
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # Google DNS veya kendi güvenilir DNS sunucunuzu kullanın
resolver_timeout 5s;
# Güvenlik Başlıkları
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Log Ayarları
access_log /var/log/nginx/uygulama.alanadiniz.com-access.log;
error_log /var/log/nginx/uygulama.alanadiniz.com-error.log;
# Tomcat'e Yönlendirme (HTTP Proxy Kullanımı)
location / {
proxy_pass http://localhost:8080; # Tomcat'in HTTP portuna yönlendirme
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # Nginx'in SSL kullandığını Tomcat'e bildirir
proxy_set_header X-Forwarded-Port $server_port; # Nginx'in 443 portunu kullandığını Tomcat'e bildirir
proxy_cache_bypass $http_upgrade;
proxy_buffering off; # Dinamik uygulamalar için buffering'i kapatmak genellikle daha iyidir
proxy_read_timeout 90s;
}
# Nginx, AJP protokolünü doğrudan desteklemez.
# Eğer AJP kullanmak isterseniz, Nginx için ajp_proxy_module gibi 3. parti bir modül derlemeniz gerekir.
# Genellikle Nginx ile HTTP proxy kullanmak daha yaygın ve basittir.
}
Önemli Notlar:
* ssl_certificate ve ssl_certificate_key yollarını Let’s Encrypt sertifikalarınızın veya kendi sertifikalarınızın yollarıyla güncelleyin.
* proxy_pass http://localhost:8080; satırı, Nginx’in gelen HTTPS isteklerini Tomcat’in HTTP portuna iletmesini sağlar.
* proxy_set_header direktifleri, orijinal istemci bilgilerini (IP adresi, host, protokol) Tomcat’e iletmek için kritik öneme sahiptir. Bu sayede Tomcat, istemcinin gerçek IP’sini ve HTTPS üzerinden geldiğini bilir.
* Strict-Transport-Security (HSTS) başlığı, tarayıcılara sitenize her zaman HTTPS üzerinden erişmeleri gerektiğini bildirir.
* Nginx, Apache gibi AJP protokolünü doğrudan desteklemez. Bu nedenle genellikle HTTP proxy kullanılır.
Yapılandırmayı Etkinleştirme ve Yeniden Başlatma
Yapılandırma dosyasını kaydettikten sonra, sembolik bir bağlantı oluşturarak bu yapılandırmayı etkinleştirin ve Nginx yapılandırmasını test edip yeniden başlatın:
sudo ln -s /etc/nginx/sites-available/uygulama.alanadiniz.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
nginx -t komutu herhangi bir hata vermezse, Nginx’in yeni yapılandırmayla başarıyla başlatılması gerekir. Artık https://uygulama.alanadiniz.com adresinden Tomcat uygulamanıza güvenli bir şekilde erişebiliyor olmalısınız.
Güvenlik İpuçları ve En İyi Uygulamalar
Tomcat bağlantılarını şifrelemek, güvenliğinizi artırmanın önemli bir adımıdır. Ancak bu, kapsamlı bir güvenlik stratejisinin sadece bir parçasıdır. İşte ek güvenlik ipuçları ve en iyi uygulamalar:
* Tomcat’i Doğrudan İnternete Açmayın: Ters proxy kullanmanın temel amacı budur. Tomcat’in 8080 (veya AJP 8009) portlarını sadece yerel ağdan veya ters proxy sunucunuzdan erişilebilir tutun. Güvenlik duvarı (firewall) kuralları ile bu portlara dışarıdan erişimi engelleyin.
* Güvenlik Duvarı (UFW) Yapılandırması: Ubuntu’da UFW (Uncomplicated Firewall) kullanarak sadece gerekli portları (80 ve 443) dışarıya açın.
sudo ufw allow 'Apache Full' # veya 'Nginx Full'
sudo ufw allow ssh
sudo ufw enable
sudo ufw status
Tomcat’in HTTP veya AJP portlarına dışarıdan erişimi engelleyin:
sudo ufw deny 8080/tcp
sudo ufw deny 8009/tcp
* Güncel Yazılım Kullanımı: İşletim sisteminizi (Ubuntu 16.04’ün desteği sona ermiş olsa da mevcut en son yamaları), Tomcat, Apache/Nginx ve Java sürümlerinizi düzenli olarak güncel tutun. Güvenlik açıklarının çoğu, eski yazılım sürümlerinden kaynaklanır.
* Güçlü SSL/TLS Ayarları: Makalede belirtilen ssl_protocols ve ssl_ciphers gibi ayarlar, zayıf şifrelerin ve eski protokollerin kullanımını engeller. SSL Labs gibi araçlarla sertifika yapılandırmanızın gücünü test edin.
* HTTP Strict Transport Security (HSTS): HSTS başlığını (Strict-Transport-Security) kullanmak, tarayıcıların sitenize her zaman HTTPS üzerinden erişmesini zorlar ve man-in-the-middle saldırılarına karşı koruma sağlar.
* Güvenlik Başlıkları: X-Frame-Options, X-Content-Type-Options, X-XSS-Protection ve Referrer-Policy gibi ek güvenlik başlıklarını kullanın.
* Tomcat Yöneticisi ve Host Yöneticisi Güvenliği: Tomcat’in varsayılan olarak gelen Yönetici ve Host Yöneticisi uygulamalarına erişimi kısıtlayın veya devre dışı bırakın. Eğer kullanmanız gerekiyorsa, güçlü parolalar kullanın ve sadece belirli IP adreslerinden erişime izin verin.
* Düzenli Yedekleme: Uygulama verilerinizi, yapılandırma dosyalarınızı ve sertifikalarınızı düzenli olarak yedekleyin.
* Logları İzleme: Apache/Nginx ve Tomcat’in erişim ve hata günlüklerini düzenli olarak kontrol edin. Anormal etkinlikler veya hata mesajları, potansiyel güvenlik sorunlarının veya yapılandırma hatalarının göstergesi olabilir.
* Minimum Yetki Prensibi: Tomcat, Apache ve Nginx’i çalıştırmak için mümkün olan en az yetkiye sahip kullanıcıları kullanın.
Sorun Giderme
Kurulum ve yapılandırma sırasında bazı sorunlarla karşılaşabilirsiniz. İşte yaygın sorunlar ve çözümleri:
* Tarayıcıda “Güvenli Değil” Uyarısı veya Sertifika Hatası:
* Sertifika Süresi Dolmuş: Let’s Encrypt sertifikaları 90 gün geçerlidir. Otomatik yenilemenin çalıştığından emin olun (sudo certbot renew --dry-run).
* Yanlış Alan Adı: Sertifika, tarayıcının erişmeye çalıştığı alan adıyla eşleşmiyor olabilir (örn. www.alanadiniz.com için sertifika aldınız ama alanadiniz.com adresine erişmeye çalışıyorsunuz). Sertifikayı doğru alan adları için aldığınızdan emin olun.
* Sertifika Dosyası Yolu Yanlış: Apache veya Nginx yapılandırmanızda SSLCertificateFile/ssl_certificate ve SSLCertificateKeyFile/ssl_certificate_key yollarının doğru olduğundan emin olun.
* Zincir Sertifika Eksik: Bazı tarayıcılar, CA zincir sertifikasının (intermediate certificate) doğru şekilde sunulmasını gerektirir. fullchain.pem dosyasının hem alan adı sertifikasını hem de zincir sertifikayı içerdiğinden emin olun.
* 502 Bad Gateway veya 503 Service Unavailable Hatası:
* Tomcat Çalışmıyor: Tomcat uygulamasının çalışır durumda olduğundan emin olun (sudo systemctl status tomcat8).
* Tomcat Portu Kapalı veya Yanlış: Tomcat’in dinlediği portun (8080 veya 8009) doğru olduğundan ve güvenlik duvarı tarafından engellenmediğinden emin olun. Tomcat’e doğrudan curl http://localhost:8080 ile erişebiliyor musunuz kontrol edin.
* Apache/Nginx Proxy Ayarları Yanlış: ProxyPass/proxy_pass direktifindeki URL’nin doğru olduğundan emin olun (örn. http://localhost:8080 veya ajp://localhost:8009).
* AJP Secret Uyuşmazlığı: Eğer AJP kullanıyorsanız ve Tomcat’te secret tanımladıysanız, Apache yapılandırmasındaki ProxySet secret değerinin Tomcat’tekiyle aynı olduğundan emin olun.
* HTTP’den HTTPS’ye Yönlendirme Çalışmıyor veya Döngüye Giriyor:
* Apache/Nginx Yapılandırması: Yönlendirme kurallarının doğru olduğundan emin olun.
* Tomcat’in X-Forwarded-Proto’yu Tanıması: Tomcat’in ters proxy’den gelen X-Forwarded-Proto başlığını doğru şekilde okuduğundan emin olun. Eğer secure="true" olarak işaretlenmiş bir sayfa hala HTTP olarak algılanıyorsa, Tomcat’in server.xml dosyasındaki RemoteIpValve gibi bir valfi etkinleştirmeniz gerekebilir:
Bu valf, Tomcat’in X-Forwarded-Proto başlığını okumasını ve isteği HTTPS olarak işlemesini sağlar.
* Günlük Dosyalarını Kontrol Etme:
* Apache Logları: /var/log/apache2/error.log ve /var/log/apache2/access.log
* Nginx Logları: /var/log/nginx/error.log ve /var/log/nginx/access.log
* Tomcat Logları: /var/log/tomcat8/catalina.out veya Tomcat kurulum dizininin logs/ altındaki diğer dosyalar.
Bu log dosyaları, sorunların kök nedenini belirlemenize yardımcı olacak değerli bilgiler içerir.
Sonuç
Bu kapsamlı rehberde, Ubuntu 16.04 üzerinde çalışan bir Tomcat 8 uygulamasının bağlantılarını Apache HTTP Sunucusu veya Nginx kullanarak nasıl şifreleyeceğinizi adım adım öğrendiniz. Ters proxy mimarisinin Tomcat uygulamanız için hem güvenlik hem de performans açısından sunduğu avantajları ele aldık. Let’s Encrypt ile ücretsiz SSL/TLS sertifikası edinme, Tomcat’i ters proxy arkasında çalışacak şekilde yapılandırma ve son olarak Apache veya Nginx’i bu sertifikalarla birlikte Tomcat trafiğini şifrelemek üzere yapılandırma süreçlerini ayrıntılı bir şekilde inceledik.
Uygulamanızın güvenliğini sağlamak, sadece sertifika kurmakla bitmez. Makalede bahsedilen güvenlik ipuçları ve en iyi uygulamalar (güvenlik duvarı yapılandırması, yazılım güncellemeleri, güçlü SSL ayarları ve güvenlik başlıkları gibi) uygulamanızın genel güvenlik duruşunu önemli ölçüde güçlendirecektir. Olası sorunları gidermek için log dosyalarını düzenli olarak kontrol etmek ve yaygın hata mesajlarının ne anlama geldiğini bilmek, operasyonel süreklilik için hayati öneme sahiptir.
Güvenli bir web uygulaması, kullanıcılarınıza olan taahhüdünüzü gösterir ve markanızın itibarını artırır. Bu rehberdeki adımları takip ederek, Tomcat 8 uygulamanız için güçlü ve şifreli bağlantılar sağlayabilir, böylece kullanıcılarınızın verilerini koruyabilir ve güvenli bir dijital deneyim sunabilirsiniz. Unutmayın, güvenlik sürekli bir süreçtir ve düzenli bakım ile güncellemeler gerektirir.