Apache Exim ve vsftpd İçin Özelleştirilmiş Fail2ban Kuralları

Güvenli bir sunucu ortamı yalnızca güçlü parolalarla değil, aynı zamanda tehditleri izleyen ve anında karşılık veren sistemlerle sağlanabilir. Fail2Ban, bu işi yapan açık kaynaklı ve güçlü bir log izleme ile IP engelleme aracıdır. SSH, FTP, Apache, Exim gibi servislerin günlük dosyalarını izleyerek olağandışı giriş denemelerini belirler. Çok sayıda başarısız parola denemesi veya brute force saldırısı yapan bir IP, Fail2Ban tarafından iptables veya benzeri güvenlik duvarları aracılığıyla otomatik şekilde engellenir.

Fail2Ban’in yapılandırması sırasında, kaç başarısız denemede IP ban uygulanacağı, bu sürenin ne kadar olacağı ve hangi log dosyalarının izleneceği esnek bir şekilde ayarlanabilir. Ayrıca tespit edilen saldırıların SMTP ile e-posta yoluyla sistem yöneticisine iletilmesi de sağlanabilir. Bu sayede yöneticinin logları sürekli izlemesine gerek kalmaz; tehditler zamanında algılanarak otomatik olarak engellenir. Özellikle MySQL versiyonu tespiti gibi hassas sistem bilgilerine yönelik denemelerde ve Plesk Apache erişim loglarında yapılan taramalar, saldırgan aktivitelerin belirlenmesinde önemli rol oynar.

Fakat Fail2Ban her ne kadar etkili bir koruma sunsa da, zayıf kimlik doğrulama sistemlerinin doğurduğu güvenlik açıklarını tamamen ortadan kaldıramaz. Bu yüzden çok faktörlü kimlik doğrulama ve güçlü parola standartlarıyla birlikte kullanılması şarttır.

Aşağıdaki gibi çalıştıralım;

fail2ban-regex /var/log/log_dosyası.log "regex ifadesi"

Test için ise aşağıdaki komutu yazalım;

fail2ban-regex "log satırı" "regex ifadesi"

Bilinmeyen dizinleri tarayan botlar, web sunucularında sık karşılaşılan bir güvenlik tehdididir. Bu taramalar çoğu zaman birçok “404 Not Found” hatasına yol açar. Apache log dosyaları bu girişimleri tespit etmek için etkili bir kaynaktır.

192.168.0.10 - - [04/Jul/2025:12:45:13 +0300] "GET /admin HTTP/1.1" 404 1234
<HOST> - - \[.*\] "GET .*" 404
  • <HOST> etiketi ile IP adresini yakalar,
  • GET .* ile istenen URI’yi tanımlar,
  • 404 ile sadece başarısız istekleri filtreler.
fail2ban-regex '192.168.0.10 - - [04/Jul/2025:12:45:13 +0300] "GET /admin HTTP/1.1" 404 1234' ' - - [.] "GET ." 404'

Exim gibi SMTP hizmetleri, başarısız kimlik doğrulama denemelerini log dosyalarına yazar. Fail2Ban bu verileri analiz edip, saldırgan IP’leri otomatik biçimde engelleyebilir.

2025-07-04 13:12:45 authentication failed for [email protected] from [203.0.113.55]: 535 Incorrect authentication data

Rebex;

Bu regex ifadesi, [] içinde yer alan IP adresini <HOST> etiketiyle yakalayacak şekilde yapılandırılmıştır.

authentication failed for .* from []: 535

Test için aşağıdaki komutu uygulayalım;

fail2ban-regex '2025-07-04 13:12:45 authentication failed for [email protected] from [203.0.113.55]: 535 Incorrect authentication data' 'authentication failed for .* from \[<HOST>\]: 535'

Başarısız oturum açma denemelerini hedef alan özel filtrelerle, FTP brute-force saldırıları engellenebilir. Bu tür hatalar genellikle vsftpd.log dosyasında aşağıdaki şekilde görünür.

Fri Jul 4 13:20:14 2025 [pid 1234] [ftpuser] FAIL LOGIN: Client "198.51.100.77"

Bu log satırında, “FAIL LOGIN” ifadesiyle başarısız bir giriş olduğu ve "Client" etiketinden sonra IP adresinin geldiği net olarak görülmektedir.

FAIL LOGIN: Client "<HOST>"

Fail2ban-regex kullanırken oluşturduğunuz regex ifadelerini mutlaka önceden test etmeyi ihmal etmeyin.
Genel kalıplarla başlayıp, daha sonra özel ifadelerle filtrelemeyi daraltmak daha güvenli sonuçlar verir.
IP adresleri yerine her zaman <HOST> etiketini kullanmanız önerilir.
Sadece eşleşen örnekler değil, eşleşmeyen örneklerle de test yaparak yanlış IP’lerin engellenmesinin önüne geçebilirsiniz.

Regex’inizi test ettikten sonra aşağıdaki şekilde özel bir filtre dosyası oluşturun:

[Definition]
failregex = BURAYA TEST ETTİĞİNİZ REGEX
ignoreregex =

Ardından jail.local içine şu şekilde ekleyin:

[benimservis]
enabled = true
port = ilgili-port
filter = benimfiltre
logpath = /var/log/ilgili_log_dosyası.log
maxretry = 3
bantime = 600

Fail2ban’ı yeniden başlatmayı unutmayın:

sudo systemctl restart fail2ban

fail2ban-regex, IP adresini algılaması için doğru bir şekilde yazılmış bir failregex ifadesi içinde <HOST> etiketine ihtiyaç duyar. Eğer log satırınız IP adresini farklı bir formatta gösteriyorsa (örneğin, köşeli parantez içinde veya port numarasıyla birlikte), <HOST> etiketinin bu biçimi doğru tanıması için regex ifadesi uygun şekilde uyarlanmalıdır.

<HOST> etiketi, IPv4 veya IPv6 adreslerini tespit eden özel bir tanımlayıcıdır ve genellikle IP adresi doğrudan log içinde yer alıyorsa sorunsuz çalışır. Ancak bazı servisler loglarda IP yerine hostname, kullanıcı adı veya karmaşık bağlantı bilgileri gösterebilir. Bu tür durumlarda <HOST> etiketi çalışmayabilir ve yerine açık regex grupları ((?P<host>...)) kullanılarak manuel eşleme yapılması gerekebilir.

Log biçiminin değişken olması, sabit regex ifadelerinin bozulmasına neden olabilir. Bu gibi durumlarda yapılması gerekenler:

  • datepattern gibi esnek tarih eşleştirme tanımları kullanmak
  • Birden fazla failregex satırı tanımlayarak farklı log biçimlerine uyum sağlamak
  • Regex ifadelerinde daha genel karakter eşleştirmelerine yer vermek (örneğin .*?, \S+, \d{1,4} gibi)
  • Servis güncellemelerinden sonra log formatlarını yeniden gözden geçirmek

Fail2ban kurallarının çalışmaması durumunda öncelikle jail.local dosyasındaki ilgili jail’in aktif olup olmadığı (enabled = true) kontrol edilmelidir. Ardından logpath değerinin doğru log dosyasına işaret edip etmediği ve bu dosyaya erişim izni olup olmadığı incelenmelidir. Yazılan failregex ifadesinin log satırlarıyla eşleşip eşleşmediği fail2ban-regex aracıyla test edilmelidir. Ayrıca findtime, maxretry ve bantime gibi parametrelerin çok yüksek değerlerde ayarlanıp ayarlanmadığına dikkat edilmelidir.

Yorum yapın