X

Firejail, un sandbox para Linux para ejecutar programas de forma segura

En el pasado explicamos de forma simplificada que es un sandbox y los posibles usos que le podemos dar. A raíz de este post, a continuación veremos como usar un sandbox llamado Firejail en Linux.

ALGUNOS DATOS SOBRE EL SANDBOX FIREJAIL

Firejail en un programa que utiliza SUID (Set user ID), los espacios de nombres del kernel Linux (Linux Namespaces) y seccomp-bpf para crear un sandbox. De esta forma podremos ejecutar cualquier tipo de programa de forma segura en un entorno controlado.

Podemos usar Firejail en multitud de programas y aplicaciones. Algunos ejemplos son los siguientes:

  1. En aplicaciones gráficas como por ejemplo un navegador web, un programa para descargar Torrent, en Skype, en un reproductor de vídeo como VLC, etc.
  2. En programas que se ejecutan en un servidor y a través de la terminal como por ejemplo el servidor web apache.

Por la experiencia que he tenido con este sandbox puedo afirmar lo siguiente:

  1. Es ligero. La velocidad de ejecución de los programas dentro del sandbox es la misma que fuera del sandbox.
  2. Al arrancar el ordenador no se cargan procesos adicionales en memoria. Por lo tanto podemos instalar Firejail con total tranquilidad porque únicamente consumirá recursos en el momento de generar y cargar el programa en el sandbox.
  3. El programa prácticamente no tiene dependencias. Por lo tanto la cantidad de paquetes que instalaremos será mínima.
  4. Su uso es extremadamente sencillo. Incluso un usuario básico puede usar este sandbox.

INSTALAR EL SANDBOX FIREJAIL EN LINUX

Para instalar el sandbox y usarlo exclusivamente a través de la terminal tenemos que ejecutar el siguiente comando en la terminal:

sudo apt-get install firejail

Si además queremos disponer de una interfaz gráfica para gestionar nuestro sandbox ejecutaremos el siguiente comando en la terminal:

sudo apt-get install firetools
Nota: En este artículo nos focalizaremos en el uso de Firejail a través de la terminal. El motivo es sencillo, la terminal ofrece muchas más opciones que la interfaz gráfica.

INSTRUCCIONES PARA USAR FIREJAIL EN LA TERMINAL

Las instrucciones a seguir para gestionar nuestro sandbox a través de la terminal son las siguientes:

Los perfiles de configuración de Firejail

Firejail incluye perfiles de configuración predeterminados para multitud de programas en Linux. En estos perfiles de configuración es donde se definen las propiedades para aislar el programa del resto del sistema operativo. En estos ficheros de configuración podemos definir parámetros como por ejemplo:

  1. Las carpetas de nuestro sistema de archivos a las que tendrá acceso el programa que se ejecuta en el sandbox.
  2. Los permisos que tendrá el programa sobre ciertos directorios de nuestro sistema operativo.
  3. Si lo programas tienen acceso al servidor de sonido.
  4. Deshabilitar la aceleración 3D de un programa en concreto.
  5. Usar unos DNS específicos para un programa usado dentro del sandbox.
  6. Determinar si el programa tendrá acceso a Internet.
  7. Etc.

Para ver la totalidad de perfiles disponibles podemos ejecutar el siguiente comando en la terminal:

ls /etc/firejail/

Modificar los perfiles de configuración estándar

Si queremos modificar alguna característica de un perfil estándar tenemos que acceder a su código y modificarla. A modo de ejemplo, para modificar el código del perfil de Firefox deberíamos ejecutar el comando:

sudo nano /etc/firejail/firefox.profile

Una vez abierto el editor de texto deberemos modificar los parámetros pertinentes. Para conocer la totalidad de parámetros existentes y su funcionalidad les recomiendo que abran un terminal y ejecuten el siguiente comando:

man 5 firejail-profile

Después de ejecutar el comando obtendrán una explicación detallada de todos los parámetros de configuración que podemos usar con Firejail.

Crear perfiles de programas que están no disponibles

Firejail dispone de perfiles de configuración para más de 300 programas. No obstante, puede darse el caso que tengamos que ejecutar un programa que no no disponga de ningún perfil. En tal caso se usará un perfil estándar.

Si el perfil estándar no es de nuestro agrado podemos crear/modificar un perfil de configuración para el programa en cuestión. Para ello les recomiendo que sigan las instrucciones de los siguientes enlaces:

De esta forma relativamente simple crearemos perfiles de configuración adaptados a nuestras necesidades para la totalidad de nuestros programas.

Si no queremos crear nuestros propios perfiles podemos usar los que podéis encontrar en los siguientes enlaces:

