Debian Colocation/Leased Server Full-Disk-Encryption

1. Grundsätzliches

Diese Anleitung beschreibt die Installationen von Debian Wheezy auf einem Server mittels Rettungssystem. Der Server ist nach der Installation weder gegen Angriffe aus dem Netzwerk abgesichert noch entspricht er dem Standard-Image des Providers. Durch den Einsatz einer Debian Basis-Installation fallen Überwachungsskripte und gepatchte Kernel des Providers weg. Das ist kein Zufall.

Das Ergebnis ist ein Minimalsystem für einen voll-verschlüsselten Server, der folgende Eigenschaften hat.

  • Möglichst unabhängig von der Provider-Infrastruktur
  • Minimalsystem
  • Full-Disk-Encryption (FDE) mit Entsperrung per SSH

Die Anleitung basiert auf dem Squeeze from Scratch HowTo von Sven Richter und stellt das Vorgehen zur Installation nach den Prinzipien meines Vortrags “Tauchfahrt mit Linux – Colocation Anti-Forensik” dar. Die Folien führen in die Problemsituation und meinen Lösungsansatz ein und sind hier zu finden. Es wird davon ausgegangen, dass die Installation von einem Linux-System aus durchgeführt wird.

2. Sicherung der Netzwerkdaten

Diese Daten sind für die Fortführung der manuellen Installation erforderlich. Am besten ist es, sie werden in einer Textdatei gesichert. Die Inhalte folgender Dateien/Programmausgaben werden benötigt.

cat /etc/resolv.conf
hostname
cat /etc/network/interfaces
route -n

Der Server muss für die folgenden Schritte über das Rettungssystems des Providers gestartet werden. Alle Schritte sind im Rettungssystem auszuführen.

3. Festplatte partitionieren

Partionsmanager aufrufen

cfdisk -z

Gelöscht wird automatisch das komplette Partitionsschema der vorherigen Installation.

Angelegt werden drei Partitionen.
sda1

  • Größe 1GB
  • Typ 83 (Wird unverschlüsselte /boot Partition)
  • Bootfähig

sda2

  • Größe 512MB
  • Typ 83 (wird später verschlüsselter Linux Swap)

sda3

  • Größe Rest (wird von cfdisk automatisch vorgeschlagen)
  • Typ 83 (wird später verschlüsselter Linux Datenbereich)

Die neuen Partitionen werden formatiert und folgend eingebunden.

Zuerst die /boot Partition

mkfs.ext4 /dev/sda1

Dann wird die Systempartition / verschlüsselt und formatiert. Hier ist es besonders wichtig, ein Passwort auszuwählen, dass länger als 20 Zeichen ist. Je länger und zufäliger das Passwort, desto länger dauert das Brechen. Dieses Passwort ist gemeinsam mit einem folgend erstellten SSh-Schlüssel die Achillesferse des Prinzips und muss geheimgehalten werden. Es ist sehr empfehlenswert, eine Software wie PWGen zu verwenden, um ein sehr langes Passwort (zum Beispiel 200 Zeichen) zu erzeugen.

Wenn das Passwort erzeugt ist, kann wie folgt fortgefahren werden. Bei der Verschlüsselung der Partition muss zuerst die Verschlüsselung mit Eingabe von YES bestätigt werden und dann der Schlüssel zweimal eingegeben werden.

cryptsetup luksFormat /dev/sda3
cryptsetup luksOpen /dev/sda3 sda3_crypt
mkfs.ext4 /dev/mapper/sda3_crypt

Jetzt werden die Partitionen eingebunden, damit im nächsten Schritt das Basis-System installiert werden kann.

mount /dev/mapper/sda3_crypt /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

4. Debian GNU/Linux 7 “wheezy” installieren und einrichten

Um sicherzugehen, dass keine unnötigen Spuren der Debian Installation auf dem Rettungsystem zurückbleiben, wird ein kleiner Teil des Arbeitsspeichers als temporäres Verzeichnis verwendet, um die Installationspakete herunterzuladen. Aus diesem heraus wird Debian per debootstrap installiert. Anschließend wird per chroot in das frisch installierten System gewechselt.

