Bonding und SSH-Server in initramfs


Jedes System ist ein Kompromiss zwischen Sicherheit und Benutzerfreundlichkeit.


In dem gebauten NAS gab es ein ernstes Problem: Es war unmöglich, das System neu zu starten, ohne vorhanden zu sein, was die Datenverfügbarkeit verringerte.


Dieses Problem war nicht kritisch, bis sie begannen, den Stromnotfall auszuschalten: drei Monate lang, zweimal mehrere Stunden lang. Die USV ist für kurzfristige Fehlfunktionen ausgelegt und sollte nicht länger als eine halbe Stunde (obwohl es wirklich ungefähr eine Stunde dauert) mit Batterien arbeiten. Um das System wieder einzuschalten, musste ich bei jeder solchen Abschaltung in eine andere Stadt.


Dank eines Hinweises von ValdikSS wurde dieses Problem behoben. Aber ...



Ich brauchte Schnittstellenbindung und Remote-SSH-Entsperrung. Und ich habe kein Handbuch gefunden, das sofort erstellt werden kann, damit es so funktioniert, wie ich es brauche.


Daher bringe ich meine Version der Lösung mit Bonding und dynamischer IP mit, in der das System sowohl lokal als auch remote entsperrt werden kann.


Ich erinnere Sie daran, dass Sie zum Ausführen dieser Einstellungen lokalen physischen Zugriff auf die NAS- und Backup-Startfunktionen haben müssen.


Verklebung bei initramfs


Da im NAS zwei Schnittstellen zu einem Kanal zusammengefasst sind, wurde beschlossen, dies auch beim Booten zu tun.


Aus der Frage "Verwenden von NFS-root mit verbundenen Schnittstellen" habe ich das Skript übernommen. Der Artikel "Verwalten der Linux-Bindung ohne ifenslave mit sysfs" half beim Einrichten der Bindung.


Zuerst müssen Sie Module in initramfs aufnehmen, die zum Betrieb des Netzwerks verwendet werden. Dies erfolgt mit folgendem Befehl:


while read m _; do /sbin/modinfo -F filename "$m"; done </proc/modules | sed -nr "s@^/lib/modules/`uname -r`/kernel/drivers/net(/.*)?/([^/]+)\.ko\$@\2@p" >> /etc/initramfs-tools/modules 

Kopieren Sie nun die beiden Skripte nach /etc/initramfs-tools/scripts/ .


Die erste wird benötigt, um die Grenzflächen beim Bonden anzuheben:


/ etc / initramfs-tools / scripts / init-premount / 00_bonding_init
 #!/bin/sh -e PREREQS="" case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac BOND_MASTER=${BOND_MASTER:-bond0} echo "Network interfaces loaded: " echo `ls /sys/class/net` if [ ! -e "/sys/class/net/${BOND_MASTER}" ]; then echo "Creating bonding master 'bond0'..." echo "+${BOND_MASTER}" > /sys/class/net/bonding_masters fi echo "Master interface: ${BOND_MASTER}" for x in $cmdline; do case $x in bondslaves=*) bondslaves="${x#bondslaves=}" ;; esac done IFS="," for x in $bondslaves; do echo "+$x" > "/sys/class/net/${BOND_MASTER}/bonding/slaves" done 

Die zweite Möglichkeit besteht darin, die Verbindungsschnittstelle zu deaktivieren, während das Laden fortgesetzt wird:


/ etc / initramfs-tools / scripts / init-bottom / iface_down
 #!/bin/sh -e PREREQS="" case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac if [ ! -d /sys/class/net/bond0 ]; then exit 0 fi echo "Remove bonding interface..." for x in $cmdline; do case $x in bondslaves=*) bondslaves="${x#bondslaves=}" ;; esac done IFS="," for x in $bondslaves; do echo "-$x" > /sys/class/net/bond0/bonding/slaves done echo "-bond0" > /sys/class/net/bonding_masters 

Andernfalls funktioniert das Netzwerk nach dem Booten nicht.


Vergessen Sie nicht, Skripten die Berechtigung zum Ausführen zu erteilen:


 chmod +x /etc/initramfs-tools/scripts/init-premount/00_bonding_init /etc/initramfs-tools/scripts/init-bottom/iface_down 

Es müssen nur noch die Schnittstellen festgelegt werden, die in die Verbindung einbezogen werden sollen, sowie die Parameter zum Abrufen der Adresse.
Die Adresse wird über DHCP erhalten, weil Bonding hat den gleichen MAC wie nach dem Start, da der Router eine feste IP ausgibt und die Ports weiterleitet.


