Servidor de enlaces y SSH en initramfs


Cada sistema es un compromiso entre seguridad y usabilidad.


En el NAS construido , había un problema grave: era imposible reiniciar el sistema sin estar en su lugar, lo que reducía el nivel de disponibilidad de datos.


Este problema no fue crítico, hasta el momento en que comenzaron a apagar la emergencia eléctrica: durante tres meses, dos veces durante varias horas. El UPS está diseñado para fallas a corto plazo y no debe funcionar con baterías durante más de media hora (aunque realmente es aproximadamente una hora), y con cada apagado de este tipo, para volver a encender el sistema, tuve que ir a otra ciudad.


Gracias a una pista de ValdikSS , este problema se ha resuelto. Pero ...



Necesitaba vinculación de interfaz y desbloqueo SSH remoto. Y no encontré un manual que se pueda hacer de inmediato para que funcione como lo necesito.


Por lo tanto, traigo mi versión de la solución con vinculación e IP dinámica, en la que el sistema se puede desbloquear, tanto local como remotamente.


Le recuerdo que para realizar esta configuración, debe tener acceso físico local al NAS y capacidades de arranque de respaldo.


Vinculación en initramfs


Dado que, en el NAS, dos interfaces se combinan en un canal, se decidió hacer esto también en el arranque.


De la pregunta "Uso de NFS-root con interfaces enlazadas" tomé el script. El artículo "Cómo administrar la vinculación de Linux sin ifenslave usando sysfs" ayudó a establecer la vinculación.


Primero debe incluir módulos en initramfs que se utilizan para operar la red. Esto se hace con el siguiente comando:


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 

Ahora copie los dos scripts a /etc/initramfs-tools/scripts/ .


El primero es necesario para elevar las interfaces en la vinculación:


/ 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 

El segundo es desactivar la interfaz de enlace mientras continúa la carga:


/ 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 esto no se hace, la red no funcionará después del arranque.


No olvide dar permiso a los scripts para ejecutar:


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

Solo queda establecer las interfaces que se incluirán en la vinculación y los parámetros para obtener la dirección.
La dirección se obtendrá a través de DHCP, porque La vinculación tendrá el mismo MAC que después del arranque, porque el enrutador emitirá una IP fija y reenviará los puertos.


Obtengo las interfaces automáticamente de las que están incluidas en bond0 bond mientras se ejecuta el NAS:


 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 

Finalmente, actualice la configuración de GRUB y la imagen initramfs:


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

Eso es todo Si todo está configurado correctamente, después de reiniciar e iniciar el script de inicio en initrmafs, los pings en el NAS de IP desaparecerán, a pesar de que el sistema operativo aún no está cargado.


Observo que configurar la vinculación en Dracut se hace mucho más fácil, porque ya hay scripts en la entrega .


Servidor SSH en initramfs


Instale el paquete para habilitar Dropbear SSH en initramfs:


 apt-get install dropbear-initramfs 

Dropbear SSH se incluirá en initrmafs automáticamente, y comenzará si se genera al menos una interfaz de red con una dirección IP en una etapa temprana del arranque.


Después de eso, convierta la clave Dropbear al formato OpenSSH y ciérrela con una contraseña:


 /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 clave id_rsa se id_rsa en la máquina con la que se realizará el desbloqueo. ~/.ssh/dropbear que se copiará en el ~/.ssh/dropbear .


En /etc/dropbear-initramfs/authorized_keys , se deben especificar las huellas digitales y los parámetros de cada clave.


Por ahora, solo agregue la huella digital de una tecla, para lo cual debe ejecutar el siguiente comando:


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

No se necesitan envoltorios mencionados en los artículos, /bin/unlock - script del sistema (cryptroot-unlock).


Así es como debería verse /etc/dropbear-initramfs/authorized_keys al final:


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

Actualice la configuración de GRUB y la imagen de initramfs y reinicie:


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

Desde la máquina donde copió la clave, ahora es posible conectarse al NAS y desbloquear:


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

Después de eso, la consola recibirá constantemente un error sobre la ausencia de un argumento ( ash: -gt: argument expected ), pero se desbloqueará. Este es un error en el script de desbloqueo del sistema que no afecta nada (el error se corrige fácilmente, pero los envoltorios no lo resuelven).


Se pueden encontrar más detalles en estos artículos:



Depuración


Para la depuración, puede insertar una llamada a /bin/sh en el script 00_bonding_init después de:


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

Cuando se resuelven los problemas de enlace, reemplace el command="/bin/unlock" con command="/bin/sh" en authorized_keys .


Después de conectarse a través de SSH, se le presentará un shell que puede usar para la depuración.

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


All Articles