Fail2ban yasaklı IP'lerin paylaşımı


18

Kamuya açık hizmetleri olan tüm sunucularda fail2ban kullanıyorum ve merak ediyorum:

  1. Kontrol ettiğim ana bilgisayarlar arasında yasaklanmış IP'leri paylaşmanın kolay bir yolu var mı ?
  2. Bu verileri toplayan ve yayınlayan bir hizmet var mı?

Bu sunucuyu kurmanın 1. gününden beri sayısız giriş denemesi yapıyorum.


2
İnternete hoş geldiniz. Bu listeyi yayınlamanın bir anlamı yok - hepimiz bu durumu çok iyi biliyoruz.
Sven

1
Teşekkürler. Bir şeyi tarif ederken örneklere sahip olmak güzel. Eğer daha iyi bilirsen onları görmezden gel.
ndemou

IP listesini kaldırdım ve sorunuzu bir soruya dönüştürme fırsatını yakaladım. Listeyi yayınlamanın bir anlamı yok, aynı zamanda soruyu da karıştırıyor ve hızla modası geçmiş olacak.
gparent

2
Ayrıca benim önerim fail2ban kaldırmak ve bu konuda bakım durdurmak. Şifre doğrulamayı kapattıysanız, yapabileceğiniz çok az şey vardır. fail2ban geçmişte sömürülmüş ve kesinlikle hiçbir fayda sağlamayan potansiyel bir güvenlik açığı eklemek net bir kayıptır.
gparent

@gparent: Size önerilerde: Teşekkürler - Daha önce fail2ban istismar geçmişine hiç bakmadım. Güvenlik için S / WI daha iyi bir performans bekler. Yaptığınız düzenlemelerle ilgili olarak: Bir soruyu bu kadar değiştirmenin iyi olduğuna inanmıyorum. Kötü bir soru ise, posterin sonuçlara maruz kalmasına izin verin. Neyse şimdi olduğu gibi bırakacağım.
ndemou

Yanıtlar:


8

Bir keresinde bu sitede fail2ban verilerini merkezileştirmek için bir sistem gördüm ve değiştirilmiş bir sürüm oluşturdum. Veritabanı aynı, bu ben değişti ve bazı komut dosyaları yarattı.

Sistemimin 4 bileşeni var:

  1. fail2ban veritabanı

    Yalnızca bir tablo içeren bir MySQL veritabanı erp_core_fail2ban::

    CREATE TABLE IF NOT EXISTS 'erp_core_fail2ban' (
      'id' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      'hostname' varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      'created' datetime NOT NULL,
      'name' text COLLATE utf8_unicode_ci NOT NULL,
      'protocol' varchar(16) COLLATE utf8_unicode_ci NOT NULL,
      'port' varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      'ip' varchar(64) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY ('id'),
      KEY 'hostname' ('hostname','ip')
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
  2. fail2ban.php

    Bir ana bilgisayar her yasaklandığında, veritabanını doldurur:

    
    <?php
    require_once("/etc/fail2ban/phpconfig.php");
    
    $name = $_SERVER["argv"][1];
    $protocol = $_SERVER["argv"][2];
    $port = $_SERVER["argv"][3];
    if (!preg_match('/^\d{1,5}$/', $port))
        $port = getservbyname($_SERVER["argv"][3], $protocol);
    $ip = $_SERVER["argv"][4];
    
    $hostname = gethostname();
    
    $query = "INSERT INTO 'erp_core_fail2ban' set hostname='" . addslashes($hostname) . "', name='" . addslashes($name) ."', protocol='" . addslashes($protocol) . "', port='" . addslashes($port) . "', ip='" . addslashes($ip) . "', created=NOW()";
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());
    mysql_close($link);
    exit;
    ?>
    
  3. cron2ban

    Bunu her dakika crontab'da çalıştırıyorsunuz. Son eklenen ana makineleri alır ve yasaklar.

    
    <?php
    // phpconfig.php will have database configuration settings
    require_once("/etc/fail2ban/phpconfig.php");
    
    // file with only a line, containing the last id banned
    $lastbanfile="/etc/fail2ban/lastban";
    
    $lastban = file_get_contents($lastbanfile);
    
    // select only hosts banned after last check
    $sql = "select id, ip from erp_core_fail2ban where id > $lastban";
    $result = mysql_query($sql) or die('Query failed: ' . mysql_error());
    mysql_close($link);
    
    while ($row = mysql_fetch_array($result)) {
            //
            $id = $row['id'];
            $ip = $row['ip'];
    
    
        exec("fail2ban-client set $jail banip $ip");
    
    } // $id contains the last banned host, add it to the config file file_put_contents($lastbanfile, $id); ?>
  4. phpconfig

    Bu dosya / etc / fail2ban adresine gider ve veritabanı yapılandırması ve hapishane seçimine sahiptir.

    
    <?php
    // jail to be used
    $jail = "ssh";
    
    // file to keep the last ban
    $lastbanfile="/etc/fail2ban/lastban";
    
    // database configuration
    $dbserver="localhost";
    $dbuser="root";
    $dbpass="root";
    $dbname="fail2ban";
    
    // connect to database
    $link = mysql_connect($dbserver, $dbuser, $dbpass) or die('Could not connect: ' . mysql_error());
    mysql_select_db($dbname) or die('Could not select database');
    
    ?>
    

