Tips en Trucs 2022

Externe opslag versleutelen met cryptsetup

Veel mensen beschouwen harde schijven als veilig omdat ze die fysiek bezitten. Het is moeilijk om de gegevens op een harde schijf te lezen die je niet hebt, en veel mensen denken dat het beveiligen van hun computer met een wachtwoordzin de gegevens op de schijf onleesbaar maakt.

Dit is niet altijd het geval, deels omdat in sommige gevallen een wachtwoordzin alleen dient om een gebruikerssessie te ontgrendelen. Met andere woorden, je kunt een computer aanzetten, maar omdat je de wachtwoordzin niet hebt, kun je niet op het bureaublad komen, en kun je dus geen bestanden openen om ze te bekijken.

Het probleem is, zoals menig computertechnicus begrijpt, dat harde schijven uit computers kunnen worden gehaald, en sommige schijven zijn al extern ontworpen (USB sticks, bijvoorbeeld), zodat ze op elke computer kunnen worden aangesloten voor volledige toegang tot de gegevens die erop staan. Je hoeft een schijf ook niet fysiek te scheiden van de computer om deze truc te laten werken. Computers kunnen worden opgestart vanaf een draagbare opstartschijf, die een schijf loskoppelt van het besturingssysteem en er een externe schijf van maakt die kan worden gelezen.

Het antwoord is om de gegevens op een schijf in een digitale kluis te plaatsen die niet kan worden geopend zonder informatie waartoe alleen jij toegang hebt.

Linux Unified Key Setup (LUKS) is een schijfversleutelingssysteem. Het biedt een generieke sleutelopslag (en bijbehorende metadata en herstelhulpmiddelen) in een speciaal gebied op een schijf met de mogelijkheid om meerdere wachtwoordzinnen (of sleutelbestanden) te gebruiken om een opgeslagen sleutel te ontgrendelen. Het is ontworpen om flexibel te zijn en kan zelfs metadata extern opslaan, zodat het kan worden geïntegreerd met andere tools. Het resultaat is volledige schijfversleuteling, zodat je al jouw gegevens veilig kunt opslaan, zelfs als jouw schijf fysiek of softwarematig van de computer is gescheiden.

Het is niet gebruikelijk om een interne harde schijf los te koppelen van de computer, maar externe schijven zijn ontworpen om mee te reizen. Naarmate de technologie kleiner en kleiner wordt, is het gemakkelijker om een draagbare schijf aan een sleutelhanger te hangen en elke dag met je mee te dragen. Het voor de hand liggende gevaar is echter dat je ze ook gemakkelijk kunt kwijtraken. Ik heb achtergelaten schijven gevonden in de USB-poorten van hotel lobby computers, business center printers, klaslokalen en zelfs een wasserette. De meeste hiervan bevatten geen persoonlijke informatie, maar het is een gemakkelijke fout om te maken.

Je kunt voorkomen dat belangrijke gegevens in verkeerde handen terecht komen door jouw externe schijven te versleutelen.

LUKS en de bijhorende cryptsetup opdracht bieden een manier om dit onder Linux te doen. Zoals Linux doet tijdens de installatie, kun je de hele schijf versleutelen zodat er een wachtwoordzin nodig is om hem te mounten.

Eerst heb je een lege externe schijf nodig (of een schijf met inhoud die je bereid bent te wissen). Dit proces overschrijft alle gegevens op een schijf, dus als je gegevens hebt die je op de schijf wilt bewaren, maak er dan eerst een back-up van.

Zoek de schijf

Ik heb een kleine USB stick gebruikt. Wees op je hoede tegen het per ongeluk wissen van gegevens, de schijf waarnaar in deze tip wordt verwezen, bevindt zich op de locatie /dev/sdb. Sluit jouw schijf aan en zoek de locatie:

dany@pindabook:~> lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 238,5G  0 disk 
├─sda1   8:1    0  1000M  0 part 
├─sda2   8:2    0   260M  0 part /boot/efi
├─sda3   8:3    0     8G  0 part [SWAP]
├─sda4   8:4    0    80G  0 part /
└─sda7   8:7    0 149,2G  0 part /srv/www/htdocs
                                 /usr/home/Documents
sdb      8:16   1   3,7G  0 disk 
└─sdb1   8:17   1   3,7G  0 part

Ik weet dat mijn demo drive zich bevindt op /dev/sdb omdat ik de grootte ervan herken (3,7GB), en het is ook de laatste drive die ik heb aangesloten (met sda als eerste [interne schijf], sdb als tweede [USB stick], enzovoort). De aanduiding /dev/sdb1 betekent dat de schijf 1 partitie heeft.

Als je het niet zeker weet, verwijder dan jouw schijf, kijk naar de uitvoer van lsblk, en sluit dan terug jouw schijf aan en kijk opnieuw naar lsblk.

Zorg ervoor dat je de juiste schijf identificeert, want versleutelen overschrijft alles wat erop staat. Mijn schijf is niet leeg, maar bevat kopieën van documenten waar ik elders kopieën van heb, dus het verlies van deze gegevens is niet belangrijk voor mij.

