hits counter

Seguridad:



Instalar y configurar el cortafuegos ufw

Sin un cortafuegos activo, nuestra Raspberry está expuesta a recibir posibles ataques e intrusiones desde Internet (o incluso desde otros ordenadores de la red local). El cortafuegos nos permite vigilar los puertos de comunicaciones y controlar todo lo que entra en nuestra máquina desde el exterior y también todo lo que sale de ella hacia el exterior. De todas las posibilidades que ofrece Raspbian, hemos elegido ufw porque es el más fácil de configurar. De hecho, su nombre se corresponde con el acrónimo de uncomplicated firewall (cortafuegos sin complicaciones).

Por lo tanto, vamos a instalarlo:

sudo apt-get install ufw

Por defecto, el firewall ya incorpora un par de reglas básicas: impide todo el tráfico entrante, pero permite el tráfico saliente. Esto equivale a escribir estas dos reglas:

sudo ufw default deny incoming
sudo ufw default allow outgoing

A estas reglas generales le añadiremos nosotros cuantas excepciones creamos convenientes. Por ejemplo, permitiremos la entrada por el puerto 22 tcp, que es el puerto estándar que corresponde al servidor SSH:

sudo ufw allow 22/tcp

Ya que el cortafuegos tiene preconfigurados los servicios más habituales, también podríamos haber hecho la acción anterior refieriéndonos al nombre del servicio, en lugar del puerto, de la siguiente forma:

sudo ufw allow ssh

Lo mismo sucede en el caso del servidor web que tengamos instalado, ya sea éste Apache, Nginx o Lighttpd. Podemos hacerlo de dos maneras, bien abriendo directanente el puerto:

sudo ufw allow 80/tcp

o bien haciendo referencia al servicio correspondiente:

sudo ufw allow www

Vistos los dos ejemplos anteriores, debemos saber que cada puerto admite dos protocolos: tcp y udp. Al abrir un puerto por su número, debemos indicar, como hemos hecho antes, el protocolo correspondiente (tcp o udp); si no indicamos nada, se abrirán ambos. Aclarado esto, continuamos.

Otra cosa que viene preconfigurada es el protocolo cifs, que es el que usa el servidor Samba:

sudo ufw allow cifs

Para conocer la lista completa de los servicios que ya trae predefinidos el cortafuegos ufw, escribiremos el siguiente comando:

sudo ufw app list

A continuación vamos a abrir los puertos que utilizan otros servicios que tenemos instalados también en nuestra Raspberry. El primero que abriremos será el puerto 3389 tcp, que corresponde al servidor de acceso remoto xrdp:

sudo ufw allow 3389/tcp

Ahora haremos lo mismo con el puerto 9091, que es el que se asigna por defecto para acceder a Transmission mediante el navegador web, y también con el puerto que hayamos indicado en la configuración del programa para establecer las conexiones (supongamos que es el 34200):

sudo ufw allow 9091/tcp
sudo ufw allow 34200/tcp

También lo vamos a hacer con los puertos 21, 1723, 8200 y 10000, que se refieren, respectivamente, a los servidores FTP, VPN y DLNA que tenemos instalados en nuestro sistema, y al servicio Webmin:

sudo ufw allow 21/tcp
sudo ufw allow 1723/tcp
sudo ufw allow 8200/tcp
sudo ufw allow 10000/tcp

Si tuviéramos la necesidad de abrir varios puertos consecutivos (por ejemplo, del 25010 al 25020, como en el caso de los puertos pasivos del servidor FTP), no es necesario que lo hagamos de uno en uno; podemos abrirlos todos de una vez, así:

sudo ufw allow 25010:25020

Y una cosa más: lo mismo que creamos reglas para permitir la entrada por un puerto y acceder al servicio asociado al mismo, también podríamos, si fuera necesario, denegarla. Por ejemplo, impedir el acceso al servidor web:

sudo ufw deny 80/tcp

O denegar el acceso a un determinado host de nuestra red local, indicando su IP:

sudo ufw deny from 192.168.1.35

Bien. Una vez añadidas todas las reglas, ya podemos activar el cortafuegos:

sudo ufw enable

