SSH zum Entschlüsseln von verschlüsseltem LVM während des Startvorgangs des Headless-Servers?


59

Als ich Ubuntu 10.04 und jetzt 10.10 installiert habe, wurde mir die Option angeboten, "verschlüsseltes LVM" für meine Festplatte zu aktivieren. Nachdem ich diese Option ausgewählt habe, werde ich während des Startvorgangs aufgefordert, mein Kennwort einzugeben, um den LVM zu entschlüsseln.

Jetzt denke ich über die Einrichtung eines Headless-Servers nach, auf dem Linux ausgeführt wird (nicht unbedingt Ubuntu), aber ich mache mir Sorgen, dass ich ihn während des Startvorgangs nicht entschlüsseln kann, da der Server Headless ist. Kann ich während des Startvorgangs SSH ausführen, um mein Kennwort für den verschlüsselten LVM einzugeben? Wenn ja, wie richte ich es ein? Oder gibt es eine andere Lösung? Auch diese Frage ist NICHT Ubuntu-spezifisch. Vielen Dank.


4
Siehe auch:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Ich denke, die Antwort von @Nate sollte die akzeptierte sein: Es werden (im Wesentlichen, da eine Bearbeitung erforderlich ist, um Änderungen im verknüpften Blog widerzuspiegeln) durchgehend öffentliche statt private Schlüssel verwendet.
Jonathan Y.

Antworten:


25

Für neuere Ubuntu-Versionen, zum Beispiel 14.04, fand ich eine Kombination aus @dragly und den Antworten dieses Blogposts sehr hilfreich. Umschreiben:

  1. (Auf dem Server) Installieren Sie Dropbear

    sudo apt-get install dropbear
    
  2. (Auf dem Server) Kopieren Sie die Berechtigungen für die Anmeldung mit dem öffentlichen / privaten Root-Schlüssel und weisen Sie sie zu

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

erinnern sich ändern Benutzer auf Ihren Benutzernamen auf dem Server

  1. (Auf dem Client) Privaten Schlüssel vom Server abrufen

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Auf dem Client) Fügen Sie einen Eintrag zu ssh config hinzu

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (Auf dem Server) Erstellen Sie diese Datei unter/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Auf dem Server) Machen Sie diese Datei ausführbar

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Aktualisieren Sie die initramfs

    sudo update-initramfs -u
    
  6. Deaktivieren Sie den Dropbear-Dienst beim Booten, damit openssh verwendet wird, nachdem die Partition entschlüsselt wurde

    sudo update-rc.d dropbear disable
    

Sie sind fertig. Versuch es. In dem oben verlinkten Blogbeitrag finden Sie Anweisungen zum Konfigurieren des Servers mit einer statischen IP-Adresse, falls Sie dies tun müssen.


Das verlinkte Blog hat einen Verweis zum Anhängen des öffentlichen Schlüssels eines Clients an den Server hinzugefügt /etc/initramfs-tools/root/.ssh/authorized_keys, auch wenn noch der private Schlüssel von Dropbear kopiert wird, den man völlig ignorieren kann. Das Befolgen der restlichen Anweisungen funktioniert für mich. Das bedeutet, dass dies die akzeptierte Antwort sein sollte (sobald diese Änderung übernommen wurde), da nur öffentliche Schlüssel verwendet werden.
Jonathan Y.

23

Eine Anleitung für ein solches Setup mit BusyBox und Dropbear finden Sie in diesem Blogbeitrag . early-ssh hat bei mir nicht funktioniert und wird anscheinend nicht mehr benötigt.

