Miércoles, Julio 15, 2020

Prevenir un ataque por diccionario en SSH y Apache

securidad.png

Estoy realizando unas practicas en una “empresa” donde prácticamente no había nada, y cuando digo nada me refiero a que no había instalación de red, ni Wi-Fi, ni Switchs configurados… Nada. Había conexión a Internet y un cortafuegos con pfSense. Era un lugar donde realmente me siento  a gusto, así que enseguida me puse a trabajar para tener algo que administrar ya que soy administrador de sistemas.

A fecha de hoy tenemos configurados 3 Switchs, unos 8 puntos de acceso, un servidor (con DNS, Servidor Web, Radius (a medias…), etc), y un montón de cables repartidos por todo el edificio. Yo era muy feliz en ese entorno, hasta que me avisaron de que ya teníamos IP pública y que podíamos acceder desde “fuera”.

Soy un administrador de sistemas “nuevo” (por no decir novato), es decir, me estreno en este campo y aunque tenga ciertos conocimientos de sistemas operativos, tengo que admitir que me falta mucho conocimiento o más bien experiencia. Además tengo que admitir que soy un poco maniático por la seguridad informática, y hasta ahora, como que no había acceso desde fuera, no me había preocupado mucho.

El otro día, en mis horas de practicas, mirando una curiosidad de un gráfico del consumo de red de una VLAN en el pfSense me doy cuenta de que han “demasiados” logs, quiero decir, que habían rotado demasiado. Así que hago un cat del último y me doy cuenta de esto:

Jun 12 05:43:33 dns sshd[22187]: Invalid user tom from 103.253.XXX.XXX

Extrañado me pregunto ¿Que carajos significa esto?, y hago un grep

cat auth.log.1 | grep Invalid

Y… una imagen vale más que mil palabras:

Mirando los usuarios, me doy cuenta de que han probado con usuarios como “a“, “b“, “c“, “a1“, “user1” y digo esto tiene que ser un ataque de diccionario, otra explicación no tiene. Informo del asunto y cambio contraseñas por si las moscas (la contraseña que teníamos no era muy… “compleja”). Todo un fin de semana intentando acceder por SSH, lo más seguro es que fuera algún “netbot” de estos que corren por la red.

Al día siguiente, nos ponemos un poco más serios con el tema de seguridad y empezamos a establecer una política de seguridad (que en realidad aún está en proceso…). Aquí es cuando entra nuestro mejor amigo Fail2Ban, una aplicación que escanea los logs de nuestro sistema y rechaza las IP’s que muestren signos maliciosos como demasiados fracasos de contraseña, etc.

Instalación de Fail2Ban

La instalación es muy sencilla, ya que podemos encontrar este programa en los repositorios de Debian y de toda sus derivadas.

sudo aptitude install fail2ban

Configurando Fail2ban

Lo primero que vamos hacer es crear una copia de seguridad del fichero de configuración que viene por defecto, por si las moscas:

cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.conf.old

Ahora podemos modificar tranquilamente el fichero de configuración y lo adaptaremos a nuestras necesidades. Lo primero de todo, modificamos el parámetro background en true para que fail2band corra como un daemon más del sistema.

# Option: background.
# Notes.: start fail2ban as a daemon. Output is redirect to logfile..
# Values: [true | false] Default: false.
background = true

¿Donde guardaremos los logs generados por Fail2ban? Pues podemos utilizar syslog, o generar un nuevo log. Yo me decidí por la segunda opción.

# Option: logtargets.
# Notes.: log targets. Space separated list of logging targets..
# Values: STDERR SYSLOG file Default: /var/log/fail2ban.log.
logtargets = /var/log/fail2ban.log

Lo siguiente es configurar el máximo de intentos que vamos a permitir que una IP intente acceder antes de banear la IP. Por defecto viene 3 intentos, yo lo dejé por defecto, todos nos hemos equivocado dos veces al poner la contraseña.

# Option: maxretry.
# Notes.: number of retrys before IP gets banned..
# Values: NUM Default: 3.
maxretry = 3

Luego podemos configurar el tiempo que estará sin accedo dicha IP baneada. Por defecto vienen 600 segundos, que son 10 minutos. Yo he puesto 36000 que son 10 horas.

# Option: bantime.
# Notes.: number of seconds an IP will be banned..
# Values: NUM Default: 600.
bantime = 36000

Existe un parámetro, que nos permite indicar que IP’s no debe prohibir NUNCA, aunque nos equivoquemos 100 veces seguidas. Ese parámetro es uno llamado ignoreip y se puede poner una red entera o IPs.

