SSH para descriptografar o LVM criptografado durante a inicialização do servidor sem cabeçalho?

59

Quando instalei o Ubuntu 10.04 e, agora, 10.10, me foi oferecida a opção de ativar o "LVM criptografado" para o meu disco rígido. Depois de escolher essa opção, minha senha é solicitada durante a inicialização para descriptografar o LVM.

Agora, estou pensando em configurar um servidor sem cabeça que execute o Linux (não necessariamente o Ubuntu), mas estou preocupado que, como o servidor não tenha cabeça, não será possível decifrá-lo durante a inicialização. Eu seria capaz de fazer o SSH durante a inicialização para inserir minha senha para o LVM criptografado? Se sim, como faço para configurá-lo? Ou há outra solução? Novamente, essa pergunta NÃO é específica para o Ubuntu. Obrigado.

hpy
fonte
4
Veja também:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L
Acho que a resposta do @Nate deve ser a aceita: ela (essencialmente, uma vez que é necessária uma edição para refletir as mudanças no blog vinculado) usa chaves públicas em vez de privadas .
Jonathan Y.

Respostas:

25

Para versões mais recentes do ubuntu, por exemplo, 14.04, achei uma combinação de @dragly e as respostas deste post de blog muito úteis. Parafrasear:

  1. (No servidor) Instale o Dropbear

    sudo apt-get install dropbear
    
  2. (No servidor) Copie e atribua permissões para o login raiz de chave pública / privada

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

lembre-se de alterar o usuário para o seu nome de usuário no servidor

  1. (No cliente) Buscar chave privada do servidor

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (No cliente) Adicione uma entrada ao ssh config

    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. (No servidor) Crie este arquivo em/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (No servidor) Torne esse arquivo executável

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Atualize o initramfs

    sudo update-initramfs -u
    
  6. Desative o serviço dropbear na inicialização para que o openssh seja usado após a partição ser descriptografada

    sudo update-rc.d dropbear disable
    

Você Terminou. Experimente. Verifique a postagem do blog vinculada acima para obter instruções sobre como configurar o servidor com um endereço IP estático, se você precisar fazer isso.

nsg
fonte
O blog vinculado adicionou uma referência para anexar a chave pública de um cliente à do servidor /etc/initramfs-tools/root/.ssh/authorized_keys, mesmo que ele ainda copie a chave privada do Dropbear, que pode ser totalmente desconsiderada. Seguir o restante das instruções funciona para mim, o que significa que essa deve ser a resposta aceita (uma vez que reflete essa alteração), porque ela usa apenas chaves públicas.
Jonathan Y.
23

Um guia para fazer essa configuração com o BusyBox e o Dropbear é mostrado nesta postagem do blog . O early-ssh não funcionou para mim e aparentemente não é mais necessário.

Resumi o que você precisa fazer a seguir. Para mais detalhes, dê uma olhada na postagem acima:

  1. Instale o BusyBox e o Dropbear no seu servidor

    sudo apt-get install dropbear busybox
    
  2. Atualize seu initramfs no servidor

    sudo update-initramfs -u
    
  3. Copie a chave privada gerada pelo dropbear na sua máquina cliente. Talvez você precise copiar isso para um novo diretório e alterar a propriedade para fazer isso. No seu servidor, faça o seguinte:

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

    Lembre-se de substituir o usuário pelo seu nome de usuário. Os logins de senha não parecem funcionar.

  4. Agora você pode transferir a chave privada com scp chamando o seguinte em seu cliente :

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Configure o arquivo ~ / .ssh / config do seu cliente para facilitar o login. Abra-o com um editor de texto e adicione o seguinte:

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

    Mude o Host para o que quiser e HostName para o nome do seu servidor. Deixe o usuário ser root. Parece ser o único usuário aceito no Dropbear. Salve e feche o arquivo.

  6. Reinicie o servidor e aguarde o prompt da senha. Dê ao Dropbear alguns segundos para detectar e configurar sua conexão com a internet. Conecte-se ao seu servidor com o seguinte comando no seu cliente :

    ssh myremoteserver # or any name you chose
    
  7. Quando estiver logado, emita o seguinte comando no seu servidor . Veja a postagem do blog para obter detalhes:

    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;
    

    Levará algum tempo (30 segundos) antes de você digitar sua senha. Digite-o quando solicitado.

  8. Feche a conexão digitando

    exit
    
  9. Seu servidor agora deve ter desbloqueado seu disco rígido criptografado e inicializado normalmente.