Ejecutar un programa dentro del sandbox

Ejecutar un programa en el sandbox es fácil gracias a los perfiles de configuración que hemos visto en el apartado anterior.

Para abrir un programa en el sandbox tan solo tenemos que abrir una terminal y teclear firejail seguido del comando que usaríamos para ejecutar el programa desde la terminal. Por lo tanto, para ejecutar Firefox en el sandbox ejecutaríamos el siguiente comando en la terminal:

firejail firefox

Al ejecutar el comando arrancará Firefox dentro dentro del sandbox. Al no indicar ningún tipo de parámetro se iniciará con la configuración predeterminada de Firefox.

Ejecutar un programa modificando la configuración estándar

Es posible iniciar un programa añadiendo/modificando algunas de las configuraciones que figuran en el perfil de configuración.

Para ello ejecutaremos el comando firejail seguido las opciones para modificar provisionalmente el perfil del programa más el comando para ejecutar el programa en la terminal. Por lo tanto, si queremos ejecutar VLC sin que tenga acceso a internet ejecutaremos el siguiente comando:

firejail --net=none vlc

Si queremos que vlc siempre arranque de este modo podríamos realizar las siguientes modificaciones.

Primero creamos la carpeta que alojará los ficheros que modificaran la configuración estándar de un programa determinado. Para ello ejecutamos el siguiente comando en la terminal:

mkdir ~/.config/firejail/

Seguidamente creamos el fichero que modificará la configuración predeterminada de VLC ejecutando el siguiente comando en la terminal:

nano ~/.config/firejail/vlc.profile
Nota: El nombre del fichero tiene que ser el mismo que el nombre del perfil estándar.

Una vez se abra el editor de textos pegamos el siguiente código:

include /etc/firejail/vlc.profile
net none

La primera línea contiene la palabra include seguida de la ruta que contiene el perfil estándar que queremos modificar. La segunda línea contiene los nuevos parámetros de configuración que queremos aplicar. Una vez realizados los cambios los guardamos y cerramos el fichero.

La próxima vez que arranquemos VLC en el sandbox, no tendrá acceso a internet. Por lo tanto, VLC únicamente será útil para reproducir ficheros de vídeo y sonido locales.

Ejecutar un programa en modo privado

Firejail nos permite ejecutar programas en modo privado. Este modo tiene las siguientes particularidades:

  1. Es la opción que ofrece más seguridad para ejecutar un programa o para acceder a nuestras cuentas bancarias.
  2. El modo privado utiliza la configuración estándar de un programa. Por lo tanto, si abrimos Google Chrome en modo privado dispondremos de la configuración estándar de Chrome sin ninguna extensión instalada. Esto puede resultar útil porque cuantas más extensiones usemos y más modifiquemos la configuración, más inseguro estamos haciendo nuestro navegador.
  3. El programa se ejecuta en un sistema de ficheros temporal (tmpfs). Por lo tanto absolutamente todos los ficheros que se almacenen en el sistema de archivos temporal serán borrados al cerrar nuestro sandbox.
  4. Este modo permite ejecutar programas sin necesidad de modificar ningún archivo en nuestro disco duro.

Para ejecutar el navegador Google Chrome en modo privado y forzando que se utilicen por defecto los dns de Google ejecutaremos el siguiente comando en la terminal:

firejail --private --dns=8.8.8.8 --dns=8.8.4.4 google-chrome

Este ejemplo que acabamos de ver es una buena solución en el caso que queramos acceder nuestras cuentas bancarias de forma segura a través de Internet.

Hacer que los programas dentro del sandbox tengan su propia red

Mediante Macvlan existe la posibilidad que los programas ejecutados en el sandbox tengan una ip interna distinta a la de nuestro ordenador, un firewall propio, su propia tabla ARP, etc.

Para ello tenemos que ejecutar un comando del siguiente estilo:

firejail --net=nombre_interfaz_de_red nombre_del_programa

Por lo tanto, si nuestra interfaz de red es eth0 y queremos ejecutar Firefox con una IP interna distinta a la de nuestro ordenador ejecutaremos el siguiente comando:

firejail --net=eth0 firefox

Si además queremos definir una IP concreta podemos ejecutar el siguiente comando:

firejail --net=eth0 --ip=192.168.1.80 firefox
Nota: Esta opción únicamente funciona para redes cableadas. Actualmente no está soportado en redes inalámbricas.

Limitar el ancho de banda de un programa que se ejecuta dentro del sandbox

Si nos apetece también podemos limitar el ancho de banda que consumen los programas que se ejecutan dentro del sandbox. Para ello deberemos seguir las siguientes instrucciones:

Primero crearemos una sandbox con nombre navegador y una interfaz de red propia para arrancar Firefox. Para ello ejecutaremos el siguiente comando en la terminal:

firejail --name=navegador --net=eth0 firefox

A continuación abriremos otra terminal y limitaremos el ancho de banda del sandbox navegador ejecutando el siguiente comando en la terminal:

firejail --bandwidth=navegador set eth0 80 20

De este modo estamos aplicando la siguiente limitación:

  1. La velocidad máxima de descarga de Firefox será de 80 kilobytes.
  2. La velocidad de subida máxima será de 20 kilobytes por segundo.

Si en algún momentos queremos eliminar los límites de velocidad impuestos, tan solo tenemos que ejecutar el siguiente comando:

firejail --bandwidth=navegador clear eth0

Comprobar que un programa se está ejecutando dentro del sandbox

Para comprobar que un programa se está ejecutando dentro del sandbox tan solo tenemos que ejecutar el siguiente comando:

firejail --list

Después de ejecutar el comando obtendréis un resultado parecido al siguiente:

joan@debian:~$ firejail --list
5394:joan:firejail firefox 
5628:joan:firejail vlc 
5735:joan:firejail --list

Observando el resultado podemos ver que los programas que estamos ejecutando son firefox y vlc.

Ver los recursos que está consumiendo un programa dentro del Sandbox

Si queremos monitorizar el uso de recursos de estos dos programas podemos ejecutar el siguiente comando:

firejail --top

El resultado obtenido será el siguiente:

PID    User   RES(KiB)  SHR(KiB)   CPU%   Prcs    Uptime       Command
5394   joan   575692    253608     99.0   4       00:04:35     firejail firefox
5628   joan   60380     47372      0.0    3       00:04:22     firejail vlc
6360   joan   8028      6968       0.0    3       00:02:21     firejail top
7162   joan   2148      1984       0.0    1       00:00:04     firejail --top

Acceder dentro de un un Sandbox para administrarlo

Si tenemos necesidad de acceder dentro de un sandbox para modificar ciertos parámetros, como por ejemplo comprobar una configuración de red, tenemos que seguir las siguientes instrucciones:

Tan solo tenemos que ejecutar el comando firejail –join= seguido del número de PID del programa que se ejecuta en el sandbox. Si miramos las salidas de los comandos los anteriores apartados vemos que Firefox tiene el PID número 5394. Por lo tanto para acceder dentro del sandbox de Firefox ejecutaremos el siguiente comando en la terminal:

sudo firejail --join=5394

El resultado obtenido es el siguiente:

Switching to pid 5395, the first child process inside the sandbox
Child process initialized in 2.61 ms
root@debian:/home/joan#

Una vez dentro del sandbox podremos realizar las tareas de administración que consideremos oportunas.

Usar el sandbox de forma predeterminada.

Para usar firejail de forma predeterminada en todas las aplicaciones que dispongan de un perfil tenemos que ejecutar el siguiente comando en la terminal:

sudo firecfg

Este comando creará enlaces simbólicos de todas las aplicaciones que dispongan de un perfil de Firejail en la ubicación /usr/local/bin y apuntarán a /usr/bin/firejail. De este modo, cada vez que arranquemos un programa que disponga de un perfil arrancará dentro del sandbox

Para hacer que los programas vuelvan arrancar fuera del sandbox deberán acceder en la ubicación /usr/local/bin y borrar la totalidad de enlaces simbólicos que se crearon con el comando firecfg.

Podemos usar Firejail de forma predeterminada en una sola aplicación creando un enlace simbólico de forma manual. Para ello ejecutamos un comando del siguiente tipo:

sudo ln -s /usr/bin/firejail /usr/local/bin/nombre_programa

Por lo tanto si queremos que Firefox arranque de forma predeterminada en el sandbox deberemos ejecutar el siguiente comando en la terminal:

sudo ln -s /usr/bin/firejail /usr/local/bin/firefox

Si algún día queremos deshacer esta configuración, tan solo tenemos que acceder en la ubicación /usr/local/bin/ y borrar el enlace simbólico de Firefox.

Usar servidores gráficos alternativos a X11

Firejail permite usar servidores gráficos alternativos a X11. Concretamente permite utilizar los servidores gráficos Xpra and Xephyr.

Al usar estos servidores gráficos alternativos podremos protegernos contra Keyloggers y capturadores de pantalla.

Si queréis hacer uso de esta funcionalidad, lo primero que tendréis que realizar es instalar estos servidores gráficos ejecutando el siguiente comando en la terminal:

sudo apt-get install xpra xserver-xephyr

Una vez instalados los servidores ejecutaremos los programas usando comando similares a los siguientes:

firejail --x11=nombre_servidor comando_arrancar_programa

Por lo tanto, si quiero arrancar vlc sin tener conexión de red mediante el servidor gráfico Xephyr ejecutaré el siguiente comando en la terminal:

firejail --x11=xephyr --net=none vlc

En el caso que quisiéramos usar el servidor Xpra debe riamos haber usado el siguiente comando:

firejail --x11=xpra --net=none vlc

¿CÓMO OBTENER MÁS INFORMACIÓN?

Si quieren más información sobre el uso de este sandbox les recomiendo que visiten la web de su autor y su página de github.

Ver los comentarios (12)

    • Hola Jairo

      Coincido en tu opinión. Firejail es un software muy útil para determinado tipo de usuarios.

      Saludos

  • uffff que buen artículo, visito muchos blogs y algunos foros y nunca había leído nada acerca de poder usar un sandbox en linux. Veo que es muy poderoso usar esto.

    Yo en principio creo que sólo lo usaría para los navegadores web y supongo que también es muy útil para usarlo con un gestor de contraseñas como keepassx para mantenerlo apartado del resto.

    Una pregunta: lo que se ejecuta en el sandbox entiendo que no tiene acceso a los datos en memoria de otras aplicaciones y viceversa ¿no? Si eso es así viene genial para usarlo en navegadores web por si alguna web maliciosa intenta acceder a la información almacenada en memoria o en el disco duro y lo mismo para un gestor de contraseña ya que yo siempre tengo en ejecución keepassx y así se evita que alguna aplicación tenga acceso a su contenido.

    Gran artículo, eres un crack.

    • Hola

      Todo Sandbox actua como mencionas. En caso contrario no es un sandbox. Las utilidades que mencionas son ideales para usarlas en un Sandbox, de hecho algunos navegadores traen ya su propio sandbox.

      Saludos

      • hola de nuevo.

        Sabes si firefox y chromium traen su propio sandbox, en caso de sí ¿tendría sentido usar firejail con estos navegadores?

        gracias.

  • Extremadamente interesante esta herramienta. Y muy buen artículo por cierto.

    Antes en windows utilizaba mucho "sandboxie" pero no conocía ninguna alternativa para linux cuando hice el cambio.

    Echo mucho de menos un mecanismo con el que contaba sandboxie que no he visto nunca en linux:

    Sandboxie tenia un mecanismo de "Copy on Write" que permitía evitar que los ficheros sufrieran alteraciones fuera de la sandbox, de tal forma que resultaba muy sencillo inspeccionar que modificaciones ha podido realizar un proceso dentro de esta.

    ¿Sabes si firejail cuenta con algún mecanismo parecido?

    • Hola,

      Sí que lo tiene. Si lees el artículos encontrarás como usar el modo que mencionas.

      Saludos.

      • Epah! Pues me lo he debido de saltar, porque no he visto tal cosa.

        ¿Te refieres al modo privado?

        Si es así, creo no es lo mismo. Por lo que he leído y probado, monta unos directorios temporales tanto para el /home como para /root, lo que es distinto de lo que sandboxie hace.

        Con el modo privado dejas de tener acceso a los ficheros que tienes en tu home, mientras que con CoW sigues teniendo ese acceso, solo que si realizas cambios en un fichero este no se pierde, sino que persisten ambas versiones del mismo. La versión modificada para la sandbox y la original para el resto del sistema.

        Si no es eso y te refieres a otra parte del articulo ya dirás, porque lo he repasado 2 veces y no he visto tal comportamiento por ningún lado.

        • Hola

          Diria que no tiene la función que mencionas. Pero si quieres salir de dudas lo puedes probar tu mismo. En menos de un minuto puedes instalar y usar Firejail.

          Saludos

          • Buenas.

            Ok entendido. Ya lo había instalado y probado mientras leía el articulo.

            Creo que tal vez se pueda combinar con otras tecnologías como LVM o ZFS para dar esa funcionalidad de CoW. LXD por ejemplo lo hace con las snapshots de ZFS, pero es un poco coñazo tener que configurar todo un contenedor si solo deseas probar un simple programa.

            Aun así gracias por todo. Desconocía la herramienta.

          • Buenas,

            Otra cosa que puedes hacer es ir a la web de los desarrolladores y proponer la característica que estás buscando. Por lo que veo el desarrollo de Firejail está activo y no es el típico software que sale y no se actualiza más.

            Saludos y felices fiestas

Artículos Relacionados