Ich erhalte die Schnittstellen automatisch von denen, die in bond0 bond enthalten sind, während der NAS ausgeführt wird:


 sed -i "s/\(GRUB_CMDLINE_LINUX_DEFAULT=\)\"\(.*\)\"/\1\"\2 $(echo -n ip=:::::bond0:dhcp bondslaves=$(sed -e 's/ /,/' /sys/class/net/bond0/bonding/slaves))\"/" /etc/default/grub 

Aktualisieren Sie abschließend die GRUB-Konfiguration und das initramfs-Image:


 update-grub update-initramfs -u -k $(uname -r) 

Das ist alles Wenn alles richtig konfiguriert ist, werden nach dem Neustart und dem Starten des Startskripts in initrmafs Pings auf dem IP NAS ausgeführt, obwohl das Betriebssystem noch nicht geladen ist.


Ich stelle fest, dass das Einrichten der Bindung in Dracut viel einfacher ist, da die Lieferung bereits Skripte enthält .


SSH-Server in initramfs


Installieren Sie das Paket, um Dropbear SSH in initramfs zu aktivieren:


 apt-get install dropbear-initramfs 

Dropbear SSH wird automatisch in initrmafs aufgenommen und startet, wenn zu einem frühen Zeitpunkt des Startvorgangs mindestens eine Netzwerkschnittstelle mit einer IP-Adresse aufgerufen wird.


Konvertieren Sie anschließend den Dropbear-Schlüssel in das OpenSSH-Format und schließen Sie ihn mit einem Kennwort:


 /usr/lib/dropbear/dropbearconvert dropbear openssh \ /etc/dropbear/dropbear_rsa_host_key \ id_rsa dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key | \ grep "^ssh-rsa " > id_rsa.pub ssh-keygen -p -f id_rsa 

Der Schlüssel id_rsa wird auf den Computer id_rsa , mit dem die Entsperrung durchgeführt wird. Ich ~/.ssh/dropbear davon aus, dass es in das ~/.ssh/dropbear kopiert wird.


In /etc/dropbear-initramfs/authorized_keys müssen Schlüsselfingerabdrücke und Parameter für jeden Schlüssel angegeben werden.


Fügen Sie zunächst nur den Fingerabdruck eines Schlüssels hinzu, für den Sie den folgenden Befehl ausführen müssen:


 echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/unlock"' $(cat id_rsa.pub) >> /etc/dropbear-initramfs/authorized_keys 

Es werden keine in den Artikeln erwähnten Wrapper benötigt. /bin/unlock - Systemskript (Cryptroot-Unlock).


So sollte /etc/dropbear-initramfs/authorized_keys am Ende aussehen:


 no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/unlock" ssh-rsa AAAA...XDa root@nas 

Aktualisieren Sie die GRUB-Konfiguration und das initramfs-Image und starten Sie neu:


 update-grub update-initramfs -u -k $(uname -r) reboot 

Von dem Computer, auf den Sie den Schlüssel kopiert haben, können Sie jetzt eine Verbindung zum NAS herstellen und entsperren:


 $ ssh -i .ssh/dropbear/id_rsa_initram -o UserKnownHostsFile=.ssh/dropbear/known_hosts root@nas.NAS.cloudns.cc Enter passphrase for key '.ssh/dropbear/id_rsa_initram': X11 forwarding request failed on channel 0 Please unlock disk root_crypt1 (/dev/disk/by-id/ata-Samsung_SSD_850_PRO_256GB-part3): 

Danach wird die Konsole ständig eine Fehlermeldung über das Fehlen eines Arguments erhalten ( ash: -gt: argument expected ), aber das Entsperren wird ash: -gt: argument expected . Dies ist ein Fehler im System-Entsperr-Skript, der keine Auswirkungen hat (der Fehler kann leicht behoben werden, aber die Wrapper beheben ihn nicht).


Weitere Details finden Sie in diesen Artikeln:



Debuggen


Zum Debuggen können Sie einen Aufruf von /bin/sh in das Skript 00_bonding_init nachdem:


 case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac 

Wenn die Verbindungsprobleme behoben sind, ersetzen Sie den command="/bin/unlock" durch den command="/bin/sh" in authorized_keys .


Nach dem Herstellen einer Verbindung über SSH wird eine Shell angezeigt, die Sie zum Debuggen verwenden können.

Source: https://habr.com/ru/post/de419915/


All Articles