Benutzer-Werkzeuge

Webseiten-Werkzeuge


 [[anwenderwiki:linuxclient:home_verschluesselung]] 

Verschlüsselung des home-Verzeichnisses

Auf Lehrergeräten ist es sinnvoll zumindest das home-Verzeichnis zu verschlüsseln, da darin oft personenbezogene Daten abgelegt sind. Dazu gibt es verschiedene Varianten:

  1. LUKS - verschlüsselt nur ganze Partitionen oder das ganze System, performant, aber ungeeignet bei Geräten, die mehrere Benutzer haben
  2. ecryptfs - verschlüsselt Verzeichnisse oder Dateien einzeln
  3. systemd-homed - für home-Verzeichnisse (in Entwicklung)

Zusätzlich zum home sollte auch die swap-Auslagerung (falls vorhanden) und das /tmp-Verzeichnis verschlüsselt werden.

Alternative 1: Verschlüsselung eines home-Verzeichnisses mit ecrptfs

Da das Betriebssystem Ubuntu und die home-Partition bei meiner Konfiguration (Sync mit LINBO) auch unverschlüsselte Daten enthalten, kam nur die Verschlüsselung ecryptfs in Frage.

Folgende Verfahren wurden an einem Ubuntu 22.04-System durchgeführt.

Am einfachsten ist es die Verschlüsselung beim Neuanlegen eines Benutzers gleich mit zu installieren. Bei Anmeldung an Ubuntu wird dann das Anmeldepasswort auch zum Entsprerren einer Passphrase verwendet und mit der Passphrase das home entschlüsselt.
Verschlüsselung installieren:

sudo apt install ecryptfs-utils cryptsetup

Neuen Benutzer anlegen:

sudo adduser –-encrypt-home testlehrer

Nun die Benutzerverwaltung aufrufen und ggf. weitere Einstellungen zum Benutzer setzen.
Problem bei ecryptfs: Das home wird beim Abmelden nicht verschlossen, nur beim Herunterfahren. Deshalb in der Datei /etc/pam.d/common-session-noninteractive folgende Zeile mit „#“ auskommentieren:

     ...
     # session optional pam_encryptfs.so unwrap
     ...

Die dabei erzeugte Passphrase „wrapped-passphrase“ sollte man nun an einem sicheren Ort (z.B. USB-Stick) aufbewahren. Dazu die Passphrase unverschlüsselt extrahieren:

ecryptfs-unwrap-passphrase .ecryptfs/wrapped-passphrase > /media/usbstick/mypassphrase.txt
Eine Passwortänderung darf nur innerhalb des Accounts erfolgen, nicht von außen, da sonst das Passwort der Passphrase nicht angepasst würde.

Verschlüsselung des /tmp-Verzeichnisses mit ecrptfs

Alle Befehle als root ausführen. Zuerst die Verschlüsselungs-Pakete installieren:

apt install ecryptfs-utils cryptsetup

Meist gibt es neben /tmp auch das Verzeichnis /var/tmp, die man mit einem Link zusammenführt:

# rm –Rf /var/tmp
# ln –s /tmp /var/tmp

Nun eine Container-Datei /.crypttmp der Größe 300 MB erzeugen und (ohne journal) formatieren:

# dd if=/dev/zero of=/.crypttmp count=300 bs=1M
# losetup /dev/loop20 /.crypttmp
# mkfs.ext4 -O ^has_journal /dev/loop20

In der Datei /etc/crypttab eine Zeile hinzufügen:

     crypttmp /.crypttmp /dev/urandom tmp,size=256, hash=sha256,cipher=aes-cbc-essiv:sha256

In der Datei /etc/fstab eine Zeile hinzufügen:

     /dev/mapper/crypttmp /tmp ext4 defaults 0 2

Mapping starten und Verzeichnis leeren:

# cryptdisks_start crypttmp
# rm -Rf /tmp/*

Beim Booten wird jedesmal ein neues /tmp-Verzeichnis angelegt, formatiert und mit einer (neuen) zufälligen Passphrase (/dev/urandom) verschlüsselt.
Problem: Das /tmp-Verzeichnis hat hier eine maximale Größe von 300 MB - beim einem großen Update des Systems brach dieses bei mir ab, da der update-Prozess in /tmp nicht genügend Speicherplatz für alle neuen Pakete hatte. Ggf. die Größe der Container-Datei verändern.

Alternative 2: Verschlüsselung des Home und tmp mit LUKS

