Este documento descreve como configurar o Fail2ban, Fail2sql e Fail2ban-geo para detectar tentativas de acesso não autorizadas à rede, registrá-las numa base de dados MySQL e representá-las num mapa do Google Maps. Primeiro instala-se e configura-se o Fail2ban para bloquear os IPs, depois o Fail2sql regista os dados na base de dados e por fim o Fail2ban-geo cria um mapa interativo com a geolocalização dos ataques.
Mapa de ataques com geolocalização dos IPs usando Fail2ban, Fail2sql e Google Maps
1. By Carlos Domingues (cabdomingues)
IT Security - Como criar mapas (suportados no
Google maps) com a geolocalização dos atacantes
usando o fail2ban / fail2sql / fail2ban-geo
2. IT Security - Como criar mapas (suportados no Google maps) com a geolocalização
dos atacantes usando o fail2ban / fail2sql / fail2ban-geo
Objetivo: Aumentar a segurança da rede informática
Bloquear de forma automática tentativas de acesso indevido através de vários protocolos:
ex. smtp, imap, ssh, ftp, etc., etc.
Facilitar a análise dessas tentativas
Solução: Fail2ban – http://www.fail2ban.org
Fail2sql – http://fail2sql.sourceforge.net
Fail2ban-geo - PHP interface - http://www.byteme.org.uk/2014/04/21/ban-hammer-fail2ban-
geo-ip-on-google-maps/
Pre-requisitos:
Servidor com iptables instalado
Servidor Mysql disponível
Apache web server (ou outro que interprete PHP e aceda a BDs Mysql)
Conta no Google (para criar a API de autenticação aplicacional)
3. Fail2ban
•Detectar tentativas
de acesso indevido à
rede (através de
análise de logs de
smtp, imap, ftp, ssh,
etc.)
Fail2sql
•Registar essas
tentativas numa
base de dados
mysql para análise
posterior
Fail2geo &
Google
maps
•Usar o fail2ban-geo
para representar de
forma
geolocalizadas
todas as tentativas
de acesso indevido
4. Fail2ban - install
• Dependendo da distribuição de Linux, o processo de instalação poderá ser diferente
• yum install fail2ban
• apt-get install fail2ban
• Extrair código from tar.gaz and ./configure / make / make install
Etc..
Alguns guias de instalação do Fail2ban
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-fail2ban-on-ubuntu-14-04
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-centos-6
https://help.ubuntu.com/community/Fail2ban
5. Fail2sql - install
Fail2SQL é escrito em PHP e usa o serviço do MaxMind GeoIP PHP API para dar informação geográfica do IP.
Os dados são guardados numa BD MySQL
• Name
• Protocol
• Port
• IP
• Count (total banned)
• Longitude
• Latitude
• Country Code
• Geo Data (city, country)
• NOTA cabdomingues : Adicionei mais uma linha chamada timestamp (datetime) para registar a data em que o IP foi banido.
Ver mais informação em https://www.samculley.co.uk/log-fail2ban-bans-to-mysql-using-fail2sql/ e http://fail2sql.sourceforge.net/
6. Fail2sql - install
O Fail2SQL instala-se de forma muito simples:
1º download
wget http://fail2sql.sourceforge.net/fail2sql-1.0.tar.gz
2º untar
tar –zxvf fail2sql-1.0.tar.gz
3º execute
mv fail2sql-1.0/* /usr/share/fail2ban/fail2sql/bin/ //colocam-se os ficheiros numa pasta mais adequada
/opt/fail2sql-1.0/fail2sql –u //faz o update da base dados GeoIP
/opt/fail2sql-1.0/fail2sql –l //lista os Ips banidos
7. Fail2sql – config
Editar o ficheiro /usr/share/fail2ban/fail2sql/bin/file2sql
(neste caso está em /usr/share/fail2ban/fail2sql/bin. Pode estar noutro lado qualquer, dependendo da pasta de instalação)
Alterar as configurações de acesso ao mysql, que deverão ser criadas (ver páginas seguintes)
$home = "/usr/share/fail2ban/fail2sql/bin";
$link = mysql_connect('srv-nomeservidor_mysql', 'fail2ban_user', ‘change_password')
or die('Could not connect: ' . mysql_error());
8. Fail2sql – install db
CREATE TABLE `fail2ban` (
`id` int NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`protocol` varchar(4) NOT NULL,
`port` int(11) NOT NULL,
`ip` varchar(20) NOT NULL,
`count` int(11) NOT NULL,
`longitude` varchar(20) DEFAULT NULL,
`latitude` varchar(20) DEFAULT NULL,
`country` varchar(5) DEFAULT NULL,
`geo` varchar(255) DEFAULT NULL,
`timestamp` datetime DEFAULT NULL, //nova coluna adicionada cabdomingues
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Criar user específico na BD para este serviço (ex. file2ban_user) e dar as permissões adequadas.
9. Fail2sql – customize
Como adicionei mais um campo (datetime) na BD, pretendo que esse campo seja preenchido
com a data de registo. Alterar o script fail2sql e adicionar mais um campo nos inserts (que é a
data atual – now() )
Linha 58 :-
$query = "INSERT INTO `fail2ban` values ('', '".$name."', '".$protocol."', '".$port."', '".$ip."', '1',
'".$geoip->longitude."', '".$geoip->latitude."', '".$geoip->country_code."', '".$geoip->city.",
".$geoip->country_name."', NOW())";
Linha 61:-
$query = "INSERT INTO `fail2ban` values ('', '".$name."', '".$protocol."', '".$port."', '".$ip."', '1', '',
'', '', '', NOW())";
10. Fail2ban
• Pressupondo que o Fail2ban está corretamente configurado, a única alteração para este efeito
(usar o fail2sql) será adicionar a linha abaixo identificada no ficheiro de configuração da ação do
iptables:
ex. /etc/fail2ban/action.d/iptables.conf
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype> //esta linha supostamente já deve existir
/usr/share/fail2ban/fail2sql/bin/fail2sql <name> <protocol> <port> <ip> //esta deve ser adicionada
Esta linha deve ser customizada de acordo com a directoria de instalação do fail2sql (ver página Fail2sql -
install)
• Restart fail2ban service
11. NOTA:
Nesta fase, os IPs banidos pelo fail2ban já devem estar a ser inseridos na base de
dados mysql.
Se isso não acontecer, rever as configurações de acesso à BD mysql no script fail2sql
e rever as configurações do fail2ban (iptables action)
/etc/fail2ban/action.d/iptables.conf
12. Google maps
Para poder usar os mapas Google, temos de criar em primeiro lugar, uma chave de API:
1º go to https://console.developers.google.com/project
2º criar novo projeto
3º No menu de APIs e autenticação, escolher “Credenciais”
4º e depois criar “Chave para aplicativos do navegador”
Será esta chave que deve ser usada na linha 8 do index.php (script PHP do fail2ban-geo)
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&sensor=false"></script>
14. Fail2ban-geo - install
Download dos ficheiros do fail2ban-geo (chamei-lhe assim, mas o autor chama-lhe
banhammer).
http://static.byteme.org.uk/banhammer.tar.gz
Extrair todos os ficheiros para uma área do apache (dentro da zona publica - html)
tar –zxvf banhammer.tar.gz
mv banhammer/* /var/www/html/fail2ban-geo/
Neste caso a minha pasta de instalação vai ser : /var/www/html/fail2ban-geo/ e o endereço de acesso
http://nome_do_servidor/fail2ban-geo
15. Fail2ban-geo – customize
Editar index.php e adicionar a chave do Google:
Depois de criar “Chave para aplicativos do navegador” no google temos de adicionar esta chave na linha 8 do
index.php (script PHP do fail2ban-geo)
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&sensor=false"></script>
Nota: Qualquer erro que aconteça ao gerar o mapa do Google pode estar relacionado com este ponto.
16. Fail2ban-geo – customize
Edit dbinfo.php
<?php //aconselho a adicionar php a seguir ao <? para evitar erros por causa dos short tags do php.ini. O autor tinha apenas <?
$db_host = '127.0.0.1'; //ip do servidor de mysql (pode nao ser o mesmo do apache)
$db_user = 'fail2ban_user';
$db_pwd = ‘change_password';
$database = 'fail2ban';
$table = 'fail2ban';
?>
17. Fail2ban-geo – customize
Edit getmarkers.php
Como eu adicionei um campo (timestamp) na BD Myssql, com a data na qual este IP foi banido, vou configurar
o meu sistema para apenas mostrar o mapa com as localizações dos ataques dos últimos 3 dias:
$query = "SELECT * FROM $table WHERE timestamp >= ( CURDATE() - INTERVAL 3 DAY )";
Adicionei a esta query a condição WHERE timestamp >= ( CURDATE() - INTERVAL 3 DAY )"; para ver no mapa apenas os ultimos 3 dias. Caso
contrário o mapa ficava muito preenchido e ilegível.
18. Fail2ban-geo – customize
Edit maps.js
Uma informação que para mim é importante na alálise das tentativas de acesso indevido é saber qual o ISP (Internet
Service Provider) de onde vêm os ataques.
Uma forma muito simples, mas eficaz, é usar um outro serviço (o db-ip.com):
Assim sendo, no mapa produxido pelo maps.js alterei a linha, adicionando um link novo:
var html = "<b>" + type+ " ATTACK" + "</b><br />"+name + "<br/><a href='https://db-ip.com/" + address + "'>Mais INFO " + "</a> ou <a
href='http://whois.domaintools.com/" + address + "'> WHOIS</a> sobre </a>" + address;
O efeito que se consegue é este
e ao clickar nos links, temos toda a informação que precisamos ->