1.48. Festplattenverschlüsselung mit Geli und USB Boot
1.48.1. Einleitung
1.48.1.1. Vorraussetzungen
USB Bootfähiges Mainboard
FreeBSD DVD (wegen Install Daten und Fixit Shell)
USB Stick
HDD Terminologie: ad10
USB Stick Terminologi: da0
Man sollte schon einen relativ guten USB Stick nehmen. Ich hatte erst einen 6€ noname 2GB USB Stick und es kamen nur LBA Fehler Mit einem 20€ USB Stick von Sony gab es keine Probleme mehr.
1.48.1.2. Zielsetzung
Eine 1TB HDD soll folgendermaßen formatiert werden
ad10s1 (40GB)
a / 300MB
b swap 2GB
c raw disk
d /usr 20GB
e /var 5GB
f /tmp 5GB
g /root 1GB
h /home 5GB (rest)
ad10s2 (Rest)
d /data
Wobei ad10s1 Die Systempartition ist, welche direkt beim booten eingehangen wird. Dies geschiet mittels Password und einem Key, welcher sich auf dem USB Stick befindet. ad10s2 Ist die Datenpartition und kann nach belieben eingehangen werden.
Das ganze System soll von einem unverschlüsselten USB Stick booten, welcher nach dem Start entfernt werden kann.
1.48.1.3. Hinweis
Achtung ich gehe davon aus, dass es sich um eine leere Festplatte handelt. Diese wird neu formatiert, falls sich Daten darauf befinden, dann vorher Backups erstellen!
1.48.2. Installation
1.48.2.1. Fixit Shell starten
FreeBSD mit der Install DVD Booten.
Fixit Shell starten ( sysinstall->fixit->2 CDROM/DVD )
1.48.2.2. Setup Permissions
Die fixit shell gibt am Anfang den Hinweis /etc/pwd und /etc/group zu symlinken, da ansonsten die Rechte beim entpacken von tar archiven verloren gehen könnten. Da diese Dateien allerdings schon existieren, lösche ich diese erst und linke sie neu.
Fixit> rm /etc/pwd.db
Fixit> rm /etc/spwd.db
Fixit> rm /etc/group
Fixit> ln -s /mnt2/etc/pwd.db /etc/pwd.db
Fixit> ln -s /mnt2/etc/spwd.db /etc/spwd.db
Fixit> ln -s /mnt2/etc/group /etc/group
1.48.2.3. Partitionierung
Dies geschiet mit fdisk
Fixit> fdisk -i /dev/ad10
Ich habe folgende Werte verwendet
Do you want to change our idea of what BIOS thins? [n]
Do you want to change it? [y]
sysid 165
start 63
size 83885697 # ca 40GB
set beg/end [n]
are you happy with this [y]
Data for Partition 2
Do you want to change it? [y]
sys 165
start 83885760
size 1869636384
set beg/end [n]
are you happy with this [y]
set active partition [y]
active [1]
are you happy with this [y]
write partition table [y]
Bei Bedarf kann die Größe der ersten Partition von ca 40G auch geändert werden.
1.48.2.4. Geli
1.48.2.4.1. Load Geli
Um Geli laden zu können muss man vorher zwei symlinks zu kernel und lib erstellen.
Fixit> ln -s /dist/boot/kernel /boot/kernel
Fixit> ln -s /dist/lib /lib
Fixit> kldload geom_eli
1.48.2.4.2. Create Keys
Jetzt werden die Verschlüsselungskeys für die beiden Partitionen erzeugt. Den zweiten key kann man natürlich auch später erzeugen, da dieser für die Installation nicht notwendig ist.
Fixit> mkdir -p /root/keys
Fixit> dd if=/dev/random of=/root/keys/ad10s1.key bs=128k count=1
Fixit> dd if=/dev/random of=/root/keys/ad10s2.key bs=128k count=1
1.48.2.4.3. Encrypt
Die -b Option bedeutet, dass bei dieser Partition schon eine Passwortabfrage beim booten erfolgt.
Fixit> geli init -b -K /root/keys/ad10s1.key -s 4096 -l 256 /dev/ad10s1 # -b PWD Abfrage beim Boot
Passwort:
Passwort wiederholung:
Fixit> geli init -K /root/keys/ad10s2.key -s 4096 -l 256 /dev/ad10s2 # Wird im running system gemountet
Passwort:
Passwort wiederholung:
1.48.2.4.4. Attach
Hier werden die Partitionen entschlüsselt.
Fixit> geli attach -k /root/keys/ad10s1.key /dev/ad10s1
Fixit> geli attach -k /root/keys/ad10s2.key /dev/ad10s2
1.48.2.4.5. Override (Optional)
Falls es sich um eine schon benutzte Festplatte handelt, kann diese hier mit /dev/random komplett überschrieben werden.
Fixit> dd if=/dev/random of=/dev/ad0s1.eli bs=1m
Fixit> dd if=/dev/random of=/dev/ad0s2.eli bs=1m
1.48.2.5. Slices
Sollen Bei meinem Setup folgendermaßen aussehen:
ad10s1 (40GB)
a / 300MB
b swap 2GB
c raw disk
d /usr 20GB
e /var 5GB
f /tmp 5GB
g /root 1GB
h /home 5GB (rest)
Fixit> bsdlabel -w /dev/ad10s1.eli
Fixit> bsdlabel -e /dev/ad10s1.eli
Manueller Eintrag mit bsdlabel. Die * sind Platzhalter und bedeuten, dass bsdlabel die Werte automatisch nach-berechnet. Folgende Werte habe ich bei mir eingetragen:
a: 300M 2 4.2BSD
b: 2G * swap
c: -- dont edit --
d: 20G * 4.2BSD
e: 5G * 4.2BSD
f: 5G * 4.2BSD
g: 1G * 4.2BSD
h: * * 4.2BSD
Slices formatieren
Fixit> newfs -L ROOT /dev/ad10s1.elia
Fixit> newfs -L SWAP /dev/ad10s1.elib
Fixit> newfs -L USR /dev/ad10s1.elid
Fixit> newfs -L VAR /dev/ad10s1.elie
Fixit> newfs -L TMP /dev/ad10s1.elif
Fixit> newfs -L ROOTHOME /dev/ad10s1.elig
Fixit> newfs -L HOME /dev/ad10s1.elih
1.48.2.6. Installieren
Installations-Directory anlegen, in diesem fall /fixed und die Slices entsprechend mounten
Fixit> mkdir /fixed
Fixit> cd /fixed
Fixit> mount /dev/ad10s1.elia /fixed
Fixit> mkdir home root tmp usr var
Fixit> mount /dev/ad10s1.elid /fixed/usr
Fixit> mount /dev/ad10s1.elie /fixed/var
Fixit> mount /dev/ad10s1.elif /fixed/tmp
Fixit> mount /dev/ad10s1.elig /fixed/root
Fixit> mount /dev/ad10s1.elih /fixed/home
Installations Pfad angeben und Base und Kernel installieren
Fixit> export DESTDIR=/fixed
Fixit> cd /dist/7.2-RELEASE/base && ./install.sh
Fixit> cd /dist/7.2-RELEASE/kernels && ./install.sh generic
### Anmerkung: Bei der Base installation kamen folgende Fehlermeldungen:
/root/.profile: Cant create ‚root/.profile‘ : Cross-Devide link
./root/.cshrc: Cant create ‚root/.cshrc‘ : Cross-Devide link
tar: Error exit delayed from previous errors
Diese konnte ich aber misachten, da alles trotzdem funktioniert Sollte jemand wissen was hier los ist, bitte ändern
1.48.2.7. USB Stick Setup
USB Stick formatieren und partitionieren
Fixit> fdisk -BI /dev/da0
Fixit> bsdlabel -B -w /dev/da0s1
Fixit> newfs /dev/da0s1a
USB Directory erzeugen und einhängen
Fixit> mkdir /usb
Fixit> mount /dev/da0s1a /usb
Den Boot Ordner vom Installierten System auf den USB Stick kopieren
Fixit> mkdir /usb/boot
Fixit> cp -Rpv /fixed/boot/ /usb/
Damit man booten kann muss die kernel unter /boot/kernel/kernel zu finden sein. Also GENERIC nach kernel verschieben.
Fixit> rmdir /usb/boot/kernel
Fixit> mv /usb/boot/GENERIC /usb/boot/kernel
Fixit> cd /usb/boot/kernel
Damit der Systemstart schneller geht, kann man noch die kernel und die Kernelmodule gzippen
Fixit> gzip * # compress to have faster loading
Um Platz zu sparen kann man auch in /usb/boot/kernel die nichtbenötigten Module löschen. Definitiv benötigte Module sind:
zlib.ko
crypto.ko
acpi.ko
geom_eli.ko
kernel
Den Geli Encryption Key auf den USB Stick kopieren.
Fixit> cp /root/keys/ad10s1.key /usb/ad10s1.key
Damit man die Festplatte entschlüsseln kann muss das Geli Modul geladen werden und der Pfad für das Keyfile angegeben werden. Hierzu wird folgender Eintrag in der loader.conf auf dem USB Stick angelegt:
Fixit> vi /usb/boot/loader.conf
geom_eli_load="YES"
geli_ad10s1_keyfile0_load="YES"
geli_ad10s1_keyfile0_type="ad10s1:geli_keyfile0"
geli_ad10s1_keyfile0_name="/ad10s1.key"
Jetzt muss noch eine fstab auf dem USB Stick angelegt werden, welcher die root-partition mountet.
Fixit> mkdir /usb/etc
Fixit> cd /usb/etc
Fixit> vi fstab
/dev/ad10s1.elia / ufs rw 1 1
Nach dem Mount der root Partition ist der USB Stick aus dem namespace raus, darum muss noch eine fstab in der root Partition der Festplatte angelegt werden, wo dann der Rest geladen werden muss.
Fixit> vi /fixed/etc/fstab
/dev/ad10s1.elib none swap sw 0 0
/dev/ad10s1.elid /usr ufs rw 2 2
/dev/ad10s1.elie /var ufs rw 2 2
/dev/ad10s1.elif /tmp ufs rw 2 2
/dev/ad10s1.elig /root ufs rw 2 2
/dev/ad10s1.elih /home ufs rw 2 2
Jetzt ist man fertig und kann das System rebooten. Beim reboot muss man dann das Passwort für die ad10s1 Partition eingeben.
1.48.3. Post-Installation
1.48.3.1. Post Steps
Super User Passwort setzen
# passwd
Add user with wheel group
# adduser
Set Timezone
# tzsetup
set up network card
# ifconfig re0 add 192.168.0.133 netmask 255.255.255.0
/etc/resolve.conf anpassen
domain domain.de
nameserver 217.237.151.51
nameserver 217.237.149.205
1.48.3.2. Zusätzliche Packages installieren
# mount_cd9660 /dev/acd0 /mnt
# cd /mnt/7.2-RELEASE/manpages && ./install.sh
# cd /mnt/7.2-RELEASE/src && ./install.sh all
...
1.48.3.3. Ports Collection installieren
Hierzu bnötigt man eine funktionierende Internetkonfiguration.
# mkdir /usr/ports
# cd /usr/ports
# portsnap fetch extract
1.48.3.4. rc.conf
ifconfig_re0="inet 192.168.0.133 netmask 255.255.255.0" # hier natürlich das entsprechende Interface und IP wählen.
defaultrouter="192.168.0.1" # Auch hier wirder dementsprechend anpassen
hostname="hostname.domain.de"
sshd_enable="YES" # ssh aktiveren
syslogd_enable="YES"
syslogd_flags="-ss" # disable logging from remote host
1.48.3.5. Directory Permissions setzen
Man kann jetzt noch die Directory Permissions von root und den systemusern verbessern.
# chmod 700 /root
# chmod 700 /home/<USER>
1.48.4. Fehler
Sollte der Systemstart nach der Installation nicht klappen, da man evtl. das keyfile falsch in die loader.conf eingetragen hat oder sicht sonst irgendwo vertippt hat, kann man immer noch das System mit der DVD starten, die Fixit shell aufrufen und alles ändern. Hier zu muss aber wieder Geli geladen werden, die symlinks wie oben entsprechend angepasst werden, die Partitionen und den USB stick einhängen.
1.48.5. Quellen
HOWTO: GELI+ZFS for whole system inc. root with boot from USB stick
FreeBSD/System verschlüsseln mit geli(8)
System verschlüsseln mit geli(8)
FreeBSD Handbook - Disks Encryption
Zuletzt geändert: 2023-07-22