Sandboxing con Firejail

Firejail es una herramienta fácil de usar, que nos permite realizar una especie de jaula con aplicaciones, especialmente útil para navegadores, clientes de correo electrónico, etc.

Instalación

$ sudo pacman -Syu firejail

Para que el funcionamiento de la herramienta sea óptimo debemos utilizar un kernel con el user-namespaces habilitado. En el caso de Arch, se recomienda utilizar en conjunción con el kernel linux-grsec, que lleva los parches grsecurity y habilitada esta opción o el kernel linux-usernd (disponible en el AUR).

Además, podemos añadir los siguientes paquetes (del AUR), con utilidades y perfiles predefinidos:

$ yaourt -S firetools firejail-profiles firejail-extras firectl

Existen diferentes formas de lanzar firejail:

Linea de comandos

 $ firejail nombre_aplicación

Desde los menus

En este caso hay que modificar el .desktop asociado. Por orden de preferencia, sería:

   ~/.local/share/applications/aplicacion.desktop

     /usr/local/share/applications/aplicacion.desktop

    /usr/share/applications/aplicacion.desktop

Añadiremos en el fichero deseado firejail en la cláusala “Exec”.

Si solo queremos que lo use el usuario actual, editaríamos/crearíamos el primero.

Si lo queremos por defecto para todos los usuarios, el segundo.

El tercero corresponde al paquete, por lo que se sobreescribe en cada actualización y, en todo caso, lo usaremos como plantilla para crear los .desktop de la primera y segunda opción.

Si se tratase de una aplicación que queremos que se ejecute en el inicio, el .desktop quedará ubicado en:

 ~/.config/autostart/

Entre las opciones disponibles para ejecutar firejail, disponemos de dos interesantes:

firejail –seccomp aplicación

Con la opción seccomp añadimos seguridad adicional.

firejail –seccomp –private aplicación

Con la opción private, no monta dentro del contenedor ningún directorio del usuario, muy útil para, por ejemplo, navegar por sitios “peligrosos” sin correr riesgos. Una vez se cierra la aplicación, no quedan «rastros» en el disco.

Según la aplicación a ejecutar, se usará un perfil predefinido que indica qué se debe añadir al contenedor para que funcione correctamente. En el caso de no existir un perfil para la misma, se utiliza uno genérico. Es por ello que hemos instalado los paquetes firejail-profiles y firejail-extras.

Veamos un ejemplo con firefox:

Si queremos ejecutarlo desde la línea de comandos, usaremos:

$ firejail firefox

Se lanzará con su perfil (todos los perfiles disponibles los tenemos en /etc/firejail/).

Bien, si queremos que no haya ningún cambio en disco, es decir, que sea totalmente transparente su ejecución, usaremos:

$ firejail –seccomp –private firefox

Sin embargo, esto es engorroso, si queremos utilizar por defecto firejail. Pare ello disponemos de varias opciones:

– Crear un enlace simbólico:  

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

De esta forma, cada vez que lancemos firefox, lo hará con firejail. Esto funciona siempre que no se utilicen rutas absolutas y el path /usr/local/bin tenga preferencia o esté en la variable PATH (por defecto, para los usuarios es así).

Una herramienta que nos facilita la creación de estos enlaces es firecfg.

Sin embargo, es posible que queramos ejecutar con la opción –seccomp. Bien, para ello, podemos crear un pequeño scritp en bash. Siguiendo el ejemplo, creamos el fichero /usr/local/bin/firefox, con el siguiente contenido.

firejail –seccomp /usr/bin/firefox $@

y le damos permisos de ejecución:

sudo chmod +x /usr/bin/firefox

De esta manera, podemos añadir las opciones personalizas que deseemos.

– Modificar los .desktop:

Si lanzamos la aplicación desde el menú del escritorio en el que nos encontremos, probablemente, no se ejecutará enjaulado. El motivo es que porque se suele utilizar la ruta completa, con lo que el paso anterior es ignorado. Parar evitar problemas, eliminamos los enlaces simbólicos anteriores antes de utilizar este médoto. Siguiendo el ejemplo anterior, vamos a hacer lo siguiente:

sudo mkdir -p /usr/local/share/applications/

sudo cp /usr/share/applications/firefox.desktop /usr/local/share/applications/

Si solo lo queremos disponible para nuestro usuario:

cp /usr/share/applications/firefox.desktop ~/share/applications/

Ahora editamos el fichero y buscamos todas las ocurrencias de “Exec”, cambiando el contenido por:

Exec=firejail –seccomp firefox %u

Con esto estaría todo lo necesario para aplicaciones, pero… ¿y para daemons? Bueno, dado que estamos utilizando systemd, deberemos modificar la unidad correspondiente. Para evitar que sea sobreescrita, realizarmos lo siguiente:

sudo mkdir /usr/lib/systemd/system/unidad_a_sobreescribir.service.d

Y crearemos un fichero dentro de ese directorio, con la configuración nueva, con la extensión conf (por ejemplo firejail.conf):

[Service]

ExecStart=

ExecStart=firejail –seccomp binario

Sustituyendo “binario” por el contenido del ExecStart original, disponible en /usr/lib/systemd/system/unidad_a_sobreescribir.service.

Es importante la opción “ExecStart=” ya que, de no ponerla, se ejecutarán la original y la sobreescrita.

De esta forma, aunque reinstalemos el paquete afectado, esta configuración no se perderá.

Hecho esto, debemos recargar la lista de daemons:

sudo systemctl daemon-reload

Y ya podemos lanzar el servicio en cuestión.

Ahora ya sabemos cómo lanzar las aplicaciones con firejail. Toca ver cómo monitorizarlas. Es por ello que instalamos firetools.

Si lanzamos firetools, veremos que se nos abre una especie de dock, con varios iconos. Son lanzadores de aplicaciones con perfil de firejail, detectadas en nuestro sistema. Por supuesto, estos lanzadores podemos editarlos y añadir opciones personalizadas.

En cualquier caso, la utilidad real se encuentra pulsando sobre “Firetools”. Se nos abrirá una ventana donde podemos ver una lista de aplicacicones enjauladas, su árbol de procesos, podremos navegar por su sistema de ficheros, etc. Sin duda, una utilidad bastante interesante si vamos a usar esta herramienta de sandboxing.

Más información: https://firejail.wordpress.com/documentation-2/firefox-guide/

¡Espero que os haya gustado! 😉

 

 

 

@MMontesDiaz