De schijf wissen

Om verder te gaan, vernietigen we de inhoud van de schijf door de schijf te overschrijven met nullen:

dany@pindabook:~> sudo dd if=/dev/zero of=/dev/sdb bs=512
[sudo] wachtwoord voor root: 
dd: fout bij schrijven van '/dev/sdb': Geen ruimte meer over op apparaat
7831553+0 records gelezen
7831552+0 records geschreven
4009754624 bytes (4,0 GB, 3,7 GiB) gekopieerd, 925,961 s, 4,3 MB/s

Deze stap is niet strikt noodzakelijk, maar ik begin graag met een schone lei. Deze stap duurt lang (926 seconden of 15 minuten voor mijn 4 GB USB Stick), maar heeft ook voordelen bij het maken van een versleutelde back-up.

De schijf voor LUKS formatteren

De cryptsetup opdracht gebruiken we voor het beheren van LUKS volumes. De luksFormat subopdracht creëert een soort LUKS kluis die beveiligd is met een wachtwoord en een beveiligd bestandssysteem kan bevatten.

Wanneer je een LUKS-partitie maakt, wordt je gewaarschuwd over het overschrijven van gegevens en wordt je gevraagd om een wachtwoordzin voor jouw schijf te maken:

dany@pindabook:~> sudo cryptsetup luksFormat /dev/sdb
[sudo] wachtwoord voor root:

WARNING!
========
Dit zal data op /dev/sdb onherroepelijk overschrijven.

Are you sure? (Type 'yes' in capital letters): YES
Voer wachtwoord in voor /dev/sdb: 
Voer wachtwoord nogmaals in:

LUKS volume openen

Nu heb je een volledig versleutelde kluis op je schijf. Kijkers, inclusief uw eigen ogen, worden buiten deze LUKS partitie gehouden. Dus om hem te gebruiken, moet je hem openen met je wachtwoordzin. Open de LUKS kluis met cryptsetup open samen met de apparaatlocatie (/dev/sdb, in mijn voorbeeld) en een willekeurige naam voor je geopende kluis:

dany@pindabook:~> sudo cryptsetup open /dev/sdb stick
Voer wachtwoord in voor /dev/sdb:

In dit voorbeeld gebruik ik stick, maar je kunt je kluis elke naam geven die je maar wilt, en je kunt hem elke keer dat je hem opent een andere naam geven.

LUKS volumes worden geopend op een speciale apparaatlocatie genaamd /dev/mapper. Je kunt de bestanden daar oplijsten om te controleren of jouw kluis is toegevoegd:

dany@pindabook:~> ls /dev/mapper
control  stick

Een bestandssysteem aanmaken

Nu je je LUKS volume ontcijferd en open hebt, moet je er een bestandssysteem op aanmaken om er gegevens in op te slaan. In mijn voorbeeld gebruik ik XFS, maar u kan ext4 of JFS gebruiken of gelijk welk bestandssysteem dat je wil:

dany@pindabook:~> sudo mkfs.xfs -f -L stick /dev/mapper/stick
meta-data=/dev/mapper/stick      isize=512    agcount=4, agsize=244608 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=0    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=978432, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

LUKS volume sluiten

Je kunt een LUKS volume op elk moment sluiten met de close subopdracht van cryptsetup:

dany@pindabook:~> sudo cryptsetup close stick

Dit verwijdert het volume uit /dev/mapper.

Grafische ondersteuning

Gebruikers van grafische bureaubladomgevingen zoals KDE en Gnome krijgen bij het aansluiten van een LUKS versleuteld volume ondersteuning.

KDE Cryptsetup

Daarbij moet je zowel de LUKS wachtwoordzin ingeven, als het root wachtwoord om op de achtergrond de cryptsetup opdracht te kunnen uitvoeren.

Root toegang

Bij het openen van de bestandsbeheerder blijkt echter als vlug dat je als gewone gebruiker geen schrijfrechten hebt.

Geen schrijfrechten

Dit los je op door éénmaal de volgende opdracht uit te voeren:

dany@pindabook:~> sudo chown dany:users /run/media/dany/stick/
[sudo] wachtwoord voor root:

Bekijken we de inhoud van de map /dev/mapper, dan merken we dat de grafische omgeving zelf een unieke naam voor de kluis heeft bedacht.

dany@pindabook:~> ls /dev/mapper
control  luks-813a996c-88b8-40af-afac-8a323ea1ea43

En dat het bestandssysteem in de kluis automatisch werd gekoppeld. Vandaar dat je de kluis niet kunt sluiten:

dany@pindabook:~> sudo cryptsetup close luks-813a996c-88b8-40af-afac-8a323ea1ea43
Apparaat luks-813a996c-88b8-40af-afac-8a323ea1ea43 is nog in gebruik.

Koppel eerst het bestandsysteem in de kluis af met:

dany@pindabook:~> sudo umount /run/media/dany/stick

Waarna je de kuis kunt sluiten:

dany@pindabook:~> sudo cryptsetup close luks-813a996c-88b8-40af-afac-8a323ea1ea43

Dit kan natuurlijk ook via de grafische omgeving.