Con esto dejamos ufw configurado y activado, de manera que podamos acceder a través de la red a las distintas aplicaciones y servidores que hemos ido instalando en la Raspberry Pi. Es muy importante recordar esto: si queremos tener acceso a un servicio instalado en la RasPi, ya sea desde la red local o a través de Internet, tenemos que abrir antes el puerto correspondiente en el cortafuegos. Si no lo hacemos, ufw impedirá el acceso y no podremos conectar con dicho servicio.

Veamos, para finalizar, algunos comandos más que nos serán útiles en algún momento: desactivar el cortafuegos, reiniciarlo, mostrar su estado o un ejemplo de cómo borrar una regla que hemos establecido previamente:

sudo ufw disable
sudo /etc/init.d/ufw restart
sudo ufw status verbose
sudo ufw delete allow 22/tcp



Cambiar los puertos por defecto

Además de usar un cortafuegos, una buena manera de proteger aún más nuestra máquina contra posibles intrusiones externas es cambiar los puertos por defecto de los distintos servicios que estemos usando. Tomemos como ejemplo los puertos estándar de los servidores SSH y HTTP (servidor web), que son el 22 y el 80, respectivamente. En el fichero de configuración /etc/ssh/sshd_config podemos modificar el puerto del servidor SSH, mientras que en el fichero /etc/apache2/ports.conf es posible hacer lo mismo con el servidor web Apache.

Si lo hacemos, hemos de tener en cuenta algo muy importante: a partir de entonces, cuando queramos acceder al servicio correspondiente, debemos añadir (a la IP local o al nombre del dominio virtual) el número del puerto, precedido de dos puntos (:). Por ejemplo, si cambiamos el puerto del servidor Apache al 3030, ahora tendremos que escribir lo siguiente para acceder desde la red local o desde Internet:

http://192.168.1.33:3030
http://midominio.com:3030



Asegurar el servidor SSH

Si accedemos a nuestra Raspberry mediante SSH a través de Internet, deberíamos de preocuparnos por asegurar el servidor, ya que los intentos de acceso no autorizado a los servidores SSH son muy frecuentes. Veamos a continuación algunos parámetros que podemos modificar o añadir para que nuestro servidor SSH esté más seguro.

Lo primero que tenemos que hacer es entrar en el archivo de configuración para realizar los cambios:

sudo nano /etc/ssh/sshd_config

Veremos una gran cantidad de opciones de configuración en él. Una de las primeras que encontraremos es la que indica el puerto de acceso al servidor, que por defecto es el 22. Si lo cambiamos (poniendo, por ejemplo, el puerto 3426), dificultaremos mucho el trabajo a quien intente acceder a nuestra máquina:

Port 3426

AVISO: preferimos cambiar el puerto estándar directamente en lugar de hacer una redirección del mismo en el router. Por lo tanto, habrá que indicar forzosamente el nuevo puerto cuando se acceda al servidor, tal y como lo hemos explicado al final del apartado anterior relativo al cambio de los puertos por defecto.

Otra cosa que debemos comprobar es la directiva de seguridad que permite el acceso a root, el superusuario de Linux. Muchos ataques de fuerza bruta se concentran en atacar al usuario root con la esperanza de que tenga una contraseña débil, algo que sucede con demasiada frecuencia. Por eso estaremos mucho más seguros si impedimos la entrada a root, lo que conseguiremos poniendo así esta línea:

PermitRootLogin no

Una opción que podemos modificar es la que indica la cantidad de segundos que la pantalla de login estará disponible para que el usuario se identifique. Pasado ese tiempo, la pantalla o ventana de acceso se cerrará:

LoginGraceTime 60

También asegurarnos de que el servidor no acepte contraseñas vacías o en blanco:

PermitEmptyPasswords no

Si alguna de las dos siguientes directivas de seguridad no vienen incluidas por defecto en el fichero de configuración, habremos de escribirlas nosotros mismos, añadiéndolas al final del fichero:

MaxAuthTries 3
MaxStartups 2

Sirven para prevenir los ataques de fuerza bruta. La primera indica el número máximo de errores permitidos al hacer login. Si sobrepasamos ese número, la pantalla de login se cerrará y habrá que volver a empezar de nuevo. La segunda directiva se refiere al número máximo de conexiones simultáneas por IP que permite el servidor.

