Du vin dans un bac à sable - Wine in a sandbox

Wine est un instrument merveilleux pour tous ceux qui ne veulent plus de Windows, mais ne peuvent pas non plus se passer entièrement d’une poignée d’applications dont les équivalents sous OS libre sont décevants. Ainsi, pour les maniaques de la copie audio parfaite, Exact Audio Copy est largement supérieur à Rubyripper (moins efficace et dont le développement a cessé) ou à Morituri (sans aucune souplesse en ce qui concerne les tags).
Cependant, Wine a un inconvénient majeur : il ouvre la machine aux menaces spécifiques à Windows. Sur les forums, on lit souvent des réponses à ce problème du type : « Mais comme on ne lance pas Wine en root, on ne compromet pas sa machine. » Certes, mais on expose toutes les données auxquelles l’utilisateur de l’application a accès, ce qui est très suffisant pour faire peur…

Les méthodes de sécurisation les plus simples (comme winetricks sandbox, qui supprime des lecteurs avec winecfg) n’étant pas très efficaces, mieux vaut se tourner vers la virtualisation. Cependant, outre que cette solution est lourde, EAC ne fonctionnera pas correctement sur un Wine de machine virtuelle Virtualbox, à cause du pilote virtualisé du CD-ROM.

Sous FreeBSD, il suffit de faire tourner Wine dans une jail. Mais sous Linux, la mise en place de container LXC était une opération lourde, assez décourageante pour un besoin aussi basique.

La donne a cependant changé avec l’arrivée de Docker : il devient en effet assez facile de créer un container pour faire tourner une application graphique sous Wine.

Voici comment je m’y suis pris.

Fichier Dockerfile pour créer le container :

:::text
FROM ubuntu:

ENV DEBIAN\_FRONTEND noninteractive

RUN apt-get update -y  
RUN apt-get install -y python-software-properties software-properties-common
RUN add-apt-repository -y ppa:ubuntu-wine/ppa  
RUN dpkg --add-architecture i386  
RUN apt-get update -y  
RUN apt-get install -y wine1.7 winetricks  
RUN apt-get purge -y python-software-properties  
RUN apt-get autoclean -y

\# Remplacer 1002 & 100 avec user & group id  
RUN export uid=1002 gid=100 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER utilisateur  
ENV HOME /home/utilisateur  
CMD /usr/bin/wine

Un petit coup de docker build utilisateur/wine.
Le container est construit. Reste qu’il ne faut pas y placer les données, si on veut pouvoir le faire évoluer et se mettre à jour. Le plus pratique pour pouvoir aussi échanger des fichiers entre l’hôte et le container est de créer un dossier Wine sur l’hôte qu’on montera comme home dans le container avec : -v emplacement-dossier-Wine:/home
Il faut créer à l’intérieur un dossier au nom de l’utilisateur : mkdir utilisateur
Pour rediriger le container vers la sesson X de l’hôte : -e DISPLAY=\$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

Ce qui donnera, pour ouvrir un shell dans le container :
docker run -ti --rm -e DISPLAY=$DISPLAY -v emplacement-dossier-Wine:/home -v /tmp/.X11-unix:/tmp/.X11-unix utilisateur/wine /bin/bash

Il faut ensuite créer un environnement wine pour 32 bits, ce qu’on peut faire avec l’instruction dans le shell ouvert dans le container :
WINEARCH=win32 winecfg

On procède ensuite, toujours dans le shell à l’installation normale d’une application wine. On l’essaie ensuite en la lançant depuis le shell. Si tout marche correctement, on peut ensuite se fabriquer un lanceur depuis l’hôte, de type :
docker run -ti --rm -e DISPLAY=$DISPLAY -v emplacement-dossier-Wine:/home -v /tmp/.X11-unix:/tmp/.X11-unix utilisateur/wine /bin/sh -c "cd /home/utilisateur/.wine/drive_c/Program\ Files/Programme/ && wine Prgramme.exe"

Le container se lance et se ferme en même temps que l’application. Voilà notre vin en sécurité dans le bac à sable…

links

social