Makkelijk veilige beeldschermvergrendeling
Met Pluggable Authentication Modules (PAM) kun je redelijk eenvoudig het irritante herhaaldelijk invullen van je wachtwoord vervangen door gezichtsherkenning. Om te zorgen dat dit werkt, moet je wel even een beetje klussen.
Bij Ubuntu en de meeste andere Linux-distributies wordt de Gnome-shell gebruikt als de standaard interface. De shell bepaalt wie er toegang tot het systeem krijgt. Daarvoor authenticeert deze de gebruiker volgens de PAM-instellingen die in /etc/pam.d/ gdm-password staan. De instellingen daarin worden toegepast wanneer een gebruiker zich op een systeem aanmeldt, maar ook wanneer het scherm moet worden ontgrendeld. Je kunt geen wijziging voor het ontgrendelen instellen zonder de instellingen van het aanmelden te wijzigen (zie ook 'Aanmelden versus ontgrendelen').
En precies dat is het uitgangspunt van deze serie artikelen: veilig aanmelden met een sterk wachtwoord en gemakkelijk ontgrendelen, bijvoorbeeld via gezichtsherkenning en pincode. In de vorige twee artikelen hebben we laten zien hoe je dat in PAM omzet. In dit artikel gaat het er specifiek om hoe je de schermvergrendeling van de Ubuntu-desktop goed inricht.
Om de ontgrendelfunctie van het wachtwoord los te kunnen koppelen, moet je een aparte screensaver installeren. Het zou voor de hand liggen om gewoon de Gnome-screensaver te gebruiken die toch al in Ubuntu zit. Maar die is inmiddels alleen nog maar een dummy die weliswaar nog wel een PAM-bestand installeert, maar dat doet verder niets. Het ontgrendelen gaat zoals gebruikelijk met gdm-password.
Als vervanging is XScreenSaver een goede optie. De ontwikkelaar hiervan, Jamie Zawinski, is opensourceroyalty. Hij was de oprichter van Netscape en later Mozilla, en zijn project heeft jarenlang gediend als basis voor de screensaver van Gnome. Zijn voorgeschiedenis geeft de ietwat oubollige jaren negentig-vormgeving van XScreenSaver extra charme. Je wordt dan ook getrakteerd op een unieke selectie van screensaver-klassiekers, zoals Flying Toasters, Pacman, The Matrix, etc.
XScreenSaver werkt alleen op Xbased-desktops en niet op systemen zoals Fedora Workstation waar Wayland op draait. De installatie doe je heel eenvoudig door als rootgebruiker het commando apt install xscreensaver uit te voeren, of indien je alle modules wilt hebben door xscreensaver-gl uit te voeren. Om de screensaver en daarmee de vergrendeling daadwerkelijk te activeren moet je nog enkele handelingen verrichten. Het eenvoudigst doe je dat door naar het over
zicht van toepassingen te gaan en daar ‘opstartto’ in te voeren. Dan kun je de app voor opstarttoepassingen openen.
Daar kun je dan een nieuwe entry toevoegen waarmee via xscreensaver de servercomponenten van de screensaver bij de start van elke sessie op de achtergrond opstarten. Als je niet wilt dat bij elke start het logo kort zichtbaar is, dan moet je nog -nosplash aan het commando toevoegen. Via het programma xscreensaver-command kun je dan commando’s zoals -lock, -deactivate of -restart naar de server sturen.
Als volgende stap moet je de Gnome Screen Lock uitschakelen. Hiervoor stel je in de systeeminstellingen bij ‘Instellingen/Energie’ de optie ‘Zwart scherm’ in op ‘Nooit’, en zet je bij ‘Privacy/Schermvergrendeling’ het schuifje achter ‘Automatische schermvergrendeling’ op uit. Dat klinkt verontrustend, maar deze opdrachten verdwijnen niet, XScreenSaver neemt deze taken op zich. Bovendien kun je de schermvergrendeling van Gnome altijd nog via het gebruikersmenu bereiken en verricht hij zoals voorheen het wekken vanuit de suspend-modus.
Als je toch al bezig bent, kun je bij ‘Apparaten/toetsenbord’, de sneltoets Super-L (ofwel Windows-toets + L) voor jezelf reserveren door eerst het vergrendelen van het scherm aan een andere toetsencombinatie toe te wijzen, bijvoorbeeld ‘Super-I’. Daarna kun je met + een nieuw commando definiëren en screensaver-command -lock aan Super-L toewijzen. Dat kan pas als de toetsencombinatie niet meer bezet is.
Daarmee heb je Gnome screenlock al vervangen door een screensaver met alle toeters en bellen er aan. Je moet de boel alleen nog wat finetunen. Allereerst moet je met het configuratieprogramma xscreensaver-demo instellen na welke periode van inactiviteit de screensaver wordt ingeschakeld (‘Op zwart na’). Korter is beter, over het algemeen is iets van drie minuten prima. Daarmee wordt het scherm echter nog niet vergrendeld. Zodra er gebruikersactiviteit wordt geregistreerd, verschijnt het beeld met alle geopende vensters weer.
Pas als je het selectievakje ‘Vergrendel scherm na’ aanvinkt, wordt de vergrendeling geactiveerd. Bij de tijdsduur die erbij staat stel je in hoelang na het activeren van de screensaver het vergrendelen wordt geactiveerd. Als je 0 instelt, wordt het scherm samen met de screensaver vergrendeld, maar het kan prettig zijn om de vergrendeling nog even iets uit te stellen, zodat je bijvoorbeeld tot een minuut na het ingaan van de screensaver het beeld nog kunt oproepen door op een willekeurige toetst te drukken.
Er zijn hier ook nog enkele andere instellingen. Als je meerdere schermen hebt, kan het een tikje irritant zijn als er op elk scherm een andere screensaver te zien is. Met de modus ‘Eén schermbeveiliging’ verhelp je dit. Bij moderne schermen is het ‘saven’ van het scherm tegen inbranden met een screensaver eigenlijk overbodig. Als je de energie die je daarmee verkwist wilt besparen, stel je de optie ‘Alleen zwart scherm’ in. Bovendien kun je onder ‘Geavanceerd’ ook het energiebeheer inschakelen, waarmee de monitor na een bepaalde tijd naar een gewenste modus schakelt (bij laptops kun je hier beter van afblijven, omdat het energiebeheer dit beter inregelt).
Je kunt hier ook een index voor afbeeldingen of teksten aangeven, die sommige modules gebruiken voor de effecten die de screensaver gebruikt. De optionele RSSfeed kun je gebruiken om met de Star Wars-module teksten in de stijl van de legendarische intro naar achteren de ruimte in laten verdwijnen.
200 MEESTERWERKEN
Het is zeer de moeite waard om enkele minuten, of naar wens zelfs uren, door de collectie van meer dan 200 modules te neuzen. Sommige van de previews hebben een bijna hypnotisch effect, terwijl andere verbluffende effecten tonen zoals het traag uit elkaar vloeien van een foto die zojuist met de webcam is gemaakt. Je kunt voor een bepaalde screensaver kiezen, of telkens een willekeurige uitkiezen. Houd er daarbij wel rekening mee dat sommige screensavers de informatie gebruiken die op dat moment op de desktop staat, en daarmee potentieel vertrouwelijke informatie tonen.
Al deze instellingen gelden telkens alleen voor de gebruiker die op dat moment is aangemeld. In geval van twijfel is het daarom beter om de gehele procedure, van start-up-entry, sneltoets tot aan XScreenSaverconfiguratie voor alle gebruikers te herhalen of de diverse relevante config-bestanden bij elkaar te zoeken en te kopiëren. Op andere systemen dan Ubuntu desktop 18.04. zijn de verschillende handelingen mogelijk anders , maar het principe blijft hetzelfde. De maker van XScreenSaver geeft diverse tips voor andere desktops, zoals KDE.
Afgezien van dat het geinig is, biedt XScreenSaver een duidelijk voordeel: je kunt de pc ontgrendelen via een aparte PAM-configuratie en je kun nu via /etc/pam.d/xscreensaver compleet controleren hoe dat moet gaan. Zo kun je met de methodes die in het artikel op pagina 84 worden beschreven bijvoorbeeld een gezichtsherkenning met een korte PIN-code combineren, om niet bij elke korte pauze een veilig maar ellenlang wachtwoord te moeten invoeren. Via de link aan het einde van dit artikel vind je diverse voorbeeldconfiguraties waaruit je je persoonlijke favoriete kunt kiezen. Deze kun je simpelweg in plaats van common-auth invoeren. Voor alle configuraties geldt: in geval van twijfel zal het login-wachtwoord altijd nog werken.
Er is een ding waar je wel op moet letten: het XScreenSaver-proces start de authenticatie met de beperkte rechten van een gebruiker. Daarmee krijgt de PAM-module pam_userdb echter geen toegang tot de lijst van versleutelde pincodes die alleen root mag lezen. Dit kun je omzeilen door het bestand leesrechten te geven voor alle gebruikers op het systeem: chmod a+r /etc/pinlist.db
In dat geval mag je echter in geen geval de pincodes ook gebruiken om bijvoorbeeld via sudo toegang tot root-rechten te verlenen. De pincodes worden wel volgens hetzelfde principe als de systeemwachtwoorden versleuteld, maar een gebruiker of trojan die over de hashwaarden beschikt, kan dan eenvoudig alle mogelijke codes uitproberen. De miljoen combinaties van een pincode die uit zes cijfers bestaat, vormen geen groot obstakel. Dit is een mankement waar we nog geen echt goede oplossing voor gevonden hebben. Maar je verkleint het risico door de rechten te beperkten tot die een aanvaller toch al zou krijgen om de hash te kunnen lezen en kraken. Bij een configuratie waarbij de pincode alleen in combinatie met bijvoorbeeld een U2F-token het scherm ontgrendelt zal dit niet zo’n probleem zijn.
Een ander probleem waar geen geweldige oplossing voor is, is een situatie waarbij een andere gebruiker zich op het systeem wil aanmelden terwijl het scherm geblokkeerd is. XScreenSaver biedt weliswaar een knop aan die ‘New login’ heet, maar bij de actuele Gnomeversie bestaat de achterliggende systeemlogica niet meer. Je kunt eventueel wel de volgende commando’s invoeren in het bestand ~/.Xresources: xscreensaver.newLoginCommand: gnome-session-quit --logout --force --no-prompt Als op de knop wordt geklikt, wordt zonder pardon de actuele sessie beëindigd en verschijnt er een nieuw aanmeldscherm. Dat iedereen die langskomt een andere gebruiker gewoon eruit kan knikkeren, is niet handig. Maar als het alternatief is dat andere gebruikers van de pc de aan/uitknop moeten indrukken, dan is dit nog de betere optie. Als de situatie niet van toepassing is, dan laat je de default-instellingen gewoon zoals ze zijn.
HET APPARAATBEHEER
De veiligste en eenvoudigste manier om het scherm te ontgrendelen is met een hardwarematige U2F-token zoals de YubiKey. Je hoeft maar een klein tikje te geven tegen de muis en de token, die er als een usb-stick uitziet, begint al uitnodigend te knipperen. Met een aanraking op de token wordt de authenticatie al voltooid. Het zou mooi zijn als je dit nog verder zou kunnen automatiseren, bijvoorbeeld dat het systeem ontgrendelt als je de token inplugt en de pc direct wordt vergrendeld wanneer je hem uit de poort trekt.
Dankzij udev is dit prima te doen. Met het flexibele apparaatbeheer kun je eigen rules definiëren die acties uitvoeren bij het insteken of loskoppelen van allerlei hardware. Het thema is weliswaar complex, want over udev zou je meerdere artikelen kunnen volschrijven. Maar met de volgende compacte handleiding zou het moeten lukken je eigen rules te maken.
De directory waar je alles hiervoor regelt is /etc/ udev/rules.d/. Daar maak je een bestand aan met de naam 80-yubikey.rules, dat events filtert zoals ‘U2F-token werd verwijderd’ en dat vervolgens een script start dat het scherm vergrendelt. Dit kun je natuurlijk zeer algemeen toepassen en rules opstellen waarmee een fanfare begint te spelen en bepaalde belangrijke bestanden worden opgeslagen als je een specifieke usb-stick inplugt.
Het probleem hierbij is dat de meeste handleidingen op internet die beschrijven hoe je eigen udev-rules opstelt, in de praktijk vaak niet werken. Deze rules beschrijven dat je eerst met lsusb een overzicht opvraagt van alle beschikbare devices:
Bus 001 Device 022: ID 1050:0120 Yubikey Touch U2F Security Key
Bus 001 Device 005: ID 046d:c52b Logitech Unifying Receiver
En je dan bijvoorbeeld met lsusb -vd 1050:0120 concrete informatie zoekt voor het gewenste apparaat. Je krijgt dan een lange lijst van gegevens te zien zoals idProduct 0x0120 Yubikey Touch U2F Security Key waar je dan in principe naar zou kunnen zoeken. En hoewel de rules op zich juist kunnen zijn, mislukt het vaak in de praktijk. De reden hiervoor is, dat udev bij het verwijderen van een apparaat maar een klein deel van deze informatie beschikbaar maakt. Het attribuut idProduct zat daar bijvoorbeeld niet tussen. Hetzelfde gebeurt ongeveer wanneer je met de tool udevadm informatie oproept over een apparaat dat nog actief is: je weet nooit welke van de talloze informatievelden nog zichtbaar zullen zijn wanneer het apparaat verwijderd is.
De onderstaande stappen beschrijven een methode die je op alle apparaten kunt toepassen. Daarvoor moet
je korte tijd alle udev-events loggen met udevadm monitor -u -e | tee /tmp/udev-remove
en vervolgens trigger je het gewenste event, dus bijvoorbeeld het verwijderen van de U2F-token uit de usb-poort. Uit de output die dit in /tmp/udev-remove
oplevert, zoek je een event uit dat voldoende informatie levert voor een geschikt filter en dat maar een keer langskomt. Zo kwamen wij het volgende tegen:
DEV [588756.639688] remove ... ACTION=remove HID_ID=0003:00001050:00000120 HID_NAME=Yubico Security Key by Yubico SUBSYSTEM=hid
Wat we vervolgens in de volgende udev-rule in /etc/ udev/rules.d/80-Yubikey hebben samengevat: SUBSYSTEM=="hid", ACTION=="remove",
ENV{HID_NAME}== "Yubico Security Key by Yubico", RUN+="/usr/local/bin/dev_removed.sh"
Hiermee start het lokale script dev_removed.sh wanneer de U2F-token van Yubico wordt verwijderd. Je kunt dan een corresponderend add-event maken dat je bijvoorbeeld device_added.sh noemt. Maak dan beide scripts uitvoerbaar met chmod a+x. Het rule-bestand en de gebruikte scripts staan bij de link hiernaast.
Er is nog een obstakel dat de scripts moeten beslechten voordat alles werkt. Want de device-manager roept het script met root-rechten op zonder enige gebruikerscontext in acht te nemen. Alleen kan het op die manier niet met de XScreenSaver praten. Daarvoor moet het script eerst nog achterhalen aan wie de actuele x-sessie toebehoort, en diens identiteit overnemen. Dat doe je met de volgende commando’s: user=`who | grep ':0' | awk '{print $1}'| head -1`
Daarmee kan dan
DISPLAY=:0 sudo -n -H -u "$user" /usr/bin/ xscreensaver-command -lock
Het vergrendel-commando uitschakelen. Dat werkte bij ons al prima. Als je dit in de praktijk wilt gebruiken, moet je de variabele $user voor gebruik nog controleren. In een situatie waarbij meerdere gebruikers X-sessies hebben en displays zoals :1 worden gebruikt, moet je nog het een en ander instellen, maar dat is een complexer verhaal.
EINDELIJK KLAAR
Dit is alles wat je nodig hebt om veilig maar handig je scherm te kunnen ontgrendelen. Het concept dat we hier gepresenteerd hebben kun je nog verder uitbreiden en bijvoorbeeld nog extra beveiligingen inbouwen, zodat na drie mislukte aanmeldpogingen een krachtigere authenticatie is vereist, en je het loginwachtwoord moet invoeren. Ook het toepassen van veiligheidsfuncties van de hardware (Trusted Platform Module, TPM) om gegevens veiliger te houden zou zondermeer wenselijk zijn. Microsoft is wat dat betreft met “Windows Hello” al beduidend verder. Desondanks is het voorgestelde Hallo Linux in zijn huidige vorm al een stap in de goede richting om meer veiligheid en meer gemak te realiseren.
De authenticatiemethode met een U2F-token, die je zowel voor sudo als ook voor het ontgrendelen van de XScreenSaver kunt gebruiken, is bijzonder handig. Uiteraard in combinatie met de fallback-optie Password, zoals in het eerste artikel is beschreven. De methode met U2F is zo veilig, dat dit in principe al voldoende is. Maar op kantoor zal het vaak genoeg gebeuren dat je even van je pc vandaan loopt en de token in de machine laat zitten. Om dan niet de pc helemaal onbeveiligd te laten, is de mogelijkheid om het systeem via gezichtsherkenning met een webcam te ontgrendelen zoals dat met Windows Hello kan, bijzonder handig. Dit komt min of meer overeen met de PAM-configuratie inc-u2f+howdy-pw die in de verzameling van PAM-scripts via de link te vinden is.