NetBSD mit Festplattenverschlüsselung auf UEFI System

dev0

Rock Hopper
Ich möchte die tolle Beschreibung von franco98 zur Installation von NetBSD auf UEFI System um die Festplattenverschlüsselung ergänzen. Ich habe auf meinem Thinkpad X270 NetBSD 8.1 und 9.0 RC1 nach der folgenden Anleitung erfolgreich installiert:

Anlegen der Partitionen

Es werden mindestens drei Partitionen benötigt.

1. EFI System Partition
2. NetBSD root Partition
3. NetBSD CGD Partition

NVMe Geräte heißen unter NetBSD ld?, d.h ld0 für das erste Gerät, usw.

NetBSD braucht eine unverschlüsselte root-Partition. Alles andere kann
in den verschlüsselten CGD Container installiert werden.

Nach dem Anlegen der Partitionen sieht das Layout etwa so aus:

Code:
dkctl ld0 listwedges

dk0: EFI System
dk1: NetBSD root
dk2: NetBSD encrypted

Anschließend kann das root Dateisystem erzeugt werden:
Code:
newfs -O2 /dev/dk1
Erzeugen des CGD

Zunächst muß die root Partition temporär eingehängt werden:
Code:
mount /mnt
Dann muß das Zielverzeichnis für die Krypto-Konfiguration anlegt werden:
Code:
mkdir -p /mnt/etc/cgd
Anschließend wird die Krypto-Konfiguration erzeugt:
Code:
cgdconfig -g -i encblkno8 -o /mnt/etc/cgd/dk2 aes-cbc 256
Nun kann der Krypto-Bereich geöffnet und ein Kennwort festgelegt werden:
Code:
cgdconfig -V re-enter cgd0 /dev/dk2 /mnt/etc/cgd/dk2
In diesem Beispiel wird das Gerät cgd0 angelegt und initialisiert. Nun können die
entsprechenden Partitionen darauf erzeugt werden.
Code:
disklabel -i cgd0
Folgendes Layout wurde für das Beispiel gewählt:
Code:
# /dev/rcgd0:
type: cgd
disk: cgd0
label: fictitious
flags:
bytes/sector: 512
sectors/track: 2048
tracks/cylinder: 1
sectors/cylinder: 2048
cylinders: 261120
total sectors: 534773760
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0        # microseconds
track-to-track seek: 0    # microseconds
drivedata: 0

7 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
b:  67108864         0       swap                     # (Cyl.      0 -  32767)
d: 534773760         0     unused      0     0        # (Cyl.      0 - 261119)
e: 419430400  67108864     4.2BSD      0     0     0  # (Cyl.  32768 - 237567)
f:   8388608 486539264     4.2BSD      0     0     0  # (Cyl. 237568 - 241663)
g:  39845888 494927872     4.2BSD      0     0     0  # (Cyl. 241664 - 261119)
und dieses Layout für die Dateisysteme konfiguriert:
Code:
Filesystem         Size       Used      Avail %Cap Mounted on
/dev/dk1           241M       122M       107M  53% /
/dev/cgd0f         3.9G       106M       3.6G   2% /var
/dev/cgd0e         197G       1.9G       185G   1% /usr
/dev/cgd0g          18G        19M        17G   0% /home
kernfs             1.0K       1.0K         0B 100% /kern
ptyfs              1.0K       1.0K         0B 100% /dev/pts
procfs             4.0K       4.0K         0B 100% /proc
tmpfs              3.9G         0B       3.9G   0% /var/shm
Anschließend müssen die Datensysteme erzeugt und der Swap Space initialisiert werden:

Code:
newfs -O2 /dev/cgd0e
newfs -O2 /dev/cgd0f
newfs -O2 /dev/cgd0g
swapon /dev/cgd0b

Installation des Systems

Nun müssen die neuen Dateisystem in das Installationsverzeichnis eingehängt werden:

Code:
mount /dev/cgd0e /mnt/usr
mount /dev/cgd0f /mnt/var
mount /dev/cgd0g /mnt/home
Jetzt kann die eigentliche Installation erfolgen:
Code:
cd /mnt

