Teilen von IPs, die von fail2ban gebannt wurden

18

Ich verwende fail2ban auf allen Servern mit öffentlich sichtbaren Diensten und frage mich:

  1. Gibt es eine einfache Möglichkeit, gesperrte IP-Adressen zwischen von mir kontrollierten Hosts auszutauschen?
  2. Gibt es einen Dienst, der diese Daten sammelt und veröffentlicht?

Seit dem ersten Tag der Einrichtung dieses Servers habe ich unzählige Anmeldeversuche erhalten.

ndemou
quelle
2
Willkommen im Internet. Es hat keinen Sinn, diese Liste zu veröffentlichen - wir alle kennen diese Situation nur allzu gut.
Sven
1
Vielen Dank. Ich glaube, dass es schön ist, Beispiele zu haben, wenn man etwas beschreibt. Fühlen Sie sich frei, sie zu ignorieren, wenn Sie es besser wissen.
Ndemou
Ich habe die IP-Liste entfernt und die Gelegenheit genutzt, Ihre Frage in eine Frage zu verwandeln. Es macht nicht nur keinen Sinn, die Liste zu veröffentlichen, sondern wirft auch die Frage auf und wird schnell veraltet sein.
Eltern
2
Mein Vorschlag ist auch, fail2ban zu entfernen und sich nicht mehr darum zu kümmern. Wenn Sie die Kennwortauthentifizierung deaktiviert haben, können Sie nur sehr wenig tun. fail2ban wurde in der Vergangenheit ausgenutzt, und das Hinzufügen einer potenziellen Sicherheitslücke, die absolut keinen Nutzen bringt, ist ein Nettoverlust.
gparent
@gparent: Zu Ihren Vorschlägen: Danke - Ich habe mir noch nie die Geschichte von fail2ban Exploits angesehen. Aus Sicherheitsgründen würde S / WI eine bessere Erfolgsbilanz erwarten. In Bezug auf Ihre Änderungen: Ich glaube nicht, dass es gut ist, eine Frage so stark zu ändern. Wenn es eine schlechte Frage ist, lassen Sie das Plakat die Konsequenzen erleiden. Wie auch immer, ich werde es so lassen, wie es jetzt ist.
Ndemou

Antworten:

8

Ich habe einmal ein System zur Zentralisierung von fail2ban-Daten auf dieser Site gesehen und eine modifizierte Version erstellt. Die Datenbank ist die gleiche, aber ich habe einige Skripte geändert und erstellt.

Mein System besteht aus 4 Komponenten:

  1. fail2ban Datenbank

    Es ist eine MySQL-Datenbank, die nur eine Tabelle enthält 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

    Jedes Mal, wenn ein Host gesperrt wird, wird die Datenbank gefüllt:

    
    <?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

    Sie setzen dies auf Crontab, jede Minute ausgeführt. Die zuletzt hinzugefügten Hosts werden abgerufen und gesperrt.

    
    <?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

    Diese Datei wird in / etc / fail2ban abgelegt und enthält Datenbankkonfiguration und Gefängnisauswahl.

    
    <?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');
    
    ?>
    

Erstellen Sie diese Dateien und ändern Sie die Konfiguration von fail2ban:

Nach der Zeile, in der actionban = .....eine neue Zeile eingefügt wurde, um das PHP-Skript aufzurufen:

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

Wenn Sie diese Struktur auf allen Ihren Servern verwenden, wird sichergestellt, dass jedes Mal, wenn ein Host auf einem Server gesperrt wird, alle anderen Server dies ebenfalls sperren.

ThoriumBR
quelle
3

Deshalb habe ich eine Reihe von Nachforschungen angestellt, nachdem ich beobachtet hatte, wie dieselbe IP-Adresse nacheinander auf meinen Cluster von Webservern auftrat. Da ich AWS benutze, dachte ich, dass es einen einfachen Weg geben könnte und dass er in meinen ersten zwei Tagen des Testens von 5 Servern wunderbar funktioniert.

Als erstes empfehle ich, SELinux vorübergehend zu deaktivieren. Wir werden uns am Ende darum kümmern. Ich bin kein SELinux-Experte, aber was ich getan habe, funktioniert bisher.

Die Hauptanforderung ist eine gemeinsam genutzte Dateiquelle. Ich verwende AWS EFS. Nachdem das neue Laufwerk bereitgestellt und bereitgestellt wurde, habe ich das Protokollziel in /etc/fail2ban/fail2ban.conf in einen Unterordner im EFS-Laufwerk geändert.

logtarget = /efsmount/fail2ban/server1.log

Dann habe ich einen einfachen Filter geschrieben und in /etc/fail2ban/filter.d/fail2ban-log.conf platziert

[Definition]

failregex = .* Ban <HOST>

ignoreregex =

Filter zu /etc/fail2ban/jail.local hinzugefügt

[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

Dann startete fail2ban neu

sudo fail2ban-client reload

So weit, ist es gut! Nein, der schmerzhafte Teil ist SELinux. Nachdem ich fail2ban eine Weile laufen ließ, führte ich diesen Befehl aus, der fail2ban durch die Filter lassen würde.

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

Audit2allow fordert Sie auf, diesen Befehl auszuführen

sudo semodule -i fail2ban-nfs.pp

Ich überprüfe immer noch meine SELinux-Protokolle hier und da, um festzustellen, ob weitere Ablehnungen vorliegen. Wenn jemand einen Tipp hat, wie man dieses klare SELinux mit einer anderen Methode erreicht, wäre das großartig.

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

Zu diesem Zeitpunkt gab es noch Fehler beim Neustart von fail2ban. Bei der Verwendung von action = action_mwl in jail.local ist ein Fehler aufgetreten. Nach ein bisschen googeln habe ich das gefunden, was bisher funktioniert. Nach dem, was ich gelesen habe, ist es wegen der Zeilenumbrüche in der logpath-Direktive, die auf mehrere Dateien verweisen. Ich habe es mit Kommas, Leerzeichen usw. versucht, sonst hat nichts mit action_mwl funktioniert.

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

Vergessen Sie nicht, SELinux wieder einzuschalten!

prophoto
quelle
Wie Sie habe ich viel Mühe in fail2ban investiert (ich habe diese Frage gestellt), aber nach ein wenig mehr Recherche habe ich gparents Rat befolgt, um fail2ban zu entfernen (siehe Kommentare zu der Frage)
ndemou
2

Ich habe das gerade implementiert und bisher scheint es gut zu funktionieren. Allerdings musste ich einige PHP-Dateien aktualisieren, da die Skripte in der ursprünglichen Antwort veraltete Funktionen verwenden.

Hier sind die aktualisierten Skripte

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);
?>

Außerdem muss die Aktion fail2ban.php an jeder Stelle so stark eingerückt sein wie die darüber stehende Zeile. Beispielsweise:

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

Sonst startet fail2ban nicht. Ich hoffe, dies hilft jedem, der versucht, dies bereitzustellen.

Simba Lion
quelle
1

Eine Alternative zu fail2banist DenyHosts , die mit einer Synchronisierungsfunktion kommt. Die Installation ist ziemlich ähnlich fail2banfinden Cyberciti Tutorial für weitere Details .

Das Problem ist, dass der Synchronisationsdienst zentralisiert ist und der Quellcode der Serverseite nicht verfügbar zu sein scheint. Daher können Sie Ihren eigenen DenyHosts-Dienst nicht einfach starten und müssen sich auf einen Drittanbieter verlassen (was für einige möglicherweise in Ordnung ist) Anwendungsfälle).

Tombart
quelle
0

Ja und ja. Beides ist möglich.

Sie müssen einen geeigneten Mechanismus finden, um die Liste der IPs gemeinsam zu nutzen. Wenn Sie beispielsweise AWS verwenden, können Sie s3 nutzen. Sie können rsync zwischen Linux-Hosts oder eine allen Hosts gemeinsame Datenbank verwenden. Sie könnten einen Dienst mit Ihrer bevorzugten Programmiersprache ausstatten, der eine erholsame API bietet, die Sie selbst auswählen können.