Bu dosyaları oluşturun ve yapılandırmayı fail2ban'dan değiştirin:

actionban = .....PHP betiğini çağırmak için yeni bir satır eklenmiş satırdan sonra :

/root/fail2ban.php <name> <protocol> <port> <ip>

Bu yapıyı tüm sunucularınızda kullanmak, bir ana bilgisayar bir sunucuda her yasaklandığında, diğer tüm sunucuların da onu yasaklamasını sağlayacaktır.


3

Bu yüzden aynı ip adresini birbiri ardına web sunucuları kümeme çarptıktan sonra bunu nasıl yapacağım konusunda bir sürü araştırma yaptım. AWS kullandığımdan beri kolay bir yol olabileceğini ve 5 sunucuyu test ettiğim ilk iki günümde güzel çalıştığını düşündüm.

Tavsiye ettiğim ilk şey SELinux'u geçici olarak devre dışı bırakmak, sonunda bununla ilgileneceğiz. Ben bir SELinux uzmanı değilim ama yaptığım şu ana kadar çalışıyor.

Birincil gereksinim paylaşılan bir dosya kaynağıdır, AWS EFS kullanıyorum. Yeni sürücü sağlandıktan ve bağlandıktan sonra, /etc/fail2ban/fail2ban.conf içindeki günlük hedefini EFS sürücüsünde bir alt klasöre değiştirdim.

logtarget = /efsmount/fail2ban/server1.log

Sonra basit bir filtre yazdım ve /etc/fail2ban/filter.d/fail2ban-log.conf

[Definition]

failregex = .* Ban <HOST>

ignoreregex =

Filtreyi /etc/fail2ban/jail.local dosyasına ekledi

[fail2ban-log]
enabled = true
port = http,https
findtime = 86400 ; 1 day
logpath  = /efsmount/fail2ban/server1.log
        /efsmount/fail2ban/server2.log
        /efsmount/fail2ban/server3.log
        /efsmount/fail2ban/server4.log
maxretry = 1

Sonra fail2ban yeniden başlatıldı

sudo fail2ban-client reload

Çok uzak çok iyi! Acı veren kısım SELinux değildir. Fail2ban biraz çalıştırmak için izin sonra filtreler aracılığıyla fail2ban izin verecek bu komutu çalıştırdı.

sudo grep fail2ban /var/log/audit/audit.log | sudo audit2allow -M fail2ban-nfs

Audit2allow size bu komutu çalıştırmanızı söyleyecektir

sudo semodule -i fail2ban-nfs.pp

Hala daha fazla reddi olup olmadığını görmek için SELinux günlüklerimi burada ve orada kontrol ediyorum. Herkes bu net SELinux almak için harika bir başka yöntemle bir ipucu varsa.

sudo cat /var/log/audit/audit.log |grep fail2ban |grep denied

