Protegiendo la Raspberry Pi

Si vas a tener un dispositivo conectado las 24 horas del día a Internet, una de las primeras cosas por las que te deberías preocupar es por su seguridad, en el articulo de hoy vamos a ver como deshabilitar el poder hacer login al servicio ssh y como activar un cortafuegos para proteger las conexiones.

Desactivando autentificacion por contraseña de SSH

Si leíste este articulo, expliqué la forma de autentificarnos y conectarnos mediante ssh a nuestra rpi sin necesidad de introducir clave y contraseña.

Si estamos utilizando este método para conectarnos es buena idea deshabilitar lo que no vayamos a usar, en este caso el ofrecer un login para conectar.

Editamos el fichero

sudo nano /etc/ssh/sshd_config

Buscamos y dejamos el valor tal y como lo pongo

PasswordAuthentication no

Desactivando login para root en SSH

También en el fichero /etc/ssh/sshd_config ponemos lo siguiente:

PermitRootLogin no

Y reiniciamos el servicio:

sudo service ssh restart

Ahora solo se podrá acceder a la rpi mediante la clave SSH

Instalar UFW como cortafuegos

ufw es un sencillo cortafuegos para configurar iptables, y mediante unos simples comandos, podemos ir añadiendo o quitando reglas de una forma fácil y compresible

Para instalar ufw simplemente nos conectamos por ssh a la rpi y ejecutamos:

sudo apt-get install ufw

Si utilizas IPv6 comprueba que la variable IPv6 tiene el valor yes dentro del fichero /etc/default/ufw excerpt

Antes de activar el cortafuegos vamos a configurar unas cuantas reglas

Permitiendo conexiones desde nuestra red local

Por defecto ufw viene configurado para denegar todo el trafico de red entrante y permitir toda el trafico de salida, así que lo primero que hacemos es permitir la entrada de todo el trafico interno de nuestra red local

sudo ufw allow from 192.168.1.0/24

Con esta sencilla regla vamos a permitir que cualquier ordenador que se encuentre en el tramo de red 192.168.1.xxx pueda conectar con la rpi.

Configurando UFW para trabajar con OpenVPN

Lo primero es permitir hacer forwarding para que trabaje el NAT.

Editamos el fichero /etc/default/ufw y buscamos la directiva DEFAULT_FORWARD_POLICY y cámbianos el valor de DROP a ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Editamos el fichero /etc/ufw/before.rules,

sudo nano /etc/ufw/before.rules

Y añadimos el siguiente texto entre la cabecera y la linea filter, cambia la IP/subnet por la que corresponda en tu caso, lo puedes comprobar en /etc/openvpn/server.conf .

# NAT (Network Address Translation) table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Allow traffic from clients to eth0
-A POSTROUTING -s 10.8.0.0/24 -o enxb827eb06342b -j MASQUERADE

# do not delete the "COMMIT" line or the NAT table rules above will not be processed
COMMIT

Para saber tu interfaz de red ejecutamos:

ip route | grep default

default via 192.168.1.1 dev enxb827eb06342b src 192.168.1.3 metric 202
default dev tun0 scope link src 10.8.0.1 metric 204

enxb827eb06342b seria la insterfaz que uso (màs común puede ser eth0), tun0 corresponde a la interfaz que levanta openvpn.

Permitiendo las conexiones a nuestra red local VPN

Vamos a permitir que cualquier equipo que pertenezca a la red local de la VPN, 10.8.0.0/24, puedan conectarse a la rpi

sudo ufw allow from 10.8.0.0/24

La ultima regla que agrego es permitir las conexiones entrantes a la rpi desde cualquier dirección al puerto del servidor VPN, para que se puedan conectar los clientes+.

Supongamos que configuraste el puerto 1194 con el protocolo udp, como puerto de escucha en el servidor VPN, la regla seria:

sudo ufw allow 1194/udp

Activando UFW

Como dije antes, por defecto ufw viene configurado para denegar todas las peticiones entrantes y permitir todas las que salen, por lo que junto a las reglas que hemos ido agrandado ya tendremos configurado nuestro cortafuegos, solo queda activarlo, para ello:

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprobando funcionamiento

Así han quedado mis reglas

  • Permito salir todo el tráfico de red
  • Deniego todo el trafico entrante salvo las siguientes reglas:
    • Solo tienen acceso a la rpi los equipos de mi red local 192.168.1.0/24
    • Solo tienen acceso a la rpi los equipos de mi red local VPN 10.8.0.0/24
    • Permito las conexiones udp al puerto 1194 para la VPN.
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
Anywhere                   ALLOW IN    192.168.1.0/24
41194/udp                  ALLOW IN    Anywhere
Anywhere                   ALLOW IN    10.8.0.0/24
1194/udp                   ALLOW IN    Anywhere (v6)

Aprendiendo un poco mas sobre UFW

Con ufw no es necesario conocer el numero de puerto de un determinado servicio, ofrece la posibilitad de abrir o cerrar un puerto por el nombre de la aplicación

Para ver el listado de estas aplicaciones ya predefinidas

sudo ufw app list

Available applications:
  AIM
  Bonjour
  CIFS
  DNS
  Deluge
  IMAP
  IMAPS
  IPP
  KTorrent
  Kerberos Admin
  Kerberos Full
  Kerberos KDC
  Kerberos Password
  ....

Para abrir un puerto por el nombre de la aplicación:

sudo ufw allow 'WWW Secure'
sudo ufw allow KTorrent

Para cerrar un puerto por el nombre de la aplicación:

sudo ufw deny KTorrent

Abrir puerto

sudo ufw allow 1194/udp

sudo ufw allow 1714:1764/tcp
sudo ufw allow 1714:1764/udp

Cerrar puerto

sudo ufw deny 1194/udp

Borrar regla

sudo ufw delete allow 1194/udp
Rule deleted
Rule deleted (v6)

Activar ufw

sudo ufw enable

Desactivar ufw

sudo ufw disable

Borrar todas las reglas y dejar ufw por defecto

sudo ufw reset

Recargar ufw

sudo ufw reload

Ver el log

sudo more /var/log/ufw.log
sudo tail -f /var/log/ufw.log

Ver los puertos que están en modo escucha, esto es útil por si necesitamos abrir un puerto para un servicio en concreto

sudo ufw show listening | more

Aunque tambien podemos usar

sudo netstat -tanp | grep LISTEN

Denegar el acceso a una IP con 6 o mas intentos de conexión en menos de 30 segundos, si tienes habilitado sshd puede serte muy ótil

sudo ufw limit SSH

Errores

Me costo un poco encontrar la razón por la cual, después en reinicio de la Raspberry Pi, mis dispositivos no tenían acceso a Internet, tenían red, se veían entre ellos pero no resolvían las DNS, hasta que di con la solución, simplemente tenia que desinstalar el paquete iptables-persistent,

sudo apt purge iptables-persistent

Después de eso ahora mis dispositivos ya resolvían las DNS, por alguna razón, se mantenían las reglas previas en Iptables a las configuradas por UFW

Referencia https://www.cyberciti.biz/faq/howto-configure-setup-firewall-with-ufw-on-ubuntu-linux/

comentario powered by Disqus