In meiner Variante wird das Unterverzeichnis eines Benutzers mit frei wählbarem Benutzernamen, z.B. `tobias` auf einer eigenen Partition verschlüsselt. Ebenso wird tmp als eigene Partition verschlüsselt.

Ich partitioniere daher den Client so:

/dev/nvme0n1p1 260MB EFI (/boot)
/dev/nvme0n1p2 16MB reserved MS
/dev/nvme0n1p3 15 GB LINBO-Cache
/dev/nvme0n1p4 35 GB Ubuntuclient (inkl. home für linuxadmin & alex)
/dev/nvme0n1p5 1 GB  /tmp
/dev/nvme0n1p6 ca. 180 GB (Rest)  home-crypt
  • lokaler Vor-Installations-Benutzer alex (1066) wird angelegt - unverschlüsselt mit Passwort Muster!, er bekommt sudo-Rechte für das turnkey-skript und die Linuxadmin-Umgebung
# groupadd -g 1066 alex
# useradd -d /home/alex -k /home/linuxadmin -s /bin/bash -m -u 1066 -N -g 1066 alex
# echo 'alex:Muster!' | chpasswd
  • /var/tmp wird auf /tmp verlinkt und beim Boot automatisch immer neu verschlüsselt
mv /var/tmp/* /tmp/
mv /var/tmp/.??* /tmp/
rmdir /var/tmp/
ln -s /tmp /var/tmp
echo "tmp  /dev/nvme0n1p5 /dev/urandom tmp,cipher=aes-xts-plain64,size=256" >> /etc/crypttab
echo "/dev/mapper/tmp /tmp ext4 defaults 0 2" >> /etc/fstab
  • das turnkey-Skript auf dem Desktop von Alexander, das per sudo folgende Aktionen durchführt:
    • Abfrage von Benutzername und Passwort für das neue Konto (uid/gid: 1067)
    • Abfrage, ob ein Administrationsschlüssel hinterlegt werden sollte (/admin.key)
    • Benutzer- und Gruppe werden angelegt: $newuser mit $newpw
# groupadd -g 1067 $newuser
# useradd -m -d /home/${newuser} -s /bin/bash -N -g 1067 -G $othergroups -k /home/linuxadmin $newuser 
# echo '$newuser:$newpw' | chpasswd
  • Containerverschlüsselung der Homepartition erstellt
# cryptsetup luksFormat --use-random -c aes-xts-plain64 -s 512 -h sha512 -y /dev/nvme0n1p6 
  
WARNUNG!
========
Hiermit werden die Daten auf »/dev/nvme0n1p6« unwiderruflich überschrieben.

Sind Sie sicher? (Tippen Sie 'yes' in Großbuchstaben): YES
Geben Sie die Passphrase für »/dev/nvme0n1p6« ein: <starkes Passwort>
Passphrase bestätigen: <starkes Passwort>
  • Eventuell Administrationsschlüssel hinterlegen:
#  printf $newpw | cryptsetup luksAddKey /dev/nvme0n1p6 /admin.key
  • Container öffnen und formatieren
# printf $newpw | cryptsetup luksOpen /dev/nvme0n1p6 cryptohome
# mkfs.ext4 /dev/mapper/cryptohome
  • sudo-Rechte bei Wunsch vergeben
  • Deaktivierung von Konto „alex“, Löschen des Adminkeys auf dem Gerät: /admin.key
  • Damit das Home-Verzeichnis bei der Anmeldung auch geöffnet und als /home/$newuser gemountet wird, verwende ich momentan (noch) pam_mount nach folgender Vorlage: Der Vorlagennutzer „wilhelm“, der durch $newuser ersetzt werden sollte:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
  <debug enable="0" />
  <volume user="wilhelm" fstype="crypt" path="/dev/nvme0n1p6" mountpoint="/home/wilhelm" options="crypto_name=cryptohome,allow_discard,fstype=ext4">
    <user>                                                                                                                                                    
      wilhelm                                                                                                                                                 
    </user>
  </volume>

    <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other" />
    <mntoptions require="nosuid,nodev" />
   <logout wait="1000" hup="0" term="1" kill="1" />
    <mkmountpoint enable="1" remove="true" />
</pam_mount>

Skriptvorschlag

 [[anwenderwiki:linuxclient:home_verschluesselung]] anwenderwiki/linuxclient/home_verschluesselung.txt · Zuletzt geändert: 2022/03/13 10:29 von tobias