(Muito obrigado ao autor original da postagem do blog!)

dragly
fonte
2
Não entendo bem o motivo de mudar com chaves privadas. Deve ser suficiente copiar a chave pública sua na máquina cliente para o servidor como chave autorizada para o servidor raiz, certo?
Gdvdijk
Tenho certeza de que é possível criar o par de chaves na máquina cliente e mover apenas a chave pública de lá para o servidor, mas se bem me lembro, acho que houve alguns problemas ao encontrar um formato que o BusyBox aceitaria. Portanto, reutilizar as chaves que já estavam no servidor foi a única opção que eu trabalhei.
dragly
11
Alguma idéia do que devo fazer para que isso funcione no Arch Linux?
Gerharddc
11
@ Gerhman Confira o pacote dropbear_initrd_encrypt no AUR para obter suporte ao ssh no Archlinux.
Caleb
11
@Gerhman archwiki page: Desbloqueio remoto da raiz ou de outra partição Ainda não o fez, mas parece interessante. Terá que verificá-lo para fora :)
hanetzer
18

Eu acho que o early-ssh fornece o que você está procurando:

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...

Já existe um pacote .deb disponível, então você provavelmente está bem com o Ubuntu.

abanar
fonte
Parece que é exatamente isso que estou procurando, obrigado!
Hp
3
Você tem um link para um bom tutorial ou howto? Estou preso com o early-ssh na minha caixa de compressão debian.
11
Sim, um tutorial seria ótimo.
Hpy 29/04
16

Dê uma olhada no leia-me do cryptsetup para isso em /usr/share/doc/cryptsetup/README.remote.gz(pacote Ubuntu cryptsetup). Existe um guia completo para fazer isso. É semelhante à resposta de dragly , mas acho que isso é um pouco mais elegante. (Chaves formatadas pelo Dropbear, passando a senha por meio de um FIFO em vez de um script de shell frágil etc.)

desbloqueando rootfs via login ssh no initramfs

Você pode desbloquear seus rootfs na inicialização a partir do controle remoto, usando ssh para efetuar login no sistema de inicialização enquanto estiver executando o initramfs montado.

Configuração

Para que o desbloqueio remoto funcione, os seguintes pacotes devem ser instalados antes da criação do initramfs: dropbear busybox

O arquivo /etc/initramfs-tools/initramfs.confcontém as opções de configuração usadas ao criar o initramfs. Ele deve conter BUSYBOX=y (definido como o padrão quando o pacote busybox é instalado) ter o busybox instalado no initramfs e não deve conter DROPBEAR=n, o que desabilitaria a instalação do dropbear no initramfs. Se definido como DROPBEAR=y, dropbear será instalado em qualquer caso; se DROPBEARnão estiver definido, o dropbear será instalado apenas no caso de uma configuração de criptografia existente.

As chaves do host usadas para o initramfs são dropbear_dss_host_keye dropbear_rsa_host_key, ambas localizadas em /etc/initramfs-tools/etc/dropbear/. Se eles não existirem quando o initramfs for compilado, eles serão criados automaticamente. A seguir estão os comandos para criá-los manualmente:

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

Como o initramfs não será criptografado, a autenticação de chave pública será assumida. As chaves usadas para isso serão retiradas /etc/initramfs-tools/root/.ssh/authorized_keys. Se esse arquivo não existir quando o initramfs for compilado, ele será criado e /etc/initramfs-tools/root/.ssh/id_rsa.pubserá adicionado a ele. Se o último arquivo também não existir, ele será gerado automaticamente - você encontrará a chave privada correspondente na qual mais tarde precisará fazer login no initramfs em /etc/initramfs-tools/root/.ssh/id_rsa (ou id_rsa.dropbearno caso de precisar no formato dropbear). A seguir, estão os comandos para executar as respectivas etapas manualmente:

