Nginx Sunucunuzu Fail2Ban ile Ubuntu 22.04 Üzerinde Nasıl Korursunuz?
Nginx, günümüzün en popüler ve güçlü açık kaynaklı web sunucularından biridir. Yüksek performans, ölçeklenebilirlik ve esneklik sunarak milyonlarca web sitesine, web uygulamasına ve API’ye güç vermektedir. Ters proxy, yük dengeleyici ve HTTP önbelleği olarak da kullanılabilen Nginx, modern web altyapılarının vazgeçilmez bir bileşenidir. Ancak, internete açık her sunucu gibi Nginx de çeşitli siber tehditlere maruz kalır. Brute-force saldırıları, hizmet reddi (DoS) denemeleri, zafiyet taramaları ve botnet faaliyetleri gibi kötü niyetli girişimler, sunucunuzun performansını düşürebilir, hizmet kesintilerine yol açabilir ve hatta hassas verilerin ele geçirilmesine neden olabilir.
Bu makalede, Ubuntu 22.04 işletim sistemi üzerinde çalışan Nginx sunucunuzu, otomatik bir izinsiz giriş önleme çerçevesi olan Fail2Ban ile nasıl koruyacağınızı adım adım inceleyeceğiz. Fail2Ban, sunucu log dosyalarını sürekli olarak izleyerek kötü niyetli aktiviteleri tespit eder ve belirli bir sayıda başarısız denemenin ardından saldırgan IP adreslerini otomatik olarak engeller. Bu sayede, sunucunuzun güvenliğini artırırken, manuel müdahale ihtiyacını minimize etmiş olursunuz. Nginx’in çeşitli log dosyalarını kullanarak, farklı saldırı türlerine karşı nasıl koruma sağlayacağımızı detaylı bir şekilde ele alacağız.
Nginx ve Web Sunucusu Güvenliğinin Önemi
Nginx, modern web altyapılarının temel taşlarından biridir. Yüksek trafikli sitelerden mikroservis mimarilerine kadar geniş bir yelpazede kullanılır. Bu kadar kritik bir rol üstlenmesi, onun güvenliğinin de en üst düzeyde tutulmasını zorunlu kılar. Bir Nginx sunucusunun karşılaşabileceği başlıca tehditler şunlardır:
* Brute-Force Saldırıları: Özellikle HTTP kimlik doğrulama veya admin paneli gibi giriş noktalarını hedef alan, şifre deneme yanılma saldırılarıdır. Saldırganlar, binlerce farklı kullanıcı adı ve şifre kombinasyonunu deneyerek sisteme sızmaya çalışır.
* Hizmet Reddi (DoS/DDoS) Saldırıları: Sunucuyu aşırı isteklerle boğarak meşgul etmeyi ve yasal kullanıcıların hizmetlere erişimini engellemeyi amaçlar. Bu saldırılar, sunucunun kaynaklarını tüketerek hizmet kesintisine yol açar.
* Zafiyet Taramaları ve Keşif Faaliyetleri: Saldırganlar, sunucunuzdaki potansiyel zafiyetleri (örneğin, eski yazılım sürümleri, açık portlar, yanlış yapılandırmalar) tespit etmek için otomatik araçlar kullanır. Bu taramalar genellikle sisteme sızma girişimlerinin ilk adımıdır.
* Web Uygulama Saldırıları: Nginx bir ters proxy olarak kullanıldığında, arkasındaki web uygulamalarını hedef alan SQL Enjeksiyonu, XSS (Cross-Site Scripting) gibi saldırılara karşı birincil savunma hattı olabilir.
Bu tehditler, sadece hizmet kesintisine değil, aynı zamanda veri ihlallerine, itibar kaybına ve finansal zararlara da yol açabilir. Bu nedenle, Nginx sunucularını proaktif güvenlik önlemleriyle korumak hayati önem taşır. Fail2Ban, bu önlemlerin başında gelir ve otomatik bir savunma katmanı sunar.
Fail2Ban’e Yakından Bakış
Fail2Ban, Linux tabanlı sistemlerde çalışan, otomatik bir izinsiz giriş önleme yazılımıdır. Temel amacı, sunucu log dosyalarını (SSH, Apache, Nginx, Postfix vb.) sürekli olarak tarayarak kötü niyetli aktiviteleri tespit etmek ve bu aktiviteleri gerçekleştiren IP adreslerini geçici veya kalıcı olarak engellemektir.
Çalışma Prensibi:
Fail2Ban, belirli bir hizmetin log dosyalarını (örneğin, Nginx’in access.log veya error.log dosyaları) düzenli aralıklarla okur. Bu loglarda önceden tanımlanmış “filtreler” ile eşleşen desenler arar. Bir IP adresinden gelen denemeler belirli bir zaman dilimi içinde (örneğin, 10 dakika içinde 5 başarısız giriş denemesi) eşiği aşarsa, Fail2Ban bu IP adresini bir güvenlik duvarı (genellikle iptables) kuralı ekleyerek engeller. Engelleme süresi sona erdiğinde, IP adresi otomatik olarak serbest bırakılır.
Temel Bileşenler:
* Jail (Hapishane): Belirli bir hizmeti (örneğin, nginx-http-auth, nginx-dos, ssh) korumak için kullanılan yapılandırma birimidir. Her jail, hangi log dosyasının izleneceğini, hangi filtrenin kullanılacağını, engelleme süresini (bantime), deneme süresi penceresini (findtime) ve maksimum deneme sayısını (maxretry) tanımlar.
* Filter (Filtre): Log dosyalarındaki kötü niyetli aktivite kalıplarını tanımlayan düzenli ifadeler (regex) içerir. Örneğin, “yanlış şifre” veya “401 Unauthorized” gibi mesajları arar. Filtreler /etc/fail2ban/filter.d/ dizininde bulunur.
* Action (Eylem): Bir IP adresi engellendiğinde veya engeli kaldırıldığında gerçekleştirilecek eylemleri tanımlar. Varsayılan eylem, iptables kullanarak IP’yi engellemektir, ancak e-posta bildirimi gönderme gibi başka eylemler de tanımlanabilir. Eylemler /etc/fail2ban/action.d/ dizininde bulunur.
Avantajları:
* Otomatik Koruma: Kötü niyetli IP’leri otomatik olarak tespit eder ve engeller, manuel müdahale gerektirmez.
* Hafif ve Verimli: Kaynak tüketimi düşüktür ve sunucu performansını olumsuz etkilemez.
* Esnek Yapılandırma: Farklı hizmetler için özelleştirilebilir filtreler ve eylemler tanımlanabilir.
* Geniş Kapsam: SSH, web sunucuları, e-posta sunucuları gibi birçok farklı hizmeti koruyabilir.
Ön Gereksinimler
Fail2Ban’ı Nginx ile entegre etmeden önce aşağıdaki ön gereksinimlerin karşılandığından emin olun:
* Ubuntu 22.04 Sunucusu: Makaledeki adımlar Ubuntu 22.04 LTS sürümü için geçerlidir.
* Nginx Kurulumu: Nginx web sunucusunun sunucunuza kurulu ve çalışır durumda olması gerekmektedir. Nginx’i kurmak için:
sudo apt update
sudo apt install nginx
sudo systemctl enable nginx
sudo systemctl start nginx
* Sudo Yetkilerine Sahip Kullanıcı: Komutları çalıştırmak için sudo yetkilerine sahip bir kullanıcı hesabınız olmalıdır.
* SSH Erişimi: Sunucuya uzaktan erişim için SSH bağlantınızın olması gereklidir.
Fail2Ban Kurulumu
Fail2Ban’ı Ubuntu 22.04 sunucunuza kurmak oldukça basittir. İlk olarak sistem paket listesini güncelleyin ve ardından Fail2Ban paketini yükleyin:
1. Sistem Paketlerini Güncelleme:
sudo apt update
sudo apt upgrade -y
2. Fail2Ban Paketini Kurma:
sudo apt install fail2ban -y
3. Fail2Ban Servisinin Durumunu Kontrol Etme:
Kurulum tamamlandıktan sonra, Fail2Ban servisinin çalışır durumda olduğunu doğrulayın:
sudo systemctl status fail2ban
Çıktıda active (running) ifadesini görmelisiniz. Eğer çalışmıyorsa, aşağıdaki komutla başlatabilirsiniz:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Fail2Ban Yapılandırması: Temel Ayarlar
Fail2Ban’ın yapılandırma dosyaları /etc/fail2ban/ dizininde bulunur. Ana yapılandırma dosyası jail.conf‘tur. Ancak, bu dosyayı doğrudan düzenlemek yerine, jail.local adında bir kopya oluşturarak değişiklikleri bu dosyada yapmanız önerilir. Bunun nedeni, jail.conf dosyasının Fail2Ban güncellemeleri sırasında üzerine yazılabilmesidir. jail.local dosyası ise jail.conf dosyasındaki ayarları geçersiz kılar ve güncellemelerden etkilenmez.
1. jail.local Dosyasını Oluşturma:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2. jail.local Dosyasını Düzenleme:
Şimdi jail.local dosyasını bir metin düzenleyici ile açın:
sudo nano /etc/fail2ban/jail.local
Bu dosyanın başında [DEFAULT] bölümü bulunur. Bu bölümde, tüm jail’ler için geçerli olacak genel ayarları yapılandırabilirsiniz.
* ignoreip: Engellenmeyecek IP adreslerini veya IP aralıklarını (CIDR formatında) belirtir. Kendi IP adresinizi veya güvenilir sunucuların IP’lerini buraya eklemek, yanlışlıkla kendinizi engellemenizi önler. Birden fazla IP adresi boşlukla ayrılır.
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42
* bantime: Bir IP adresinin engelli kalacağı süreyi saniye cinsinden belirtir. Varsayılan olarak 10 dakika (600 saniye) olarak ayarlanmıştır. Daha uzun bir süre için (örneğin, 1 saat) 3600 saniye yapabilirsiniz. -1 değeri, IP adresinin kalıcı olarak engelleneceği anlamına gelir.
bantime = 3600
* findtime: Belirtilen maxretry sayısına ulaşmak için IP adresinin ne kadar süre içinde deneme yapması gerektiğini saniye cinsinden belirtir. Varsayılan olarak 10 dakika (600 saniye) olarak ayarlanmıştır.
findtime = 600
* maxretry: Bir IP adresinin findtime süresi içinde kaç başarısız denemeden sonra engelleneceğini belirtir. Varsayılan olarak 5 olarak ayarlanmıştır.
maxretry = 5
* destemail: Engelleme eylemi tetiklendiğinde bildirim gönderilecek e-posta adresini belirtir.
destemail = admin@example.com
* action: Engelleme eylemi için varsayılan olarak hangi betiğin kullanılacağını belirtir. %(action_mw)s e-posta ile bildirim gönderir, %(action_mwl)s e-posta ile logları da gönderir.
action = %(action_mwl)s
Örnek [DEFAULT] yapılandırması:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # Kendi IP adresinizi ekleyin
bantime = 3600
findtime = 600
maxretry = 5
destemail = your_email@example.com
sendername = Fail2Ban
mta = sendmail
action = %(action_mwl)s
Değişiklikleri kaydedip dosyayı kapatın (CTRL+O, Enter, CTRL+X).
Nginx İçin Fail2Ban Filtreleri ve Jail’leri Oluşturma
Nginx için Fail2Ban yapılandırması, Nginx’in ürettiği log dosyalarını izleyerek belirli desenleri yakalamaya dayanır. Nginx genellikle iki ana log dosyası kullanır:
* /var/log/nginx/access.log: Tüm gelen HTTP isteklerini kaydeder.
* /var/log/nginx/error.log: Nginx sunucusunun karşılaştığı hataları kaydeder.
Bu iki log dosyası, farklı türdeki saldırıları tespit etmek için kullanılabilir.
Nginx HTTP Kimlik Doğrulama Koruması (Brute-Force)
Eğer Nginx ile htpasswd kullanarak bir dizin veya alan için HTTP temel kimlik doğrulaması (auth_basic) kullanıyorsanız, brute-force saldırılarına karşı koruma sağlamak önemlidir. Fail2Ban’ın varsayılan olarak nginx-http-auth filtresi bulunur.
1. nginx-http-auth Filtresi:
Bu filtre genellikle /etc/fail2ban/filter.d/nginx-http-auth.conf yolunda bulunur ve aşağıdaki gibi bir içeriğe sahiptir:
# Fail2Ban filter for nginx http authentication
[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+" client: , server: \S+, request: "\S+ \S+ HTTP/\d\.\d", host: "\S+"$
^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: "\S+ \S+ HTTP/\d\.\d", host: "\S+"$
^ \[error\] \d+#\d+: \*\d+ client: , server: \S+, request: "\S+ \S+ HTTP/\d\.\d", host: "\S+" upstream: "basic:/\S+", user: "\S+", reason: "password mismatch"$
^ \[error\] \d+#\d+: \*\d+ user "\S+" was not found in "\S+", client: , server: \S+, request: "\S+ \S+ HTTP/\d\.\d", host: "\S+"$
ignoreregex =
Bu filtre, Nginx’in error.log dosyasında HTTP kimlik doğrulama hatalarını (yanlış kullanıcı adı/şifre, kimlik bilgisi sağlanmaması vb.) arar.
2. jail.local‘a Jail Ekleme:
jail.local dosyasını açın ve dosyanın sonuna aşağıdaki bölümü ekleyin:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
* enabled = true: Bu jail’i etkinleştirir.
* port = http,https: Bu jail’in uygulandığı portları belirtir.
* filter = nginx-http-auth: Kullanılacak filtrenin adını belirtir.
* logpath = /var/log/nginx/error.log: İzlenecek log dosyasının yolunu belirtir. HTTP kimlik doğrulama hataları error.log‘a yazılır.
* maxretry ve bantime değerlerini isterseniz [DEFAULT] bölümündekilerden farklı olarak burada da belirleyebilirsiniz.
Nginx DoS/DDoS ve Zafiyet Tarama Koruması
Nginx’e yönelik DoS denemeleri, zafiyet taramaları veya sürekli olarak bulunmayan sayfalara erişim denemeleri gibi kötü niyetli aktiviteler genellikle access.log veya error.log dosyalarında 4xx (Client Error) hata kodları üretir. Bu tür aktiviteleri yakalamak için özel bir filtre oluşturabiliriz.
1. Özel nginx-dos Filtresi Oluşturma:
Yeni bir filtre dosyası oluşturun:
sudo nano /etc/fail2ban/filter.d/nginx-dos.conf
Dosyanın içine aşağıdaki içeriği yapıştırın:
[Definition]
# Catches various Nginx bad requests, 4xx errors indicating attacks or bad bots.
# This filter monitors both access.log and error.log for suspicious patterns.
failregex = ^ -."(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \S HTTP/\d\.\d" (400|401|403|404|405|408|413|414|429|444|499) .*$
^\[error\].client: . (400|401|403|404|405|408|413|414|429|444|499).*$
^\[error\].client: . (request body no buffer|request line too large|client prematurely closed connection).*$
^\[error\].client: . (access forbidden by rule|directory index of "\S+" is forbidden).*$
ignoreregex =
* İlk failregex satırı: access.log‘da belirli HTTP metodları ile gelen ve 4xx hata kodu (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed, 408 Request Timeout, 413 Request Entity Too Large, 414 URI Too Long, 429 Too Many Requests, 444 No Response, 499 Client Closed Request) döndüren istekleri yakalar. Özellikle 404 taramaları ve 429 (oran sınırlaması) bu regex ile yakalanabilir.
* İkinci failregex satırı: error.log‘da 4xx hata kodlarını içeren genel hataları yakalar.
* Üçüncü failregex satırı: error.log‘da “request body no buffer”, “request line too large” veya “client prematurely closed connection” gibi Nginx’in kötü biçimlendirilmiş veya aşırı büyük isteklerle karşılaştığını gösteren hataları yakalar. Bunlar genellikle DoS veya zafiyet taramalarının belirtisidir.
* Dördüncü failregex satırı: error.log‘da dizin listeleme veya özel kurallarla erişimin yasaklandığı durumları yakalar, bu da zafiyet taraması veya yetkisiz erişim denemesi olabilir.
Dosyayı kaydedip kapatın.
2. jail.local‘a nginx-dos Jail’i Ekleme:
jail.local dosyasını açın ve dosyanın sonuna aşağıdaki bölümü ekleyin:
[nginx-dos]
enabled = true
port = http,https
filter = nginx-dos
logpath = /var/log/nginx/access.log /var/log/nginx/error.log
maxretry = 10
findtime = 120
bantime = 86400 # 24 saat engelleme
* logpath: Bu jail, hem access.log hem de error.log dosyalarını izleyecektir.
* maxretry = 10: 120 saniye (2 dakika) içinde 10 başarısız deneme.
* bantime = 86400: Bu tür saldırılar genellikle daha ciddi olduğundan, engelleme süresini 24 saate çıkarabiliriz.
Nginx Rate Limiting ve Fail2Ban Entegrasyonu
Nginx’in yerleşik oran sınırlama (limit_req_zone) özelliği, sunucunuzu DoS saldırılarına karşı korumak için çok güçlü bir araçtır. Bu özellik, belirli bir IP adresinden gelen istek sayısını sınırlar ve eşik aşıldığında 429 (Too Many Requests) hata kodu döndürür. Fail2Ban’ı, Nginx’in bu 429 hatalarını yakalaması ve bu istekleri gönderen IP adreslerini engellemesi için yapılandırabiliriz.
1. Nginx’te Oran Sınırlama Yapılandırması:
Nginx yapılandırma dosyanızda (/etc/nginx/nginx.conf veya sitenizin yapılandırma dosyasında /etc/nginx/sites-available/default gibi) http bloğunun içine aşağıdaki satırları ekleyin:
http {
# ... diğer ayarlar ...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s; # 10MB bellek, IP başına saniyede 5 istek
server {
# ... diğer ayarlar ...
location / {
limit_req zone=mylimit burst=10 nodelay; # 10 isteğe kadar patlamaya izin ver, gecikme yapma
# ...
}
}
}
Bu yapılandırma, her benzersiz IP adresinden saniyede 5 isteğe izin verir. Eğer bir IP adresi bu oranı aşarsa, Nginx 429 hatası döndürür. Nginx yapılandırmasını yeniden yüklemeyi unutmayın:
sudo nginx -t
sudo systemctl reload nginx
2. Özel nginx-limit-req Filtresi Oluşturma:
Bu 429 hatalarını yakalamak için yeni bir Fail2Ban filtresi oluşturun:
sudo nano /etc/fail2ban/filter.d/nginx-limit-req.conf
Dosyanın içine aşağıdaki içeriği yapıştırın:
[Definition]
# Fail2Ban filter for Nginx 429 (Too Many Requests) errors
failregex = ^ -."(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \S HTTP/\d\.\d" 429 .*$
ignoreregex =
Bu filtre, access.log dosyasında 429 hata kodu ile biten tüm Nginx isteklerini yakalar.
3. jail.local‘a nginx-limit-req Jail’i Ekleme:
jail.local dosyasını açın ve dosyanın sonuna aşağıdaki bölümü ekleyin:
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 1800 # 30 dakika engelleme
Bu jail, Nginx’in oran sınırlamasını tetikleyen IP’leri yakalayarak, Nginx’in kendisi tarafından geçici olarak engellenmelerine ek olarak Fail2Ban tarafından da engellenmelerini sağlar.
Tüm bu değişiklikleri yaptıktan sonra, Fail2Ban servisini yeniden başlatmanız gerekir:
sudo systemctl restart fail2ban
Fail2Ban Filtre ve Jail Testi
Yaptığınız filtrelerin ve jail’lerin doğru çalıştığından emin olmak için fail2ban-regex aracını kullanabilirsiniz. Bu araç, belirli bir log dosyasında filtrenizin regex desenini test etmenizi sağlar.
Örneğin, nginx-dos filtrenizi test etmek için:
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-dos.conf
Veya nginx-limit-req filtresini test etmek için:
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-limit-req.conf
Bu komutlar, belirtilen log dosyasında filtrenizin kaç tane eşleşme bulduğunu gösterir. Test için gerçek log dosyaları yerine, sahte log girişleri içeren bir metin dosyası da oluşturabilirsiniz:
echo '192.168.1.100 - - [10/Oct/2023:12:00:00 +0000] "GET /nonexistent HTTP/1.1" 404 153 "-" "Mozilla/5.0"' | sudo tee -a /tmp/test_nginx.log
echo '192.168.1.101 - - [10/Oct/2023:12:00:01 +0000] "GET /admin/login HTTP/1.1" 401 153 "-" "Mozilla/5.0"' | sudo tee -a /tmp/test_nginx.log
echo '192.168.1.102 - - [10/Oct/2023:12:00:02 +0000] "GET /api/data HTTP/1.1" 429 153 "-" "Mozilla/5.0"' | sudo tee -a /tmp/test_nginx.log
Ardından bu sahte log dosyasını test edebilirsiniz:
sudo fail2ban-regex /tmp/test_nginx.log /etc/fail2ban/filter.d/nginx-dos.conf
sudo fail2ban-regex /tmp/test_nginx.log /etc/fail2ban/filter.d/nginx-limit-req.conf
Çıktı, filtrenizin kaç IP adresini ve kaç başarısız denemeyi yakaladığını göstermelidir.
Fail2Ban Yönetimi
Fail2Ban servisini yönetmek için systemctl ve fail2ban-client komutlarını kullanabilirsiniz.
* Fail2Ban Servisini Yeniden Başlatma:
Yapılandırma değişikliklerinden sonra servisi yeniden başlatmak zorunludur.
sudo systemctl restart fail2ban
* Fail2Ban Servisinin Durumunu Kontrol Etme:
sudo systemctl status fail2ban
* Tüm Aktif Jail’lerin Durumunu Görüntüleme:
sudo fail2ban-client status
Bu komut, hangi jail’lerin etkin olduğunu ve her bir jail tarafından kaç IP adresinin engellendiğini gösterir.
* Belirli Bir Jail’in Durumunu Görüntüleme:
Örneğin, nginx-dos jail’inin durumunu görmek için:
sudo fail2ban-client status nginx-dos
Bu komut, o jail tarafından engellenen IP adreslerinin listesini gösterir.
* Bir IP Adresinin Engelini Kaldırma:
Yanlışlıkla engellenen bir IP adresinin engelini kaldırmak için:
sudo fail2ban-client unban
Örneğin:
sudo fail2ban-client unban 203.0.113.42
Bu komut, IP adresini tüm jail’lerden kaldırır. Belirli bir jail’den kaldırmak için:
sudo fail2ban-client set unbanip
Örneğin:
sudo fail2ban-client set nginx-dos unbanip 203.0.113.42
* Bir IP Adresini Manuel Olarak Engelleme:
Belirli bir IP adresini manuel olarak engellemek için:
sudo fail2ban-client set banip
Nginx ve Genel Sunucu Güvenliği İçin Ek İpuçları
Fail2Ban, Nginx sunucunuzu otomatik saldırılara karşı korumak için mükemmel bir araç olsa da, kapsamlı bir güvenlik stratejisinin yalnızca bir parçasıdır. Ek güvenlik önlemleri alarak sunucunuzun genel güvenliğini daha da artırabilirsiniz:
* Nginx Yapılandırma Güvenliği:
* TLS/SSL Kullanımı: Tüm hassas iletişimleri şifrelemek için HTTPS kullanın. Let’s Encrypt gibi hizmetlerle ücretsiz sertifikalar alabilirsiniz.
* Güvenlik Başlıkları: HTTP Strict Transport Security (HSTS), Content Security Policy (CSP), X-Content-Type-Options, X-Frame-Options gibi güvenlik başlıklarını uygulayın.
* Gereksiz Modülleri Devre Dışı Bırakma: Kullanmadığınız Nginx modüllerini devre dışı bırakın.
* Sunucu Bilgisini Gizleme: Nginx sürüm numarasını HTTP yanıt başlıklarından (server_tokens off;) gizleyin.
* Dizin Listelemeyi Kapatma: autoindex off; direktifi ile dizin listelemeyi engelleyin.
* En Düşük Ayrıcalık Prensibi: Nginx’i www-data gibi ayrıcalıksız bir kullanıcı ile çalıştırın.
* Güvenlik Duvarı (UFW) Kullanımı:
Ubuntu’nun yerleşik güvenlik duvarı olan UFW (Uncomplicated Firewall) ile sunucunuza gelen ve giden trafiği kontrol edin. Yalnızca gerekli portları (örneğin, 22 SSH, 80 HTTP, 443 HTTPS) açın.
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 80 ve 443 portlarını açar
sudo ufw enable
* SSH Güvenliği:
* Anahtar Tabanlı Kimlik Doğrulama: Şifre yerine SSH anahtarları kullanarak güvenliği artırın.
* Varsayılan Portu Değiştirme: SSH varsayılan portu olan 22’yi başka bir porta değiştirin.
* Root Girişini Devre Dışı Bırakma: PermitRootLogin no ayarı ile root kullanıcısının doğrudan SSH ile giriş yapmasını engelleyin.
* Fail2Ban SSH Jail: Fail2Ban’ın varsayılan sshd jail’ini etkinleştirerek SSH brute-force saldırılarına karşı koruma sağlayın. jail.local dosyasında [sshd] bölümünü enabled = true olarak ayarlayın.
* Düzenli Güncellemeler:
İşletim sistemi ve tüm yazılımları (Nginx, Fail2Ban vb.) düzenli olarak güncelleyerek bilinen zafiyetlere karşı korunun.
sudo apt update && sudo apt upgrade -y
* Log İzleme ve SIEM Çözümleri:
Fail2Ban loglarını (/var/log/fail2ban.log) ve Nginx loglarını düzenli olarak inceleyin. Daha büyük altyapılar için, logları merkezi bir SIEM (Security Information and Event Management) çözümüne göndermek, güvenlik olaylarını daha etkin bir şekilde izlemenizi ve analiz etmenizi sağlar.
* Web Uygulama Güvenlik Duvarı (WAF):
ModSecurity gibi bir WAF çözümü, Nginx’in önüne geçerek web uygulaması katmanındaki SQL enjeksiyonu, XSS gibi saldırıları tespit edip engelleyebilir. Fail2Ban, ağ katmanındaki saldırıları engellerken, WAF uygulama katmanındaki tehditlere odaklanır.
Sorun Giderme
Fail2Ban’ın düzgün çalışmadığını düşünüyorsanız, aşağıdaki adımları izleyebilirsiniz:
* Fail2Ban Loglarını Kontrol Etme:
Fail2Ban’ın kendi log dosyası /var/log/fail2ban.log‘u inceleyerek hataları veya engelleme olaylarını kontrol edin.
sudo tail -f /var/log/fail2ban.log
* Filtrelerin Doğru Çalıştığını Doğrulama:
fail2ban-regex aracını kullanarak filtrelerinizin log dosyalarınızdaki desenleri doğru bir şekilde eşleştirdiğinden emin olun.
* Jail’lerin Etkin Olup Olmadığını Kontrol Etme:
sudo fail2ban-client status komutu ile tüm jail’lerin etkin olduğunu ve doğru log dosyalarını izlediğini doğrulayın.
* Nginx Log Dosyalarını Kontrol Etme:
Nginx’in log dosyalarının (/var/log/nginx/access.log, /var/log/nginx/error.log) doğru izinlere sahip olduğundan ve Fail2Ban kullanıcısının bu dosyalara erişebildiğinden emin olun.
* IPTables Kurallarını Kontrol Etme:
Engellenen IP’lerin güvenlik duvarı kurallarına doğru bir şekilde eklendiğini kontrol edin:
sudo iptables -L -n
Fail2Ban, f2b- önekine sahip zincirler oluşturur.
Sonuç
Nginx sunucunuzu Fail2Ban ile korumak, siber saldırılara karşı ilk ve en önemli savunma hatlarından birini oluşturur. Bu makalede, Fail2Ban’ı Ubuntu 22.04 üzerine kurmayı, temel ayarlarını yapılandırmayı ve Nginx’in HTTP kimlik doğrulama, DoS/DDoS denemeleri ve oran sınırlama hataları gibi çeşitli saldırı türlerine karşı nasıl koruma sağlayacağınızı adım adım öğrendiniz. Özel filtreler oluşturarak ve Nginx’in log dosyalarını etkin bir şekilde kullanarak, sunucunuzun güvenliğini önemli ölçüde artırabilirsiniz.
Ancak, unutulmamalıdır ki güvenlik sürekli bir süreçtir. Fail2Ban güçlü bir araç olsa da, tek başına yeterli değildir. Nginx yapılandırma güvenliği, UFW gibi bir güvenlik duvarı, SSH güvenliği, düzenli güncellemeler ve log izleme gibi ek önlemlerle birleştirildiğinde, sunucunuz çok daha sağlam bir güvenlik duruşuna sahip olacaktır. Bu adımları uygulayarak, Nginx tabanlı web hizmetlerinizin kesintisiz ve güvenli bir şekilde çalışmasını sağlayabilirsiniz.