Firewall: bloquear el acceso a internet a aplicaciones concretas

Hoy me ha surgido un problema con una de las aplicaciones que uso con los chicos en el aula. Una de esas que tienen opciones para descargar complementos, insertar publicidad, o llevar un seguimiento remoto de la actividad realizada con el programa.

firewall

Está claro que no me interesa que los chicos añadan/descarguen nada que pueda afectar al uso para el que se pensó la instalación de dicho programa, o que les bombardeen con publicidad nada apropiada para su edad, ni que sepan las veces o no que utilizo la herramienta o de que manera. En MS Windows bastaría con aplicar reglas específicas en el cortafuegos, pero ¿cómo lo hago en Linux?

Filtrando las peticiones a direcciones/sitios

Como primera opción me planteé bloquear las direcciones y dominios que utilizaba el programa en cuestión. Para averiguarlas tenía un par de opciones rápidas:

1) arrancar el programa y en un terminal de consola aparte ejecutar algo como esto (prueba con -ntpW para obtener las IPs):

netstat -tpW | grep "nombre o PID del programa"

netstat

(en el ejemplo de la imagen se han buscado las conexiones abiertas para el programa «firefox»)

2) Utilizar el servicio «dnsmasq» para monitorizar las peticiones que se realizan (revisa el siguiente artículo para saber como configurarlo):

sudo killall -9 dnsmasq
sudo dnsmasq --no-daemon --log-queries

f2

(Nota: en este caso no podemos discriminar por proceso)

Una vez obtenidas las direcciones de los sitios a bloquear sólo has añadirlas al fichero «/etc/hosts» de la forma

127.0.0.1   dominio_a_bloquear

… o puedes configurar reglas de cortafuegos específicas para las IPs y cargarlas en el fichero «/etc/rc.local» antes de la línea «exit 0»:

iptables -I OUTPUT -s ip_a_bloquear -j DROP

El problema de estos métodos es que bloquean el acceso para todas las aplicaciones del sistema (efecto global), no sólo a las que nos interesan. Además las direcciones y dominios pueden pertenecer a otros servicios a los que sí queremos acceder en otras circunstancias y desde otros programas.

Filtrado por grupo de usuarios

Otra solución es aprovecharnos de la forma en la que se le asignan privilegios a los procesos en Linux: asignándoles los del grupo y usuario que lo ejecuta. Y de la capacidad de filtrado de paquetes de red del sistema creando una regla que afecte a los procesos cuyo  «grupo propietario» con el que se ejecuta sea uno en particular:

1) Vamos a crear un nuevo grupo de usuarios específico para este propoósito

sudo groupadd filtrado

2) Añadimos al grupo a los usuarios que queramos controlar

sudo adduser alumno filtrado

3) Creamos una regla de iptables pata bloquear las peticiones de red desde procesos asociados a ese grupo

iptables -A OUTPUT -m owner --gid-owner filtrado -j REJECT

… y la escribimos en el fichero «/etc/rc.local» (antes de la última línea que pone «exit 0«) para que se ejecute cada vez que iniciemos el sistema.

Ejemplos de uso:

Ahora sólo tenemos que iniciar los programas indicando a Linux que lo haga asignándole uno de los grupos a los que pertenezca el usuario (en los ejemplos el usuario es «alumno«, al que previamente añadimos al grupo «filtrado«):

sg filtrado "nombredelprograma"

… y sí: las comillas » » son obligatorias para indicar el programa. Por ejemplo, si queremos ejecutar un programa de windows con wine:

sg filtrado "wine ruta_y_nombre_al_programa.exe"

A partir de aquí sólo nos queda modificar los accesos a los programas que nos interesen para que invoquen los ejecutables de esta manera.

Modificando y añadiendo adecuadamente las reglas de iptables podemos ser capaces de bloquear total o parcialmente (sólo direcciones/protocolos concretos) el acceso a internet de nuestros procesos. Incluso tener distintos grupos con diferentes «niveles de acceso»…