Takip et

Nginx’i SSL ile Jenkins İçin Ters Proxy Olarak Yapılandırma

Nginx’i SSL ile Jenkins İçin Ters Proxy Olarak Yapılandırma Giriş Günümüzün hızla değişen yazılım geliştirme dünyasında, Sürekli

Nginx’i SSL ile Jenkins İçin Ters Proxy Olarak Yapılandırma

Giriş

Günümüzün hızla değişen yazılım geliştirme dünyasında, Sürekli Entegrasyon (CI) ve Sürekli Teslimat (CD) süreçleri, yazılım kalitesini artırmak, geliştirme döngülerini hızlandırmak ve ekiplerin daha verimli çalışmasını sağlamak için vazgeçilmez hale gelmiştir. Bu süreçlerin merkezinde yer alan araçlardan biri de Jenkins’tir. Jenkins, açık kaynaklı, güçlü ve genişletilebilir bir otomasyon sunucusudur ve yazılım projelerinin derlenmesi, test edilmesi ve dağıtılması gibi birçok görevi otomatikleştirmek için kullanılır.

Jenkins ve Sürekli Entegrasyon/Teslimat (CI/CD)

Jenkins, CI/CD boru hatlarının oluşturulmasına olanak tanıyarak geliştiricilerin kod değişikliklerini sık sık entegre etmelerini, otomatik testler çalıştırmalarını ve dağıtımları otomatikleştirmelerini sağlar. Bu, hataların erken aşamada tespit edilmesine, entegrasyon sorunlarının azaltılmasına ve nihayetinde daha hızlı ve güvenilir yazılım teslimatına yol açar. Ancak, Jenkins sunucusunun doğrudan internete açık bir şekilde çalıştırılması güvenlik ve performans açısından ideal değildir. İşte bu noktada Nginx devreye girer.

Nginx’in Rolü

Nginx, yüksek performanslı, açık kaynaklı bir web sunucusu ve ters proxy sunucusudur. Yüksek trafikli web sitelerini ve uygulamalarını yönetme yeteneğiyle bilinir. Jenkins gibi bir uygulama sunucusunun önüne Nginx’i bir ters proxy olarak konumlandırmak, uygulamanın güvenliğini, performansını ve yönetilebilirliğini önemli ölçüde artırır. Bu makalede, Nginx’i SSL (Secure Sockets Layer) ile Jenkins için bir ters proxy olarak nasıl yapılandıracağımızı adım adım inceleyeceğiz. Bu sayede Jenkins kurulumunuz daha güvenli, daha performanslı ve profesyonel bir yapıya kavuşacaktır.

Neden Nginx Ters Proxy ve SSL Kullanmalıyız?

Jenkins’i Nginx arkasında bir ters proxy olarak çalıştırmak ve iletişimi SSL ile şifrelemek, birçok önemli avantaj sunar. Bu avantajlar, uygulamanızın güvenliğini, performansını ve genel yönetimini iyileştirmeye yardımcı olur.

Güvenlik

Jenkins genellikle hassas kod depolarına erişim sağlar ve dağıtım süreçlerini yönetir. Bu nedenle güvenliği son derece önemlidir. SSL (HTTPS) kullanmak, istemci ile sunucu arasındaki tüm iletişimi şifreleyerek veri hırsızlığını ve kurcalamayı engeller. Nginx’i ters proxy olarak kullanmak ise Jenkins sunucusunu doğrudan internete açmaktan korur, potansiyel saldırı yüzeyini azaltır. Nginx, güvenlik duvarı gibi davranarak kötü niyetli istekleri filtreleyebilir, DDoS saldırılarına karşı bir kalkan görevi görebilir ve çeşitli güvenlik politikalarını uygulayabilir.

Performans ve Yük Dengeleme