4.1 Debootstrap herunterladen und anpassen

mount -t tmpfs none /tmp
cd /tmp
wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.55_all.deb

Sollte die debootstrap Quelle nicht mehr aktuell sein, kann der richtige Link hier eingesehen werden: http://ftp.de.debian.org/debian/pool/main/d/debootstrap/

ar -xf debootstrap_1.0.55_all.deb
tar xJf data.tar.xz
tar xzf control.tar.gz

Jetzt muss geprüft werden, ob der Inhalt des Pakets unverändert im Rettungssystem angekommen ist. Jedes Debian Paket liefert eine Datei md5sums mit, die Prüfsummen über die enthaltenen Dateien enthält. Mit dem folgenden Einzeiler lässt sich die Integrität des debootstrap Pakets prüfen.

cat md5sums | cut -d " " -f 3 | xargs md5sum $1 > md5sums.local; diff md5sums md5sums.local

Der Befehl darf keine Ausgabe erzeugen, sonst sind Daten verändert worden.

Um jetzt per debootstrap installieren zu können, muss der Quelltext von debootstrap leicht angepasst werden.

nano usr/sbin/debootstrap

Die folgenden Zeilen entsprechend editieren

Suchen:

DEBOOTSTRAP_DIR=/usr/share/debootstrap

und ersetzen mit:

DEBOOTSTRAP_DIR=/tmp/usr/share/debootstrap

4.2 Installation durchführen

Um sicherzugehen, dass nur offizielle Pakete ohne Hintertüren auf dem neuen System installiert werden, müssen die Signaturen aller Pakete geprüft werden. Alle Debian Pakete sind durch öffentliche Schlüssel in einer Public-Key-Infrastruktur gesichert. Damit diese Signaturen geprüft werden können, muss der Hauptschlüssel des Debian Archivs wie folgt importiert werden.

wget --no-check-certificate https://ftp-master.debian.org/keys/archive-key-6.0.asc
gpg --import archive-key-6.0.asc

Mit dem Befehl gpg --list-keys wird geprüft, ob der Schlüssel erfolgreich importiert wurde. Ist das der Fall, kann das Grundsystem installiert werden.

usr/sbin/debootstrap --keyring=/root/.gnupg/pubring.gpg --arch amd64 wheezy /mnt/ http://ftp2.de.debian.org/debian

Nach der Installation des Grundsystems erfolgt die Anmeldung über den chroot-Befehl, um die weitere Einrichtung durchzuführen.

mount -t proc none /mnt/proc
mount -o bind /dev /mnt/dev
mount -t tmpfs none /mnt/tmp
mount -o bind /sys /mnt/sys
LANG=C chroot /mnt /bin/bash

Erzeugen die Befehle keine Fehlermeldung, wurde erfolgreich in das frisch installierte Debian gewechselt.

4.3 Rootpasswort und User erstellen

Als erstes wird im Grundsystem ein Passwort für den Superuser root gesetzt.

passwd

5. System und Netzwerk konfigurieren

Jetzt werden die gesicherten Netzwerkdaten benötigt. Entweder die Daten liegen in einer Textdatei vor, oder sie werden live durch die entsprechenden Befehle in der chroot Umgebung abgerufen.

Diese werden sinngemäß eingetragen:

echo $euerHostname > /etc/hostname
echo "$eureIP $euerHostname >> /etc/hosts

 

 cat > /etc/resolv.conf << "EOF"
nameserver 127.0.0.1
nameserver 123.123.123.123
nameserver 213.186.33.99
EOF

Auch hier muss 123.123.123.123 entsprechend der gesicherten Daten angepasst werden. Sollen statt der Nameserver des Providers anonyme nicht-loggende Nameserver eingesetzt werden, können hier einige eingesehen werden.

5.1 Netzwerk

Anhand dieses Beispiels wird das Netzwerk konfiguriert. Es müssen unbedingt die Daten für die eigene IP-Adresse ersetzt werden.

cat > /etc/network/interfaces << "EOF"
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 123.123.123.123
netmask 255.255.255.0
broadcast 123.123.123.255
network 123.123.123.0
gateway 123.123.123.254
EOF 
echo 'BOOTLOGD_ENABLE=Yes' > /etc/default/bootlogd

