Ausgangspunkt ist ein Debian Server dessen root Partition nicht verschlüsselt ist. Alle anderen installierten Festplatten sind mit dmcrypt plain (also ohne LUKS Aufsatz) verschlüsselt.
Ziel ist es nun diese Installation auf eine neue HDD umzuziehen und dabei gleich dafür zu sorgen das root ebenfalls verschlüsselt ist und auch per remote SSH Session beim reboot freigeschaltet werden kann. Auf LUKS wird ganz bewusst verzichtet.

Das alles kann auch für eine Neu Installation benutzt werden. Dann sind aber einige zusätzliche Schritte nötig. Installiert werden kann sowohl per Debootstrap oder auch mit dem normalen Installer von z.B. einer NetinstallCD.

Genauso ist es möglich wenn man bereits ein verschlüsseltes root nach dieser Anleitung hat, erneut auf einen anderen Datenträger umzuziehen.

Wer keinen Wert auf ein reines dmcrypt legt kann auch die ganz normale Installation von Debian benutzen und dort Systemverschlüsselung auswählen. Allerdings bekommt man dann eine Verschlüsselung auf einem LVM mit LUKS ohne Remote SSH Freischaltung.

Diese Anleitung ist noch unter Debian8 (Jessie) entstanden.
Wer Testing benutzt wie ich das tue und mittlerweile auf Debian9 (Stretch) angekommen ist muss einige Dinge anpassen. Ansonsten wird das System nicht mehr booten. Ich habe alle entsprechenden Änderungen markiert und ergänzt. Damit ist diese Anleitung auch Debian9 Ready.
Ein weiterer wichtiger Punkt ist:
https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
In einem weiteren Blog Post Eth* ab Debian9 (Stretch) habe ich beschrieben wie man die Namensgebung eth0 beibehalten kann. Ansonsten muss eth0 in dieser Anleitung durch die neue Namensgebung ersetzt werden.

So jetzt gehts aber los!

Im Ursprungs System sollten folgende Pakete bereits installiert sein:

  • dropbear
  • dropbear-initramfs <-- Ab Debian Stretch
  • cryptsetup
  • initramfs
  • rsync
  • busybox

Desweiteren sollte das System schon mit Key Auth laufen. Wenn nicht solltet Ihr wissen wie Ihr euch ein Schlüsselpaar erzeugt. Darauf werde ich in dieser Anleitung nicht weiter eingehen. Hier aber zwei Links mit weiteren Infos:
wiki.archlinux.de
wiki.linux-club.de

Es gibt verschiedene Wege das ganze zu bewerkstelligen. In dieser Anleitung benutzen wir eine Virtuelle Maschine auf welche wir umziehen. Das ist quasi eine Trockenübung wobei nichts schief gehen kann.
Wir erstellen uns also eine virtuelle Maschine (ich bevorzuge VirtualBox) mit einer sagen wir mal 20GB HDD.
Nun brauchen wir noch eine LiveCD womit wir das System starten. Ich bevorzuge Debian mit Cinnamon Desktop. Kann man hier herunterladen:
Debian Live CD Download

So wenn das erledigt ist starten wir die virtuelle Maschine mit der Live CD.
Danach öffnen wir ein Terminal und werden erstmal root mit:

sudo su

danach installieren wir noch weitere nötige Pakete:

apt-get update
apt-get install aptitude
aptitude install cryptsetup vim openssh-server

Nun legen wir die benötigten Partitionen auf unserer 20GB HDD an indem wir
cfdisk in der Konsole starten und damit folgende Partitionen erzeugen:

== Als Label "DOS" wählen, NICHT GPT, ich gehe hier davon aus das das Boot Laufwerk keine 4TB HDD ist==

  • sda1 - 500MB - boot - ext4
  • sda2 - 1 GB - swap
  • sda3 - Rest - root - cryptet ext4

So wenn das erledigt ist werden wir als nächstes sda3 verschlüsseln:

cryptsetup -y create root /dev/sda3

Merkt euch das Passwort gut, wenn es weg ist kommt Ihr nicht mehr an die Daten.
Nun können wir alle Partitionen formatieren:

mkfs.ext4 /dev/sda1
mkswap /dev/sda2
mkfs.ext4 /dev/mapper/root

So nun mounten wir die neue root partition:

mount /dev/mapper/root /mnt

Und befüllen sie mit dem alten root System. In diesem Beispiel geht es per rsync über SSH aus der Konsole des alten Systems. Ordner wie /dev usw werden dabei ausgelassen. Wer diesen Befehl nicht versteht konsultiert bitte man rsync.

Je nach Version der Live CD muss zuerst noch ein Passwort für root gesetzt und Passwort Login aktiviert werden.

passwd root

Und in der /etc/ssh/sshd_config folgende Werte ändern:

PermitRootLogin yes
PasswordAuthentication yes

und ssh neu starten:

/etc/init.d/ssh restart

Jetzt sollte der rsync Befehl vom alten System aus funktionieren:

rsync --stats --progress --numeric-ids -aAhHSP \
--exclude=/mnt --exclude=/proc --exclude=/dev --exclude=/sys --exclude=/lost+found \
/ root@192.168.1.246:/mnt/

So wenn das erledigt ist mounten wir jetzt das neue System mal richtig zusammen und erzeugen fehlende Ordner:

cd /mnt
mv boot boot_old
mkdir boot
mount /dev/sda1 /mnt/boot
mv boot_old/* boot/
rm -r boot_old
mkdir dev
mkdir proc
mkdir sys

Nun wird es Zeit in das neue System zu chrooten:

mount -o rbind /dev /mnt/dev
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
chroot /mnt /bin/bash

Als erstes installieren wir nun grub auf der neuen HDD:

grub-install /dev/sda

Als nächstes passen wir /etc/crypttab an:

root /dev/sda3 none chiper=aes hash=ripemd160
swap /dev/sda2 /dev/urandom swap

und /etc/fstab:

== die UUID der partionen bekommt man mit dem Befehl:==

blkid
UUID=uuid-sda1        /boot ext4 noatime               0 2
/dev/mapper/root /     ext4 defaults,errors=remount-ro 0 1
/dev/mapper/swap none  swap sw                         0 0
proc            /proc  proc defaults                   0 0

Jetzt fehlt noch der Dropbear für remote freischaltung, dafür editieren wir /etc/initramfs-tools/initramfs.conf. Wir suchen nach DEVICE= und editieren es:

DEVICE=eth0
IP=192.168.1.222::192.168.1.1:255.255.255.0:EuerHostname:eth0:off
RESUME=none
DROPBEAR=y

Ab Debian Stretch ist der Punkt DROPBEAR=y nicht mehr erforderlich. Stattdesen wird das Paket "dropbear-initramfs" installiert.

ethx ist das Netzwerk Device eures Servers, bei nur einer Netzwerkkarte immer eth0
192.168.1.222 ist die IP unter der Dropbear auf eine Verbindung wartet.
192.168.1.1 ist eure Gateway IP

Jetzt müssen wir Dropbear nur noch unseren Auth Key mitteilen.
Ich habe den gleichen Key benutzt wie der mit dem ich mich am gebooteten System anmelde. Es steht aber jedem frei auch einen seperaten Schlüssel zu benutzen für Dropbear.

== Debian Version < Stretch: ==

Dieser gehört nach /etc/initramfs-tools/root/.ssh/authorized_keys.

Die Standard Dropbear Schlüssel löschen wir, damit könnte jemand ins System einbrechen wenn er sie entwendet:

rm /etc/initramfs-tools/root/.ssh/id_rsa
rm /etc/initramfs-tools/root/.ssh/id_rsa.pub

== Debian Version >= Stretch: ==

Dieser gehört nach /etc/dropbear-initramfs/authorized_keys.


Optionaler Schritt:

Den Dropbear SSH Port ändern, standard ist 22 wie immer, ich möchte ihn aber auf dem selben Port haben wie den echten SSH Server nach dem booten.

== Debian Version < Stretch: ==

Also editieren wir die Datei /etc/initramfs-tools/initramfs.conf. Folgendes hinzufügen:

PKGOPTION_dropbear_OPTION="-p 1234"

== Debian Version >= Stretch: ==

In der Datei /etc/dropbear-initramfs/config wird der Port gesetzt:

DROPBEAR_OPTIONS="-p 1234"

So wenn das alles erledigt ist bauen wir das initramfs einmal neu und updaten den grub:

update-grub
update-initramfs -u

== ACHTUNG ==

Nach dem Testing Update von Grub am 22.10.16 gab es eine komische Fehlermeldung beim update-grub: "error disk: cryptouuid/root not found"
Ich bin der Sache noch nicht weiter auf den Grund gegangen. Aber das System würde so nicht mehr booten weil es root nicht findet.
Abhilfe schafft man indem man folgende zwei grub Scripte modifiziert:

/etc/grub.d/10_linux
Zeile 68 hiermit ersetzen:
|| uses_abstraction "${GRUB_DEVICE}" lvm; then
/etc/grub.d/20_linux_xen
Zeile 56 hiermit ersetzen:
|| uses_abstraction "${GRUB_DEVICE}" lvm; then

Jetzt noch ein

update-grub

welches ohne Fehlermeldung durchlaufen sollte.
Ich werde hier wieder editieren wenn sich da neues ergibt.

Fertig. LiveCD auswerfen und System neu starten.
Wenn alles richtig gelaufen ist seht ihr nach ein paar Sekunden das Dropbear hochgefahren ist und der Server auf das Verschlüsselungs Passwort wartet. Ihr könnt es nun lokal eingeben oder euch zum Dropbear verbinden als root mit eurem Key woraufhin ihr in der Busybox landet und mit folgendem Befehl das root Dateisystem freischaltet und das System seinen Bootvorgang fortsetzt:

== Debian Version < Stretch: ==

/lib/cryptsetup/askpass "passphrase: " > /lib/cryptsetup/passfifo

== Debian Version >= Stretch: ==

Ab Stretch besteht auch die Möglichkeit folgenden Befehl auszuführen zum Unlock. Der alte Befehl funktioniert aber weiterhin genauso.

cryptroot-unlock

Herzlichen Glückwunsch zu eurem Debian Umzug auf ein vollverschlüsseltes Dateisystem welches als solches nicht zu erkennen ist wenn die Kiste aus ist.
Würde man die Paranoia nun weiter voran treiben könnte man noch /dev/sda1 (sprich boot) auf einen USB Stick auslagern. Somit wäre das System nur noch startfähig wenn dieser Stick angesteckt ist.
Aber das könnt Ihr selbst rausfinden wie das geht :)