In een eerdere uitgave van Linux Magazine hebben we aandacht besteed aan Docker. Met Docker run je een Linux OS in een container met daarin specifieke en gecompileerde software. Het is heel geschikt om software op die manier te isoleren van het feitelijke OS. Aangezien Docker enkel uit een console omgeving bestaat, worden deze containers meestal gebruikt in de cloud.

Met subuser is het mogelijk om de grafische omgeving en audio devices te gebruiken met Docker. Zo zijn Docker containers als normale Linux-programma’s op je eigen desktop gebruiken. Uiteraard laat subuser niet automatisch alle permissies toe, die een desktopapplicatie nodig heeft. Dat zou immers niet veilig zijn. Subuser werkt daarom net als mobile apps met een autorisatiebestand.

 

Isolatie door permissies

Het autorisatiebestand in subuser geeft de minimale set aan permissies, die nodig zijn om een programma in een Docker container optimaal te laten functioneren. In tegenstelling tot mobile apps zijn de permissies van subuser niet afdwingbaar om een subuser programma te installeren. Bij het installeren van een subuser container vraagt het welke permissies tijdens het gebruik hiervan actief mogen zijn. Als gebruiker bepaal je altijd zelf wat je wel en niet toelaat per image.

 

Installeren en opstarten

Subuser is gebaseerd op Docker en Git. Achter de schermen gebruikt subuser Docker containers en Git wordt gebruikt als het managementsysteem voor het beheer van gecreëerde subuser images. Op Ubuntu installeer je deze pakketten als volgt:

 

    sudo apt-get install docker.io

    sudo apt-get install git

 

Subuser is geschreven in Python. Om het te installeren, hebben we de Python installer voor Python versie 3 (pip3) nodig. Mocht pip3 niet aanwezig zijn, dan installeer je dit op Ubuntu met:

 

    sudo apt-get install python3-pip

 

Het installeren van subuser gaat met het commando:

 

    sudo pip3 install subuser

 

Nu subuser geïnstalleerd is, gaan we er mee aan de slag. Echter, omdat subuser achter de schermen gebruik maakt van Docker, is het nodig dat er een “sudo” vereist wordt voor elk gebruik van het subuser commando. Docker heeft namelijk root permissies nodig om bij de onderdelen van het host OS te komen. Om dit te voorkomen is het handig om de gebruiker toe te voegen aan de group ‘docker’. Dit gaat als volgt:

 

    sudo usermod -a -G docker $USER

 

Het repository van subuser heeft na installatie een ruim aantal packages beschikbaar. Om te zien welke dat zijn, type dan:

 

    subuser list available

 

We zien dat de multimediaplayer VLC in de lijst staat. Dit is een goed programma om ook het geluid en het netwerk te testen. Installeer VLC als subuser image met:

 

    subuser subuser add vlc vlc@default

 

Dit voegt lokaal een nieuwe subuser image toe met de naam ‘vlc’ die uit de default repository komt. Er wordt een overzicht van de eigenschappen van het image getoond en er wordt gevraagd om de permissies in te stellen. Als een subuser programma voor het eerst geïnstalleerd wordt, wordt er lokaal achter de schermen een nieuwe Docker image gemaakt. Zodra de nieuwe image klaar is, wordt deze opgestart. Dat gaat als volgt:

 

    subuser run vlc

 

De rode rand is er om aan te geven dat het om een subuser programma gaat. Het speelt de open source film ‘Big Buck Bunny’ via het netwerk af. Ter vergelijking is naast de VLC van subuser de native OS-versie van VLC geplaatst.

 

Zelf subuser programma’s inpakken

Subuser werkt met Git als beheer voor de images. Hierdoor is het makkelijk om zelf nieuwe images aan te maken en later te updaten. Een eigen subuser repository aanmaken is simpel. Maak een directory op een locatie naar keuze, ga naar die locatie toe en maak het repository aan met de volgende commando’s:

 

    mkdir suberuser-repository

    cd suberuser-repository

    subuser pkg init

 