5.2 Einrichtung der /etc/crypttab,/etc/fstab, Paketquellen und lokale Einstellungen

Zuerst wird die Dateisystem-Tabelle für verschlüsselte Partitionen angelegt.

sda2_crypt /dev/sda2 /dev/urandom cipher=aes-cbc-essiv:sha256,size=256,swap
sda3_crypt /dev/sda3 none luks

Dann die entsprechende Dateisystem-Tabelle für unverschlüsselte und aktive verschlüsselte Partitionen.

/dev/sda1               /boot   ext4    noatime 0       2
/dev/mapper/sda2_crypt  none    swap    sw      0       0
/dev/mapper/sda3_crypt  /       ext4    noatime,defaults,errors=remount-ro 0 1
proc /proc proc defaults

Jetzt werden die Paketquellen in der Datei /etc/apt/sources.list wie folgt eingetragen.

deb http://ftp.de.debian.org/debian/ wheezy main non-free contrib
deb-src http://ftp.de.debian.org/debian/ wheezy main non-free contrib
deb http://security.debian.org/ wheezy/updates main non-free contrib
deb-src http://security.debian.org/ wheezy/updates main non-free contrib
deb http://ftp.de.debian.org/debian/ wheezy-updates main non-free contrib
deb-src http://ftp.de.debian.org/debian/ wheezy-updates main non-free contrib

Nach Aktualisierung der lokalen Caches für Pakete kann fortgefahren werden.

aptitude update && aptitude -y upgrade

Jetzt erfolgt die Konfiguration der Sprache des Systems.

aptitude -y install locales && dpkg-reconfigure locales

Hier wird de_DE.UTF-8 gewählt. Die Zeitzone muss auch gesetzt werden, in der Regel auf Europa/Berlin.

dpkg-reconfigure tzdata

6. Bootmanager, Kernel und Basis-Software installieren

Der Kernel wird wie folgt installiert.

aptitude -y install linux-image-amd64

6.1 Grundlegende Software installieren

aptitude install -y ssh grub-pc pciutils psmisc cryptsetup dropbear busybox

Während der Installation erscheint eine Nachfrage von grub-pc. Dort einfach bestätigen. Wird nach dem Ort, an dem GRUB installiert werden soll gefragt, ist /dev/sda anzugeben. Weicht die Festplattenbenennung ab, ist es wichtig zu wissen, dass GRUB nicht in einer Partition (wie /dev/sda1), sondern auf der Festplatten (wie /dev/sda) installiert werden sollte.

7. Remote unlock einrichten

/etc/initramfs-tools/initramfs.conf mit nano öffnen. Die Zeile DEVICE= suchen und folgende Ergänzungen exakt eintragen. Der Hostname sollte keine Punkte enthalten und wird nur in der Bootumgebung benötigt. Achtet unbedingt auf die Anzahl der Doppelpunkte, im Zweifelsfall ist hier das Format nachzulesen.

DEVICE=eth0
IP=$eureServerIP::$routerIP:255.255.255.0:$euerHostname:eth0:off
DROPBEAR=y

Jetzt werden die Änderungen an der initrd Konfiguration übernommen und die bestehende initrd aktualisiert.

update-initramfs -u -k all

Jetzt muss der eigene öffentliche Schlüssel für die initialen Bootumgebung der Datei /etc/initramfs-tools/root/.ssh/authorized_keys hinzugefügt werden. Als nächstes müssen die Dateien id_rsa und id_rsa.pub auf dem Server gelöscht werden, sie könnten von einem Angreifer entwendet werden um sich in der Bootumgebung anzumelden.

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

8. Reboot des Systems

Wir gehen wieder zurück zum Kundenmenü, stellen unter Netboot HD ein und startet den Serve wie folgt neu.

update-grub
exit
reboot

Jetzt wird der Server hochgefahren und sollte nach maximal drei Minuten wieder verfügbar sein.

9. Server entsperren

Mit Putty und der unter Punkt 8 erzeugten .ppk Datei als Schlüssel mit dem Server verbinden. Das Passwort wie folgt eingeben.