# Option: ignoreip.
# Notes.: space separated list of IP's to be ignored by fail2ban..
# You can use CIDR mask in order to specify a range..
# Example: ignoreip = 192.168.0.1/24 123.45.235.65.
# Values: IP Default: 192.168.0.0/24.
ignoreip = 192.168.1.0/24

Hay dos parámetros muy interesantes y que se van a repetir unas cuantas veces. Son los parámetros cmdstart y cmdend, el primero es el comando que ejecutará cuando el servicio de fail2ban sea iniciado, y el segundo cuando el servicio de fail2ban se pare. Podemos ejecutar cualquier comando, yo he visto en un ejemplo que se enviaba un correo electrónico, y me pareció buena idea.

# Option: cmdstart.
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD Default:.
cmdstart = echo "Se ha iniciado fail2ban" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo...
# Option: cmdend.
# Notes.: command executed once at the end of Fail2Ban.
# Values: CMD Default:.
cmdend =echo "Se ha detenido fail2ban" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.<;

A partir de ahora empezaremos a configurar servicios y usaremos una métrica muy parecida al fichero de configuración de SMB, pondremos el nombre del servicio entre corchetes y debajo toda la configuración. Hasta la fecha, Fail2ban permite configurar FTP, HTTP, Kerberos, MailServices, MTA, SSH, VOIP y VPN.

Configuración para Apache

La configuración que he utilizado es la siguiente:

[Apache]

enabled = true
logfile = /var/log/httpd/access_log
cmdstart = echo "S'ha iniciat fail2ban amb Apache2" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo...
cmdend =echo "S'ha aturat fail2ban amb Apache2" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.<;
fwban = iptables -I INPUT -s <ip> -j DROP
fwunban = iptables -D INPUT -s <ip> -j DROP
failregex = authentication failure|user .* not found|*. User notfound.
  • enabled: Activar Fail2ban para Apache
  • logfile: Indicamos el log del Apache
  • cmdstart: Comando que ejecutará cuando sea iniciado
  • cmdend: Comando que ejecutará cuando sea parado
  • fwban: Regla de IPTABLE que ejecutará para banear la IP
  • fwunban: Regla de IPTABLE que ejecutará cuando haya pasado el tiempo de prohibición
  • failregex: Palabras que buscará en el fichero de configuración.

Configuración para SSH

La configuración que he utilizado para SSH:

[SSH]

enabled = true
logfile = /var/log/secure
cmdstart = echo "S'ha iniciat fail2ban amb SSH" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo...
cmdend =echo "S'ha aturat fail2ban amb SSH" | mail -s "Fail2ban" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.<;
fwban = iptables -I INPUT -s <ip> -j DROP
fwunban = iptables -D INPUT -s <ip> -j DROP
failregex = Authentication failure|Failed password|Invalid user
  • enabled: Activar Fail2ban para SSH
  • logfile: Indicamos el log del SSH
  • cmdstart: Comando que ejecutará cuando sea iniciado
  • cmdend: Comando que ejecutará cuando sea parado
  • fwban: Regla de IPTABLE que ejecutará para banear la IP
  • fwunban: Regla de IPTABLE que ejecutará cuando haya pasado el tiempo de prohibición
  • failregex: Palabras que buscará en el fichero de configuración.

¿Funciona?

Para comprobar que Fail2Ban funciona correctamente, desde una maquina me he intentado conectar con mi usuario, he fallado más de tres veces y a la cuarta vez no me dejaba loguear:

UsuarioMisterioso@dns:~$ ssh Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo..X.X
ssh: connect to host 192.168.X.X port 22: Connection timed out

Ahora miramos el log de Fail2Ban:

2015-06-18 11:15:14,719 fail2ban.actions: WARNING [ssh] Ban 192.168.X.X

Ahora, podemos estar más tranquilos, ya que Fail2ban se ocupará de banear todas esas IPs maliciosas que intentan acceder en nuestro sistema.

 

Fuentes: Fail2Ban | Fail2Ban_ES | portallinux

Compártelo. ¡Gracias!

 
Grupo Digital de Ayuda! Laboratorio Linux! - Linux para todos.

¿Quién está en línea?

Hay 96 invitados y ningún miembro en línea

Contador de Visitas

10751285
Hoy Hoy 1213
Ayer Ayer 2808
Esta semana Esta semana 6748
Este mes Este mes 38011
Total de Visitas Total de Visitas 10751285

Día con más
visitantes

06-15-2020 : 2878

Gracias por su visita