viernes, agosto 22, 2014

Crear una cuenta con acceso restringido a Internet

Para quien le pueda interesar crear una configuración similar. Se trata de configurar en un ordenador un usuario para un niño, con acceso restringido a Internet, para que no se disperse cuando se supone que tiene que hacer otra cosa ;-).

En mi caso creé esta configuración porque cuando dejo al peque con un programa no quiero que el pillín en lugar de ponerse con ello busque juegos en Internet y se ponga a jugar a la que me descuido. Encima la publicidad que sale como que no es muy recomendable.

He creado en un ordenador con GNU/Linux una cuenta para el niño (les encanta tener su propia cuenta). Para que no tengan acceso a Internet, pero sí a servicios que puedan correr en la propia máquina, supongamos que el usuario del peque se llama "pepito", entonces ejecutamos como root:

iptables -I OUTPUT -m owner --uid-owner pepito  ! --destination 127.0.0.1 -j DROP

Hay varias formas de hacer que esta regla se ejecute cada vez que arranquemos el ordenador sin tener que escribilar de nuevo. Una que sirve para cualquier distribución de Linux es añadirla al fichero /etc/rc.local.

Permitir ir a algunos sitios

Por supuesto si se quiere conceder permiso de acceso a Internet es tan simple como tener otro script para quitar la regla de iptables (para quitar una regla, en lugar de -I o -A, se usa -D). Otro día podemos hablar de cómo poner/quitar la regla fácilmente desde nuestro smartphone.

Ahora bien, puede interesarnos permitir el acceso a Internet, pero sólo a determinadas webs para que se centren por ejemplo en buscar información sobre algo. Una posible solución es añadir reglas que permitan el acceso a determinadas direcciones. Por ejemplo, en lugar de la regla anterior, que bloqueaba totalmente el acceso a Internet para el usuario "pepito" podemos usar estas otras:

iptables -N pepito
iptables -I OUTPUT -m owner --uid-owner pepito -j pepito
iptables -A pepito -j DROP
iptables -I pepito --destination 127.0.0.1 -j ACCEPT

iptables -I pepito --destination museoescultura.mcu.es -j ACCEPT
iptables -I pepito --destination es.wikipedia.org -j ACCEPT

Como se ve, el tráfico a Internet originario del usuario "pepito" pasa una serie de reglas en la cadena "pepito". Si el destino es la IP local (127.0.0.1) o la Wikipedia o el Museo Nacional de Escultura (uno de los pocos musesos nacionales fuera de Madrid), se autoriza, para cualquier otro destino, se deniega.

Este mecanismo es simple, pero tiene sus carencias. Una de ellas es que iptables bloquea realmente el tráfico por dirección IP, no por nombre de sitio. Y los sitios con muchas visitas suelen tener varias direcciones, cuando no usar la infraestructura de una empresa, Akamai, con servidores por todo el mundo para que estén cerca de la red de los usuarios (por ejemplo mirar el resultado de nslookup www.redhat.com y nslookup www.oracle.com).

En la práctica posiblemente no nos de problemas. Aunque iptables lo que haga es resolver la IP y permitir sólo el acceso por esa IP, habitualmente el resultado de resolver la IP se cachea y posteriores peticiones del navegador darán la misma IP. Si así no fuera, se puede solucionar poniendo la IP en /etc/hosts.

Pero no es la solución ideal.

Mejor solución, usar un proxy

La solución más flexible es utilizar un proxy. Vamos a usar tinyproxy.

La idea es volver a poner la regla que impide a "pepito" acceder a Internet. En su lugar configuramos Firefox para usar como proxy web a tinyproxy (ponemos como IP a 127.0.0.1 y como puerto 8888). Como el proxy se ejecuta con su propia identidad y no como usuario "pepito" no le afecta la regla que corta el acceso a Internet. Configuramos tinyproxy para que sólo permita el acceso a las direcciones que enumeremos en un fichero.


El paquete tinyproxy existe tanto en distribuciones basadas en Debian como Fedora/RHEL/CentOS. En Debian el fichero de configuración está en /etc/tinyproxy.conf y en CentOS en /etc/tinyproxy/tinyproxy.conf

Editamos el fichero de configuración /etc/tinyproxy.conf para cambiar dos líneas:
  1. Filter: hay que poner la ruta del fichero en el que pondemos la lista de sitios que permitimos, un dominio por línea (si ponemos wikipedia.org, estamos permiendo tanto es.wikipedia.org como en.wikipedia.org).
  2. FilterDefaultDeny yes
Estas instrucciones son para Debian (supongo que funcionarán igualmente en Ubuntu, al estar basada en Debian). En CentOS son similares, pero el paquete tinyproxy está en el repositorio EPEL, el fichero de configuración en /etc/tinyproxy/tinyproxy.conf. Recordemos así mismo que en CentOS por instalar un servicio no se arranca automáticamente: hay que configurarlo explícitamente para que lo haga:
 chkconfig tinyproxy on
 service tinyproxy start

En CentOS 7 en lugar de chkconfig y service se usa systemctl enable/start.