Verschlüsselung nachträglich umsetzen

für normale Benutzer

Gegeben 

Eine ganz normale Linux Installation (im Beispiel Ubuntu 18.10),
Ziel: das "home" oder eine Datenablage in eigener Partition (Zielpartition)
Bisher sind keine Laufwerke verschlüsselt.
GRUB ist nicht quiet, nicht silent (wg fehlerhaftem Plymouth)

Vorbereitung

Soll der komplette, eigene mountpoint  /home verschlüsselt werden, ist ein Start von einer Live-DVD / USB-Gerät erforderlich. Dazu gleiche OS-Distro und -Version benutzen.
Das /home muss in einer eigenen Partitionen liegen, ggf. verschieben (Gparted funktioniert einfach und sicher).

LUKS installieren
	sudo apt-get install cryptsetup

Zielstellung:


Eine Lösung

Nachträglich verschlüsseln mit LUKS, nur den Bereich.

Vorteil:

Das Vorgehen:
  1. Daten von der Zielpartition 2x sichern (Original geht unter)
  2. Aufsetzen von LUKS auf der Zielpartition
  3. Mapping erzeugen, für unverschlüsselten Zugriff
  4. Dem Mapping einen Namen geben, zum mounten
  5. Ein Dateisystem auf dem neuen "Laufwerk" erzeugen
  6. Einen mount point erzeugen
  7. Automatisches Entschlüsseln und mapping durch den Kernel veranlassen: Eintrag in die crypttab
  8. Mount in die fstab eintragen
  9. Dateien aus der Sicherung zurückkopieren in die neue Crypt-Partition.
Fertig.

Gute Literatur

und viele weitere ...

Backup and recovery:
https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#6-backup-and-data-recovery






Die Schritte im einzelnen:

0. Darstellung im Beispiel

<device> = /dev/sda3
<name> = luks-56956....0ab51

Die Namen in Beispielen sind evtl. nicht konsistent (von verschiedenen Computern).

1. Sichern:

Wie gewohnt, bitte 2x, weil die Originaldateien untergehen.
In unserem Beispiel sei es die /dev/sda3
Löschen ist nicht erforderlich.

2. Aufsetzen von LUKS auf der Zielpartition

Die bestehende Partition, auf der bisher die Daten waren, wird wiederverwendet.
Erzeugt wird hier ein neuer LUKS Container.
generisch: cryptsetup luksFormat <device>
sudo cryptsetup  luksFormat -s 256 -y  -c  twofish-ecb /dev/sda3
Rückfragen mit y / ja beantworten.
Es gibt mehrere Typen von Schlüsseln, die bereitstehen (nicht alle denkbaren by default).

Es besteht die Möglichkeit, den Schlüssel als key file zu übergeben, statt interaktiver Password-Abfrage. Diese Option wird in der man page ausführlich dargelegt. Aus Erwägung von Zuverlässigkeit und Sicherheit  wird hier auf Abfrage beim booten gesetzt (unvorteilhaft wäre: USB-Stick versagt oder wird mit-beschlagnahmt).

Nun haben wir LUKS aufformatiert in unsere Zielpartition.

Prüfen

Stimmt das Ergebnis?
Verifiziere, dass erfolgreich ein LUKS System da ist:
generisch: cryptsetup -v isLuks <device>
sudo cryptsetup -v isLuks /dev/sda3
Das zeigt "Command successful", wenn -v oder --verbose als Option (sonst echo $?)

Zeige Details zur Überprüfung an:
generisch: cryptsetup luksDump <device>
sudo cryptsetup  luksDump  /dev/sda3

3. Mapping erzeugen

Erzeuge ein Mapping (eine Zuordnung), um den Zugriff auf die entschlüsselten Inhalte des Geräts zu ermöglichen.
Dies macht das Gerät über Mapping zugänglich (eine eingebaute Kernelfunktion!)

Den device name in Form einer UUID ermitteln:
generisch: cryptsetup luksUUID <device>
sudo cryptsetup luksUUID /dev/sda3

4. Dem Mapping einen Namen geben

Aus der UUID wird der neue Name erstellt, Muster: luks-[UUID]
Dieser wird fuer das mapping benutzt:
generisch: cryptsetup luksOpen <device> <name>
sudo cryptsetup luksOpen /dev/sda3 luks-595682c3-cb1f-4315-a20c-db20bfa1bc42
Achtung: Das Mapping ist selbst kein mount!

Prüfen

Dieses mapping muss nun vorhanden sein, Aufruf:
cryptsetup -v isLuks <device>
(Antwort "Command successful.") und mit 
	ls -latr  /dev/mapper/
die Bezeichnung prüfen.