Een versleutelde back-up maken

Eerst heb ik wat informatie nodig over het niet geopende LUKS volume:

dany@pindabook:~> sudo fdisk -l
Schijf /dev/sda: 238,47 GiB, 256060514304 bytes, 500118192 sectoren
Disk model: SAMSUNG MZ7TD256
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: gpt
Schijf-ID: 4377B292-5385-4B4B-8FDA-FA94290B7512

Apparaat       Begin     Einde  Sectoren Grootte Type
/dev/sda1       2048   2050047   2048000   1000M Windows recovery-omgeving
/dev/sda2    2050048   2582527    532480    260M EFI-systeem
/dev/sda3    2582528  19357695  16775168      8G Linux wisselgeheugen
/dev/sda4   19357696 187131903 167774208     80G Linux bestandssysteem
/dev/sda7  187131904 500117503 312985600  149,2G Microsoft basisgegevens


Schijf /dev/sdb: 3,73 GiB, 4009754624 bytes, 7831552 sectoren
Disk model: USB DISK 2.0    
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes

Daaruit blijkt dat de fysieke sectorgrootte van de USB stick (LUKS volume, /dev/sdb) 512 bytes is. Een versleutelde back-up maak je dan door een schijfkopie te maken met de dd opdracht. De optie conv=sparse zorgt ervoor dat sectoren die geen informatie bevatten, niet in de back-up worden opgenomen. Sectoren die uitsluiten nullen bevatten, worden aanzien als lege, geen informatie bevattende sectoren. Het voordien wissen van de schijf wordt hier dan een duidelijk voordeel.

dany@pindabook:~> sudo dd if=/dev/sdb of=stick.img conv=sparse bs=512
7831552+0 records gelezen
7831552+0 records geschreven
4009754624 bytes (4,0 GB, 3,7 GiB) gekopieerd, 183,527 s, 21,8 MB/s

Aan de uitvoer van de opdracht zie je duidelijk dat de volledige USB stick in 3 minuten (183 seconden) werd gekopieerd. Maar als je de volgende ls opdracht uitvoert, krijg je de volgende informatie te zien:

dany@pindabook:~> ls -hlst *.img
13M -rw-r--r-- 1 root root 3,8G  2 sep 19:09 stick.img

Hierbij is 3,8G de grootte van de USB-stick, maar 13M de grootte van het sparse back-up bestand. M.a.w. het lijkt alsof het back-up bestand 3,8G groot is, maar door enkel de sectoren met inhoud weg te schrijven neemt het back-up bestand minder schijfruimte in.

Een versleuteld back-up bestand openen

Aan een back-up heb je niets als je bij een ramp de gegevens niet kunt terughalen. De werkwijze is identiek, buiten het feit dat we deze keer werken met een bestand met een LUKS volume.

Met de losetup opdracht kan je het besturingssysteem een bestand als een apparaat (schijf) laten benaderen:

dany@pindabook:~> sudo losetup /dev/loop0 stick.img 
[sudo] wachtwoord voor root:

Je kunt het virtuele apparaat dan met cryptsetup openen:

dany@pindabook:~> sudo cryptsetup open /dev/loop0 stick
Voer wachtwoord in voor /home/dany/stick.img:

En aan het bestandssysteem koppelen:

dany@pindabook:~> sudo mount /dev/mapper/stick /mnt

De inhoud ervan beheren en weergeven met bijvoorbeeld:

dany@pindabook:~> tree /mnt/
/mnt/
└── Nieuwe map
    └── Tekstbestand.txt

1 directory, 1 file

Loskoppelen doe je met:

dany@pindabook:~> sudo umount /mnt

Daarna sluit je de kluis met:

dany@pindabook:~> sudo cryptsetup close stick

En uiteindelijk koppel je het virtuele apparaat terug los van het back-up bestand.

dany@pindabook:~> sudo losetup -d /dev/loop0

USB stick herstellen

Om de USB stick terug zonder LUKS versleuteling te gebruiken, formatteer je deze met het script dat je kan vinden op de webpagina USB Stick formatteren.

dany@pindabook:~> sudo bash usbformat.sh /dev/sdb "Dany Pinoy"
[sudo] wachtwoord voor root: 
Fout: /dev/sdb: onbekend schijflabel
Aanmaken partitietabel op /dev/sdb
Opmerking: Het kan nodig zijn /etc/fstab bij te werken.

Aanmaken partitie op /dev/sdb                                             
Opmerking: Het kan nodig zijn /etc/fstab bij te werken.

Partitie formatteren met FAT32 en naam geven                              
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
Overzicht:
Model:  USB DISK 2.0 (scsi)
Schijf /dev/sdb: 4010MB
Sectorgrootte (logisch/fysiek): 512B/512B
Partitietabel: msdos
Schijfvlaggen: 

Nummer  Begin   Einde   Grootte  Type     Bestandssysteem  Vlaggen
 1      1049kB  4010MB  4009MB   primary  fat32            lba, type=0c

Het back-up bestand verwijder je met:

dany@pindabook:~> sudo rm stick.img
[sudo] wachtwoord voor root: