Uma vez vi um sistema para centralizar os dados do fail2ban neste site , e criou uma versão modificada. O banco de dados é o mesmo, mas eu mudei e criei alguns scripts.
Meu sistema tem 4 componentes:
-
banco de dados fail2ban
É um banco de dados MySQL contendo apenas uma tabela:
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;
-
fail2ban.php
Toda vez que um host for banido, ele será preenchido pelo banco de dados:
<?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; ?>
-
cron2ban
Você coloca isso para rodar no crontab, a cada minuto. Ele recuperará os últimos hosts adicionados e os banirá.
<?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'];
} // $ id contém o último host banido, adicione-o ao arquivo de configuração file_put_contents ($ lastbanfile, $ id); >exec("fail2ban-client set $jail banip $ip");
-
phpconfig
Este arquivo vai para / etc / fail2ban e tem configuração do banco de dados e seleção de cadeia.
<?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'); ?>
Crie esses arquivos e altere a configuração do fail2ban:
Após a linha com actionban = .....
, uma nova linha inserida para invocar o script PHP:
/root/fail2ban.php <name> <protocol> <port> <ip>
Usar essa estrutura em todos os seus servidores garantirá que toda vez que um host for banido em um servidor, todos os outros servidores o banirão também.