Nu weet subuser waar het moet zoeken om zelfgemaakte beschikbare images te vinden. Als proof of concept gaan we een subuser image maken die ‘xeyes’ opstart. Xeyes is een oud Unix-programma, dat twee ogen afbeeldt, die de muis op het scherm volgen. Dit programma is te vinden in de ‘x11-apps’ package op Linux-distributies. Om een subuser image aan te maken met de passende naam “xeyes” voer je het volgende commando uit:

 

    subuser pkg add xeyes

 

Door dit commando wordt er een nieuwe directory aangemaakt met de naam ‘xeyes’ met daarin de nodige templatebestanden voor een subuser image. Het is belangrijk om te weten dat dit commando moet worden uitgevoerd in de directory van het repository, omdat subuser hiermee (vooralsnog) de templatebestanden wegschrijft op de locatie waar je op dat moment bent. Zodra je het commando hebt uitgevoerd, wordt er automatisch twee keer een teksteditor in de console opgestart.

 

Het permissions.json bestand

Het eerste bestand dat geopend wordt, heeft de naam ‘permissions.json’. Dit is het bestand waarin je aangeeft welke permissies je subuser programma nodig heeft. Alle waarden voor de permissies zijn voor de veiligheid initieel uitgeschakeld.

 Aangezien xeyes een venster gebruikt, wordt de permissie voor ‘gui’ aangepast. De standaardwaarde is ‘null’, zodat er geen vensters aangemaakt worden. Het is daarvoor voldoende om de waarde ervan aan te passen naar ‘{}’.

 Het subuser image moet ook weten welk programma op te starten. Daar heeft het de permissie ‘executable’ voor. De waarde hiervan is de locatie van de executable, die je start binnen het image. We voegen het pad van xeyes “/usr/bin/xeyes” toe en vullen dat als waarde in voor ‘executable’. Na het opslaan van dit eerste bestand wordt het tweede bestand geopend.

 

Het SubuserImagefile bestand

Het tweede bestand dat geopend is, heeft de naam ‘SubuserImagefile’. Dit is het bestand waar de instructies in staan om de inhoud van een subuser image te bouwen. Dit bestand heeft dezelfde functie als het bestand ‘Dockerfile’ voor het bouwen van Docker images. Het SubuserImagefile is een extensie op het bestand Dockerfile.

 Het SubuserImagefile bestand in de geopende editor bestaat uit twee regels. De eerste regel geeft aan dat het image gebaseerd is op een reeds bestaande subuser image ‘libx11@default’. De tweede regel eindigt met “PKG”. Dit geeft aan dat hier de naam van je gewenste package ingevuld dient te worden. Voor ons programma xeyes is dat ‘x11-apps’. Na het wegschrijven van dit tweede bestand is je package van je eerste subuser image een feit.

 

Package testen

Nu een package voor xeyes is gemaakt, is het handig om eerst te kijken of subuser je nieuwe package gevonden heeft. Voor de lijst van beschikbare subuser images type je weer:

 

    subuser list available

 

Als te zien is dat het nieuwe image in de lijst verschenen is, in het formaat als ‘xeyes@/path/to/your/subuser-repository’, dan is de packaging gelukt. Het testen van de package gaat met het commando:

 

    subuser dev xeyes

 

Als het de eerste keer is dat een nieuw image gestart wordt, maakt subuser het image lokaal aan. Als dit het geval is, komt er output van een Docker build langs. Zodra de feitelijke image gemaakt is, wordt het subuser programma gestart en verschijnt er een venster op het scherm met twee ogen erin en default rode kaders. Te merken is dat xeyes nog niet volledig functioneert, omdat de ogen de muis niet volgen, zodra de muis niet boven het xeyes window gepositioneerd is. Dat is gewenst gedrag, aangezien ‘gui’ activeren om windows aan te maken, niet betekent dat xeyes toegang heeft tot informatie van de muispointer. Dit is makkelijk te corrigeren door de permissies te updaten.

 