Wenn Sie die Liste öffentlich teilen, können Sie eine Website erstellen und eine einfache Textdatei hosten. Einige bieten bereits solche Listen an (keine mir bekannten Crowd-Sourcing-Listen). Das Erstellen einer eigenen Site / eines eigenen Dienstes würde den Rahmen einer Antwort sprengen, sollte jedoch nicht besonders schwierig sein.

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

Eine ziemlich manuelle Einrichtung wäre, die Konfiguration zu ändern, die iptableszum Aktualisieren von Regeln aufruft , sodass ein eigenes Skript aufgerufen wird, das eine Liste von Hosts durchläuft (aus einer Datei gelesen?) Und die iptablesAufrufe jeweils über SSH durchführt. Sie benötigen eine schlüsselbasierte Authentifizierung zwischen allen dafür konfigurierten Hosts. Admin-Automatisierungstools wie Puppet können die Einrichtung und Wartung vereinfachen. Dies wäre nicht sonderlich effizient, aber wenn Sie nicht eine große Menge an Sondierungsdaten sehen (und / oder nicht eine große Anzahl von Hosts haben), bin ich sicher, dass es gut genug wäre. Wenn Sie nur wenige Hosts haben, müssen Sie nicht einmal eine Datei durchlaufen: Konfigurieren Sie die einzelnen Hosts so, dass die anderen der Reihe nach aufgerufen werden. Der Aufwand für die Skripterstellung ist minimal.

Is there a way to share banned IPs publicly?

Es gibt zweifellos viele Möglichkeiten. Lassen Sie die obigen Skripte die Daten in eine Datenbank ablegen und die Clients daraus lesen, nach neuen Regeln suchen und diese ausführen, sobald sie eingehen. Das einfache "Ausführen einer Regel, wie Sie sie sehen" ist nicht perfekt, wenn viele vorhanden sind Hosts übermitteln Informationen, zum Beispiel in diesem Fall:

  1. Um 12:00 sagt Server 1 "Banne Host X jetzt" und "Banne Host X in einer Stunde aufheben".
  2. Um 12:45 sagt Server 2 "Banne Host X jetzt" und "Banne Host X in einer Stunde aufheben".
  3. Die Überlappung bedeutet, dass Server 3 Host X für eine Stunde und nicht für eine Stunde + 45 Minuten sperrt, wenn die Anweisungen in der angegebenen Reihenfolge befolgt werden.

Dies sollte jedoch kein bedeutendes Problem sein. Wenn Sie mit der Datenbank ein bisschen schlauer werden, können Sie mehrere Übermittlungen sauberer verwalten, wenn Sie sich dafür entschieden haben, dass sich die Mühe lohnt.

Wenn Sie das als öffentlichen Dienst betreiben, können Sie sich auf eine Welt voller Administrationsprobleme einlassen:

  • Verwalten der Bandbreite und anderer Ressourcen, wenn Sie viele Benutzer gewinnen.
  • Ordnen und Durchsetzen von Zahlungsmethoden, falls Sie versuchen, das Problem der Ressourcenbeschaffung zu lösen, indem Sie den Zugriff in irgendeiner Weise in Rechnung stellen.
  • Umgang mit Versuchen, Ihre Datenbank zu verschmutzen, einem schlechten Schauspieler, der versucht, einen Konkurrenten aus kommerziellen Gründen oder als Erpressungsversuch von den Orten zu verbannen, die die Liste abonnieren.
  • Umgang mit Beschwerden, wenn jemand gesperrt ist und der Meinung ist, dass dies nicht der Fall sein sollte.
  • Umgang mit DDoS-Angriffen, die auftreten werden , wenn Ihr Dienst die Bots anderer überhaupt erfolgreich stört.
David Spillett
quelle