echo -n "$meinPasswort" > /lib/cryptsetup/passfifo

Hint: Alle Zeichen innerhalb eures Schlüssels die nicht 0-9,a-z und A-Z sind müssen mit einer Escape-Sequenz versehen werden. Aus 09a67Z*p; wird 09a67Z\*p\;.

10. Erweiterungen

Soll dgetty zur Abwehr von lokalen Eingaben eingesetzt werden, oder die /boot Partition automatisch auf Änderungen überwacht werden, finden sich die Werkzeuge dgetty und scout an dieser Stelle. Weitere Maßnahmen zur Anonymisierung finden sich im Artikel OVH Debian from Scratch Hacks.

16 comments

    1. Hallo Sebastian,

      danke für das Kompliment, ich kenne deine Sparsamkeit sehr gut und weiss es darum zu schätzen. Solltest du Fragen haben, scheu dich bitte nicht :)

      Grüße,
      Falk

  1. Danke fuer das gute Howto!

    Bei ’7. Remote unlock einrichten’ sollte der aufruf von `update-initramfs -u -k all` erst erfolgen wenn man die keys geloescht und den eigenen public key in die authorized_keys eingetragen hat.

    Herzliche Gruesse,

  2. Hallo zusammen,
    zuerst mal Danke für diese schöne Zusammenfassung, hat mir bei meinem Projekt sehr weiter geholfen. Ich hätte noch eine kleine Aktualisierung dazu, unter 4.2 muss es für die neue Debian Version nun

    wget –no-check-certificate https://ftp-master.debian.org/keys/archive-key-7.0.asc
    gpg –import archive-key-7.0.asc

    statt

    wget –no-check-certificate https://ftp-master.debian.org/keys/archive-key-6.0.asc
    gpg –import archive-key-6.0.asc

    heißen.

    Gruß

  3. Sehr schöne Anleitung. Genau was ich gesucht habe. Danke.

    Hat auch alles wunderbar geklappt bis auf das in Punkt 4.2 ja Debian Wheezy und nicht Squeeze installiert werden soll und somit dann auch der Key “archive-key-7.0.asc” anstatt “archive-key-6.0.asc” verwendet werden muss.

    1. Hallo Hans,

      danke für den Hinweis, habe es auf meine ToDo-Liste für das Nächste Update der Anleitung aufgenommen. Auf die Notwendigkeit, dem Rescue-System zu vertrauen, gehe ich in meinem Vortrag zur Anleitung ein. Den findest du hier (Folie 14 ff.).

      Grüße nach München

  4. Hallo. Vorab vielen Dank für das super Tut. Hat alles geklappt. Ich habe allerding Probleme mit cfdisk, da meine Festplatten größer 2 TB sind. Außerdem kriege ich es nicht hin ein Software-Raid anzulegen bzw. die Befehle entsprechend anzupassen.

    1. Hallo Matteo,

      diese Woche komme ich leider nicht dazu, die Anleitung anzupassen und ich bin mir mittlerweile auch garnicht mehr so sicher, ob ein Blogpost für die Anleitung ausreicht und ein Wiki nicht besser geeignet wäre. Ich versuche mich nächste Woche darum zu kümmern.

      Die Installation mit Software-RAID wie auch LVM ist möglich, habe ich bereits gemacht.

      Grüße

  5. cfdisk ist doch auch schon etwas älter, kann man da nicht besser mit parted partionieren?

    parted /dev/sda mklabel gptparted /dev/sda unit mb mkpart 1 1 1000
    parted -s /dev/sda set 1 boot on
    parted /dev/sda unit mb mkpart 2 1000 1512
    parted /dev/sda unit mb mkpart 3 1512 100%

    Zum beispiel?

    1. Hallo Marco,

      ja cfdisk ist etwas älter (um nicht zu sagen steinalt). Parted setze ich bereits seit einem Vierteljahr ein, will aber noch sechs bis zehn Festplatten damit partitionieren bevor ich es uneingeschränkt empfehle. Im Bereich Storage auf Festspeichern lohnt es sich (Datensicherheit!) sehr konservativ zu sein :)

      Grüße

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>