Fail2ban Nedir, Nasıl Kullanılır, Nasıl Ayarlanır

  Linux

Bir çok sistemcinin, vps/vds, hosting sahiplerinin imkanlarının kısıtlı olduğu noktada tercih ettiği mükemmel bir programdır. Kısıtlı imkanlardan kastım, yapıda entegre güvenlik sistemleri (firewall v.b.) yok ise ücretsiz ve basit olmasıyla ve özellikleriyle tercih edilmesidir.

Sunucu üzerinde iptables ile birlikte kullanıldığı zaman atak önleyici bir mekanizma işlevini yerine getirerek güvenliği önemli ölçüde sağlamaktadır.

Nedir Fail2ban ?
Belirli sistemleri entegre olarak destekleyerek loglarını sürekli takip eder ve inceler, burada login girişimlerini, atak girişimlerini tespit ederek konfigürasyonu doğrultusunda önlem alır. Örneğin dışarıya ssh’ı açık olan sunucunuza art niyetli kişiler password saldırısı düzenleyerek sürekli login girişimlerinde bulunduğu zaman 3 kere denemelerinden sonra fail2ban sisteminin tehlikeli olarak algılaması ve blacklist/ban liste ilgili atacker’ın ip’sini alması gibi..

Çeşitli servislere ve özelliklere sahip olan fail2ban için aşağıdaki resmi web sayfası üzerinde detaylara erişilebilir.
http://www.fail2ban.org/

Ek olarak desteklediği özellikler ise;

  • Python tabanlı işlemleri desteklemesi,
    Veritabanı desteği,
    Çoklu satırları ayrıştırma ve filtreleme özelliği,
    Filtreler için özel tarih saat desteği,
    Varsayılan zaman dilimine entegre olma özelliği,
    Yasak komutlarına Zaman Aşımı Özelliği,
    Log/Günlük dosyalarında Karakter ve farkındalık ayarı,
    Python 3 desteği,
    tcpwrapper desteği.

 

iptables ve tcpwrapper kullanımı ile default olarak aşağıdaki servislerde tanımlar yapılabilmektedir,
xinetd, iptables, ssh, named, dropbear, proftpd, gssftpd, pureftpd, vsftpd, wuftpd, sendmail, Assp Smtp proxy, lightttpd-Apache-Nginx-http-auth, squid, 3proxy, postfix, exim, cyrus-imap, courierlogin-smtp, qmailrbl, sieve, roundcube, dovecot, sogo, groupoffice, openwebmail, horde, php-url-fopen, suhosin, nsd, asterisk, freeswitch, ejabberd, recidive, mysqld, webmin, selinux, nagios

Fail2ban Kurulumu,
Fail2ban bir çok dağıtım modelini destekliyor ve buna paralel geliştiriliyor. Aşağıdaki indirme sayfası üzerinden linux dağıtımınıza göre rpm dosyasını indirebilirsiniz. Kurulum işlemlerine başlamadan önce sistem üzerinde IP adreslerinin banlanabilmesi için iptables ve fail2ban’ın çalışabilmesi için pyhton’un kurulması gerekiyor. Bu önemli bir detay, unutmamak gerekiyor..
http://www.fail2ban.org/wiki/index.php/Downloads

Ben Redhat/Centos’a göre indirerek kurulumunu yapacağım. Fakat zaten diğerleri de aynı mantık ve işlevlere sahip olduğu için değişen bir şey olmayacaktır.

Önce fail2ban’ın indirme sayfasından rhel/centos rpm sayfasını açıyorum ve 64bit centos 5 için ilgili sayfayı ve fail2ban rpm’ini buluyorum ve indiriyorum,

Artık rpm’i sunucumuza attığıma göre kuruluma başlayabilirim. Tabi öncesinde sistemde gerekli olan python ve iptables’in da kurulu olması gerekiyor. Şayet sunucunuzda mevcutsa tekrar kurmanıza gerek yok. Sizinde görmeniz açısından kontrol ediyorum ve devam ediyorum,

Kurulum için,

