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

Date: 2014-12-06 01:24
Author: jdn06
Category: Logiciels libres
Tags: docker, sandbox, wine, Musique

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 :

   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…