Es sollte jetzt einen device node (Geräteknoten) geben
/dev/mapper/<name>  
, der das entschlüsselte Gerät darstellt.



Dieses block device (Blockgerät) kann wie jedes andere unverschlüsselte Blockgerät gelesen und geschrieben werden.

Prüfen des neuen device node:
generisch: dmsetup info <name>
sudo dmsetup info luks-595682c3-cb1f-4315-a20c-db20bfa1bc42
Hier wird ein Bericht zurückgegeben:
Name:              luks-595682c3-cb1f-4315-a20c-db20bfa1bc42
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        1
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: CRYPT-LUKS1-595682c3-cb1f-4315-a20c-db20bfa1bc42-luks-595682c3-cb1f-4315-a20c-db20bfa1bc42

5. Ein Dateisystem erzeugen

Formatieren

Das fertige device wird formatiert, um ein Dateisystem zu bekommen:
generisch: mke2fs /dev/mapper/<name>
sudo mkfs.ext4  -v  -L home0home_crypt  /dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42
hier mit -L volumelabel hat eine Länge von 16bytes (1-4bytes per char...).
Ausgabe beobachten.

6. Einen mount point erzeugen

Testweise das neue device (Gerät) wie ein normales device auf einen mountpoint mounten:
generisch: mount /dev/mapper/<name> /mnt/test
sudo mount /dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42 /mnt/test/
und mit
mount
das Ergebnis prüfen (Beispiel):
/dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42 on /mnt/test type ext4 (rw,relatime,data=ordered) 
Anschliessend un-mounten (Aushaengen).


7. Eintrag in die crypttab

Das device (Gerät) wird durch einen Eintrag in die (ggf. neu zu schaffende) /etc/crypttab entschlüsselbar und beim Booten zugeordnet, bevor anhand der fstab es gemountet (eingehängt) wird. Das wird vom OS ohne weitere Installation von Tools erledigt!

Hier besteht die Möglichkeit, das zum Entschluesseln erforderliche password in einer Datei zu hinterlegen (ggf. USB Stick?) oder ein Password abzufragen.
Gezeigt wird die Option Passwordabfrage.
Editor aufrufen
sudo vim /etc/crypttab
In /etc/crypttab:

generisch: <name>  <device>  none options   (alle 4 Felder erforderlich)
luks-69fe88d8-00o0-9b76-qr20-f242a64a9320    UUID="69fe88d8-00o0-9b76-qr20-f242a64a9320"    none    luks,tries=5,timeout=3000
„none“ im dritten Feld, dem "key field" ist für interaktives password / kein keyfile (Schlüsseldatei).
Diese Parameter funktionieren gut, mehr dazu in der man page für crypttab.

Hinweis

Damit die Password-Abfrage erkennbar ist, sollte kein "silent" oder "quiet"  in der Grub-Konfiguration wirksam sein.

Bekanntes Problem: Die Password-Abfrage bleibt am unteren Bildschirmrand unsichtbar. Wahrscheinlich ein Bug in Plymouth (z.B. #1731769 und viele weitere).
Abhilfe: Enter drücken (unschädlich).


An dieser Stelle ist ein Neustart sinnvoll, wenn nicht von Live-DVD gearbeitet wird.

8. Mount in die fstab eintragen

Das entschlüsselte device wird in /etc/fstab eingetragen, um beim Booten gemountet zu werden:
Editor aufrufen
sudo vim /etc/fstab
Eintrag
/dev/mapper/luks-69fe88d8-00o0-9b76-qr20-f242a64a9320 /home ext4    rw,users,defaults    0 2

An dieser Stelle ist ein Neustart erforderlich, wenn nicht von Live-DVD gearbeitet wird.

Das entschlüsselte device nun über den Ziel-Mountpoint mounten
sudo mount /mnt/home

Prüfen


Mit
mount
muss  die "neue" Partition sichtbar werden, im Beispiel erscheint
/dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42 on /home type ext4 (rw,relatime)

9. Daten zurückkopieren

Die a.O. gesicherten Daten auf /home zurueckspielen.


An dieser Stelle ist ein Neustart in das normale System erforderlich.




Prüfen und Wartung

Die Integritätspruefung mit e2fsck geht auf das NICHT gemountete, entschlüsselte device:
generisch: e2fsck  /dev/mapper/<name>
sudo umount /dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42
sudo e2fsck -cvf /dev/mapper/luks-595682c3-cb1f-4315-a20c-db20bfa1bc42

Die Intervalle für vollautomatische filesystem checks (Prüfungen) beim booten werden analog mit tune2fs eingestellt.
Verifikation:
sudo tune2fs -l /dev/mapper/luks-f0cbbdc2-8252-434f-8c24-898cea30c36a

Zusammenfassung der typischen Tests

sudo cryptsetup -v isLuks /dev/sda3  (it verifies the header!)

sudo cryptsetup  luksDump  /dev/sda3  (shows entire header info)

sudo dmsetup info <name>  (info on the mapped device)

look into /dev/mapper/   
look into /etc/crypttab
look into /etc/fstab
optional: look at /etc/crypttab.initramfs

generisch:  blkid -p <device>
sudo  blkid -p /dev/sda4

Unmount = close

1) Das Gerät (device) unmounten:
sudo umount /dev/mapper/luks-595682c3-cb1f-4315-a20c-8d48bfa0ab51
2) Das LUKS-Mapping beenden (close the luks-mapping)

