Liaison et serveur SSH dans initramfs


Chaque système est un compromis entre sécurité et convivialité.


Dans le NAS construit , il y avait un sérieux problème: il était impossible de redémarrer le système sans être en place, ce qui a réduit le niveau de disponibilité des données.


Ce problème n'était pas critique, jusqu'au moment où ils ont commencé à couper l'urgence électrique: pendant trois mois, deux fois pendant plusieurs heures. L'onduleur est conçu pour des dysfonctionnements à court terme et il n'est pas censé fonctionner sur des batteries pendant plus d'une demi-heure (bien qu'il s'agisse réellement d'une heure environ), et à chaque arrêt de ce type, afin de rallumer le système, j'ai dû aller dans une autre ville.


Grâce à un indice de ValdikSS , ce problème a été résolu. Mais ...



J'avais besoin d'une liaison d'interface et d'un déverrouillage SSH à distance. Et je n'ai pas trouvé de manuel qui puisse être fait tout de suite pour qu'il fonctionne à ma guise.


Par conséquent, j'apporte ma version de la solution avec liaison et IP dynamique, dans laquelle le système peut être déverrouillé, localement et à distance.


Je vous rappelle que pour effectuer ces réglages, vous devez avoir un accès physique local au NAS et des capacités de démarrage de sauvegarde.


Collage chez initramfs


Étant donné que dans le NAS, deux interfaces sont combinées en un seul canal, il a été décidé de le faire également au démarrage.


De la question "Utilisation de NFS-root avec des interfaces liées", j'ai pris le script. L'article «Comment gérer la liaison Linux sans ifenslave à l'aide de sysfs» a aidé à configurer la liaison.


Vous devez d'abord inclure dans les initramfs des modules utilisés pour faire fonctionner le réseau. Cela se fait avec la commande suivante:


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 

Copiez maintenant les deux scripts dans /etc/initramfs-tools/scripts/ .


Le premier est nécessaire pour augmenter les interfaces de liaison:


/ 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 

La seconde consiste à désactiver l'interface de liaison pendant le chargement:


/ 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 

Si cela n'est pas fait, le réseau ne fonctionnera pas après le démarrage.


N'oubliez pas de donner aux scripts la permission d'exécuter:


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

Il ne reste plus qu'à définir les interfaces qui seront incluses dans la liaison et les paramètres d'obtention de l'adresse.
L'adresse sera obtenue via DHCP, car La liaison aura le même MAC qu'après le démarrage, car le routeur émettra une adresse IP fixe et transmettra les ports.


J'obtiens automatiquement les interfaces de celles qui sont incluses dans bond0 bond pendant que le NAS fonctionne:


 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 

Enfin, mettez à jour la configuration GRUB et l'image initramfs:


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

C’est tout. Si tout est configuré correctement, après le redémarrage et le démarrage du script de démarrage dans initrmafs, les pings sur le NAS IP iront, malgré le fait que le système d'exploitation n'est pas encore chargé.


Je note que la configuration de la liaison dans Dracut est beaucoup plus facile, car il y a déjà des scripts dans la livraison .


Serveur SSH dans initramfs


Installez le package pour activer Dropbear SSH dans initramfs:


 apt-get install dropbear-initramfs 

Dropbear SSH sera automatiquement inclus dans initrmafs et démarrera si au moins une interface réseau avec une adresse IP est levée à un stade précoce du démarrage.


Après cela, convertissez la clé Dropbear au format OpenSSH et fermez-la avec un mot de passe:


 /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 

La clé id_rsa est id_rsa sur la machine avec laquelle le déverrouillage sera effectué. Je suppose qu'il sera copié dans le ~/.ssh/dropbear .


Dans /etc/dropbear-initramfs/authorized_keys , les empreintes digitales et les paramètres de chaque clé doivent être spécifiés.


Pour l'instant, ajoutez simplement l'empreinte digitale d'une clé, pour laquelle vous devez exécuter la commande suivante:


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

Aucun wrapper mentionné dans les articles n'est nécessaire, /bin/unlock - script système (cryptroot-unlock).


Voici à quoi devrait ressembler /etc/dropbear-initramfs/authorized_keys :


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

Mettez à jour la configuration GRUB et l'image initramfs et redémarrez:


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

Depuis la machine sur laquelle vous avez copié la clé, il est désormais possible de se connecter au NAS et de déverrouiller:


 $ 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): 

Après cela, la console obtiendra constamment une erreur concernant l'absence d'argument ( ash: -gt: argument expected ), mais le déverrouillage ira. Il s'agit d'une erreur dans le script de déverrouillage du système qui n'affecte rien (l'erreur est corrigée facilement, mais les wrappers ne la corrigent pas).


Plus de détails peuvent être trouvés dans ces articles:



Débogage


Pour le débogage, vous pouvez insérer un appel à /bin/sh dans le script 00_bonding_init après:


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

Une fois les problèmes de liaison résolus, remplacez la command="/bin/unlock" par command="/bin/sh" dans les command="/bin/sh" authorized_keys .


Après la connexion via SSH, vous serez présenté avec un shell que vous pouvez utiliser pour le débogage.

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


All Articles