doedel Guru
Joined: 05 Feb 2006 Posts: 579 Location: Denmark
|
Posted: Mon Oct 30, 2006 5:07 pm Post subject: Verschlüsseltes Gentoo mit cryptsetup-luks und ohne initrd |
|
|
Ich habe schon einige Howtos dazu durchgearbeitet, aber Anfangs kam ich mit der initrd nicht wirklich zurecht und schliesslich will man ja alles mal selber gemacht haben, also habe ich dies auch getan und gleich das Howto hier geschrieben.
Ich hoffe man kann es gebrauchen.
Ausgangssituation:
Bei mir sah es so aus:
/dev/hda1 /boot (ab 15MB, meine hat 60MB)
/dev/hda2 /swap
/dev/hda3 / (ein installiertes und funktionierendes Gentoo)
/dev/hdc1 [frei]
Das ganze geschah aus dem schon laufenden Gentoo heraus. Sicher lässt sich das auch mit einer LIVE-CD machen (die 2006.1er hat glaube ich sogar Portage mit drin), aber damit habe ich mich nicht mit befasst, kann es ja noch mal machen (oder einer von euch). Es basiert auf einem 2.6er Kernel (im Moment 2.6.17-gentoo-sources), ich weiss allerdings nicht, ob es mit einem 2.4er auch tut. Darunter? Evtl. noch mit dem 2.4er, aber alles andere wage ich zu bezweifeln.
1. Kernel
Zuerst schaut ihr ob euer Kernel folgendes eingebaut hat:
(Ich habe einfach alle Algiorhythmen fest eingebaut, so kann keiner fehlen, aber fühlt euch frei, zu experimetieren und auszuprobieren)
Code: |
$ cd /usr/src/linux
$ make menuconfig
--> Cryptographic Options
--> Alles <*>
--> Device Drivers
--> Block Devices
<*> Loopback Device Support
<*> Cryptoloop Support
--> Multi Device Support (RAID and LVM)
<*> Device Mapper Support
<*> Crypt Target Support
Dann natürlich noch eure Dateisysteme, aber das werde ich hier nicht beschreiben, das sollte von vornherein schon klar sein.
|
Dann speichert ihr eure Konfiguration beim Verlassen von menuconfig und baut euren Kernel:
Code: |
$ make bzImage && make modules && make modules_install
$ mount /boot
$ cp arch/i386/boot/bzImage /boot/gentoo-crypt
|
So, der Kernel wäre fertig, auf zum nächsten Schritt.
2. /boot bearbeiten
Nun bekommt /boot ein Mini-Gentoo verpasst, das zuerst bootet, das verschlüsselte Root-Device mountet, chrootet und dann bootet als wäre es nicht verschlüsselt.
Mein Mini-Linux mit Kernel und Grub hat 6.5MB, also müsste eine Boot-Partition von 12-15MB auf jeden Fall reichen.
Code: |
$ ROOT="/boot" USE="make symlinks" emerge -av sys-apps/busybox sys-fs/device-mapper sys-fs/cryptsetup-luks
|
Nun erstellt ihr die /init-Datei.
Code: |
$ touch /boot/init
$ chmod +x /boot/init
$ nano /boot/init
|
Jetzt seid ihr im Editor Nano und könnt bequem per c&p folgende Init einfügen.
Code: |
#!/bin/ash
# Einstellungen fuer das init-script
ROOT_DEV=/dev/hdc1
NEW_ROOT=/mnt/new_root
NEW_ROOT_BOOT=/mnt/new_root/boot
NEW_ROOT_INIT=/sbin/init
PROC_DIR=/proc
MAPPER_DIR=/dev/mapper
ERR_SHELL=/bin/ash
# Ende Einstellungen
clear
echo " Dies ist ein Linux System mit verschluesseltem Root-Device."
echo
echo " * Setze umask .."
umask 022
echo " * Mounte /proc .."
mount -t proc none $PROC_DIR
echo " * Erstelle Ramdisk fuer " $MAPPER_DIR " .."
mount -t tmpfs none $MAPPER_DIR
echo " * Richte " $MAPPER_DIR "/control ein .."
cp /dev/control $MAPPER_DIR
echo " * Mounte Dateisysteme .."
cryptsetup luksOpen $ROOT_DEV root
mount /dev/mapper/root $NEW_ROOT -o rw
echo " - $NEW_ROOT"
mount --bind / $NEW_ROOT_BOOT
mount -t tmpfs none /etc
cat /proc/mounts > /etc/mtab
mount -o remount,ro $NEW_ROOT
mount -o remount,rw /dev/root
umount /etc
echo " - $NEW_ROOT_BOOT"
echo " * Starte init.."
exec <dev/console >dev/console 2>&1
exec chroot $NEW_ROOT $NEW_ROOT_INIT
echo " *** INIT KONNTE NICHT GESTARTET WERDEN !!! ***"
echo " * Versuche eine Shell zu starten (" $ERR_SHELL ") .."
exec $ERR_SHELL
# WICHTIG!!! HIER AUF KEINEN FALL KOMMENTARZEICHEN ENTFERNEN!! DIES IST ZUM ANLEGEN NEUER MAPPINGS!!! (BEISPIEL)
#
# /bin/cryptsetup -c blowfish-cbc-essiv:sha256 -y -s 256 luksFormat /dev/hdc1
# /bin/cryptsetup luksOpen /dev/hdc1 root
# mke2fs /dev/mapper/root
# mkdir /new_root
# mount /dev/mapper/root /new_root
#
# [ENDE]
|
Bei "#Einstellungen" muss eigentlich nur ROOT_DEV angepasst werden. Der Rest bleibt im Normalfall so, ich habe das allerdings als Variablen gemacht, falls man mal was ändern will (sinnlose Spielereien), dass man dann nicht das Script immer durchgucken muss, wo man nun was ändern muss.
Speichern --> init fertig.
Nun werden alle nötigen Verzeichnisse in /boot angelegt
Code: |
$ mkdir /boot/dev
$ mkdir /boot/dev/mapper
$ mkdir /boot/proc
$ mkdir /mnt/new_root
|
Und jetzt die nötigen dev-Nodes kopiert. Um dies zu tun muss auf dem "Install-Linux" cryptsetup-luks und device-mapper installiert sein, sowie der Kernel muss wie oben angepasst sein.
Code: |
$ emerge -av cryptsetup-luks device-mapper
|
Jetzt die Nodes.
Code: |
$ cp /dev/console /boot/dev/
$ cp /dev/null /boot/dev
$ cp /dev/mapper/control /boot/dev (NUR NACH /dev!!! wird vom script beim booten geändert, aber jetzt erst nach /dev!)
$ cp /dev/hd* /boot/dev
bzw
$ cp /dev/sd* /boot/dev
|
Jetzt wird Grub eingerichtet.
Code: |
$ nano /boot/grub/menu.lst
|
Dies ist meine menu.lst, natürlich anpassen, aber nur die root= option, wenn es bei euch anders sein sollte.
Code: |
timeout 10
splashimage /grub/splash.xpm.gz
title Gentoo verschluesselt
root(hd0,0)
kernel /gentoo-crypt root=/dev/hda1 init=/init
title Gentoo Rescue
root (hd0,0)
kernel /gentoo-crypt root=/dev/hda3
|
So, das wäre geschafft, also auf zum Erstellen der verschlüsselten Partition und Installation von Gentoo mit einem stage3-Archiv.
3. Verschlüsseln und Installieren
Wie ihr vielleicht anhand des Beispiels in dem Init-Script schon gesehen habt, wird die Partition so verschlüsselt:
Code: |
DARAN DENKEN, DASS MAN DIE RICHTIGE PARTITION EINSTETZT!!
cryptsetup -c blowfish-cbc-essiv:sha256 -y -s 256 luksFormat /dev/hdc1
cryptsetup luksOpen /dev/hdc1 root
mke2fs /dev/mapper/root
mkdir /mnt/gentoo
mount /dev/mapper/root /mnt/gentoo
|
und schwupps habt ihr sie gemountet und könnt Gentoo installieren.
Das werde ich hier aber nur so nötig wie möglich beschreiben, da man sowas schon können sollte... Wenn man mal im Handbuch spitzeln will, ab hier gehts los http://www.gentoo.org/doc/de/handbook/handbook-x86.xml?part=1&chap=5 . ABER teilweise ist es hier etwas anders wie im Handbuch und sollte auch so wie hier beschrieben gemacht werden!!
Code: |
$ date MMDDhhmmYYYY
$ cd /mnt/gentoo
$ wget http://distfiles.gentoo.org/releases/x86/current/stages/stage3-i686-2006.1.tar.bz2
$ wget http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
$ tar xvfjp stage3-i686-2006.1.tar.bz2
$ tar xvjf portage-latest.tar.bz2 -C /mnt/gentoo/usr
(make.conf anpassen, use-flags usw...)
$ nano /etc/make.conf
$ cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
$ mount -t proc none /mnt/gentoo/proc
$ mount -o bind /dev /mnt/gentoo/dev
$ chroot /mnt/gentoo /bin/bash
$ env-update && source /etc/profile
|
So, nun ist man im neuen Gentoo, weiter, hopphopp! Bald sind wir fertig!
Code: |
$ emerge --sync
$ cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime
$ USE="-doc symlink" emerge -av gentoo-sources
|
Ab hier wirds ein klein bisschen haarig (aber nur ganz wenig) und anders wie im Handbuch.
Der Kernel vom Hostsystem muss genau der gleiche sein, wie der vom neuen System!!! Und keine Jammereien, wenn ihr Module nicht verwenden könnt! Ich habe euch gewarnt...
(In einem anderen Terminal, ohne chroot!!!)
Code: |
$ cp /usr/src/linux/.config /mnt/gentoo/root/kconf
$ cd /usr/src/linux
$ make menuconfig
Load an alternate configuration file
/root/kconf
OK
Exit und speichern
$ make modules && make modules_install
|
So, hier ists immer noch anders! Die fstab kann so übernommen werden (teilweise, ist aber beschrieben), die alte am besten löschen (also die aus dem Stage3 Archiv).
Code: |
$ rm /etc/fstab
$ nano /etc/fstab
|
Code: |
/dev/mapper/root / auto noatime 1 1
proc /procproc defaults 0 0
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
|
So, weiter mit dem Netzwerk (Im Handbuch Step 8.b)
Code: |
$ nano /etc/conf.d/net
$ rc-update add net.eth0 default
$ nano /etc/hosts
|
und nun weiter mit den restlich Kleinigkeiten...
Code: |
$ passwd (root-pw setzen)
$ nano /etc/rc.conf
$ nano /etc/conf.d/keymaps
$ nano /etc/conf.d/clock
|
Noch ein paar Kleinigkeiten emergen...
Code: |
$ emerge -av syslog-ng vixie-cron device-mapper cryptsetup-luks
$ rc-update add syslog-ng default
$ rc-update add vixie-cron default
$ emerge -av dhcpcd (wenn man netz per dhcp hat)
$ emerge -av rp-pppoe (wenn man sich ins netz einwählen muss)
|
Jetzt noch die nötigen Dateisystem Tools, bei ext2/ext3 braucht man nix, ansonsten Step 9.e
Den Bootloader haben wir schon, also noch wie in Step 11 beschrieben, einen User anlegen.
Nun das ganze umounten.
Code: |
$ exit
$ cd
$ umount /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
|
So. Fertig. Erst mal recken, strecken, eine rauchen und dann geniessen
4. Zusätzliche Datenpartition
Um eine zusätzliche Partition miteinzubinden, benötigt es lang nicht mehr soviel Arbeit wie die Gentoo-Installation.
Ich werde hier nur den Weg mit Passwort beschreiben, da ich nichts von keyfiles halte, wenn diese in die falschen Hände gelangen, bringt das alles ja nichts .
Zuerst wird die Partition verschlüsselt:
Code: |
$ cryptsetup -c blowfish-cbc-essiv:sha256 -y -s 256 luksFormat /dev/hdX
$ cryptsetup luksOpen /dev/hdX daten
|
Nun wird diese formatiert:
Ich verwende für Datenpartitionen immer den Parameter -m 0, das heisst, dass nichts für den Superuser reserviert wird. Ich denke, dass dies nur auf der /-Part. etwas ausmacht, aber wenn ich da falsch liege, sagt es mir!
Code: |
$ mke2fs -j -m 0 /dev/mapper/daten
|
und anschliessend gemountet:
Code: |
$ mkdir /home/USER/daten
$ mount /dev/mapper/daten /home/USER/daten
(natürlich den eigenen Benutzer eintragen anstelle von USER)
|
jetzt wird das ganze für den User beschreibbar gemacht:
Code: |
$ chmod +rw /home/USER/daten
$ chown USER /home/USER/daten
|
So das wärs fürs erste, jetzt noch ein init-script um das ganze beim Booten machen zu lassen. (Also das mounten..)
Code: |
#!/sbin/runscript
start() {
ebegin "Mounte verschlüsselte Partition"
cryptsetup luksOpen /dev/hdX daten
mount /dev/mapper/daten /home/USER/daten
eend $?
}
stop() {
ebegin "umounten der verschlüsselten Partition"
umount /dev/mapper/daten
cryptsetup luksClose /dev/mapper/daten
eend $?
}
|
Dieses initscript wird nun nach /etc/init.d/mount_crypt gespeichert und mit
Code: |
$ chmod +x /etc/init.d/mount_crypt
|
ausführbar gemacht und so zum default-runlevel hinzugefügt:
Code: |
$ rc-update add mount_crypt default
|
So, fertig
Das sollte natürlich auch funktionieren wenn man es nach /home/USER mountet, also als home-Verzeichnis, habe ich aber nicht versucht.
5. Swap
Ich habe es natürlich auch selber versucht, aber das war nicht wirklich das Gelbe vom Ei. Ich habe diesen Schritt vom Gentoo-Wiki übernommen und möchte ihn deshalb hier verlinken.
http://de.gentoo-wiki.com/DM-Crypt#Swap-Partition_verschl.C3.BCsseln
6. Zum Schluss
Meine Quellen für dieses Howto waren:
http://www.gentoo.org/doc/de/handbook/handbook-x86.xml
http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS
http://de.gentoo-wiki.com/Mini-Gentoo
http://de.gentoo-wiki.com/DM-Crypt#Swap-Partition_verschl.C3.BCsseln
Vielen Dank an diejenigen, die diese Howtos und das Handbuch geschrieben haben, sowie an alle die in irgendeiner Weise damit zu tun haben.
Und hier noch ein Thread dazu: https://forums.gentoo.org/viewtopic-t-511797.html
Bugs/TODO:
1. Als zweiten Bootloader LILO, was für AMD-64 user leider entfällt (mich juckts net, grub rockz )
2. Vielleicht ein Howto schreiben, wie man dies von einer LIVE-CD auf eine frische Platte bastelt.
Änderungen:
1. /boot kann mit neuem init script fürs Mini-Linux beschrieben werden.
2. Dateisystemcheck funzt nun auch, device-mapper und crypt-setup-luks fehlten auf verschlüsseltem System -> fstab "1 1" für root-dev.
3. Swap hinzugefügt
4. Datenpartition hinzugefügt (ich denke mal, seit diesem Schritt und Swap ist es auch 100% benutzbar obwohl es natürlich auch andere Howtos und Wege gibt) _________________ 1 ha == 1 Hekto-Ar == 1 Hektar |
|