Ich habe im Folgenden zusammengefasst, was Sie tun müssen. Weitere Details finden Sie im obigen Beitrag:

  1. Installieren Sie BusyBox und Dropbear auf Ihrem Server

    sudo apt-get install dropbear busybox
    
  2. Aktualisieren Sie Ihre initramfs auf dem Server

    sudo update-initramfs -u
    
  3. Kopieren Sie den von dropbear generierten privaten Schlüssel auf Ihren Client-Computer. Möglicherweise müssen Sie dies in ein neues Verzeichnis kopieren und den Eigentümer ändern, um dies zu tun. Gehen Sie auf Ihrem Server folgendermaßen vor:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    Denken Sie daran, den Benutzer durch Ihren Benutzernamen zu ersetzen. Kennwortanmeldungen scheinen nicht zu funktionieren.

  4. Jetzt können Sie den privaten Schlüssel mit scp übertragen, indem Sie auf Ihrem Client Folgendes aufrufen :

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Richten Sie die ~ / .ssh / config-Datei Ihres Clients für die einfache Anmeldung ein. Öffnen Sie es mit einem Texteditor und fügen Sie Folgendes hinzu:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    Ändern Sie den Host in einen beliebigen und den Hostnamen in den Namen Ihres Servers. Lassen Sie den Benutzer root sein. Es scheint der einzige akzeptierte Benutzer in Dropbear zu sein. Speichern und schließen Sie die Datei.

  6. Starten Sie Ihren Server neu und warten Sie auf die Aufforderung zur Eingabe der Passphrase. Geben Sie Dropbear ein paar Sekunden Zeit, um die Internetverbindung zu erkennen und einzurichten. Stellen Sie mit dem folgenden Befehl auf Ihrem Client eine Verbindung zu Ihrem Server her :

    ssh myremoteserver # or any name you chose
    
  7. Wenn Sie angemeldet sind, geben Sie den folgenden Befehl auf Ihrem Server ein . Weitere Informationen finden Sie im Blog-Beitrag:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    Es dauert einige Zeit (30 Sekunden), bis Sie Ihre Passphrase eingeben können. Geben Sie es ein, wenn Sie dazu aufgefordert werden.

  8. Schließen Sie die Verbindung, indem Sie Folgendes eingeben

    exit
    
  9. Ihr Server sollte nun die verschlüsselte Festplatte entsperren und wie gewohnt starten.

(Ein großes Dankeschön an den ursprünglichen Autor des Blogposts!)


2
Ich verstehe den Grund nicht ganz, warum ich mich mit privaten Schlüsseln bewege. Es sollte ausreichen, den öffentlichen Schlüssel von Ihnen auf dem Client-Computer als autorisierten Schlüssel für den Root-Server auf den Server zu kopieren, oder?
Gertvdijk

Ich bin sicher, dass es möglich ist, das Schlüsselpaar auf dem Client-Computer zu erstellen und nur den öffentlichen Schlüssel von dort auf den Server zu verschieben, aber wenn ich mich richtig erinnere, gab es einige Probleme, ein Format zu finden, das BusyBox akzeptieren würde. Daher war die Wiederverwendung der bereits auf dem Server vorhandenen Schlüssel die einzige Option, mit der ich arbeiten konnte.
Dragly

1
Irgendeine Idee, was ich tun soll, damit dies unter Arch Linux funktioniert?
Gerharddc

1
Die @Gerhman Check out dropbear_initrd_encrypt Paket im AUR für Früh SSH - Unterstützung auf Archlinux.
Caleb

1
@Gerhman archwiki page: Remote-Freischaltung des Roots oder einer anderen Partition Es ist noch nicht geschehen, aber es sieht interessant aus.
Muss

18

Ich denke, Early-ssh bietet das, wonach Sie suchen:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

Es ist bereits ein .deb-Paket verfügbar, sodass Ubuntu wahrscheinlich für Sie in Ordnung ist.


Sieht so aus, als würde ich genau danach suchen, danke!
HPY

3
Haben Sie einen Link zu einem guten Tutorial oder Howto? Ich stecke mit Early-SSH auf meiner Debian-Squeeze-Box fest.

1
Ja, ein Tutorial wäre toll.
HPY


16

Schauen Sie sich die Cryptsetup-Readme dazu in /usr/share/doc/cryptsetup/README.remote.gz(Ubuntu-Paket cryptsetup) an. In gibt es eine vollständige Anleitung, um dies zu erreichen. Es ist ähnlich wie die Antwort von Dragly , aber ich denke, das ist ein bisschen eleganter. (Mit Dropbear formatierte Schlüssel, die die Passphrase nicht über ein fragiles Shell-Skript, sondern über ein FIFO weitergeben usw.)