Bu noktada hala fail2ban yeniden başlatılırken hata alıyordum. Jail.local dosyasında action = action_mwl kullanılırken bir hata oluştu. Biraz googling yaptıktan sonra şimdiye kadar çalışan bunu buldum. Ne okuduğumdan, birden fazla dosyaya işaret eden logpath direktifindeki satır kesmeleri nedeniyle. Ben virgül, boşluk, vb denedim action_mwl ile başka hiçbir şey çalıştı.

action_mwm = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-matches[name=%(__name__)s, dest="%(destemail)s", chain="%(chain)s"]

action = %(action_mwm)s

SELinux'u tekrar açmayı unutmayın!


Sizin gibi, fail2ban için çok çaba harcadım (bu soruyu gönderdim) ama biraz daha araştırma yaptıktan sonra, failinban'ı kaldırmak için gparent'ın tavsiyesini aldım (soru hakkındaki yorumlara bakın)
ndemou

2

Bunu yeni uyguladım ve şimdiye kadar iyi çalışıyor gibi görünüyor. Ancak, özgün yanıttaki komut dosyaları kullanımdan kaldırılmış işlevleri kullandığından bazı php güncelleştirmek zorunda kaldı.

Güncellenen komut dosyaları

phpconfig.php

#!/usr/bin/php
<?php
// jail to be used
$jail = "ssh";

// file to keep the last ban
$lastbanfile="/etc/fail2ban/lastban";

// database configuration
$dbserver="[your.mysql.hostname]";
$dbport="[sql.port.default.is.3306]";
$dbuser="[sql.user";
$dbpass="[sql.password]";
$dbname="[sql.table]";

// connect to database
$link = mysqli_connect($dbserver, $dbuser, $dbpass, $dbname, $dbport) or die('Could not connect: ' . mysqli_error());
mysqli_select_db($link,$dbname) or die('Could not select database');

?>

fail2ban.php

#!/usr/bin/php 
<?php
require_once("/etc/fail2ban/phpconfig.php");

$name = $_SERVER["argv"][1];
$protocol = $_SERVER["argv"][2];
$port = $_SERVER["argv"][3];
if (!preg_match('/^\d{1,5}$/', $port))
    $port = getservbyname($_SERVER["argv"][3], $protocol);
$ip = $_SERVER["argv"][4];

$hostname = gethostname();

$query = "INSERT INTO erp_core_fail2ban (hostname,created,name,protocol,port,ip) VALUES ('$hostname',NOW(),'$name','$protocol','$port','$ip')";
echo $query;
$result = mysqli_query($link,$query) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);
exit;
?>

cron2ban.php

#!/usr/bin/php
<?php
// phpconfig.php will have database configuration settings
require_once("/etc/fail2ban/phpconfig.php");

// file with only a line, containing the last id banned
$lastbanfile="/etc/fail2ban/lastban";

$lastban = file_get_contents($lastbanfile);
// select only hosts banned after last check
$sql = "SELECT id,ip FROM erp_core_fail2ban WHERE id > $lastban";
$result = mysqli_query($link,$sql) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);

while ($row = mysqli_fetch_array($result)) {
        //
        $id = $row['id'];
        $ip = $row['ip'];

    exec("fail2ban-client set $jail banip $ip");


}

// $id contains the last banned host, add it to the config file
file_put_contents($lastbanfile, $id);
?>

Ayrıca fail2ban.php eylemini nereye koyarsanız yerleştirin, üstündeki satır kadar girintili olmalıdır. Örneğin:

actionban = ...
            /etc/fail2ban/fail2ban.php

Aksi takdirde fail2ban başlamaz. Umarım bu, dağıtmaya çalışan herkese yardımcı olur.


1

Bir alternatif fail2banolan DenyHosts bir senkronizasyon işlevselliği da verilir. Kurulum oldukça benzerdir fail2ban, daha fazla ayrıntı için Cyberciti'nin eğitimine bakın .

Sorun, senkronizasyon hizmetinin merkezileştirilmiş olması ve sunucu tarafının kaynak kodunun kullanılabilir görünmemesi, bu nedenle kendi DenyHosts hizmetinizi kolayca başlatamamanız ve 3. tarafa güvenmeniz (bazıları için iyi olabilir) kullanım örnekleri).