Para criar uma chave (no formato dropbear):

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

Para converter a chave do formato dropbear para o formato openssh:

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

Para extrair a chave pública:

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

Para adicionar a chave pública ao arquivo allowed_keys:

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

No caso de você querer alguma interface para se configurado usando DHCP, definindo DEVICE=em /etc/initramfs-tools/initramfs.confdeve ser suficiente. O initramfs também deve respeitar o ip=parâmetro do kernel. No caso de você usar o grub, provavelmente poderá configurá-lo /boot/grub/menu.lst, na # kopt=linha ' ' ou anexado a kernellinhas específicas ' '. O ip=parâmetro kernel está documentado na Documentation/nfsroot.txtárvore de fontes do kernel.

Problemas

Não se esqueça de executar update-initramfsquando você alterou a configuração para torná-la eficaz!

Coletar entropia suficiente para o daemon ssh às vezes parece ser um problema. A inicialização do daemon ssh pode ser adiada até que a entropia suficiente seja recuperada. Isso não impede o processo de inicialização, portanto, quando você estiver no console, não precisará esperar pelo sshd concluir sua inicialização.

Procedimento de desbloqueio

Para desbloquear do controle remoto, você pode fazer algo assim:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

Este exemplo pressupõe que você tenha um known_hostsarquivo extra " ~/.ssh/known_hosts.initramfs" que contém a chave do host do sistema de criptografia, que você tenha um arquivo " ~/id_rsa.initramfs" que contém a chave autorizada para o sistema de criptografia, que o nome do sistema de criptografia é " initramfshost.example.com" e que o a senha de criptografia é " secret"

- < [email protected]>, Qua, 30 de setembro de 2009

Obrigado ao jap por me indicar isso em um canal diferente.

gertvdijk
fonte
11
Parece uma idéia muito melhor (sendo descrita nos documentos oficiais e tudo mais) do que o hackeado ps-grepping. Como uma observação lateral sobre o procedimento de desbloqueio fornecido, no entanto, pode-se ter cuidado ao digitar a senha diretamente na linha de comando, pois provavelmente acabará em um arquivo de histórico do shell em algum lugar. Uma solução possível é criar um pequeno script de wrapper solicitando a frase secreta usando read -s -p.
Joelpet
11
note que há problemas com essa abordagem nas versões recentes do Ubuntu, ou seja bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord
6

Se você deseja inicializar de forma autônoma e remota, consulte Mandos (que eu e outros escrevemos):

Mandos é um sistema para permitir que servidores com sistemas de arquivos raiz criptografados sejam reinicializados sem supervisão e / ou remotamente. Consulte o arquivo de introdução do manual para obter mais informações, incluindo uma lista de perguntas frequentes.

Em resumo, o servidor de inicialização obtém a senha pela rede, de forma segura. Consulte o README para obter detalhes.

Teddy
fonte
Obrigado por suas contribuições, mas observe que 100% das suas postagens são quase idênticas ao seu produto como um comportamento limítrofe e você corre o risco de ser considerado spam (eu teria sinalizado suas postagens se o Mandos não fosse um software livre ou você não tinha um histórico de postagens que não sejam do Mandos em outros sites).
Gilles 'SO- stop be evil'
@ Gilles: Feito agora.
Teddy
2

Servidor sem cabeça? Se tiver uma porta serial, use-a.

O GRUB pode ser configurado para funcionar na porta serial. Seu kernel também pode ser configurado, use a porta serial para emitir as mensagens de inicialização iniciais, digitar a senha para desbloquear suas unidades e fazer login. (Se o servidor suportar BIOS serial, ative-o também. Você nunca precisará se conectar um monitor para a máquina).