for pkg in base comp etc games kern-GENERIC man misc modules text xbase xcomp xetc xfont xserver ; do \
xz -dc /amd64/binary/sets/$pkg.tar.xz | tar -xvf - ; done

In das Installationsverzeichnis wechseln und chroot aufrufen:
Code:
chroot /mnt
Devices erstellen:
Code:
cd /dev
./MAKEDEV all

Die EFI Partition vorbereiten:
Code:
mkdir /mnt/efi
mount /dev/dk0 /mnt/EFI
und den Boot-Code dorthin kopieren:
Code:
cp /usr/mdec/*.efi /mnt/EFI/efi/boot/
Die Datei /boot.cfg wie folgt anpassen:
Code:
hd0b:netbsd
hd0b:netbsd -s
Nun kann der Bootsektor geschrieben werden:
Code:
installboot /dev/rdk1/usr/mdec/bootxx_ffsv1

Konfiguration

Anschließend muß die rc.conf angepaßt werden:
Code:
rc_configured=YES
cgd=YES
wscons=YES
Besonders wichtig ist die CGD Konfiguration, da sonst die Partition beim
Start nicht entschlüsselt wird. Dazu muß zusätzlich folgende Datei /etc/cgd/cgd.conf erstellt werden:
Code:
#
# Configuration of cryptographic disk devices
#
cgd0    /dev/dk2
Damit das System nach dem Start ein deutsches Tastaturlayout hat, muß folgendes Eintrag in der Datei
/etc/wscons.conf vorgenommen werden:
Code:
encoding de

Das Kennwort für das Entschlüsseln des CGD muß allerdings leider mit US Layout eingegeben werden, da
zu diesem Zeitpunkt das Tastaturlayout noch nicht konfiguriert ist.

Außerdem wird natürlich noch eine fstab benötigt. Sie würde so aussehen:
Code:
#
# /etc/fstab
#
/dev/dk1 / ffs rw,log 1 1
/dev/cgd0b none swap sw,dp 0 0
/dev/cgd0e /usr ffs rw,log,noatime 1 2
/dev/cgd0f /var ffs rw,log,noatime 1 2
/dev/cgd0g /home ffs rw,log,noatime 1 2
#
kernfs /kern kernfs rw
ptyfs /dev/pts ptyfs rw
procfs /proc procfs rw
tmpfs /var/shm tmpfs rw,-m1777,-sram%25
#
# End fstab
#
Dafür müssen noch die Verzeichnisse /proc und /kern manuell angelegt werden:
Code:
mkdir /proc
mkdir /kern
Nun kann das installierte System neu gestartet werden. Nach dem
Neustart erfolgt nun eine Kennwortabfrage. Erst nach Eingabe des beim
Anlegen des CGD gewählten Kennwortes wird das System vollständig
hochgefahren.
 
@franco98: Es würde mich sehr interessieren, ob es bei dir genauso gut funktioniert.

Hast Du schon 9.0 RC1 ausprobiert? Ich hatte jedenfalls kein Glück mit dem Installer. Damit kann mein keine verschlüsselten Laufwerke anlegen, obwohl des dazu entsprechende Menüeinträge gibt.
 
@dev0

Ich habe noch keine Zeit gefunden, da ich aktuell meine packages von pkgsrc-2019Q4 baue und dann auf den anderen Rechnern verteile. Das dauert immer etwas, da vieles anzupassen gilt. NetBSD 9.0 habe ich noch nicht getestet, ich warte das Relaise ab.
Was meinst du mit dem Installer? Ich installiere immer nach der o.g. Methode auf GPT Platten, ohne EFI-Boot auf älteren Rechnern mit Hilfe von einer Grub Installation (frisch compiliert), ansonsten wie ich es beschrieben hatte. Das sollte eigentlich auch unter 9.0 so funktionieren.

VG aus LE Franco
 
@franco98

Mit Installer meinte ich das Installationsprogramm, das hochkommt, wenn man das Installations-Image startet. Du schreibst, daß Du dann den Installer verläßt und alles von Hand machst, wie beschrieben. Ich habe mal versucht, ohne den Installer zu verlassen, ein System mit verschlüsseltem Laufwerk auf meinem Thinkpad, das per UEFI startet, zu installieren und war damit bis jetzt nicht erfolgreich. Vielleicht ändert sich das ja mit der Version 9.0. Daher meine Frage.
 
@dev0
So wie du es oben beschrieben hast, benutzt du doch den Installer nicht.
Du entpackst die packages nach dem du das rootfs und dann cgd0 angelegt und initialisiert hast. Oder habe ich etwas missverstanden?

Ich teste deinen Weg sobald ich Zeit habe.

VG aus LE
Franco
 
"Das Kennwort für das Entschlüsseln des CGD muß allerdings leider mit US Layout eingegeben werden, da
zu diesem Zeitpunkt das Tastaturlayout noch nicht konfiguriert ist."

Das kannst du doch nach dem Booten im Installer gleich zu Beginn einstellen (Sprache, Layout) und dann über Extras zur Shell wechseln. Dann den Rest lt. deiner Abfolge abarbeiten.

Ich teste heute mal...
 
Aktueller Stand:

Alles klappt unter 9.0RC1, aber nach dem Booten findet das System die Partitionen unter cgd0 nicht mehr. Disklabel zeigt wieder die Standardpartitionen a und d an, meine erstellten b, e, f, g und h sind weg.
Die Passwortabfrage erfolgte noch, dann fängt es an mit fehlender Swap Partition usw.

Ich teste es jetzt mal mit 8.1...
 
@dev0
So funktioniert es bei mir (NetBSD 8.1 & 9.0RC1):
* gpt create -f wd0
* gpt add -a 2m -s 32m -l efi -t efi wd0
* gpt add -a 2m -s 3072m -l netbsd_root -t ffs wd0
* gpt add -a -l netbsd_cgd -t cgd wd0
* newfs_msdos -F 16 -L EFI /dev/rdk0
* newfs -O2 -o time /dev/rdk1
* mount /dev/dk1 /mnt
* cd /mnt
* mkdir -p etc/cgd boot home usr var tmp proc kern
* cgdconfig -g -o /mnt/etc/cgd/dk2 -V disklabel aes-cbc 256
* cgdconfig -V re-enter cgd0 /dev/dk2 /mnt/etc/cgd/dk2
* 2x passphrase eingeben
* disklabel -I -i cgd0
* Partition a löschen
* Partitionen b für swap, e für /usr, f für /var, g für /tmp, h für /home erstellen
* cgdconfig -u cgd0
* cgdconfig cgd0 /dev/dk2 /mnt/etc/cgd/dk2
* passphrase eingeben
* newfs -O2 -o time für /dev/rcgd0e, /dev/rcgd0f, /dev/rcgd0g und /dev/rcgd0h
* swapctl -a /devcgd0b
* mount /dev/cgd0e /mnt/usr
* mount /dev/cgd0f /mnt/var
* mount /dev/cgd0g /mnt/tmp
* mount /dev/cgd0h /mnt/home
* packages wie in meinem anderen Thread entpacken (for packages in...)
* chroot /mnt
* cd /dev
* sh ./MAKEDEV all
* cgd=YES in /etc/rc.conf eintragen
* /etc/cgd/cgd.conf erstellen (cgd0 /dev/dk2)
* mount /dev/dk0 /boot
* mkdir /boot/EFI/boot
* cp /usr/mdec/*.efi /boot/EFI/boot
* cp /boot.cfg /boot/EFI/boot
* netbsd Eintrag anpassen (hd0b:netbsd) bzw. unter 9.0 hinzufügen nach 'boot'
* installboot /dev/rdk1 /usr/mdec/bootxx_ffsv2
* /etc/fstab editieren (/dev/dk1 für /, /dev/cgd0b für swap, /dev/cgd0e für /usr,...)
* Rest konfigurieren
* exit, reboot :-)
 
Ist ja so abenteuerlich wie eine Installation von Interactive Unix im Jahre 1988 ;)
Werd's trotzdem mal probieren.
 
@berni51
Findest du?
Ist halt alles per Hand. Installiere mal ArchLinux ! Der Standard Installer bietet halt nicht die Möglichkeiten und wenn man ein verschlüsseltes System will, dann geht's wohl i.M. nur so.
 
Ja klar, versteh ich schon. Ist ja auch nicht schlimm, nur mittlerweile etwas ..... ungewohnt.
Ist aber auch mal schön, die Basics wieder anzuwenden.
 
@franco98

Vielen Dank für deinen Bericht. Kleine Anmerkung: Den Befehl cgdconfig -u cgd0 und die nochmalige Entschlüsselung kannst Du dir sparen, da das CGD nach der erstmailgen Erstellung verfügbar bleibt.

Ich habe mal auf Anregung von @datasmurf eine Wiki-Seite für die Anleitung erstellt, siehe Anhang. Vielleicht magst Du mal drüberschauen und ggf. ergänzen, dann können wir einen Pull Request dafür starten.
 

Anhänge

  • netbsd_uefi_install.rst.txt
    5,8 KB · Aufrufe: 207
@dev0

Ich habe dir ja weiter oben geschrieben, dass am Anfang jedes mal nach dem Reboot mein disklabel weg war und ich habe mich deshalb strikt an die manpage von cgdconfig gehalten:

When using verification methods, the first time that we configure the
disk the verification method will fail. We overcome this by supplying -V
re-enter when we configure the first time to set up the disk. Here is
the sequence of commands that is recommended:

# cgdconfig -g -o /etc/cgd/wd0e -V disklabel aes-cbc
# cgdconfig -V re-enter cgd0 /dev/wd0e
/dev/wd0e's passphrase:
re-enter device's passphrase:
# disklabel -e -I cgd0
# cgdconfig -u cgd0
# cgdconfig cgd0 /dev/wd0e
/dev/wd0e's passphrase:

Ich habe nur meinen disklabel interaktiv mit disklabel -I -i erstellt, aber das ändert ja nichts, dass mit cdgconfig -u und dann erneutem cdgconfig cg0... mein disklabel erhalten blieb. Das US Layout stimmt übrigens, trotz vorherigem Einstellen auf DE im Installer.

Die Idee mit dem Wiki finde ich sehr gut, ich schaue es mir gern an.

VG aus LE
Franco

P.S. Ich baue gerade auf 9.0RC1 meine packages für 2019Q4 neu, kann den Performanceverlust durch die Verschlüsslung noch nicht einschätzen. Was denkst du? Zu vernachlässigen?
 
@dev0
Ich denke ich muss hier nichts ergänzen, du hast das sehr gut ausgearbeitet.

Ob du das mit den NVMe Geräten erwähnen musst, weiß ich nicht, es gilt ja allgemein mit dkctl ein device am Anfang zu partitionieren. Ob das device wd0, ld0 usw. ist, spielt beim Anlegen der 3 Partitionen ja keine Rolle.

Wer ist denn die Zielgruppe für diesen Wiki-Eintrag?

Anfänger sollten evtl. noch wissen, dass nach dem Initialisieren des disklabels von /dev/rcgd0 die vorhandene Partition a gelöscht werden sollte.
Korrekt wäre auch eigentlich mit disklabel -I -i zu initialisieren, da der Parameter -i nur interaktives Bearbeiten bedeutet, -I -e geht natürlich auch. Ich hatte ohne Initialisierung schon öfter Probleme, da kein disklabel vorhanden war. Off-Topic ich weiß ;-)

Wir brauche ja nur b für swap und e, f, g usw. für die anderen Partitionen. Partition 'a' ist bei mir eigentlich auch nur für / vorgesehen, auf weiteren Platten, Devises nehme ich immer e bzw. i.

Man könnte noch erwähnen, dass es mehrere IV methods gibt, also optional auch cgdconfig -g -i encblkno1 ... geht.
Evtl. auch die encryption algorithmes und blocksize nennen.

Wie gesagt, wer ist die Zielgruppe? Davon hängt sicher ab, was noch rein sollte oder nicht.
Entscheide du bitte, es ist deine Anleitung! Ich finde sie sehr gut.

Vielen Dank für die Arbeit.

VG aus LE
Franco
 
Zurück
Oben