Si hay varios usuarios en el sistema, podemos añadir también al final del fichero de configuración una directiva para que sólo los usuarios especificados tengan acceso al mismo:

AllowUsers pi josem

O, si se prefiere, usar en su lugar esta otra para permitir el acceso a todos menos a los que se indican expresamente en ella:

DenyUsers luisp manu root

Una vez guardados los cambios, para comprobar que la configuración del fichero es correcta, debemos escribir este comando:

sudo sshd -t

Si no aparece ningún mensaje de error, es que todo está bien. Es muy importante comprobar que el archivo de configuración es correcto porque si no, cuando reiniciemos el servicio (o la propia Raspberry), el servidor SSH no arrancará y no podremos conectarnos.

Una vez realizadas las modificaciones en el fichero de configuración y comprobado que todo es correcto, tenemos que reiniciar el servicio para que los cambios surtan efecto:

sudo /etc/init.d/ssh restart

Periódicamente es aconsejable mirar el fichero /var/log/auth.log para comprobar si tenemos algún intento de entrada ilegal. Si los hubiese, el siguiente comando nos ayudará a encontrarlos:

sudo cat /var/log/auth.log | grep 'invalid user\|Failed'

Y este otro contará cuántas líneas con intentos de intrusión aparecen:

sudo cat /var/log/auth.log | grep 'invalid user\|Failed' | wc -l

Fail2ban

Quienes deseen ir un paso más allá en la seguridad de su servidor SSH, pueden instalar el servicio Fail2ban, que vigila el fichero de log de los servidores que tengamos instalados y banea (bloquea) aquellas IPs que hayan hecho un intento ilegal de entrar en el sistema mediante fuerza bruta:

sudo apt-get install fail2ban

Accedemos al fichero de configuración:

sudo nano /etc/fail2ban/jail.conf

y modificamos las siguientes partes de su contenido, de modo que queden así:

[DEFAULT]
#
#MISCELLANEOUS OPTIONS
#
# "ignoreip" can be an IP address, a CIDR mask or a DNS host...
ignoreip = 127.0.0.1/8 192.168.1.0/24
bantime = 600
findtime = 300
maxretry = 3

#
# JAILS
#
# SSH servers
#
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
bantime = 600
maxretry = 3

[sshd-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
bantime = 900
maxretry = 6

En la sección [DEFAULT] encontramos varias líneas relativas a la configuración genérica del servicio. Las fundamentales son: ignoreip (IPs que no deseemos que se baneen, que corresponden a localhost y además a todas las IPs de nuestra red local); bantime (tiempo de bloqueo, expresado en segundos); findtime (tiempo, en segundos, durante el que mantendremos activo el número de intentos de un cliente) y maxretry (intentos de login fallidos para que se active el baneo).

Tal y como está configurado el ejemplo de arriba, los tres últimos comandos de esta sección significan que si durante un plazo de 300 segundos (5 minutos) un cliente (dirección IP) intenta acceder incorrectamente más de 3 veces, dicha IP será bloqueada durante 600 segundos (10 minutos).

En las secciones siguientes ([sshd] y [sshd-ddos]) es donde activaremos la seguridad del servidor SSH contra ataques de fuerza bruta y contra ataques DDoS (Distributed Denial of Service): en port dejamos ssh si estamos usando el puerto por defecto (22) o bien pondremos el número de puerto por el que hayamos decidido cambiarlo. Podemos poner un bantime y un maxretry específicos para cada apartado. No hay que olvidarse de activar cada sección, si no lo está ya, poniendo enabled = true al comienzo de cada una. Todo lo demás que hay en el fichero lo dejamos como está.

Como dijimos al principio, y como se puede ver más abajo en el contenido del propio fichero, Fail2ban se puede aplicar también a otros servidores que tengamos instalados (servidor web, servidor FTP, de correo, etc.).

Acabada la configuración, sólo tenemos que reiniciar el servicio:

sudo /etc/init.d/fail2ban restart

Y desde este momento podremos realizar diversas comprobaciones, como conocer su estado:

sudo /etc/init.d/fail2ban status

Ver los servicos que tenemos activos:

sudo fail2ban-client status

O el estado actual de un servicio concreto (ssh en este caso), que nos mostrará si tiene alguna IP baneada en este momento:

sudo fail2ban-client status sshd

También se puede echar un vistazo al fichero de log para comprobar si ha habido intentos de acceso no autorizados:

sudo cat /var/log/fail2ban.log

Para finalizar, añadiremos varias notas importantes:

  1. 1.) Las contraseñas de usuario que usemos deben de ser "fuertes", es decir, tener cierta extensión (8 caracteres o más) y estar compuestas por una combinación de letras (mayúsculas y minúsculas), números y signos de puntuación. Además, la palabra resultante no debe tener sentido, de manera que no aparezca en ningún diccionario.
  2. 2.) En lugar de una contraseña, podemos también conectarnos empleando autentificación mediante clave pública, como se explica en la sección de trucos.
  3. 3.) Una guía de seguridad más completa para un servidor SSH se puede encontrar en este enlace.



