class: center, middle ## 🛡Festplattenverschlüsselung🛡 # 🔐mit LUKS (+LVM)🔐 ### Hauke Goos-Habermann #### https://goos-habermann.de --- ### Zu diesem Video  Dieses Video ist Teil gemeinsamen Projektes, bei dem Jean, Micha und ich verschiedene Aspekte behandeln, wie Ihr Eure Server absichern könnt. Schaut Euch auch das gocryptfs-Video von Micha an, da er dort **viele Grundlagen** erklären, die ich hier nicht nochmal durchgehe. Und: **Micha malt** sogar :-) **Playlist mit allen Videos**:
https://youtube.com/playlist?list=PLhvaM7uJr1PA89sEfrL74abQ4kZGC3Js9
Viel Spaß beim Vorbeischauen und Anschauen :-) --- ### Über mich - Entwickler des
Softwareverteilungssystems m23
- Organisator der
Kieler Open Source und Linux Tage
-
Dienstleister zu m23, Linux und Freier Software
- Softwareentwicklung (PHP, BASH, C/C++, JS, Python und was sonst so gebraucht wird...) - Administration - Schulungen - Support - Beratung - quasi **alles**, *was mit Linux zu tun hat* - Wöchentlicher Livestream *"Jean und Hauke Show"* auf https://www.youtube.com/c/LinuxGuides - Community-Video-Serie *"Nicht der Weisheit letzter Schluß"* auf
tube.tchncs.de
und
YouTube
mit **beruflichen** oder **privaten Projekten** - Verwendet Festplattenverschlüsselung seit
Pentium M
-Zeiten. --- ### Festplattenverschlüsselung  * Dateien und Verzeichnisse werden nur verschlüsselt auf einem physikalischen Datenträger abgelegt * Daten werden beim **Lesen** transparent entschlüsselt * Daten werden beim **Schreiben** transparent verschlüsselt * Daten sind nur dann **geschützt**, wenn der *verschlüsselte Datenspeicher* **nicht "offen"** ist #### Wofür ist das gut? * Wird z.B. ein ausgeschaltetes Notebook (*"geschlossener Zustand"*) gestohlen, so kann der Dieb die Daten nicht entschlüsseln. * Im *"offenen Zustand"* können alle Dateien und Verzeichnisse (durch die dazu berechtigten Nutzer) gelesen und modifiziert werden. So auch durch Schadsoftware, die mit den Rechten eines dieser Benutzer läuft. * Festplattenverschlüsselung ist nur **ein Baustein** in einem Sicherheitskonzept. --- ### Wo ist das drin? Direkt im Installationsprogramm als Kombination von **LVM** und **LUKS** von: * Debian * Ubuntu * Linux Mint * openSUSE * ... Beispiel: 1 TB Festplatte in einem BIOS-System (bei UEFI käme noch eine EFI-Partition hinzu):  --- ### Grundlagen: LVM Der
**L**ogical **V**olume **M**anager
ist eine zusätzliche Abstraktionsschicht zwischen physikalischen Datenspeichern (Festplatten und Partitionen) und dem Dateisystem. Er besteht aus einem Kernel-Modul und Kommandozeilenprogrammen bzw. grafischen Anwendungen (z.B.
GParted
) für die Verwaltung. #### Begriffe * **PV**, **P**hysical **V**olume: Physikalische Datenspeicher (Festplatten + Partitionen) ```bash pvcreate /dev/sdb; pvcreate /dev/sdc # Zwei SSDs als PV initalisieren ``` * **VG**, **V**olume **G**roup: Gruppe aus PVs ```bash vgcreate vg1 /dev/sdb /dev/sdc # VG "vg1" aus den SSDs bilden ``` * **LV**, **L**ogical **V**olumes: Quasi die *"Partitionen"*, die aus VGs gebildet und formatiert/gemountet werden ```bash # 1. LV: 1 GB ⇒ Swap, 2. LV: Restlicher freier Speicher ⇒ root-Dateisystem lvcreate -L1024M -nswap vg1; lvcreate -l 100%FREE -nroot vg1 ``` --- ### LVM zum Ausprobieren Der Einfachheit halber verwenden wir ein Containerdatei. Statt einer Datei können auch Geräte (SSD, HDD, USB) oder Partitionen verwendet werden. ```bash # 100 MB große Containerdatei anlegen dd if=/dev/zero bs=1M count=100 of=/tmp/lvm.img # Containerdatei über loop-Gerät zugänglich machen losetup /dev/loop7 /tmp/lvm.img # PV-Struktur anlegen pvcreate /dev/loop7 # VG aus einem PV erstellen vgcreate vg1 /dev/loop7 # 10 MB aus der VG nehmen und LV für swap erstellen lvcreate -L10M -nswap vg1 # => /dev/mapper/vg1-swap # Formatieren mkswap /dev/mapper/vg1-swap # Restlichen freien Speicher für root-Dateisystem verwenden lvcreate -l 100%FREE -nroot vg1 # => /dev/mapper/vg1-root # Formatieren mkfs.ext4 /dev/mapper/vg1-root ``` --- ### Grundlagen: Verschlüsselung **AES** ist ein weitverbreitetes symmetrisches
Blockverschlüsselungsverfahren
mit einer Blockgröße von 128 Bit (16 Byte) und einer maximalen Schlüssellänge von 256 Bit.
Wikipedia
zur Sicherheit: *...es ist kein praktisch durchführbarer Angriff bekannt...*. **Problem**: Die Datenmenge ist meist deutlich größer als 16 Byte und die Verwendung **desselben Schlüssels** – wie bei
EBC (Electronic Code Book Mode)
– **für alle Blöcke unsicher**:  .copyright[
Original-Tux von Larry Ewing CC BY-SA 4.0
und Abwandlung als
ECB-Tux
] --- ### Grundlagen: Blockverkettung **XTS** sorgt – als Nachfolger von
CBC (Cipher Block Chaining Mode)
– dafür, daß jeder Block mit einem individuellen Schlüssel verschlüsselt wird:  .copyright[
Original-Tux von Larry Ewing CC BY-SA 4.0
] --- ### LUKS zum Ausprobieren Der Einfachheit halber verwenden wir wieder ein Containerdatei. Statt einer Datei können auch Geräte (SSD, HDD, USB) oder Partitionen verwendet werden. ```bash # Neue Containerdatei mit 100 MB Nullen erstellen dd if=/dev/zero of=/tmp/luks.img bs=1M count=100 # LUKS-Struktur im Conatiner anlegen cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y /tmp/luks.img ``` * -c aes-xts-plain64: Verschlüsselungsalgorithmus (AES) + Betriebsart (XTS) * plain64: Als Initialisierungsvektor von XTS für den Block die Sektornummer als 64-Bit-Zahl (little-endian und mit Nullen aufgefüllt) verwenden * -s 512: Schlüssellänge für AES (2x 256 Bit) * -h sha512: Hash-Algorithmus, um auf den Paßwort den Schlüssel zu generieren Mehr dazu: * https://gitlab.com/cryptsetup/cryptsetup/-/wikis/DMCrypt * https://wiki.gentoo.org/wiki/Dm-crypt_full_disk_encryption * https://de.wikipedia.org/wiki/Dm-crypt#LUKS --- ### LUKS zum Ausprobieren Innerhalb des LUKS-Containers ist noch kein Dateisystem vorhanden, daher muß der Container **geöffnet** bzw. in **unverschlüsselter Repräsentation** unter ***/dev/mapper/luks-img*** abgebildet werden. Danach erfolgt das Formatieren über die bekannten Werkzeuge: ```bash # Öffnen: Bei Erfolg unter /dev/mapper/luks-img abgebildet cryptsetup luksOpen /tmp/luks.img luks-img # Mit ext4 formatieren (keine Speicherreservierung für root) mkfs.ext4 -m 0 /dev/mapper/luks-img # Einhängen mkdir -p /tmp/luks-img mount /dev/mapper/luks-img /tmp/luks-img # Was ist drin? Wieviel ist frei? (16 MB LUKS-Header) ls -l /tmp/luks-img df -h /tmp/luks-img # Aushängen und LUKS schließen umount /tmp/luks-img cryptsetup luksClose luks-img ``` --- ### LUKS: Paßworte + Schlüsseldateien LUKS unterstützt **8** gleichwertige **Speicherplätze** für **Hashes**, die mit den Paßworten oder Schlüsseldateien **verknüpft** werden und die alle zum Öffnen des LUKS verwendet werden können. ```bash # ZUSÄTZLICHES Paßwort hinzufügen cryptsetup luksAddKey /tmp/luks.img # Paßwort deaktivieren cryptsetup luksRemoveKey /tmp/luks.img # Schlüsseldatei mit 1000 Byte Zufallsdaten erstellen dd if=/dev/urandom bs=1000 count=1 of=Schlüsseldatei.dat # Schlüsseldatei hinzufügen cryptsetup luksAddKey /tmp/luks.img Schlüsseldatei.dat # Schlüsseldatei deaktivieren cryptsetup luksRemoveKey /tmp/luks.img Schlüsseldatei.dat # Paßwort oder Schlüsseldatei ändern cryptsetup luksChangeKey ... ``` --- ### LUKS: Header Der LUKS-Header enthält **nötige Parameter** und alle Speicherplätze für Hashes von Paßworten und Schlüsseldateien. Ist er **beschädigt**, so kann das LUKS nicht mehr geöffnet werden und die **Daten** sind **unwiderruflich verloren**. ```bash # Sicherungsdatei anlegen cryptsetup luksHeaderBackup [Gerät] --header-backup-file [Sicherungsdatei] # Sicherungsdatei wiederherstellen cryptsetup luksHeaderRestore [Gerät] --header-backup-file [Sicherungsdatei] # Versuchen, die Meta-Daten zu reparieren cryptsetup repair [Gerät] ``` --- ### LUKS: Beim Booten einbinden **Zusätzliche Geräte**, die nicht vom Installationsprogramm eingerichtet wurden, können mit **LUKS verschlüsselt** und so eingerichtet werden, daß das **Paßwort** zum Freischalten **beim Booten abgefragt** wird. ```bash # UUIDs aller LUKS-Geräte auflisten blkid | grep LUKS # Paßwort abfragen und unverschlüsselte Repräsentation als [Bezeichner] # abbilden echo '[Bezeichner] UUID=[LUKS-UUID] none luks,discard' >> /etc/crypttab # Hinweis: "[Bezeichner]" kann frei gewählt werden # Verzeichnis zum Einhängen anlegen mkdir /media/[Bezeichner] # Automatisches Mounten echo\ '/dev/mapper/[Bezeichner] /media/[Bezeichner] ext4 errors=remount-ro 0 1'\ >> /etc/fstab ``` --- class: center, middle ### Informationen zu mir und meinen Dienstleistungen, m23, ... ### https://goos-habermann.de