PROTEGER SERVIDORES RASPBERRY PI EN KALI LINUX CON FAIL2BAN

Antes de empezar a escribir agradezco a todas las personas que van a la EKOSPACE. El otro día había comentado a la gente de EKOSPACE para armarme un servidor para poder atacarlo y hacer mis propias pruebas de seguridad pero me recomendaron algunas herramientas de protección en el cual he escrito anteriormente aquí y me recomendaron la ultima vez sobre un SCRIPT y me pareció muy útil.


Veamos un servidor INSEGURO.

Screenshot from 2016-05-28 15-23-31

Pero no digo que SSH sea inseguro, puede llegar a ser una linda presa para hacer alguna prueba de seguridad.

Ahora veamos que hace el SCRIPT:

Screenshot from 2016-05-28 15-23-06

Que pasa si no tengo el script instalado, lo que pasa es que solo me echará del servidor. Pero en la imagen tengo es que el script lo tengo instalado y lo que hizo fue cerrarme todo mi servidor en mi propia cara. Osea me cerro los puertos seleccionado anteriormente. En resumen te volvió donde empezaste.

Veamos un poco de concepto.

Que es fail2ban?

Según wikipedia Fail2ban es una aplicación escrita en Python para la prevención de intrusos en un sistema, que actúa penalizando o bloqueando las conexiones remotas que intentan accesos por fuerza bruta. Se distribuye bajo licencia GNU y típicamente funciona en sistemas POSIX que tengan interfaz con un sistema de control de paquetes o un firewall local (como iptables o TCP Wrapper). Te recomiendo que vayas a WIKI y leas un poco más.

Tenemos su pagina oficial sobre esa herramienta AQUÍ

El proceso es muy fácil de usar en debian pero en nuestro caso lo haremos con KALI LINUX

INSTALACIÓN

 apt search fail2ban
 apt-get install fail2ban

CONFIGURACIÓN

 nano /etc/fail2ban/jail.conf

Screenshot from 2016-05-28 15-43-40

Por defecto vienen 600 segundos, que son 10 minutos, a mi juicio es poco tiempo, ya que le baneamos, que sea por un tiempo razonable y se canse, así que yo he optado por poner 36000 que son 10 horas.
Tenemos un MANUAL COMPLETO AQUÍ EN ESPAÑOL

 service fail2ban restart
 iptables -L

BUENO ESPERO QUE TE SIRVA. NO TE OLVIDES DE COMPARTIRLO PARA SEGUIR PUBLICANDO LO QUE POCO QUE APRENDO.

Proteger con fail2ban

Exploraciones Fail2ban los archivos de registro (por ejemplo, /var/log/apache/error_log) y la prohibición de direcciones IP que muestran los signos maliciosos – demasiados fallos de contraseña, en busca de vulnerabilidades, etc. Generalmente Fail2Ban se utiliza para actualizar las reglas del cortafuegos para rechazar las direcciones IP de una cantidad especificada de tiempo, aunque cualquier otra acción arbitraria (por ejemplo, el envío de un correo electrónico) también podría ser configurado. Fuera de la caja Fail2Ban viene con filtros para varios servicios (Apache, servicio de mensajería, ssh, etc.).
Fail2Ban es capaz de reducir la tasa de autenticaciones Los intentos incorrectos sin embargo, no puede eliminar el riesgo que presenta de autenticación débiles. Configurar los servicios de utilizar sólo dos factores o mecanismos de autenticación públicas/privadas si realmente quiere proteger los servicios.

Configuracion

 /etc/sysconfig/iptables
 
*filter
:INPUT DROP [1:328]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [11:620]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
COMMIT   

archivo de configuración de copia

 cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

servicio SSH config: Añadir esta información a continuación /etc/fail2ban/jail.local

 
[ssh-iptables]
enabled  = true  
filter   = sshd  
action   = iptables[name=SSH, port=ssh, protocol=tcp]  
           slacknotification[name="SSH"]
logpath  = /var/log/secure  
maxretry = 5   

Con esta configuración fail2ban se compruebe cerrar la sesión ssh/var/log/secure, detectar automáticamente muestra el ataque de fuerza bruta

pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=x.x.x.x 

Crear una acción fail2ban
Presentar /etc/fail2ban/action.d/slack notification.conf

# Fail2Ban configuration file
#
# Author: HieuHT
#
#

[INCLUDES]

[Definition]

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = /etc/fail2ban/action.d/slacknotification.py -c '#nguyehiemchetnguoi' -u 'Fail2Ban' -n  -i  -s uname -n -f 

[Init]

# Default name of the chain
#
name = default  

Aquí es un servicio para enviar una notificación
Presentar /etc/fail2ban/action.d/slack notification.slack notification.py,

#!/usr/bin/env python
#coding:utf-8
"""
  Author:  HarryHa --
  Name: slacknotification.py
  Created: 08/14/2015
"""
INCOMMING_WEBHOOKS="https://hooks.slack.com/services/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"
import urllib
import urllib2
import json
import sys
import optparse

def build_parser():
    usage = """
    usage: %prog -s 
    -s: service name
    """    
    parser = optparse.OptionParser(usage= usage)
    parser.add_option("-c", "--channel", dest="channel", help="Slack Channel.", default = "#general")    
    parser.add_option("-u", "--username", dest="username", help="Slack Username.")    
    parser.add_option("-n", "--name", dest="name", help="Service name.")
    parser.add_option("-i", "--ip", dest="ip", help="IP Address")
    parser.add_option("-s", "--server", dest="server", help="Server Name")
    parser.add_option("-f", "--failures", dest="failures", help="Number Failures")
    return parser

def req(message, channel, username):
    payload = {'text': message,
               'channel': channel,
               'username': username,
               'icon_emoji': ':mega:'
               }
    payload = json.dumps(payload)
    data = urllib.urlencode({'payload' : payload})
    request = urllib2.Request(INCOMMING_WEBHOOKS, data)
    try:        
        response = urllib2.urlopen(request)
        response_data = response.read()
        return response_data
    except Exception, e:
        print e

if __name__ == '__main__':
    parser = build_parser()
    options, _args = parser.parse_args()    
    messages = "*%s*: banned *%s* from *%s* after *%s* attempts" % (options.name, options.ip, options.server, options.failures)
    req(messages, options.channel, options.username)