Sempre é uma boa idéia ter uma maneira "não relacionada à rede" de acessar um servidor sem cabeça.

LawrenceC
fonte
Ótimo ponto! No entanto, as formas " fora da rede " de acessar um servidor sem cabeçalho são ( somente ) relevantes principalmente se a proximidade física entre cliente / servidor estiver próxima; a menos que eu esteja ignorando alguma outra possibilidade / recurso de uma conexão serial.
ILMostro_7 28/02
2

No arch linux, existe um pacote AUR dropbear_initrd_encrypt que faz o que você deseja fora da caixa. Funciona muito bem para interfaces com fio. Eu tive que cortá-lo um pouco para wireless.

user3188445
fonte
2

Infelizmente, nenhuma das respostas acima funcionou para mim. Além disso, copiar uma chave privada do servidor parece paradoxal.

De qualquer forma, as seguintes instruções foram elaboradas:

Inicialize o seu servidor conectando e desbloqueando a partição criptografada através do seu CLIENT

Instale pacotes obrigatórios (no SERVER)

apt-get install dropbear initramfs-tools busybox

Anexe as chaves públicas desejadas ao arquivo allowed_keys do SERVER

Basta copiar e colar suas chaves públicas /etc/dropbear-initramfs/authorized_keysno SERVER

Crie o script de desbloqueio

Crie o seguinte script em /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

Torne executável:

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

Crie um IP estático (ou pule esta etapa para usar o DHCP)

Edite /etc/initramfs-tools/initramfs.confpara adicionar (ou alterar) a linha:

#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

Atualizar initialramfs

update-initramfs -u

Desative o serviço dropbear na inicialização para que o openssh seja usado após a partição ser descriptografada

sudo update-rc.d dropbear disable

Testando

  • Reinicie seu servidor
  • Conecte-se ao seu servidor via ssh [email protected] [-i ~/.ssh/id_rsa]
ceremcem
fonte
2

No debian 9 (stable), esta solução estava desatualizada. Durante a instalação, recebo um aviso dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!e não consegui encontrar as chaves necessárias. Este método é realmente simples e me foi explicado no ótimo canal #debian (obrigado novamente):

Primeiro, verifique se busybox, dropbeare dropbear-initramfsestá instalado

sudo apt install busybox dropbear*

depois adicione sua chave pública (na maioria das vezes ~/.ssh/id_rsa.pub) ao arquivo /etc/dropbear-initramfs/authorized_keys.

Atualize initramfspara ter em conta as alterações:: update-initramfs -u

Isso é tudo!

Observe que, se você deseja evitar um conflito entre as chaves entre dropbeare openssh(elas compartilham o mesmo ip, mas usam uma chave diferente), convém colocar no cliente ~/.ssh/configalgo assim:

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

Em seguida, basta conectar usando:

ssh myserver_luks_unlock

e depois de receber um prompt, digite como sugerido pelo prompt do busybox:

cryptroot-unlock

e digite sua senha.

Desfrutar!

tobiasBora
fonte
0

Estou usando a técnica explicada por outras pessoas nesta página (SSH no initramfs com um IPparâmetro do kernel para configurar a rede) há alguns anos para desbloquear remotamente servidores Ubuntu Linux sem cabeça (12.02, 14.04, 16.04 e 18.04).

Até cheguei ao ponto de desenvolver um programa Python ( unlock-remote-system ) que faz o verdadeiro desbloqueio para mim, porque o processo de fazer isso manualmente parecia um pouco frágil e comecei a temer reiniciar meus servidores, por isso, no espírito de "se dói, vale a pena automatizar" codifiquei meu conhecimento em Python 😇 (e isso de fato tornou muito mais fácil fazer reinicializações regulares para aplicar atualizações de segurança).

Desde então, decidi compartilhar também minhas anotações pessoais sobre criptografia de disco raiz remota com o mundo. A página vinculada contém alguns detalhes sobre o procedimento (também algumas dicas que não são mencionadas aqui) e pretendo mantê-lo atualizado.

xolox
fonte