Verifikation

Mit "dmsetup info" den vorher und den nachher Status überwachen:

sudo dmsetup info /dev/mapper/luks-595682c3-cb1f-4315-a20c-8d48bfa0ab51
zeigt vorher
Name:  luks-595682c3-cb1f-4315-a20c-8d48bfa0ab51
....   

Mapping schließen (luksClose)

sudo cryptsetup -v luksClose luks-595682c3-cb1f-4315-a20c-8d48bfa0ab51

Password ändern, zurückziehen

Es können mehrere Passwörter (parallel) in "slots" vergeben und auch wieder gelöscht werden.
Auch hier kann die key-Phrase von einer Datei kommen, siehe man page für cryptsetup.

Einen Überblick über die Nutzung der slots 0 bis 7 gibt
	cryptsetup luksDump <device>

Zum Hinzufügen eines Passwords wird luksAddKey benutzt.
	generisch: cryptsetup luksAddKey <device>

sudo cryptsetup luksAddKey /dev/sdb3
Enter any existing passphrase:
Enter new passphrase for key slot:
Verify passphrase:
Es gibt keine Ausgabe, welcher slot benutzt wurde.  

Löschen eines Passwords: 
Vorsicht: Man kann damit den letzten Zugang fuer immer loeschen. Siehe man page!

Backup

Das Backup der Daten kann aus dem entschlüsselten Gerät erfolgen.
Wichtig ist die Möglichkeit, den sog. Header des verschlüsselten LUKS-Containers zu sichern (Vorsicht: Diese Header-Sicherung gesichert aufbewahren, Missbrauch möglich).
Detaillierte Backup Hinweise sind in der man page auffindbar.

Backup des Header

eines LUKS crypt Containers

generisch: cryptsetup luksHeaderBackup --header-backup-file <file> <device>
oder
generisch: cryptsetup luksHeaderBackup /dev/<device> --header-backup-file /mnt/<backup>/<file>.img
mit
<device> ist die Partition, die das LUKS volume (<device> = /dev/sda3) enthält.



Restore Header

generisch: cryptsetup luksHeaderRestore --header-backup-file <file> <device>
Test before apply is possible:
cryptsetup --header <file> luksOpen <device> </dev/mapper/ -name>
see: https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#6-backup-and-data-recovery



Resize a LUKS partition

Idea:
resize partition > resize LUKS > resize2fs > DONE.

First the area has to be unmounted and unmapped by luksClose! \\ First I booted into a different Linux. Then I enlarged with gparted (0.30.0 on Fedora27). GParted recognises the LUKS correctly \\ cryptsetup resize only works after mapping the device, see man page! and it works perfect. \\ finally do resize2fs on the device (represented by the mapping). Asks for a e2fsck first, fine!

Make backup for data on partition.

Boot separate Linux (e.g. Fedora27)

Start GParted. Unmount all devices on the HD.
Increase size of LUKS-partition .

Check LUKS-partition is still valid (Header!):
sudo cryptsetup -v  isLuks /dev/sda14

Check for existing mappings
ls -latr /dev/mapper/

Map the device:
sudo cryptsetup -v luksOpen /dev/sda14 fressluke
ls -latr /dev/mapper/

Resize the LUKS
LUKS has to be mapped!  We work on the virtual device (partition)!
sudo cryptsetup -v resize fressluke

Filesystem remediation:
LUKS has to be mapped and unmounted!
sudo e2fsck -fv  /dev/mapper/fressluke
sudo resize2fs /dev/mapper/fressluke

Now test-mount the „new“ device (partition)
mount /dev/mapper/fressluke /mnt/test/
check mount with
mount
ls -latr /mnt/test/
Works fine!

UUID is the same like before, right?
sudo cryptsetup -v  luksDump  /dev/sda14
Yes, no adaption needed in fstab and crypttab.


------- end -----------