Nginx, statik içeriklerin (CSS, JavaScript, resimler vb.) sunulmasında oldukça etkilidir. Jenkins’in dinamik içeriği işlerken, Nginx statik dosyaları önbelleğe alarak ve doğrudan sunarak Jenkins sunucusunun yükünü hafifletebilir. Bu, özellikle yüksek trafikli ortamlarda Jenkins’in daha hızlı yanıt vermesini sağlar. Ayrıca, eğer gelecekte Jenkins kurulumunuzu ölçeklendirmeniz gerekirse, Nginx birden fazla Jenkins örneği arasında yük dengelemesi yaparak trafiği dağıtabilir ve hizmetin sürekli erişilebilirliğini sağlayabilir.

Tek Bir Giriş Noktası

Nginx, farklı portlarda veya farklı sunucularda çalışan birden fazla uygulamayı tek bir alan adı veya IP adresi üzerinden sunmanıza olanak tanır. Örneğin, jenkins.alanadiniz.com adresinden Jenkins’e, blog.alanadiniz.com adresinden bir bloga erişebilirsiniz. Bu, kullanıcılar için daha basit bir erişim noktası sağlar ve sunucu altyapınızın karmaşıklığını gizler.

Kolay Yönetim

Nginx’in yapılandırma dosyaları oldukça esnek ve okunabilirdir. SSL sertifikalarının yönetimi, HTTP’den HTTPS’ye yönlendirme, güvenlik başlıklarının eklenmesi gibi birçok yapılandırma Nginx üzerinde kolayca gerçekleştirilebilir. Bu, Jenkins’in kendi iç web sunucusunun (Jetty) doğrudan yapılandırmasına göre genellikle daha esnek ve güçlü bir kontrol sağlar.

Önkoşullar

Bu kılavuzu takip etmeden önce aşağıdaki önkoşulların yerine getirildiğinden emin olmalısınız:

Sunucu Gereksinimleri

  • Minimum 2GB RAM’e sahip bir Linux sunucusu (Ubuntu 20.04 veya 22.04 LTS önerilir).
  • Root veya sudo yetkilerine sahip bir kullanıcı hesabı.

Domain Adı

  • Jenkins kurulumunuza erişmek için kullanacağınız bir alan adı (örneğin, jenkins.alanadiniz.com). Bu alan adının DNS kayıtlarının sunucunuzun IP adresine işaret ettiğinden emin olun. A kaydı veya CNAME kaydı oluşturmanız gerekecektir.

Portlar

  • Sunucunuzun güvenlik duvarında (UFW, iptables vb.) aşağıdaki portların açık olduğundan emin olun:
    • 80 (HTTP – SSL sertifikası edinmek ve otomatik yönlendirme için)
    • 443 (HTTPS – Güvenli Jenkins erişimi için)
    • 8080 (Jenkins’in varsayılan çalışma portu – sadece sunucu içinde erişilebilir olmalı)

Adım 1: Sunucu Hazırlığı ve Güncelleme

Herhangi bir yazılım kurulumuna başlamadan önce sunucunuzun güncel olduğundan ve gerekli temel paketlerin yüklü olduğundan emin olmak iyi bir uygulamadır.

Sistem Güncellemesi

Sunucunuzdaki paket listelerini güncelleyin ve yüklü paketleri en son sürümlerine yükseltin:

sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

Gerekli Paketlerin Kurulumu

Bazı temel araçlar ve kütüphaneler için gerekli paketleri yükleyelim:

sudo apt install -y curl wget gnupg2 apt-transport-https ca-certificates software-properties-common

Adım 2: Jenkins Kurulumu

Jenkins’i kurmak için öncelikle Java Development Kit’i (JDK) yüklememiz gerekmektedir, çünkü Jenkins bir Java uygulamasıdır.

Java Kurulumu

Jenkins’in çoğu sürümü OpenJDK 11 veya 17 ile uyumludur. Bu kılavuz için OpenJDK 17’yi kullanacağız:

sudo apt install -y openjdk-17-jdk

Java sürümünü kontrol ederek kurulumu doğrulayın:

java -version

Jenkins Deposu Ekleme

Jenkins’in resmi deposunu sisteminize ekleyerek en güncel sürümünü yükleyebiliriz. İlk olarak, Jenkins GPG anahtarını içe aktarın:

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null

Ardından, Jenkins deposunu kaynak listenize ekleyin:

echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null

Jenkins Kurulumu ve Başlatma

Depoyu ekledikten sonra, paket listesini tekrar güncelleyin ve Jenkins’i kurun:

sudo apt update
sudo apt install -y jenkins

Kurulum tamamlandıktan sonra Jenkins servisini başlatın ve sistem başlangıcında otomatik olarak başlamasını sağlayın:

sudo systemctl start jenkins
sudo systemctl enable jenkins

Jenkins’in durumunu kontrol ederek çalıştığından emin olun:

sudo systemctl status jenkins

Varsayılan olarak Jenkins 8080 portunda çalışır. Güvenlik duvarınızda bu portun açık olduğundan emin olun (sadece sunucu içinden Nginx erişimi için, dışarıya değil):

sudo ufw allow 8080/tcp

Bu kuralı daha sonra Nginx yapılandırması tamamlandığında sadece localhost’tan erişime izin verecek şekilde daraltabiliriz.

Jenkins İlk Kurulumu

Web tarayıcınızdan sunucunuzun IP adresi ve 8080 portu üzerinden Jenkins’e erişin (örneğin, http://sunucu_ip_adresiniz:8080). Karşınıza Jenkins’in kilidini açmanız gereken bir sayfa gelecektir. Yönetici şifresini bulmak için aşağıdaki komutu kullanın:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Bu şifreyi kopyalayıp Jenkins web arayüzündeki ilgili alana yapıştırın. Ardından, “Install suggested plugins” seçeneğini seçerek önerilen eklentileri yükleyin. Eklentiler yüklendikten sonra bir yönetici kullanıcı oluşturmanız istenecektir. Gerekli bilgileri doldurun ve Jenkins kurulumunu tamamlayın.

Adım 3: Nginx Kurulumu

Jenkins’in önüne geçecek olan Nginx web sunucusunu şimdi kurabiliriz.

Nginx Kurulumu

Nginx’i Ubuntu depolarından yükleyebiliriz:

sudo apt install -y nginx

Nginx Servisini Başlatma ve Etkinleştirme

Kurulumdan sonra Nginx servisini başlatın ve sistem başlangıcında otomatik olarak başlamasını sağlayın:

sudo systemctl start nginx
sudo systemctl enable nginx

Nginx’in durumunu kontrol edin:

sudo systemctl status nginx

Güvenlik Duvarı Ayarları

Nginx’in HTTP (80) ve HTTPS (443) portlarından dışarıdan erişilebilir olması gerekmektedir. UFW (Uncomplicated Firewall) kullanıyorsanız, Nginx için profilleri etkinleştirin:

sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'
sudo ufw reload

Şu anda, Nginx’in varsayılan sayfasını tarayıcınızdan sunucunuzun IP adresine giderek görmelisiniz. Bu, Nginx’in doğru şekilde çalıştığını gösterir.

Adım 4: SSL Sertifikası Edinme (Let’s Encrypt ile)

Web sitemizin güvenli bir bağlantı üzerinden çalışması için bir SSL sertifikasına ihtiyacımız var. Let’s Encrypt, ücretsiz ve otomatik SSL sertifikaları sağlayan popüler bir servistir. Certbot aracı ile bu sertifikaları kolayca edinebiliriz.

Certbot Kurulumu

Certbot’u Nginx eklentisi ile birlikte yükleyelim:

sudo apt install -y certbot python3-certbot-nginx

SSL Sertifikası Alma

Certbot’u çalıştırarak alan adınız için SSL sertifikası alabilirsiniz. Bu adımda Certbot, Nginx yapılandırmanızı otomatik olarak algılayacak ve güncelleyecektir. Henüz Jenkins için bir Nginx yapılandırma dosyası oluşturmadığımız için, Certbot’un varsayılan Nginx yapılandırmasını kullanarak sertifika almasını sağlayacağız. Ardından, bu sertifikayı kendi Jenkins yapılandırmamızda kullanacağız.

Öncelikle, Nginx’in varsayılan yapılandırma dosyasında (/etc/nginx/sites-available/default) sunucu adınızın (server_name) doğru şekilde ayarlandığından emin olun. Eğer ayarlı değilse, geçici olarak ekleyin:

# /etc/nginx/sites-available/default dosyasını açın ve server_name satırını bulun

Eğer yoksa, server bloğunun içine ekleyin:

server_name jenkins.alanadiniz.com;

Bu geçici ayarı yaptıktan sonra Nginx’i yeniden başlatın:

sudo systemctl restart nginx

Şimdi Certbot’u çalıştırın:

sudo certbot --nginx -d jenkins.alanadiniz.com

jenkins.alanadiniz.com kısmını kendi alan adınızla değiştirin. Certbot size e-posta adresi, hizmet şartlarını kabul etme ve HTTP trafiğini HTTPS’e yönlendirme gibi birkaç soru soracaktır. HTTP trafiğini HTTPS’e yönlendirme seçeneğini (genellikle 2) seçmeniz önerilir. Başarılı bir kurulumdan sonra sertifikalarınız /etc/letsencrypt/live/jenkins.alanadiniz.com/ dizininde bulunacaktır.

Otomatik Yenileme

Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, bu sertifikaları otomatik olarak yenilemek için bir cron job veya systemd timer ayarlar. Yenileme işlemini test edebilirsiniz:

sudo certbot renew --dry-run

Herhangi bir hata mesajı almazsanız, otomatik yenileme düzgün çalışıyor demektir.

Adım 5: Nginx’i Ters Proxy Olarak Yapılandırma

Şimdi Nginx’i Jenkins için bir ters proxy olarak yapılandırma zamanı. Bu, gelen istekleri Nginx’in dinleyeceği ve ardından bunları Jenkins sunucusuna ileteceği anlamına gelir.

Nginx Yapılandırma Dosyası Oluşturma

Yeni bir Nginx yapılandırma dosyası oluşturalım. Örneğin, /etc/nginx/sites-available/jenkins:

sudo nano /etc/nginx/sites-available/jenkins

Dosyanın içeriği aşağıdaki gibi olmalıdır. Kendi alan adınızı (jenkins.alanadiniz.com) ve SSL sertifikası yollarını (Certbot’un oluşturduğu) güncellemeyi unutmayın.

server {
    listen 80;
    listen [::]:80;
    server_name jenkins.alanadiniz.com;

    # HTTP'den HTTPS'ye yönlendirme
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name jenkins.alanadiniz.com;

    ssl_certificate /etc/letsencrypt/live/jenkins.alanadiniz.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jenkins.alanadiniz.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    ssl_protocols TLSv1.2 TLSv1.3;
    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_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer-when-downgrade";

    # Proxy ayarları
    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_redirect http:// https://;

        # Jenkins'in WebSocket bağlantıları için gerekli ayarlar
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 90s;

        # Önbellekleme ayarları (isteğe bağlı, statik içerikler için)
        # expires 1d;
        # add_header Cache-Control "public, no-transform";
    }
}

Yukarıdaki yapılandırma, HTTP isteklerini otomatik olarak HTTPS’e yönlendirir, SSL sertifikalarını kullanır ve gelen tüm istekleri yerel Jenkins sunucusuna (8080 portu) iletir. Ayrıca, Jenkins’in WebSocket bağlantıları için gerekli olan Upgrade ve Connection başlıklarını da içerir. Güvenlik için bazı HTTP başlıkları da eklenmiştir.

Yapılandırmayı Test Etme ve Uygulama

Yeni yapılandırma dosyasını etkinleştirmek için bir sembolik bağ (symlink) oluşturalım ve Nginx’in varsayılan yapılandırmasını devre dışı bırakalım:

sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default

Nginx yapılandırmasının sözdizimini kontrol edin:

sudo nginx -t

Eğer “test is successful” mesajını görürseniz, Nginx servisini yeniden başlatarak değişiklikleri uygulayın:

sudo systemctl restart nginx

Artık tarayıcınızdan https://jenkins.alanadiniz.com adresine giderek Jenkins’e güvenli bir şekilde erişebilmelisiniz.

Adım 6: Jenkins Yapılandırması

Nginx ters proxy olarak ayarlandıktan sonra, Jenkins’in de bu yeni erişim URL’sini bilmesi gerekir. Aksi takdirde, Jenkins web arayüzünde bazı bağlantılar hatalı görünebilir veya yönlendirmeler düzgün çalışmayabilir.

Jenkins Sistem Ayarları

Jenkins web arayüzüne giriş yapın ve sol menüden “Manage Jenkins” -> “System” yolunu izleyin.

Aşağı kaydırarak “Jenkins URL” veya “Jenkins Location” alanını bulun. Bu alanı https://jenkins.alanadiniz.com olarak güncelleyin. Bu ayar, Jenkins’in kendine ait URL’leri doğru bir şekilde oluşturmasını sağlar.

Değişiklikleri kaydetmek için sayfanın altındaki “Save” veya “Apply” düğmesine tıklayın.

Güvenlik Ayarları

Jenkins’in kendi iç web sunucusunun (Jetty) sadece localhost üzerinden erişilebilir olmasını sağlamak, ek bir güvenlik katmanı sağlar. Bu, doğrudan 8080 portuna erişimi kısıtlayarak sadece Nginx’in Jenkins ile iletişim kurmasına izin verir.

Jenkins’in başlatma yapılandırma dosyasını düzenlemeniz gerekecektir. Ubuntu’da bu genellikle /etc/default/jenkins veya /etc/sysconfig/jenkins (Red Hat tabanlı sistemler için) dosyasındadır.

sudo nano /etc/default/jenkins

Bu dosya içinde JENKINS_ARGS satırını bulun ve --httpListenAddress=127.0.0.1 parametresini ekleyin veya mevcut parametreleri güncelleyin:

# Örnek:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=8080"

Şuna dönüştürün:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=8080 --httpListenAddress=127.0.0.1"

Değişiklikleri kaydettikten sonra Jenkins servisini yeniden başlatın:

sudo systemctl restart jenkins

Bu değişiklikten sonra, http://sunucu_ip_adresiniz:8080 adresinden Jenkins’e doğrudan erişmeye çalıştığınızda erişimin engellendiğini görmelisiniz. Artık Jenkins’e sadece Nginx üzerinden, yani https://jenkins.alanadiniz.com adresinden erişilebilir.

Ayrıca, güvenlik duvarınızda daha önce açtığınız 8080 portu kuralını sadece localhost’tan erişime izin verecek şekilde daraltmak isteyebilirsiniz:

sudo ufw delete allow 8080/tcp # Mevcut kuralı sil
sudo ufw allow in on lo to any port 8080 # Sadece localhost'tan 8080'e izin ver
sudo ufw reload

Bu, sunucunun dışından 8080 portuna erişimi tamamen kapatır ve sadece Nginx’in (sunucu içinde çalıştığı için) Jenkins ile iletişim kurmasını sağlar.

Adım 7: Güvenlik İyileştirmeleri ve Ek Yapılandırmalar

Jenkins kurulumunuzu daha güvenli ve performanslı hale getirmek için Nginx üzerinde ek iyileştirmeler yapabiliriz.