Packages updaten

Subuser packages updaten gaat simpelweg door het aanpassen van de twee bestanden in de package directory in je subuser repository. Om het xeyes package te updaten, open je vanaf de locatie in het subuser repository het bestand ‘permissions.json’ met je favoriete editor:

 

    vi xeyes/permissions.json

 

 De permissie ‘gui’ is te strict voor xeyes. In plaats daarvan activeren we de ‘x11’ permissie, die wel toestaat dat een subuser programma de coördinaten van de muis volgt. Zie afbeelding 7 waarin de ‘gui’ permissie verwijderd is en de optie ‘x11’ is geactiveerd met de waarde “true”. Om de aanpassingen door te voeren, type je het volgende commando in de console:

 

   subuser dev –update xeyes

 

Er wordt een nieuw build gedaan, ook wanneer subuser geen wijzigingen detecteert. Dit is erg handig, want de updatefunctie kijkt ook naar updates van het OS in het image. Zodra er updated packages zijn binnen de gebruikte subuser images, wordt een update van het softwaremanagementsysteem geactiveerd om deze door te voeren. Zo is het mogelijk om een oud image bijvoorbeeld na een jaar te updaten met nieuwe versies van de software die hierin geïnstalleerd is.

 

Gerelateerde projecten

Subuser is niet het enige project dat werkt met isolatie van applicaties met gebruik van de desktop-omgeving. De volgende projecten zijn gestart met hetzelfde doel voor ogen als subuser, maar hebben elk een eigen inslag met betrekking tot functionaliteit, onderhoudbaarheid en veiligheid.

 

x11docker

Net als met subuser is het met x11docker ook mogelijk om Docker images met X11 applicaties op te starten. De focus van x11docker ligt net iets meer op veiligheid. Het werkt, in tegenstelling tot subuser, met twee instanties van een X11 server. Zowel het host OS als het container OS hebben een X11 server nodig. Daarbij is met x11docker meer in te stellen dan met subuser. Echter, dit maakt dat x11docker iets minder gebruiksvriendelijk en toegankelijk voor de beginnende gebruiker dan subuser.

 

Bedrock Linux

Bedrock Linux is in feite geen echte distributie, maar een uitbreiding, die te installeren is op elke Linux-distributie naar keuze. Het is speciaal ontworpen om packages van verschillende Linux-distributies tegelijk te installeren zonder dat de installers van de distributies daar weet van hebben. Bedrock Linux maakt gebruik van het concept van containers om de applicaties te scheiden per distributie waarvoor ze in feite bestemd zijn. Het haalt de individuele programma’s uit de containers en draait alle programma’s tegelijkertijd in zijn eigen OS.

 

Subgraph OS

Subgraph OS is een Linux-distributie met de focus op security. Naast de veiligheid met betrekking tot de grafische desktopomgeving, richt het zich voornamelijk op het tegengaan van hacken van het OS. Subgraph OS gebruikt speciale kernel eigenschappen, waardoor het een veilige doorvoerhaven is voor verkeer tussen het internet en de geïsoleerde applicaties.

 

Qubes OS

 

De meest veilige optie voor het scheiden van applicaties is Qubes OS, ook een Linux-distributie. Het isoleert niet elke applicatie individueel, maar maakt gebruik van zogenaamde compartimenten, genaamd qubes. Deze compartimenten vormen een laag bovenop de Linux-kernel en zijn in feite afgeschermde delen met elk een eigen focus op security. Op deze manier stelt het de gebruiker in staat om verschillende applicaties in een qube met bepaalde veiligheidsafstellingen te draaien. Qubes OS is hiermee bijzonder veilig, maar wel minder gebruiksvriendelijk.