Crear un túnel SSH

Si estamos fuera de casa, posiblemente tengamos la oportunidad de conectarnos a Internet a través de una red inalámbrica pública (de un hotel, bar, biblioteca,...) y navegar desde ella; pero hacerlo de esta forma tiene sus riesgos: alguien conectado a la misma red, y que esté usando un sniffer, podría, por ejemplo, obtener los nombres de usuario y las contraseñas que escribamos en el navegador. Sería posible evitar esto y navegar de una forma segura si tuviéramos instalado un servidor VPN en nuestra Raspberry y nos conectáramos a él. Pero si no lo tenemos instalado, hay una alternativa sencilla que nos servirá para salir del paso: crear un túnel SSH y navegar de manera segura por él. La diferencia es que en el caso de la VPN, todo el tráfico entre el servidor y el cliente (lo que incluye cualquier servicio o aplicación que usemos) está cifrado, mientras que en la alternativa que vamos a explicar, sólo lo estará el tráfico que se genere en el navegador.

Vamos a realizar el proceso en dos pasos: primero configuramos el cliente SSH para crear el túnel y luego haremos los cambios oportunos en el navegador. Así pues, nos conectamos a la red inalámbrica pública. A continuación, si usamos Windows, arrancamos el cliente PuTTY y nos vamos a la categoría Connection - SSH - Tunnels. Ahí escribimos un puerto cualquiera (comprendido entre el 1025 y el 65535; por ejemplo, el 3590) en "Source port" y pinchamos en el botón "Add" para añadirlo. Luego en "Destination" marcamos "Auto" y "Dynamic". Nos debe de quedar así:


Despúes subimos hasta la categoría Session de PuTTY y en "Host Name" escribimos la IP pública de la RasPi (si tenemos IP fija) o un dominio virtual (que podemos crear en No-ip, por ejemplo) para conectarnos con el servidor SSH remoto de nuestra Raspberry:


Hacemos clic en el botón "Open" y escribimos el nombre de usuario y contraseña para establecer la conexión SSH con la Raspberry Pi. Dejamos PuTTY abierto.

En el caso de que usemos Linux, nos podemos ahorrar la configuración del cliente; tan sólo tendremos que teclear esto en una terminal:

ssh -D 3590 -p 22 pi@midominio.no-ip.org

cambiando, lógicamente, midominio.no-ip.org por el dominio virtual o la IP pública que tengamos.

Ahora arrancamos el navegador (Firefox en nuestro caso) y nos vamos a Opciones - Avanzado - pestaña Red. Hacemos clic en "Configuración" y ahí configuramos manualmente el Servidor SOCKS poniéndole la IP 127.0.0.1, el mismo puerto que abrimos antes para el túnel SSH (3590) y seleccionando "SOCKS v5" debajo. Debe de quedar así:


Pinchamos en "Aceptar" y ya podemos navegar con seguridad a través del túnel SSH que hemos creado. Pero antes debemos tener en cuenta un par de cosas:

  1. 1.) Naturalmente, es necesario que el puerto 22 esté abierto en el router y redirigido a la IP local de la RasPi para que la conexión con el servidor SSH funcione a través de Internet.
  2. 2.) Si por algún motivo la conexión SSH se desconectase, el navegador mostraría un error, de manera que nos daríamos cuenta enseguida de que el túnel ya no está funcionando.