Servidor de ligação e SSH no initramfs


Todo sistema é um compromisso entre segurança e usabilidade.


No NAS construído , havia um problema sério: era impossível reiniciar o sistema sem estar no local, o que reduzia o nível de disponibilidade de dados.


Esse problema não foi crítico até o momento em que começaram a desligar a emergência de eletricidade: por três meses, duas vezes por várias horas. O no-break foi projetado para avarias de curto prazo e não deve funcionar com baterias por mais de meia hora (embora realmente seja cerca de uma hora), e com cada desligamento desse tipo, para ligar o sistema novamente, tive que ir para outra cidade.


Graças a uma dica do ValdikSS , esse problema foi resolvido. Mas ...



Eu precisava de ligação de interface e desbloqueio remoto de SSH. E não encontrei um manual que possa ser feito imediatamente, para que funcione conforme necessário.


Portanto, trago minha versão da solução com vínculo e IP dinâmico, no qual o sistema pode ser desbloqueado, local e remotamente.


Lembro que, para executar essas configurações, você deve ter acesso físico local ao NAS e aos recursos de inicialização de backup.


Colagem na initramfs


Como no NAS, duas interfaces são combinadas em um canal, foi decidido fazer isso também na inicialização.


Da pergunta "Usando o NFS-root com interfaces vinculadas" , peguei o script. O artigo "Como gerenciar ligações linux sem ifenslave usando sysfs" ajudou a configurar as ligações.


Primeiro, você precisa incluir módulos no initramfs que são usados ​​para operar a rede. Isso é feito com o seguinte 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 

Agora copie os dois scripts para /etc/initramfs-tools/scripts/ .


O primeiro é necessário para elevar as interfaces na ligação:


/ 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 

O segundo é desativar a interface de ligação enquanto o carregamento continua:


/ 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 

Se isso não for feito, a rede não funcionará após a inicialização.


Não esqueça de dar permissão aos scripts para executar:


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

Resta apenas definir as interfaces que serão incluídas na ligação e os parâmetros para obter o endereço.
O endereço será obtido via DHCP, porque A ligação terá o mesmo MAC que após a inicialização, porque o roteador emitirá um IP fixo e encaminhará as portas.


Recebo automaticamente as interfaces daquelas incluídas no vínculo bond0 enquanto o NAS está em execução:


 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 

Por fim, atualize a configuração do GRUB e a imagem initramfs:


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

Isso é tudo. Se tudo estiver configurado corretamente, após a reinicialização e o início do script de inicialização no initrmafs, os pings no IP NAS continuarão, apesar do fato de o sistema operacional ainda não estar carregado.


Observo que a criação de vínculos no Dracut é muito mais fácil, porque existem scripts na entrega .


Servidor SSH no initramfs


Instale o pacote para ativar o Dropbear SSH no initramfs:


 apt-get install dropbear-initramfs 

O Dropbear SSH será incluído no initrmafs automaticamente e será iniciado se pelo menos uma interface de rede com um endereço IP for levantada no estágio inicial da inicialização.


Depois disso, converta a chave Dropbear para o formato OpenSSH e feche-a com uma senha:


 /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 

A chave id_rsa é id_rsa para a máquina com a qual o desbloqueio será realizado. Assumirei que ele será copiado para o ~/.ssh/dropbear .


Em /etc/dropbear-initramfs/authorized_keys , as impressões digitais das chaves e os parâmetros de cada chave devem ser especificados.


Por enquanto, basta adicionar a impressão digital de uma chave, para a qual você precisa executar o seguinte comando:


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

Nenhum wrapper mencionado nos artigos é necessário, /bin/unlock - script do sistema (cryptroot-unlock).


É assim que o /etc/dropbear-initramfs/authorized_keys deve aparecer no final:


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

Atualize a imagem de configuração e initramfs do GRUB e reinicie:


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

Na máquina em que você copiou a chave, agora é possível conectar-se ao NAS e 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): 

Depois disso, o console constantemente recebe um erro sobre a ausência de um argumento ( ash: -gt: argument expected ), mas o desbloqueio será realizado. Este é um erro no script de desbloqueio do sistema que não afeta nada (o erro é corrigido facilmente, mas os wrappers não o curam).


Mais detalhes podem ser encontrados nestes artigos:



Depuração


Para depuração, você pode inserir uma chamada para /bin/sh no script 00_bonding_init após:


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

Quando os problemas de ligação forem resolvidos, substitua o command="/bin/unlock" pelo command="/bin/sh" nas command="/bin/sh" authorized_keys .


Após a conexão via SSH, você verá um shell que pode ser usado para depuração.

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


All Articles