Senkronizasyon servisine bağlantı bugün
kesildi

0

Evet ve evet. Her ikisi de yapılabilir.

IP listesini paylaşmak için uygun bir mekanizma bulmanız gerekir. Örneğin AWS kullanıyorsanız s3'ten yararlanabilirsiniz. Linux ana bilgisayarları arasında rsync veya tüm ana bilgisayarlar için ortak bir veritabanı kullanabilirsiniz. En sevdiğiniz programlama diliyle, sizin seçiminiz olan dinlendirici bir API sağlayan bir servisi kapatabilirsiniz.

Eğer halka açık müttefik listesini paylaşmak açısından, bir web sitesi oluşturabilir ve basit bir metin dosyası barındırabilirsiniz, bazıları zaten bu tür listeleri (bildiğim kalabalık kaynaklı değil) sağlar. Kendi sitenizi / hizmetinizi nasıl oluşturacağınız bir cevabın kapsamı dışındadır, ancak yapılması çok zor olmamalıdır.


0
Is there an easy way to share banned IPs between hosts I control?

Oldukça manuel bir kurulum, iptableskuralların güncellenmesi için çağrılan yapılandırmayı , ana bilgisayarların bir listesinden (bir dosyadan mı okunuyor?) iptablesGeçiş yapan ve her birini SSH üzerinden yapan bir komut dosyası çağırması için değiştirmek olacaktır . Bunun çalışması için yapılandırılan tüm ana bilgisayarlar arasında anahtar tabanlı kimlik doğrulaması gerekir. Kukla gibi yönetici otomasyon araçları bunu ayarlamayı ve sürdürmeyi kolaylaştırabilir. Bu son derece verimli olmaz ama trafik yoğun bir miktar görmüyorsanız (ve / veya çok sayıda ana bilgisayar varsa) o zaman yeterince iyi olacağından eminim. Yalnızca birkaç ana makineniz varsa, bir dosyada döngü yapmanız bile gerekmez: her birini diğerlerini sırayla arayacak şekilde yapılandırın. Komut dosyası oluşturma çalışması minimum düzeyde olacaktır.

Is there a way to share banned IPs publicly?

Şüphesiz birçok yol var. Yukarıdaki komut dosyalarının bir DB'ye veri bırakmasını ve istemcilerin yeni kurallar için yoklamasını ve bunları geldikçe çalıştırmasını sağlayın. toplantı sahipleri bilgi gönderiyor, örneğin bu örnek:

  1. Saat 12: 00'da sunucu 1 şimdi "X ana bilgisayarını yasakla" ve "bir saat içinde X ana bilgisayarını yasakla" diyor.
  2. 12:45'te sunucu 2 "şimdi X ana bilgisayarını yasakla" ve "bir saat içinde X ana bilgisayarını yasakla" diyor.
  3. Örtüşme, sunucu 3'ün talimatları X'e göre takip ederse X ana bilgisayarını bir saat değil, bir saat + 45 dakika yasaklayacağı anlamına gelir.

ancak bu önemli bir sorun olmamalı ve veritabanıyla biraz daha zeki olursanız, çabaya değdiğine karar verdiyseniz birden çok gönderimi daha temiz bir şekilde yönetebilirsiniz.

Bunu bir kamu hizmeti olarak yürütmek, sizi yönetici güçlüğü dünyasına açacaktır:

  • Çok sayıda kullanıcı kazanırsanız bant genişliğini ve diğer kaynakları yönetme.
  • Bir şekilde erişim için ücret alarak kaynak bulma sorunu ile başa çıkmaya çalışmanız durumunda ödeme yöntemlerini düzenlemek ve uygulamak.
  • Veritabanınızı kirletme girişimleriyle uğraşmak, bir rakibi ticari bir rahatsızlık veya şantaj girişimi olarak listeye abone olan yerlerden yasaklamaya çalışan kötü bir aktör.
  • Birisi yasaklandığında ve olmaması gerektiğini düşündüğünde şikayetlerle başa çıkmak.
  • DDoS saldırıları ile başa çıkmak olacak servis birinin botlar tatbikî tüm başarılı olarak ise gelir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.