Isolation par Docker

le

Le linuxien prudent n'aime pas les surprises.

Le linuxien prudent n'aime pas les surprises. Pour limiter les surprises que peut faire une application, il faut tout simplement l'isoler.

Sans aller jusqu'à Bash (ahem...), ne pas vouloir que Skype, Chrome, Steam, Minecraft, ... et même Firefox voient le reste du système est plus que légitime.

La solution la plus traditionnelle est le classique chroot, facile à mettre en place, mais à la réputation controversée (surtout par les gens utilisant les jails de BSD).

Apparmor propose aussi sa solution, mais sans faire rêver plus que ça.

Niveau buzzword, ces technologies sont quand même à la ramasse, pourquoi ne pas utiliser tout bêtement Docker?

Docker est tout simplement un outil conçu pour lancer une application dans un contexte (RAM, CPU, disque, réseau), de manière simple et économe. Personne ne vous oblige a y accoler le mot Cloud, que vous avez déjà tant de mal à expliquer.

Isoler une application consiste à ne lui donner accès qu'aux services dont elle a besoin, et de manière explicite.

Firefox

Firefox utilise une interface graphique, et a donc besoin de X11.

X11vnc est utilisable depuis un docker, mais c'est quand même moche comme approche. Lancer un X11 dans un Docker est faisable, mais c'est une idée atroce. Non, le plus simple est de donner accès à la socket X11 de l'hôte au container : -v /tmp/.X11-unix:/tmp/.X11-unix Pour ne pas avoir de soucis de droits, il faut que l'utilisateur Docker utilise les mêmes uid/gid que l'hôte.

Firefox fait du bruit, en natif depuis HTML5, avec l'aide sournois de Flash depuis longtemps.

Pulseaudio propose un mode client/serveur, il faut donc configurer l'hôte comme serveur : /etc/pulse/system.pa :

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;172.17.0.0/16

172.17.0.0/16 est le réseau Docker par défaut.

Dans le container une simple variable d'environement précise où se trouve le serveur : PULSE_SERVER=tcp:172.17.42.1

Firefox écrit des choses sur le disque dur.

Au-delà des prévisibles téléchargements, Firefox conserve un historique, des mots de passe, et installe même parfois des plug-ins.

Il suffit de mettre à disposition les dossiers suivants

  • ~/.mozilla : Le profil firefox (historique, mots de passe, plug-ins)
  • ~/Downloads : Les téléchargements
  • ~/.cache/mozilla : Le cache de firefox

Tout cela nous donne comme Dockerfile :

FROM debian:sid
# Base install
RUN echo "deb http://ftp.fr.debian.org/debian/ sid main contrib" > /etc/apt/sources.list && \
apt-get -q update && \
apt-get -q upgrade -y && \
apt-get -q install -y adduser ca-certificates iceweasel pulseaudio && \
apt-get -q install -y flashplugin-nonfree
# Add user (same name, uid, gid !!)
RUN adduser --disabled-password --gecos hybris hybris
# Prepare env
USER hybris
ENV DISPLAY :0.0
ENV PULSE_SERVER tcp:172.17.42.1
ENV LC_ALL C.UTF-8
# Launch ssh (used to open links from outside firefox)
CMD iceweasel

Un petit script pour avoir son pseudo firefox local:

#! /bin/bash
docker run -d --name firefox -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /home/hybris/.mozilla:/home/hybris/.mozilla \
    -v /home/hybris/Downloads:/home/hybris/Downloads \
    hybris:firefox
# firefox container should be launched before using this script
if ! docker inspect firefox > /dev/null 2>&1; then
    docker run --rm -d --name firefox -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /home/hybris/.mozilla:/home/hybris/.mozilla \
    -v /home/hybris/Downloads:/home/hybris/Downloads hybris:firefox
fi
if ! docker top firefox > /dev/null 2>&1; then
    docker start firefox
fi
if [ $# -ne 0 ]; then
    for i in $@; do
        docker exec firefox iceweasel "$i"
    done
fi

Notons l'usage de docker exec apparut dans la version 1.3, qui évite de faire des choses très sales avec du ssh.

Voila la recette pour Firefox, il ne reste plus qu'à décliner pour les autres : Les Dockerfiles d'Hybris

Service Conseil et accompagnement

Bearstech vous propose ses services Conseil et accompagnement docker

Découvrir ce service

Partager cet article

Flux RSS


Partager cet article :