rootfs über ssh login in initramfs entsperren

Sie können Ihre rootfs beim Booten von Remote aus entsperren, indem Sie ssh verwenden, um sich beim Boot-System anzumelden, während es mit eingebundenem initramfs ausgeführt wird.

Konfiguration

Damit die Remote-Entsperrung funktioniert, müssen die folgenden Pakete installiert sein, bevor das initramfs erstellt wird: dropbear busybox

Die Datei /etc/initramfs-tools/initramfs.confenthält die Konfigurationsoptionen, die beim Erstellen des initramfs verwendet werden. Es sollte enthalten BUSYBOX=y (dies ist die Standardeinstellung, wenn das busybox-Paket installiert wird), damit busybox in initramfs installiert wird, und sollte nicht enthalten DROPBEAR=n, was die Installation von dropbear in initramfs deaktivieren würde. Wenn diese DROPBEAR=yOption aktiviert ist, wird Dropbear in jedem Fall installiert. Ist dies DROPBEARnicht der Fall, wird dropbear nur bei einem vorhandenen Cryptroot-Setup installiert.

Die für die initramfs verwendeten Hostschlüssel sind dropbear_dss_host_keyund dropbear_rsa_host_key, beide befinden sich in /etc/initramfs-tools/etc/dropbear/. Wenn sie beim Kompilieren des initramfs nicht vorhanden sind, werden sie automatisch erstellt. Es folgen die Befehle, um sie manuell zu erstellen:

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

Da die initramfs nicht verschlüsselt werden, wird von einer öffentlichen Authentifizierung ausgegangen. Die dafür verwendeten Schlüssel werden entnommen /etc/initramfs-tools/root/.ssh/authorized_keys. Wenn diese Datei beim Kompilieren des initramfs nicht vorhanden ist, wird sie erstellt und /etc/initramfs-tools/root/.ssh/id_rsa.pubhinzugefügt. Existiert auch die letztere Datei nicht, wird sie automatisch generiert - Sie finden den passenden privaten Schlüssel, unter dem Sie sich später bei initramfs anmelden müssen /etc/initramfs-tools/root/.ssh/id_rsa (oder id_rsa.dropbearfalls Sie ihn im dropbear-Format benötigen). Es folgen die Befehle, um die entsprechenden Schritte manuell auszuführen:

So erstellen Sie einen Schlüssel (im Dropbear-Format):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

So konvertieren Sie den Schlüssel vom Dropbear-Format in das Openssh-Format:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

So extrahieren Sie den öffentlichen Schlüssel:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

So fügen Sie den öffentlichen Schlüssel der Datei authorized_keys hinzu:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

Falls Sie einige Schnittstelle mit DHCP konfiguriert werden, Einstellung DEVICE=in /etc/initramfs-tools/initramfs.confsollte ausreichend sein. Das initramfs sollte auch den ip=Kernel-Parameter berücksichtigen. Wenn Sie grub verwenden, möchten Sie es möglicherweise /boot/grub/menu.lstentweder in der # kopt=Zeile oder an bestimmte kernelZeilen anhängen. Der ip=Kernel-Parameter ist im Kernel-Quellbaum dokumentiert Documentation/nfsroot.txt.

Probleme

Vergiss nicht zu starten, update-initramfswenn du die Konfiguration geändert hast, damit sie wirksam wird!

Es scheint manchmal ein Problem zu sein, genügend Entropie für den ssh-Daemon zu sammeln. Der Start des ssh-Daemons kann verzögert werden, bis genügend Entropie abgerufen wurde. Dies ist für den Startvorgang nicht blockierend. Wenn Sie sich also an der Konsole befinden, müssen Sie nicht auf den Abschluss des Startvorgangs von sshd warten.

Entsperrvorgang

Zum Entsperren von der Fernbedienung aus können Sie Folgendes tun:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

