Apache Sunucusunu Ubuntu 14.04 Üzerinde Fail2Ban ile Koruma
Giriş
Günümüzün dijital dünyasında, sunucu güvenliği herhangi bir çevrimiçi varlık için hayati öneme sahiptir. Özellikle Apache gibi yaygın olarak kullanılan web sunucuları, sürekli olarak kötü niyetli saldırıların hedefi haline gelmektedir. Brute-force saldırıları, DDoS girişimleri ve çeşitli web tabanlı güvenlik açıkları, sunucuların performansını düşürebilir, hizmet kesintilerine neden olabilir ve hatta hassas verilerin ele geçirilmesine yol açabilir. Bu tür tehditlere karşı proaktif bir savunma mekanizması oluşturmak, sistem yöneticilerinin başlıca sorumluluklarından biridir.
Bu teknik makale, Ubuntu 14.04 işletim sistemi üzerinde çalışan bir Apache web sunucusunu, popüler bir saldırı önleme aracı olan Fail2Ban ile nasıl koruyacağınızı ayrıntılı bir şekilde açıklamaktadır. Ubuntu 14.04, uzun süreli destek (LTS) sağlayan bir sürüm olmasına rağmen, güvenlik güncellemeleri açısından güncel sürümler kadar aktif olmayabilir. Bu nedenle, Fail2Ban gibi ek güvenlik katmanları bu tür sistemler için daha da kritik hale gelmektedir. Fail2Ban, sunucu log dosyalarını izleyerek belirli sayıda başarısız oturum açma veya şüpheli aktivite denemesi yapan IP adreslerini otomatik olarak yasaklayarak sunucunuzu korur.
Bu rehberde, Fail2Ban’ın temel kurulumundan başlayarak, Apache ile entegrasyonu için gerekli yapılandırmaları, özel filtreler oluşturmayı, eylem mekanizmalarını ve sisteminizi nasıl izleyeceğinizi adım adım ele alacağız. Amacımız, sunucunuzun güvenliğini artırırken, hizmetlerinizi kesintisiz bir şekilde sunmaya devam etmenizi sağlayacak kapsamlı bir çözüm sunmaktır.
Neden Fail2Ban ve Neden Apache İçin?
Siber saldırılar, genellikle otomatik botlar ve script’ler aracılığıyla gerçekleştirilir. Bu botlar, zayıf parolaları denemek, bilinen güvenlik açıklarını taramak veya kaynakları tüketmek amacıyla sürekli olarak sunuculara istek gönderirler. Fail2Ban, bu tür otomatik saldırılara karşı oldukça etkili bir savunma mekanizması sunar.
Brute-Force Saldırıları ve DDoS
Brute-Force Saldırıları: Özellikle SSH, FTP veya web uygulamalarının giriş panelleri gibi kimlik doğrulama gerektiren hizmetlerde, saldırganlar binlerce farklı kullanıcı adı ve parola kombinasyonunu deneyerek sisteme sızmaya çalışır. Fail2Ban, belirli bir zaman dilimi içinde çok sayıda başarısız oturum açma denemesi yapan IP adreslerini tespit ederek bunları geçici veya kalıcı olarak yasaklar.
DDoS (Dağıtık Hizmet Engelleme) Girişimleri: Tam teşekküllü bir DDoS koruma çözümü olmasa da, Fail2Ban belirli türdeki düşük seviyeli DDoS saldırılarına karşı bir miktar koruma sağlayabilir. Özellikle tek bir IP adresinden veya sınırlı sayıda IP adresinden gelen yoğun ve tekrarlayan istekleri engelleyerek, sunucunun aşırı yüklenmesini bir ölçüde önleyebilir.
Fail2Ban’ın Çalışma Prensibi
Fail2Ban, sunucunuzdaki çeşitli hizmetlerin (Apache, SSH, Postfix vb.) log dosyalarını gerçek zamanlı olarak tarar. Önceden tanımlanmış “filtreler” (regular expressions – regex) kullanarak, bu loglarda kötü niyetli aktivite gösteren desenleri arar. Bir IP adresi, belirli bir zaman dilimi içinde (findtime) belirli bir eşiği (maxretry) aşan sayıda kötü niyetli aktivite gösterdiğinde, Fail2Ban bu IP adresini yasaklar. Yasaklama süresi (bantime) sona erdiğinde, IP adresi otomatik olarak yasaklı listesinden çıkarılır.
Apache’nin Zafiyetleri
Apache web sunucusu, dünya genelinde en çok kullanılan web sunucularından biridir ve bu popülaritesi nedeniyle sıkça saldırıların hedefi olur. Apache’ye yönelik yaygın saldırı türleri şunlardır:
- Kimlik Doğrulama Saldırıları: Apache’nin
.htaccessdosyaları aracılığıyla uygulanan temel veya özet kimlik doğrulama mekanizmaları, brute-force saldırılarına karşı savunmasız olabilir. - Web Uygulama Zafiyetleri: Apache üzerinde çalışan PHP, Python gibi dillerde yazılmış web uygulamalarındaki SQL Enjeksiyonu, XSS (Cross-Site Scripting) gibi zafiyetler, Fail2Ban’ın doğrudan hedefi olmasa da, bu tür saldırıların deneme girişimleri Apache loglarında iz bırakabilir ve Fail2Ban tarafından algılanabilir.
- Dizin Taraması ve Bilgi Sızdırma: Saldırganlar, sunucudaki dizin yapılarını veya hassas dosyaları bulmak için otomatik tarayıcılar kullanabilir. Bu tür taramalar genellikle HTTP 404 (Bulunamadı) veya diğer hata kodlarıyla sonuçlanır ve Apache loglarında kayıt altına alınır. Fail2Ban, bu tür tekrarlayan tarama girişimlerini tespit edebilir.
- Bot ve Crawler Saldırıları: Kötü niyetli botlar, sitenizin kaynaklarını tüketmek, zayıf noktaları aramak veya istenmeyen içerik göndermek için sürekli isteklerde bulunabilir. Fail2Ban, belirli “User-Agent” başlıklarını veya aşırı istek oranlarını filtreleyerek bu botları engelleyebilir.
Fail2Ban, bu tür senaryolarda Apache loglarını analiz ederek, sunucunuzu bu tehditlere karşı koruyan ilk savunma hatlarından birini oluşturur. Bu, özellikle Apache’nin kendi yerleşik saldırı önleme mekanizmalarının sınırlı olduğu durumlarda hayati önem taşır.
Ubuntu 14.04 Üzerine Fail2Ban Kurulumu
Fail2Ban’ı Ubuntu 14.04 sisteminize kurmak oldukça basittir. Aşağıdaki adımları takip ederek kurulumu gerçekleştirebilirsiniz.
Sistem Güncellemesi
Kuruluma başlamadan önce, sisteminizin paket listelerini güncellemek ve mevcut paketleri yükseltmek iyi bir uygulamadır. Bu, herhangi bir uyumluluk sorununu önlemeye yardımcı olur.
sudo apt-get update
sudo apt-get upgrade
Kurulum Komutları
Paketler güncellendikten sonra, Fail2Ban’ı yüklemek için aşağıdaki komutu kullanın:
sudo apt-get install fail2ban
Kurulum sırasında, Fail2Ban gerekli bağımlılıkları otomatik olarak kuracaktır. Kurulum tamamlandığında, Fail2Ban servisi genellikle otomatik olarak başlar.
Kurulum Sonrası Kontrol
Fail2Ban servisinin düzgün bir şekilde çalıştığından emin olmak için aşağıdaki komutu kullanabilirsiniz:
sudo service fail2ban status
Çıktıda “fail2ban is running” veya benzeri bir mesaj görmelisiniz. Ayrıca, Fail2Ban’ın genel durumunu görmek için aşağıdaki istemci komutunu da kullanabilirsiniz:
sudo fail2ban-client status
Bu komut, aktif olan “jail” (Fail2Ban’da koruma altına alınan servisler) listesini gösterecektir. Varsayılan olarak, SSH servisi için bir jail etkin olabilir.
Fail2Ban Temel Yapılandırması
Fail2Ban’ın yapılandırma dosyaları /etc/fail2ban/ dizininde bulunur. En önemli dosya jail.conf‘tur. Ancak, bu dosyayı doğrudan düzenlemek yerine, jail.local adında yeni bir dosya oluşturarak varsayılan ayarları geçersiz kılmak en iyi uygulamadır. Bu, Fail2Ban güncellendiğinde yapılandırma değişikliklerinizin kaybolmamasını sağlar.
jail.conf ve jail.local Farkı
jail.conf: Fail2Ban’ın varsayılan yapılandırma dosyasıdır. Paket güncellemeleri sırasında bu dosya üzerine yazılabilir.jail.local: Bu dosya,jail.conf‘taki ayarları geçersiz kılmak için kullanılır. Fail2Ban, öncejail.conf‘u okur, ardındanjail.local‘ı okur ve burada tanımlanan ayarları öncelikli kabul eder. Bu, güncellemelerden etkilenmeden kendi özel ayarlarınızı korumanızı sağlar.
jail.local Dosyasını Oluşturma
jail.local dosyasını oluşturmak için, jail.conf dosyasının bir kopyasını alıp adını değiştirebilir veya boş bir dosya oluşturup temel ayarları ekleyebilirsiniz. Genellikle, sadece değiştirmek istediğiniz ayarları içeren bir jail.local dosyası oluşturmak yeterlidir.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Şimdi jail.local dosyasını bir metin düzenleyici ile açın:
sudo nano /etc/fail2ban/jail.local
Varsayılan Ayarlar (bantime, findtime, maxretry)
jail.local dosyasında, [DEFAULT] bölümünün altında Fail2Ban’ın genel davranışını etkileyen birkaç önemli parametre bulunur:
bantime: Bir IP adresinin yasaklı kalacağı süreyi saniye cinsinden belirtir. Varsayılan genellikle 600 saniye (10 dakika) veya daha fazladır. Daha uzun yasaklama süreleri, ısrarcı saldırganları caydırmak için etkili olabilir, ancak yanlışlıkla yasaklanan meşru kullanıcılar için sorun yaratabilir.findtime: Bir IP adresinin yasaklanması için gerekli olan başarısız deneme sayısının (maxretry) gerçekleştiği zaman dilimini saniye cinsinden belirtir. Varsayılan genellikle 600 saniyedir.maxretry: Bir IP adresinin yasaklanmadan önce yapabileceği maksimum başarısız deneme sayısıdır. Varsayılan genellikle 5’tir.
Örnek [DEFAULT] yapılandırması:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 1h
findtime = 10m
maxretry = 5
banaction = iptables-multiport
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
bantime = 1h(1 saat)findtime = 10m(10 dakika)maxretry = 5(5 deneme)
Bu ayarlar, 10 dakika içinde 5 başarısız deneme yapan bir IP adresinin 1 saat boyunca yasaklanacağı anlamına gelir.
IP Beyaz Listesi (ignoreip)
Kendi IP adresinizi veya güvenilir sunucuların IP adreslerini yanlışlıkla yasaklanmaktan korumak için ignoreip parametresini kullanmalısınız. Bu, özellikle sunucunuza SSH üzerinden sıkça erişiyorsanız veya belirli otomasyon araçları kullanıyorsanız önemlidir.
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42
Yukarıdaki örnekte, yerel döngü IP’leri, bir yerel ağ (CIDR formatında) ve belirli bir tek IP adresi beyaz listeye alınmıştır. Kendi statik IP adresinizi buraya eklediğinizden emin olun.
Değişiklikleri kaydettikten sonra Fail2Ban servisini yeniden başlatmayı unutmayın:
sudo service fail2ban restart
Apache Koruması İçin Fail2Ban Yapılandırması
Fail2Ban, Apache sunucusunu korumak için bir dizi önceden tanımlanmış “jail” ile birlikte gelir. Bu jail’ler, Apache’nin farklı log dosyalarını ve farklı saldırı türlerini hedef alır. Bu bölümde, Apache için Fail2Ban’ı nasıl yapılandıracağınızı ve hangi jail’leri etkinleştirebileceğinizi ele alacağız.
Apache Jails’i Etkinleştirme
/etc/fail2ban/jail.local dosyasını açın ve Apache ile ilgili bölümleri bulun. Genellikle, bu bölümler # Apache yorum satırı altında gruplandırılmıştır. Bir jail’i etkinleştirmek için, ilgili bölümün altındaki enabled parametresini true olarak ayarlamanız yeterlidir.
apache-auth Jail’i
Bu jail, Apache’nin temel veya özet kimlik doğrulama mekanizmalarına yönelik brute-force saldırılarını hedefler. Genellikle /var/log/apache2/error.log dosyasını izler ve “Authentication failure” (Kimlik doğrulama hatası) gibi desenleri arar.
[apache-auth]
enabled = true
port = http,https
logpath = %(apache_error_log)s
Not: %(apache_error_log)s değişkeni, fail2ban.conf veya jail.conf içinde tanımlanmış olan Apache hata logunun varsayılan yolunu kullanır. Ubuntu 14.04 için bu genellikle /var/log/apache2/error.log‘dur.
apache-badbots Jail’i
Bu jail, kötü niyetli botları ve tarayıcıları hedefler. Genellikle bilinen kötü bot “User-Agent” başlıklarını veya aşırı tarama davranışlarını arar. Bu jail, genellikle Apache erişim loglarını (access.log) izler.
[apache-badbots]
enabled = true
port = http,https
logpath = %(apache_access_log)s
maxretry = 2
bantime = 48h
Burada maxretry ve bantime değerlerini kendi ihtiyaçlarınıza göre ayarlayabilirsiniz. Kötü botlar için daha uzun yasaklama süreleri mantıklı olabilir.
apache-noscript Jail’i
Bu jail, sunucuda var olmayan veya yürütülmemesi gereken script’leri (örneğin, .php, .asp dosyalarını) çalıştırmaya çalışan istekleri tespit eder. Bu tür istekler genellikle güvenlik açıklarını tarayan veya kötü amaçlı kod yüklemeye çalışan saldırganlardan gelir.
[apache-noscript]
enabled = true
port = http,https
logpath = %(apache_error_log)s
maxretry = 3
apache-overflows Jail’i
Bu jail, Apache’nin tampon taşması (buffer overflow) veya benzeri istismar denemelerini tespit etmeye çalışır. Çok uzun veya şüpheli URL istekleri gibi desenleri arar.
[apache-overflows]
enabled = true
port = http,https
logpath = %(apache_error_log)s
maxretry = 2
apache-nohome Jail’i (Eğer Uygulanabilirse)
Bazı Apache yapılandırmalarında, kullanıcıların ana dizinlerine erişim denemeleri için ayrı bir jail bulunabilir. Eğer bu tür bir yapılandırmanız varsa, bu jail’i de etkinleştirebilirsiniz. Bu, genellikle /var/log/apache2/error.log dosyasını izler.
[apache-nohome]
enabled = true
port = http,https
logpath = %(apache_error_log)s
Log Yolu Ayarları (logpath)
Varsayılan logpath değerleri genellikle Ubuntu için doğrudur. Ancak, özel bir Apache yapılandırmanız varsa ve log dosyalarınız farklı bir konumdaysa, logpath parametresini ilgili jail içinde manuel olarak ayarlamanız gerekebilir:
logpath = /var/log/apache2/my_custom_access.log
Tüm değişiklikleri jail.local dosyasına kaydettikten sonra, Fail2Ban servisini yeniden başlatmayı unutmayın:
sudo service fail2ban restart
Yeniden başlattıktan sonra, fail2ban-client status komutu ile yeni etkinleştirdiğiniz Apache jail’lerinin listede göründüğünü kontrol edebilirsiniz.
Fail2Ban Jail Dosyalarını Anlama
Fail2Ban’ın gücü, esnek yapılandırma yeteneklerinde yatar. Bu esnekliği sağlayan temel unsurlar, jail.conf (veya jail.local) dosyasındaki [DEFAULT] ve [JAIL_ADI] bölümleridir. Bu bölümler, Fail2Ban’ın nasıl davranacağını ve hangi hizmetleri nasıl koruyacağını tanımlar.
[DEFAULT] Bölümü
Bu bölüm, tüm jail’ler için geçerli olan genel ayarları içerir. Eğer belirli bir jail’de özel bir ayar tanımlanmazsa, [DEFAULT] bölümündeki değer kullanılır. Daha önce bahsedilen ignoreip, bantime, findtime, maxretry gibi parametreler burada tanımlanır. Ayrıca, yasaklama eylemi (banaction), e-posta bildirimleri için ayarlar (destemail, sendername, mta) da genellikle bu bölümde bulunur.
Önemli [DEFAULT] parametreleri:
ignoreip: Beyaz listeye alınacak IP adresleri veya IP aralıkları.bantime: Yasaklama süresi (saniye, dakika veya saat cinsinden).findtime: Deneme süresi (saniye, dakika veya saat cinsinden).maxretry: Yasaklama öncesi maksimum deneme sayısı.destemail: Yasaklama bildirimi gönderilecek e-posta adresi.sendername: E-posta göndericisinin adı.mta: E-posta göndermek için kullanılacak posta aktarım aracısı (örneğin,sendmail,postfix).action: Yasaklama işlemi için kullanılacak varsayılan eylem. Genellikle%(action_)sveya%(action_mwl)sgibi önceden tanımlanmış eylem setleri kullanılır.
[JAIL_ADI] Bölümleri
Her bir [JAIL_ADI] bölümü, belirli bir hizmeti (örneğin, [ssh], [apache-auth]) korumak için özel kurallar tanımlar. Bu bölümde tanımlanan parametreler, [DEFAULT] bölümündeki aynı isimli parametreleri geçersiz kılar ve yalnızca o jail için geçerli olur.
Bir jail bölümünde bulunabilecek temel parametreler:
enabled = true/false: Bu jail’in etkin olup olmadığını belirler.trueolarak ayarlandığında Fail2Ban bu jail’i izlemeye başlar.port: Korumalı hizmetin dinlediği port veya portlar. Birden fazla port için virgülle ayrılmış liste kullanılabilir (örneğin,http,httpsveya22).filter: Bu jail için kullanılacak filtre dosyasının adıdır (uzantısız). Filtre dosyaları/etc/fail2ban/filter.d/dizininde bulunur. Örneğin,filter = apache-authise, Fail2Ban/etc/fail2ban/filter.d/apache-auth.confdosyasını kullanır. Bu dosya, loglarda hangi desenlerin aranacağını tanımlayan regex kurallarını içerir.logpath: Bu jail tarafından izlenecek log dosyasının tam yoludur. Birden fazla log dosyası için yeni satırlarda veya boşlukla ayrılmış liste kullanılabilir.maxretry: Bu jail için özel olarak ayarlanmış maksimum deneme sayısı.findtime: Bu jail için özel olarak ayarlanmış deneme süresi.bantime: Bu jail için özel olarak ayarlanmış yasaklama süresi.action: Bu jail için özel olarak ayarlanmış yasaklama eylemi. Varsayılan eylemi geçersiz kılmak için kullanılabilir.
Örnek [apache-auth] jail’i:
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 6
bantime = 1h
Bu örnekte, apache-auth jail’i etkinleştirilmiş, HTTP ve HTTPS portlarını hedeflemiş, apache-auth.conf filtresini kullanmış, Apache hata logunu izlemiş ve varsayılan maxretry (5) ve bantime (10m) değerlerini geçersiz kılarak kendi özel değerlerini (6 deneme, 1 saat yasaklama) kullanmıştır.
Fail2Ban’ın nasıl çalıştığını anlamak için bu yapılandırma dosyalarını ve filtreleri incelemek, özel ihtiyaçlarınıza göre ayarlamalar yapmanıza olanak tanır.
Apache Log Dosyalarını Anlama
Fail2Ban’ın Apache’yi korumak için düzgün çalışabilmesi için, Apache’nin log dosyalarını ve bunların içeriklerini anlamak kritik öneme sahiptir. Fail2Ban, bu loglardaki belirli desenleri arayarak kötü niyetli aktiviteleri tespit eder.
access.log
Apache’nin access.log dosyası, sunucuya gelen her başarılı veya başarısız isteği kaydeder. Bu log, kimin, ne zaman, hangi sayfaya, hangi tarayıcıyla ve hangi sonuçla eriştiği gibi bilgileri içerir. Varsayılan konumu genellikle /var/log/apache2/access.log‘dur.
Örnek access.log girdisi (varsayılan “common” veya “combined” formatında):
192.168.1.10 - - [24/Oct/2023:10:30:00 +0300] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
203.0.113.50 - - [24/Oct/2023:10:30:05 +0300] "GET /admin/login.php HTTP/1.1" 404 456 "-" "BadBot/1.0"
203.0.113.51 - - [24/Oct/2023:10:30:10 +0300] "POST /wp-login.php HTTP/1.1" 200 123 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
Bu logdaki bilgiler:
192.168.1.10: İsteği yapan istemcinin IP adresi.[24/Oct/2023:10:30:00 +0300]: İsteğin zaman damgası."GET /index.html HTTP/1.1": HTTP metodu, istenen kaynak ve HTTP protokol versiyonu.200: HTTP durum kodu (200 OK, 404 Not Found, 500 Internal Server Error vb.). Fail2Ban için özellikle 4xx ve 5xx hataları önemlidir.1234: Yanıtın boyutu (bayt cinsinden)."Mozilla/5.0 ...": İstemcinin User-Agent (tarayıcı veya bot) bilgisi.
apache-badbots gibi jail’ler, access.log‘daki belirli User-Agent’ları veya çok sayıda 404/403 hatası oluşturan IP’leri tespit etmek için bu dosyayı kullanır.
error.log
Apache’nin error.log dosyası, sunucu tarafında oluşan hataları, uyarıları ve hata ayıklama mesajlarını kaydeder. Bu log, güvenlik açısından daha doğrudan göstergeler içerebilir. Varsayılan konumu genellikle /var/log/apache2/error.log‘dur.
Örnek error.log girdileri:
[Mon Oct 24 10:30:15 2023] [error] [client 203.0.113.60] client denied by server configuration: /var/www/html/secret_admin.php
[Mon Oct 24 10:30:20 2023] [error] [client 203.0.113.61] Authorization required.
[Mon Oct 24 10:30:25 2023] [error] [client 203.0.113.62] user 'admin' authentication failure for "/protected/area": Password Mismatch
Bu logdaki bilgiler:
[Mon Oct 24 10:30:15 2023]: Hatanın zaman damgası.[error]: Hata seviyesi.[client 203.0.113.60]: Hatanın kaynaklandığı istemci IP adresi.client denied by server configuration: Sunucu yapılandırması tarafından engellenen bir erişim denemesi.Authorization required./authentication failure: Kimlik doğrulama başarısızlığı.
apache-auth, apache-noscript, apache-overflows gibi jail’ler, error.log‘daki bu tür girdileri izleyerek brute-force saldırılarını, yetkisiz erişim denemelerini ve diğer kötü niyetli faaliyetleri tespit eder.
Özel Log Dosyaları
Apache, sanal ana bilgisayarlar (Virtual Hosts) veya belirli uygulamalar için özel log dosyaları da yapılandırılabilir. Eğer sunucunuzda bu tür özel log dosyaları varsa, Fail2Ban’ın ilgili jail’lerinin logpath parametresini bu dosya yollarını içerecek şekilde güncellemeniz gerekecektir.
Örneğin, bir sanal ana bilgisayarınızın error.log‘u /var/log/apache2/vhost.example.com-error.log ise, ilgili jail’in logpath‘ini buna göre ayarlamalısınız.
Log dosyalarının düzenli olarak incelenmesi, Fail2Ban’ın ne kadar etkili çalıştığını anlamanıza ve gerekirse filtrelerinizi hassaslaştırmanıza yardımcı olacaktır.
Özel Apache Fail2Ban Kuralları Oluşturma
Fail2Ban, varsayılan filtreleriyle birçok yaygın saldırıya karşı koruma sağlar. Ancak, bazen özel saldırı desenlerini veya uygulamanıza özgü zafiyetleri hedeflemek için kendi özel kurallarınızı oluşturmanız gerekebilir. Bu bölüm, özel bir Fail2Ban filtresi ve jail’i nasıl oluşturacağınızı açıklar.
Yeni Bir Filtre Dosyası Oluşturma (/etc/fail2ban/filter.d/apache-custom.conf)
Özel filtre dosyaları /etc/fail2ban/filter.d/ dizininde bulunur. Yeni bir filtre oluşturmak için bu dizine bir .conf uzantılı dosya eklemelisiniz.
sudo nano /etc/fail2ban/filter.d/apache-custom.conf
Bu dosyanın içeriği iki ana bölümden oluşur: [INCLUDES] ve [Definition].
[INCLUDES]: Diğer filtre dosyalarını veya genel yapılandırma dosyalarını dahil etmek için kullanılır. Genellikle gerekli değildir, ancak karmaşık filtreler için faydalı olabilir.[Definition]: Filtrenin ana mantığını içerir. Buradafailregexve isteğe bağlı olarakignoreregextanımlanır.
Regex Tanımlama (failregex)
failregex parametresi, Fail2Ban’ın log dosyalarında arayacağı düzenli ifade (regular expression) desenlerini içerir. Bu desenler, kötü niyetli aktiviteyi gösteren log girdilerini eşleştirmelidir. Her bir failregex kuralı ayrı bir satırda tanımlanır.
Örnek bir senaryo: Belirli bir URL’ye (örneğin, /wp-admin.php gibi bir yönetim paneli giriş sayfası) çok sayıda başarısız erişim denemesini engellemek istiyorsunuz. Bu denemeler Apache access.log‘unda 404 (Bulunamadı) veya 403 (Yasak) hataları olarak görünebilir.
Örnek apache-custom.conf içeriği:
[Definition]
failregex = ^ -. "GET /wp-admin.php HTTP/1\.." (403|404)
^ -. "POST /wp-login.php HTTP/1\.." (200)
Açıklama:
^: Satırın başlangıcı.: Fail2Ban’ın log girdisinden IP adresini çıkarmak için kullandığı bir yer tutucudur. Fail2Ban, bu yer tutucuyu dinamik olarak uygun bir IP regex’i ile değiştirir.-.*: IP adresinden sonra gelen herhangi bir karakter dizisi."GET /wp-admin.php HTTP/1\..*": Belirli bir GET isteği ve HTTP versiyonu. Buradawp-admin.phpyerine kendi hedef URL’nizi yazmalısınız.(403|404): HTTP durum kodu olarak 403 veya 404 arar."POST /wp-login.php HTTP/1\..*" (200): WordPress giriş sayfasına (wp-login.php) yapılan POST isteklerinin, başarılı bir HTTP 200 yanıtı alsa bile, çok sayıda tekrarlanması durumunda brute-force girişimi olabileceğini varsayar. (Bu, bazı durumlarda yanlış pozitiflere neden olabileceği için dikkatli kullanılmalıdır.)
fail2ban-regex ile Test Etme
Yeni oluşturduğunuz failregex kurallarını, canlıya almadan önce test etmek çok önemlidir. fail2ban-regex aracı, bir log dosyası üzerinde belirli bir filtreyi test etmenizi sağlar ve kaç tane eşleşme bulunduğunu gösterir.
sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-custom.conf
Bu komut, /var/log/apache2/access.log dosyasını apache-custom.conf filtresindeki kurallarla tarar. Çıktı, bulunan eşleşme sayısını ve hangi IP adreslerinin eşleştiğini gösterecektir. Eğer beklediğinizden farklı sonuçlar alırsanız, regex’inizi buna göre ayarlayabilirsiniz.
Özel Jail Oluşturma
Filtrenizi test edip doğruladıktan sonra, bu filtreyi kullanacak yeni bir jail oluşturmak için jail.local dosyasını düzenleyin:
sudo nano /etc/fail2ban/jail.local
Dosyanın sonuna aşağıdaki gibi yeni bir jail bölümü ekleyin:
[apache-custom]
enabled = true
port = http,https
filter = apache-custom
logpath = /var/log/apache2/access.log
maxretry = 5
bantime = 30m
Burada:
filter = apache-custom: Yeni oluşturduğumuz filtre dosyasını kullanacağımızı belirtir.logpath: Bu filtrenin hangi log dosyasını izleyeceğini belirtir.maxretryvebantime: Bu jail için özel yasaklama eşiği ve süresi.
Değişiklikleri kaydedin ve Fail2Ban servisini yeniden başlatın:
sudo service fail2ban restart
Artık Fail2Ban, özel olarak tanımladığınız desenlere göre Apache loglarını izleyecek ve kötü niyetli IP adreslerini yasaklayacaktır.
Fail2Ban Eylemleri (Actions) ve Bildirimler (Notifications)
Fail2Ban, bir IP adresini tespit ettiğinde ne yapacağını belirlemek için “eylemler” (actions) kullanır. Varsayılan olarak, Fail2Ban iptables kullanarak IP adreslerini engeller. Ancak, e-posta bildirimleri gibi ek eylemler de yapılandırılabilir.
Varsayılan Eylemler (action = %(action_)s)
Fail2Ban, /etc/fail2ban/action.d/ dizininde bir dizi önceden tanımlanmış eylem script’i ile birlikte gelir. jail.local dosyasındaki [DEFAULT] veya [JAIL_ADI] bölümlerinde action parametresini ayarlayarak bu eylemleri kullanabilirsiniz.
action = %(action_)s: Bu, varsayılan yasaklama eylemidir. Genellikleiptableskullanarak IP adresini engeller. Fail2Ban’ın çoğu kurulumunda bu yeterlidir.action = %(action_mw)s: Bu eylem, IP’yi yasaklar ve yasaklama hakkında bir e-posta bildirimi gönderir.action = %(action_mwl)s: Bu eylem, IP’yi yasaklar, yasaklama hakkında e-posta bildirimi gönderir ve ilgili log satırlarını da e-postaya dahil eder.
E-posta Bildirimleri İçin Yapılandırma (action = %(action_mwl)s)
E-posta bildirimlerini kullanmak istiyorsanız, jail.local dosyasındaki [DEFAULT] bölümünde aşağıdaki parametreleri yapılandırmanız gerekir:
[DEFAULT]
...
destemail = your_email@example.com # Bildirimlerin gönderileceği e-posta adresi
sendername = Fail2Ban # E-posta göndericisinin adı
mta = sendmail # E-posta göndermek için kullanılacak MTA (Mail Transfer Agent)
action = %(action_mwl)s # Yasaklama ve logları içeren e-posta bildirimi
Burada destemail adresini kendi e-posta adresinizle değiştirmeniz önemlidir.
sendmail veya postfix Kurulumu
Fail2Ban’ın e-posta gönderebilmesi için sunucunuzda bir MTA (Mail Transfer Agent) kurulu ve yapılandırılmış olması gerekir. Ubuntu sistemlerinde genellikle postfix veya sendmail kullanılır. Eğer sunucunuzda zaten bir MTA kurulu değilse, kurmanız gerekebilir:
sudo apt-get install postfix
Kurulum sırasında, “Internet Site” veya “Local Only” gibi seçenekler sunulabilir. Basit bildirimler için “Local Only” yeterli olabilir, ancak dışarıya e-posta göndermek istiyorsanız “Internet Site” seçeneğini seçip alan adınızı yapılandırmanız gerekebilir. Bu, ayrı bir konu olduğu için burada detaylarına girilmeyecektir, ancak Fail2Ban’ın e-posta göndermesi için bu adımın gerekli olduğunu unutmayın.
Özel Eylem Oluşturma
Fail2Ban, özel eylemler oluşturmanıza da olanak tanır. Kendi özel script’inizi yazarak, bir IP yasaklandığında veya yasağı kaldırıldığında belirli komutları çalıştırmasını sağlayabilirsiniz. Özel eylem script’leri /etc/fail2ban/action.d/ dizininde saklanır.
Örnek olarak, bir IP yasaklandığında harici bir güvenlik duvarı API’sine istek gönderen veya bir bildirim sistemine mesaj gönderen bir script oluşturabilirsiniz. Özel bir eylem dosyası genellikle aşağıdaki bölümleri içerir:
[Definition]: Eylemin tanımını içerir.actionstart: Fail2Ban servisi başladığında çalışacak komutlar.actionstop: Fail2Ban servisi durduğunda çalışacak komutlar.actioncheck: Bir IP yasaklanmadan önce çalışacak komutlar (isteğe bağlı).actionban: Bir IP yasaklandığında çalışacak komutlar.actionunban: Bir IP yasağı kaldırıldığında çalışacak komutlar.
Özel bir eylem oluşturduktan sonra, bunu jail.local dosyanızdaki action parametresinde belirtebilirsiniz:
action = my_custom_action[name=apache-custom-ban]
Bu, Fail2Ban’ın esnekliğini gösterir ve sunucunuzun özel ihtiyaçlarına göre güvenlik stratejinizi genişletmenize olanak tanır.
Fail2Ban’ı Test Etme ve İzleme
Fail2Ban’ı kurup yapılandırdıktan sonra, düzgün çalıştığından emin olmak için test etmek ve sürekli olarak izlemek çok önemlidir. Bu, olası sorunları erken tespit etmenizi ve güvenlik stratejinizi optimize etmenizi sağlar.
fail2ban-client status
Bu komut, Fail2Ban servisinin genel durumunu ve etkin olan tüm jail’leri listeler. Ayrıca, her bir jail için yasaklanan IP adreslerinin sayısını da gösterir.
sudo fail2ban-client status
Çıktı örneği:
Status
|- Number of jail: 4
- Jail list: ssh, apache-auth, apache-badbots, apache-custom
fail2ban-client status
Belirli bir jail'in durumunu daha ayrıntılı görmek için, jail adını belirterek bu komutu kullanabilirsiniz:
sudo fail2ban-client status apache-auth
Çıktı örneği:
Status for jail apache-auth |- Filter | |- currently failed: 0 | |- total failed: 12 |- file list: /var/log/apache2/error.log- Actions |- currently banned: 2 |- total banned: 5- banned IP list: 203.0.113.10, 203.0.113.11
Bu çıktı, apache-auth jail'inin kaç IP adresini yasakladığını (currently banned), toplam yasaklanan IP sayısını (total banned) ve şu anda yasaklı olan IP adreslerini gösterir. Ayrıca, filtre tarafından kaç başarısız deneme tespit edildiğini de görebilirsiniz.
Log Dosyalarını İzleme (/var/log/fail2ban.log)
Fail2Ban'ın kendi log dosyası /var/log/fail2ban.log'dur. Bu dosya, Fail2Ban servisinin başlangıç/duruş olaylarını, jail'lerin etkinleştirilmesini, IP adreslerinin yasaklanmasını ve yasaklarının kaldırılmasını kaydeder. Bu log dosyasını izlemek, Fail2Ban'ın gerçek zamanlı olarak nasıl çalıştığını anlamak için çok önemlidir.
sudo tail -f /var/log/fail2ban.log
Bu komut, log dosyasının sonunu sürekli olarak ekrana basar. Bir IP adresi yasaklandığında veya yasağı kaldırıldığında burada ilgili girdileri göreceksiniz:
2023-10-24 10:45:01,234 fail2ban.actions: WARNING [apache-auth] Ban 203.0.113.10
2023-10-24 10:55:01,234 fail2ban.actions: WARNING [apache-auth] Unban 203.0.113.10
Test Saldırıları Yapma (Dikkatli Bir Şekilde)
Fail2Ban'ın düzgün çalıştığını doğrulamak için, güvenli ve kontrollü bir ortamda test saldırıları yapabilirsiniz. Örneğin, yasaklanmasını beklediğiniz bir IP adresinden (kendi beyaz listenizde olmayan bir IP) Apache'nin kimlik doğrulama gerektiren bir alanına veya bir yönetim paneli giriş sayfasına birkaç kez yanlış parola ile erişmeye çalışın. maxretry sayısını aştığınızda, Fail2Ban'ın sizi yasakladığını görmelisiniz.
UYARI: Test saldırılarını kendi sunucunuz üzerinde yaparken, kendinizi veya diğer meşru kullanıcıları yanlışlıkla yasaklamamaya dikkat edin. Kendi IP adresinizi ignoreip listesine eklemeyi unutmayın. Mümkünse, bu tür testleri bir geliştirme veya test ortamında yapın.
Test saldırısı sonrası, fail2ban-client status komutu ile yasaklanan IP'nin listeye eklendiğini ve /var/log/fail2ban.log dosyasında ilgili "Ban" girdisini kontrol edin.