Advertisement

header ads

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.

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:



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.

¿Qué 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
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 autentifica Los intentos incorrectos sin embargo, no puede eliminar el riesgo que presenta de autentifica débiles. Configurar los servicios de utilizar sólo dos factores o mecanismos de autentifica públicas/privadas si realmente quiere proteger los servicios.

Configuración

/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)

Publicar un comentario

0 Comentarios