In diesem Beispiel wird davon ausgegangen, dass Sie eine zusätzliche known_hosts" ~/.ssh/known_hosts.initramfs" Datei haben, die den Host-Schlüssel des Cryptroot-Systems enthält, dass Sie eine " ~/id_rsa.initramfs" Datei haben , die den Authorized-Key für das Cryptroot-System enthält, und dass der Name des Cryptroot-Systems " initramfshost.example.com" lautet Passphrase für Kryptowurzel lautet " secret"

- < debian@x.ray.net>, Mittwoch, 30. September 2009

Vielen Dank an jap , der mich auf einem anderen Kanal darauf hingewiesen hat.


1
Dies scheint eine viel bessere Idee zu sein (wie in den offiziellen Dokumenten und allem beschrieben) als hackisches ps-grepping. Als Nebenbemerkung zum Entsperrvorgang empfiehlt es sich jedoch, die Passphrase vorsichtig direkt in die Befehlszeile einzugeben, da sie höchstwahrscheinlich irgendwo in einer Shell-Verlaufsdatei abgelegt wird. Eine mögliche Lösung besteht darin, ein kleines Wrapper-Skript zu erstellen, mit dem Sie zur Eingabe der Passphrase aufgefordert werden read -s -p.
Joelpet

1
Beachten Sie, dass es Probleme mit diesem Ansatz in neueren Ubuntu-Versionen gibt, z. B. bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

Wenn Sie in der Lage sein möchten, sowohl unbeaufsichtigt als auch remote zu booten , sollten Sie sich auch Mandos ansehen (was ich und andere geschrieben haben):

Mandos ist ein System, mit dem Server mit verschlüsselten Root-Dateisystemen unbeaufsichtigt und / oder remote neu gestartet werden können. Weitere Informationen, einschließlich einer FAQ-Liste, finden Sie in der Intro-Handbuchseitendatei .

Kurz gesagt, der Boot-Server erhält das Passwort auf sichere Weise über das Netzwerk. Einzelheiten finden Sie in der README.


Vielen Dank für Ihre Beiträge, aber beachten Sie, dass 100% Ihrer Beiträge fast identisch erwähnt Ihres Produktes ist Borderline - Verhalten , und Sie ein Risiko der betrachteten Spam (ich deine Beiträge hätte markiert , wenn Mandos keine freie Software war oder Sie hatten keine Geschichte von Nicht-Mandos-Posts auf anderen Websites).
Gilles 'SO- hör auf böse zu sein'

@ Gilles: Fertig.
Teddy

2

Kopfloser Server? Wenn es eine serielle Schnittstelle hat, verwenden Sie diese.

GRUB kann so konfiguriert werden, dass es über die serielle Schnittstelle arbeitet. Ihr Kernel kann auch so konfiguriert werden, dass er über den seriellen Port die ersten Startmeldungen ausgibt, das Kennwort zum Entsperren Ihrer Laufwerke eingibt und sich anmeldet. (Wenn Ihr Server das serielle BIOS unterstützt, aktivieren Sie dies ebenfalls. Dann müssen Sie keine Verbindung herstellen ein Monitor an der Maschine überhaupt).

Es ist immer eine gute Idee, einen Server ohne Netzwerkverbindung einzurichten.


Großartiger Punkt! " Nicht-Netzwerk " -Methoden für den Zugriff auf einen Headless-Server sind jedoch ( nur ) relevant, wenn die physische Nähe zwischen Client / Server eng ist. es sei denn, ich übersehen eine andere Möglichkeit / Funktion einer seriellen Verbindung.
ILMostro_7

2

Unter Arch Linux gibt es ein AUR-Paket dropbear_initrd_encrypt , das das macht, was Sie wollen. Funktioniert ziemlich gut für kabelgebundene Schnittstellen. Ich musste es für drahtlose Netzwerke ein wenig hacken.


2

Leider hat keine der obigen Antworten für mich funktioniert. Darüber hinaus erscheint das Kopieren eines privaten Schlüssels vom Server paradox.