HTTP/2 Etkinleştirme

HTTP/2, web performansını artırmak için tasarlanmış yeni nesil bir protokoldür. Nginx yapılandırmamızda zaten http2 anahtar kelimesini eklemiştik (listen 443 ssl http2;). Bu, HTTP/2’nin otomatik olarak etkinleştirildiği anlamına gelir. Tarayıcınızın geliştirici araçlarından veya çevrimiçi araçlarla sitenizin HTTP/2 üzerinden sunulup sunulmadığını kontrol edebilirsiniz.

Güvenlik Başlıkları Ekleme

Nginx yapılandırmasına ekleyebileceğiniz bazı güvenlik başlıkları, web uygulamanızın çeşitli saldırılara karşı direncini artırır. Bu başlıkları Nginx server bloğunuzdaki location / bloğunun dışına ekleyebilirsiniz (zaten bazılarını eklemiştik, şimdi daha fazlasını ekleyelim veya mevcutları gözden geçirelim):

server {
    # ... diğer ayarlar ...

    add_header X-Frame-Options "DENY";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer-when-downgrade";
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # Content Security Policy (CSP) - Dikkatli kullanılmalı, uygulamanızın ihtiyaçlarına göre ayarlanmalı
    # add_header Content-Security-Policy "default-src 'self' jenkins.alanadiniz.com; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';";

    location / {
        # ... proxy ayarları ...
    }
}
  • X-Frame-Options "DENY": Clickjacking saldırılarını önler.
  • X-Content-Type-Options "nosniff": Tarayıcıların MIME türlerini tahmin etmesini engeller, potansiyel güvenlik açıklarını azaltır.
  • X-XSS-Protection "1; mode=block": Tarayıcıların XSS saldırılarını algılamasına ve engellemesine yardımcı olur.
  • Referrer-Policy "no-referrer-when-downgrade": Yönlendiren bilgilerinin güvenli olmayan bağlantılarda gönderilmesini engeller.
  • Strict-Transport-Security "max-age=31536000; includeSubDomains" always; (HSTS): Tarayıcılara sitenize her zaman HTTPS üzerinden bağlanmalarını söyler, man-in-the-middle saldırılarına karşı koruma sağlar.
  • Content-Security-Policy (CSP): Bu başlık oldukça güçlüdür ancak yanlış yapılandırıldığında uygulamanızı bozabilir. Hangi kaynaklardan komut dosyası, stil, resim vb. yükleyebileceğinizi tanımlar. Jenkins’in kullandığı tüm kaynakları doğru bir şekilde listelemeniz gerekir. Bu başlığı eklemeden önce dikkatlice test etmeniz önerilir.

Sıkıştırma (Gzip)

Nginx, giden verileri sıkıştırarak bant genişliği kullanımını azaltabilir ve yükleme sürelerini hızlandırabilir. Gzip sıkıştırmasını etkinleştirmek için nginx.conf dosyasını (genellikle /etc/nginx/nginx.conf) düzenleyin:

sudo nano /etc/nginx/nginx.conf

http { ... } bloğunun içine aşağıdaki satırları ekleyin veya mevcut olanları güncelleyin:

http {
    # ... diğer http ayarları ...

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

Değişiklikleri kaydettikten sonra Nginx’i yeniden başlatın:

sudo systemctl restart nginx

Rate Limiting

DDoS saldırılarına veya aşırı istek göndermeye çalışan kötü niyetli kullanıcılara karşı korunmak için Nginx üzerinde hız sınırlaması (rate limiting) uygulayabilirsiniz. Bu, Nginx’in http bloğuna eklenir:

http {
    # ... diğer http ayarları ...

    limit_req_zone $binary_remote_addr zone=jenkins_limit:10m rate=10r/s; # 10MB bellek, IP başına saniyede 10 istek

    server {
        # ... diğer server ayarları ...

        location / {
            limit_req zone=jenkins_limit burst=20 nodelay; # 20 isteklik bir patlamaya izin ver, gecikme yok
            # ... proxy ayarları ...
        }
    }
}

Bu örnek, her IP adresinden saniyede 10 isteğe izin verir ve 20 isteğe kadar kısa süreli patlamalara izin verir. Aşırı istekler 503 hatasıyla reddedilecektir. Kendi ihtiyaçlarınıza göre bu değerleri ayarlamalısınız.

Kullanıcı Kimlik Doğrulama (Nginx tarafında)

Eğer Jenkins’e erişimi daha da kısıtlamak isterseniz, Nginx üzerinde temel HTTP kimlik doğrulaması (Basic Auth) ekleyebilirsiniz. Bu, Jenkins’in kendi kimlik doğrulamasından önce bir katman daha ekler.

İlk olarak, bir parola dosyası oluşturun:

sudo apt install -y apache2-utils # htpasswd aracını yüklemek için
sudo htpasswd -c /etc/nginx/.htpasswd jenkinsadmin # jenkinsadmin yerine istediğiniz kullanıcı adını yazın

Şifrenizi girmeniz istenecek. Ardından, Nginx yapılandırma dosyanızdaki location / bloğuna aşağıdaki satırları ekleyin:

location / {
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    # ... diğer proxy ayarları ...
}

Nginx’i yeniden başlatın. Artık Jenkins’e erişmeye çalıştığınızda, önce Nginx’in kimlik doğrulama penceresiyle karşılaşacaksınız.

Sorun Giderme

Kurulum veya yapılandırma sırasında karşılaşabileceğiniz yaygın sorunlar ve çözümleri aşağıdadır.

Nginx Hataları

  • Nginx başlatılamıyor veya yapılandırma hatası:
    • sudo nginx -t komutunu çalıştırarak yapılandırma dosyanızdaki sözdizimi hatalarını kontrol edin.
    • sudo systemctl status nginx komutuyla Nginx servisinin durumunu kontrol edin ve hata mesajlarını inceleyin.
    • Nginx log dosyalarını kontrol edin: /var/log/nginx/error.log.
  • 502 Bad Gateway hatası: Bu genellikle Nginx’in Jenkins’e bağlanamadığı anlamına gelir.
    • Jenkins servisinin çalıştığından emin olun: sudo systemctl status jenkins.
    • Jenkins’in 8080 portunda dinlediğinden emin olun: sudo ss -tulpn | grep 8080.
    • Nginx yapılandırmanızdaki proxy_pass http://127.0.0.1:8080; adresinin doğru olduğundan emin olun.
    • Güvenlik duvarınızın (UFW) Jenkins’in 8080 portuna localhost’tan erişimi engellemediğinden emin olun.

Jenkins Hataları

  • Jenkins web arayüzünde bozuk bağlantılar veya yönlendirme sorunları:
    • Jenkins Sistem Ayarları’ndaki “Jenkins URL” değerinin https://jenkins.alanadiniz.com olarak doğru ayarlandığından emin olun.
    • Nginx yapılandırmanızdaki proxy_redirect http:// https://; satırının mevcut olduğundan emin olun.
  • Jenkins’e doğrudan 8080 portundan hala erişilebiliyor:
    • /etc/default/jenkins dosyasındaki JENKINS_ARGS içinde --httpListenAddress=127.0.0.1 parametresinin doğru şekilde eklendiğinden ve Jenkins servisinin yeniden başlatıldığından emin olun.
    • Güvenlik duvarı (UFW) kurallarınızın 8080 portuna dışarıdan erişimi engellediğinden emin olun.

SSL Hataları

  • Tarayıcıda “Güvenli Değil” uyarısı veya SSL sertifikası hatası:
    • Alan adınızın DNS kayıtlarının sunucunuzun IP adresine doğru şekilde işaret ettiğinden emin olun.
    • Certbot ile sertifikayı doğru alan adı için aldığınızdan emin olun.
    • Nginx yapılandırmanızdaki ssl_certificate ve ssl_certificate_key yollarının doğru olduğundan emin olun.
    • sudo certbot renew --dry-run komutuyla sertifikanın hala geçerli olduğunu kontrol edin.

Log Dosyalarını Kontrol Etme

Sorun giderme sürecinde en önemli araçlardan biri log dosyalarıdır:

  • Nginx Erişim Logları: /var/log/nginx/access.log
  • Nginx Hata Logları: /var/log/nginx/error.log
  • Jenkins Logları: /var/log/jenkins/jenkins.log

Bu dosyaları tail -f komutuyla canlı olarak izleyerek sorunları daha hızlı tespit edebilirsiniz.

Sonuç

Bu makalede, Nginx’i SSL ile Jenkins için bir ters proxy olarak nasıl yapılandıracağımızı ayrıntılı bir şekilde ele aldık. Adım adım sunucu hazırlığından başlayarak, Jenkins ve Nginx kurulumlarını gerçekleştirdik, Let’s Encrypt ile ücretsiz SSL sertifikası edindik ve Nginx’i Jenkins’e gelen trafiği güvenli bir şekilde yönlendirecek şekilde yapılandırdık. Ayrıca, Jenkins’in kendi iç ayarlarını güncelleyerek ve Nginx üzerinde ek güvenlik ve performans iyileştirmeleri yaparak kurulumumuzu daha sağlam hale getirdik.

Özet

Bu yapılandırma ile Jenkins kurulumunuz artık:

  • Güvenli: Tüm iletişim HTTPS üzerinden şifrelenir ve Jenkins sunucusu doğrudan internete maruz kalmaz.
  • Performanslı: Nginx’in yüksek performanslı yapısı sayesinde statik içerikler daha hızlı sunulur ve sunucu yükü azalır.
  • Yönetilebilir: SSL sertifikası yönetimi ve diğer web sunucusu ayarları Nginx üzerinden merkezi olarak kontrol edilebilir.
  • Profesyonel: Bir alan adı ve HTTPS üzerinden erişim, uygulamanıza daha profesyonel bir görünüm kazandırır.

Bu entegrasyon, CI/CD süreçlerinizin temelini oluşturan Jenkins ortamınızın güvenliğini ve verimliliğini artırmak için kritik bir adımdır. Uygulamanızın ölçeklenebilirliği ve sürdürülebilirliği açısından da önemli faydalar sağlar.

Gelecek Adımlar

Kurulumunuzu daha da geliştirmek için aşağıdaki adımları düşünebilirsiniz:

  • Yedekleme Stratejisi: Jenkins yapılandırmalarını ve iş verilerini düzenli olarak yedeklemek için bir strateji oluşturun.
  • İzleme ve Uyarılar: Jenkins ve Nginx sunucularınızın performansını ve durumunu izlemek için Prometheus, Grafana gibi araçları entegre edin.
  • Kimlik Doğrulama Entegrasyonu: Jenkins’i LDAP, Active Directory veya OAuth gibi merkezi bir kimlik doğrulama sistemiyle entegre edin.
  • Otomasyon: Bu kurulum adımlarını Ansible, Chef veya Puppet gibi bir yapılandırma yönetim aracıyla otomatikleştirmeyi düşünün.
  • Gelişmiş Nginx Ayarları: Gelişmiş önbellekleme, DDoS koruması için daha sıkı rate limiting kuralları veya coğrafi engelleme gibi Nginx özelliklerini keşfedin.

Bu kılavuz, Jenkins ve Nginx ile güvenli ve performanslı bir ters proxy kurulumu için sağlam bir temel sağlamaktadır. Kendi özel ihtiyaçlarınıza ve güvenlik gereksinimlerinize göre yapılandırmayı daha da özelleştirebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.