Protegiendo la Raspberry Pi

6 minutos de lectura

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

1sudo nano /etc/ssh/sshd_config

Buscamos y dejamos el valor tal y como lo pongo

1PasswordAuthentication no

Desactivando login para root en SSH

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

1PermitRootLogin no

Y reiniciamos el servicio:

1sudo 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:

1sudo 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

1sudo 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:

1DEFAULT_FORWARD_POLICY="ACCEPT"

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

1sudo 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 .

1# NAT (Network Address Translation) table rules
2*nat
3:POSTROUTING ACCEPT [0:0]
4
5# Allow traffic from clients to eth0
6-A POSTROUTING -s 10.8.0.0/24 -o enxb827eb06342b -j MASQUERADE
7
8# do not delete the "COMMIT" line or the NAT table rules above will not be processed
9COMMIT

Para saber tu interfaz de red ejecutamos:

1ip route | grep default
2
3default via 192.168.1.1 dev enxb827eb06342b src 192.168.1.3 metric 202
4default 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

1sudo 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:

1sudo 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:

1sudo ufw enable
2Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
3Firewall 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.
 1sudo ufw status verbose
 2Status: active
 3Logging: on (low)
 4Default: deny (incoming), allow (outgoing)
 5New profiles: skip
 6
 7To                         Action      From
 8--                         ------      ----
 9Anywhere                   ALLOW IN    192.168.1.0/24
101194/udp                  ALLOW IN    Anywhere
11Anywhere                   ALLOW IN    10.8.0.0/24
121194/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

 1sudo ufw app list
 2
 3Available applications:
 4  AIM
 5  Bonjour
 6  CIFS
 7  DNS
 8  Deluge
 9  IMAP
10  IMAPS
11  IPP
12  KTorrent
13  Kerberos Admin
14  Kerberos Full
15  Kerberos KDC
16  Kerberos Password
17  ....

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

1sudo ufw allow 'WWW Secure'
2sudo ufw allow KTorrent

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

1sudo ufw deny KTorrent

Abrir puerto

1sudo ufw allow 1194/udp
2
3sudo ufw allow 1714:1764/tcp
4sudo ufw allow 1714:1764/udp

Cerrar puerto

1sudo ufw deny 1194/udp

Borrar regla

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

Activar ufw

1sudo ufw enable

Desactivar ufw

1sudo ufw disable

Borrar todas las reglas y dejar ufw por defecto

1sudo ufw reset

Recargar ufw

1sudo ufw reload

Ver el log

1sudo more /var/log/ufw.log
2sudo 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

1sudo ufw show listening | more

Aunque tambien podemos usar

1sudo 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

1sudo 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,

1sudo 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