Jedenfalls haben sich folgende Anweisungen ergeben :

Starten Sie Ihren SERVER, indem Sie die verschlüsselte Partition über Ihren CLIENT verbinden und entsperren

Pflichtpakete installieren (auf SERVER)

apt-get install dropbear initramfs-tools busybox

Fügen Sie Ihre gewünschten öffentlichen Schlüssel in die Datei authorized_keys des SERVER ein

Kopieren Sie einfach Ihre öffentlichen Schlüssel und fügen Sie sie in den /etc/dropbear-initramfs/authorized_keysSERVER ein

Erstellen Sie das Entsperrskript

Erstellen Sie folgendes Skript in /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

Mach es ausführbar:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Erstellen Sie eine statische IP (oder überspringen Sie diesen Schritt, um DHCP zu verwenden)

Bearbeiten /etc/initramfs-tools/initramfs.conf, um die Zeile hinzuzufügen (oder zu ändern):

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

Aktualisieren Sie initialramfs

update-initramfs -u

Deaktivieren Sie den Dropbear-Dienst beim Booten, damit openssh verwendet wird, nachdem die Partition entschlüsselt wurde

sudo update-rc.d dropbear disable

Testen

  • Starten Sie Ihren Server neu
  • Stellen Sie über eine Verbindung zu Ihrem Server her ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

Unter Debian 9 (stabil) war diese Lösung veraltet. Während der Installation wird eine Warnung angezeigt dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!und ich konnte die benötigten Schlüssel nicht finden. Diese Methode ist übrigens sehr einfach und wurde mir auf dem tollen #debian-Kanal erklärt (nochmals vielen Dank):

Stellen Sie zunächst sicher , dass busybox, dropbearund dropbear-initramfsinstalliert

sudo apt install busybox dropbear*

Fügen Sie dann Ihren öffentlichen Schlüssel (meistens ~/.ssh/id_rsa.pub) in die Datei ein /etc/dropbear-initramfs/authorized_keys.

Aktualisieren Sie dann initramfs, um die Änderungen zu berücksichtigen:: update-initramfs -u

Das ist alles!

Hinweis: Wenn Sie vermeiden möchten, dass die Schlüssel zwischen dropbearund nicht in Konflikt geraten openssh(sie haben dieselbe IP-Adresse, verwenden jedoch einen anderen Schlüssel), möchten Sie Ihren Client möglicherweise folgendermaßen einrichten ~/.ssh/config:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

Dann verbinden Sie sich einfach mit:

ssh myserver_luks_unlock

und sobald Sie eine Eingabeaufforderung erhalten, geben Sie ein, wie von der Besetztbox-Eingabeaufforderung vorgeschlagen:

cryptroot-unlock

und geben Sie Ihr Passwort ein.

Genießen!



0

Ich verwende seit einigen Jahren die von anderen auf dieser Seite erläuterte Technik (SSH im initramfs mit einem Kernel- IPParameter zum Konfigurieren des Netzwerks), um kopflose Ubuntu-Linux-Server (12.02, 14.04, 16.04 und 18.04) remote zu entsperren.

Ich ging sogar so weit, ein Python-Programm ( Unlock-Remote-System ) zu entwickeln, das das eigentliche Unlock- Verfahren für mich ausführt, da sich der Vorgang manuell als etwas zerbrechlich anfühlte und ich anfing, einen Neustart meiner Server zu befürchten, also im Geiste von "Wenn es weh tut, lohnt es sich zu automatisieren" Ich habe mein Wissen in Python verschlüsselt (und dies hat es in der Tat viel einfacher gemacht, regelmäßige Neustarts durchzuführen, um Sicherheitsupdates anzuwenden).

Seitdem habe ich mich entschlossen, meine persönlichen Notizen zur Remote-Root-Festplattenverschlüsselung mit der ganzen Welt zu teilen . Die verlinkte Seite enthält einige Details zur Vorgehensweise (auch einige Hinweise, die hier nicht erwähnt werden) und ich beabsichtige, sie auf dem neuesten Stand zu halten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.