Artık kurulum tamamlandı ve sunucuyu korumak adına hiç birşey olmaması yerine default ayarlarla çalışan fail2ban bu hali ile bile oldukça güven vermekte. Yani düşünsenize zaten önceden koruyan bir sistem yoktu, şimdi bir sistem var ve default ayarları bile korumaya yetiyor.

 

Fail2ban Konfigürasyonu
Fakat bu yetmez, ekstra konfigürasyon yapalım, birşeylerini değiştirelim, ekleyelim ve ayarlayalım derseniz basit bir şekilde konfigürasyona başlayalım,

NOT: Ben örneklerimde sürekli ssh servisini kullandım, zira kullanılabilecek servisleri konunun başında belirttim. Klişe olan balık tutmayı öğretme metodu ile sizin de zaman ayırmanız gerekiyor.

Öncelikle dizin içeriğini görüntüleyelim,

Normalde geliştirici ana dosya üzerinde işlem yapmamamızı ve varsa jail.local üzerinde bu işlemleri yapmamızı tavsiye ediyor ki bu doğru olanı.. Bende buna uyuyorum ve jail.conf dosyasının yedeğini “jail.conf.bckp” şeklinde yedeğini alıyorum.

Şimdi bu dosyalarda konfigürasyona başlamadan önce ne nedir, hangi komut ne işe yarar bunu açıklamaya çalışayım,

enabled: İlgili tanımın/komutun/bölümün aktif edilip edilmediğini belirtir. “true” ve “false” seçenekleri mevcuttur.
Filter: jail tarafından eşleşmelerin sağlanması ve filter edilmesi için kullanılır. “/etc/fail2ban/filter.d” dizini kullanılır. Örnek olarak ssh ile ilgili filter ayarları “filter.d” dizini içinde “sshd.conf” ve “sshd-ddos.conf” dosyalarında tutulur. (icelemenizi tavsiye ederim.)
action: Filtremiz bir eşitliği yakaladığı vakit hangi etkinliği yapacağını belirtir.
logpath: Jail filtrelerinin hangi log dosyalarını kullanacağının tanımları yer alır.
ignoreip: Bu ayar seçeneği ile ssh için ne kadar başarısız atak olursa olsun fail2ban bunu dikkate almayarak/yok sayarak herhangi banlama işlemi yapmayacaktır. Ben bu seçeneği evimdeki modemin ip adresini girerek kullanıyorum. Bazen şifremi 3 kere üst üste yanlış yazdığım zamanları dikkate alarak..
findtime: Başarısız oturum açma girişlerinin izleneceği zaman bilgisi ayarlanır. Örneğin ssh için log dosyasında geriye yönelik ne kadar zaman baz alınacağı ayarlanır.
maxretry: Sunucu üzerinde başarısız login girişimlerin sayısı belirlenir. Örneğin ssh için bu ayarı 3 yaparsak, 4. gelen bağlantı isteğinde ip adresi maxretry ayarına takıldığı için bir süre banlanacaktır.
bantime: maxretry tanımında başarısız girişimlerin adetini belirledikten sonra bu ip’lerin ne kadar süre (saniye bazında) banlı/bloklu kalacağı belirlenir.
banaction: IP adresi banlanırken ne gibi bir cezai opsiyon tanımlanacağı belirlenir/ayarlanır. Genelde ip adresi bloklanır. Ama farklı fantaziler de mümkün tabi. Bunu da paralelinde kendi iptables yapılandırmasına alarak varsa sunucu üzerindeki iptables ayarları ile birleştirir ve aksiyonunu bu şekilde alır. Yani 3 kereden fazla ssh denemesi yapan bir adamın ip’si iptables’da erişime kesilir ve huzur sağlanır.
dest (mail): Başarısız ssh girişimlerinde ve atak gibi durumlarda bilgi amaçlı mail göndereceği adres set edilir.
Protocol: Spesifik olarak engellenmesi istenen port/protokollerin engelleme işlemi yapılır. (iptables mantığındaki gibi..)
tcpwrapper: iptables kullanılmaması halinde sistem üzerinde mevcut olan tcpwrapper ile kısıtlama veya ayrıcalık sağlanır. Bu işlemler ise /etc dizini altında “host.allow” veya “host.deny” dosyalarında sağlanır. Yani örneğin ssh atakları durumunda sistemde iptables yok ise ssh tcpwrapper özelliği ile ip adresini “host.deny” dosyasına atarak banlama işlemi sağlanır.
usedns: gelen isteklere ait dns sorgulamasının kullanılması konusundaki ayarları kapsar. “yes” “no” ve “warn” seçenekleri ile dns sorgu tipleri belirlenir.
backend:

Ufaktan bazı ayarlarımızı yapılandıralım,

Öncelikle jail.conf veya jail.local dosyamızı açalım ve burada default olan değerleri biraz değiştirelim.
– IP adreslerinin ban süresini ayarlayalım. Defaultda bantime değeri 600 saniyedir ve 10 dakikaya tekabül eder. Ben bu süreyi çok az buluyorum. Şayet bir ip banlandıktan 10 dakika sonra tekrar denemeye devam ederse bu benim için kar değil zarar eden bir durumdur.

– Kaç saniye/dakikada süresinde bir hostun başarısız girişim yapabileceğini belirleyelim. Yani ssh için log dosyasını ne kadar zaman izleyelim ve aksiyon aldıralım ayarı..

– Tüm bu başarısız girişimler, banlanan ipler ile ilgili bilgilerin hangi mail adresine gönderileceğini ayarlayalım.

Şimdi ssh için bir denemesini yapalım. 192.168.15.1 ip adresinden ssh için 3 adet yanlış parola girmeyi deneyeceğim ve 4. denememde sunucuya erişemediğimi göreceğim. Öncelikle ilgili ip adresinden login girişimini yapıyorum ve sunucumda iptables üzerinde kontrol ettiğim zaman aşağıdaki gibi reject durumda olduğunu görüyorum.

Burada bu bilgiyi vermeden geçemeyeceğim. Hazır örnek yapmışız göstereyim; test sırasında ip adresim banlandığında bana da ayarladığım gibi bilgi maili geldi ve içeriği aşağıdaki gibi. Yani fail2ban abimiz hem beni tehlikeden korudu hem ne yaptığını raporladı, hemde raporlarken ripe analizini ip subnet bilgilerini ve nerede barındığını bile söyledi. Daha ne olsun !

Peki reject olan ip adresini yada banlı ip adresini nasıl kaldırırız bu konuyu inceleyelim. Bir ip adresi ban listenize girdi ve kalkmasını istiyorsunuz diyelim. Bunun için fail2ban-client komutu ile uygun argümanları bir araya getirmek gerekiyor ve sonrası basit. Öncelikle yukardaki örneğimizdeki ip adresimi ban listesinden kaldırayım ve sonra aşırı detay vermeden açıklamaya geçeyim. Zira oldukça geniş ama basit bir konu olduğu için biraz araştırmanız kolayca kavramanıza yetecektir.

Şimdi detay vermek gerekirse fail2ban ile birlikte server client ve regex komutları sisteme kurulmaktadır. Bunlar kurulum mantığına göre farklı işlevsel özellikler gösterirler. Örneğin server olarak yapılandırılan bir fail2ban sisteme farklı sistemler client olarak bağlanarak unix soketler yardımları ile kontrolleri sağlanır gibi..

Aşağıdaki adres üzerinden detayı öğrenmeniz mevcut.
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Usage

Burada kullanabileceğimiz komutlar, argümanları ve diziliş sıraları ile ilgili detaylı bilgileri görebiliriz. Bunun için ilgili komutumuzun help sayfasını veya aşağıdaki adres üzerinden detayları incelememiz yeterli olacaktır.

http://www.fail2ban.org/wiki/index.php/Commands
Burada tam olarak ilgili komutumuzun ardından set opsiyonunu getirerek ssh-iptables ayarıma göre banlanan ip adresimi bandan çıkarma / unban için kullandım. Aslında gayet basit.

Help çıktısı aşağıda yer alıyor,