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

56

Quando instalei o Ubuntu 10.04 e, agora, 10.10, me ofereceram a opção de habilitar o "LVM criptografado" para o meu disco rígido. Depois de escolher essa opção, eu sou solicitado para a minha senha durante a inicialização para descriptografar o LVM.

Agora, estou pensando em configurar um servidor sem cabeçalho que executa o Linux (não necessariamente o Ubuntu), mas estou preocupado que, como o servidor está sem cabeça, não poderei decifrá-lo durante a inicialização. Eu seria capaz de SSH durante a inicialização para digitar minha senha para o LVM criptografado? Se sim, como faço para configurá-lo? Ou há outra solução? Mais uma vez esta questão não é específica para o Ubuntu. Obrigado.

    
por hpy 20.12.2010 / 15:18

10 respostas

23

Para versões mais recentes do Ubuntu, por exemplo, 14.04, encontrei uma combinação de @dragly e este blogposts ' responde muito útil. Parafraseando:

  1. (No servidor) Instale o DropBear

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

    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 para o 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. Desabilite o serviço dropbear na inicialização, para que o openssh seja usado depois que a partição for descriptografada

    sudo update-rc.d dropbear disable
    

Você está feito. 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 isso é algo que você precisa fazer.

    
por 07.03.2015 / 19:02
23

Um guia para fazer tal configuração com BusyBox e Dropbear é mostrado em esta postagem no blog . early-ssh não funcionou para mim e aparentemente não é mais necessário.

Eu resumi o que você precisa fazer a seguir. Para mais detalhes, dê uma olhada no post 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. Você pode ter que 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 parecem não funcionar.

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

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Configure o arquivo ~ / .ssh / config do 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
    

    Altere o Host para o que você 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 seu servidor e aguarde o prompt da frase secreta. Dê 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. Ao efetuar login, emita o seguinte comando no seu servidor . Veja a postagem no blog para 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;
    

    Isso levará algum tempo (30 segundos) antes de você digitar sua frase secreta. Digite-o quando solicitado.

  8. Feche a conexão digitando

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

(Um grande obrigado ao autor original do post do blog!)

    
por 25.01.2012 / 19:27
18

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.

    
por 20.12.2010 / 17:17
16

Dê uma olhada no readme do cryptsetup para isso em /usr/share/doc/cryptsetup/README.remote.gz (pacote Ubuntu cryptsetup ). Há um guia completo para conseguir isso. É semelhante à resposta de dragly , mas acho que isso é um pouco mais elegante. (Dropbear formatado chaves, passando a senha através de um FIFO, em vez de um script de shell frágil, etc.)

unlocking rootfs via ssh login in initramfs

You can unlock your rootfs on bootup from remote, using ssh to log in to the booting system while it's running with the initramfs mounted.

Setup

For remote unlocking to work, the following packages have to be installed before building the initramfs: dropbear busybox

The file /etc/initramfs-tools/initramfs.conf holds the configuration options used when building the initramfs. It should contain BUSYBOX=y (this is set as the default when the busybox package is installed) to have busybox installed into the initramfs, and should not contain DROPBEAR=n, which would disable installation of dropbear to initramfs. If set to DROPBEAR=y, dropbear will be installed in any case; if DROPBEAR isn't set at all, then dropbear will only be installed in case of an existing cryptroot setup.

The host keys used for the initramfs are dropbear_dss_host_key and dropbear_rsa_host_key, both located in /etc/initramfs-tools/etc/dropbear/. If they do not exist when the initramfs is compiled, they will be created automatically. Following are the commands to create them manually:

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

As the initramfs will not be encrypted, publickey authentication is assumed. The key(s) used for that will be taken from /etc/initramfs-tools/root/.ssh/authorized_keys. If this file doesn't exist when the initramfs is compiled, it will be created and /etc/initramfs-tools/root/.ssh/id_rsa.pub will be added to it. If the latter file doesn't exist either, it will be generated automatically - you will find the matching private key which you will later need to log in to the initramfs under /etc/initramfs-tools/root/.ssh/id_rsa (or id_rsa.dropbear in case you need it in dropbear format). Following are the commands to do the respective steps manually:

To create a key (in dropbear format):

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

To convert the key from dropbear format to openssh format:

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

To extract the public key:

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

To add the public key to the authorized_keys file:

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

In case you want some interface to get configured using dhcp, setting DEVICE= in /etc/initramfs-tools/initramfs.conf should be sufficient. The initramfs should also honour the ip= kernel parameter. In case you use grub, you probably might want to set it in /boot/grub/menu.lst, either in the '# kopt=' line or appended to specific 'kernel' line(s). The ip= kernel parameter is documented in Documentation/nfsroot.txt in the kernel source tree.

Issues

Don't forget to run update-initramfs when you changed the config to make it effective!

Collecting enough entropy for the ssh daemon sometimes seems to be an issue. Startup of the ssh daemon might be delayed until enough entropy has been retrieved. This is non-blocking for the startup process, so when you are at the console you won't have to wait for the sshd to complete its startup.

Unlocking procedure

To unlock from remote, you could do something like this:

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

This example assumes that you have an extra known_hosts file "~/.ssh/known_hosts.initramfs" which holds the cryptroot system's host-key, that you have a file "~/id_rsa.initramfs" which holds the authorized-key for the cryptroot system, that the cryptroot system's name is "initramfshost.example.com", and that the cryptroot passphrase is "secret"

-- <[email protected]>, Wed, 30 Sep 2009

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

    
por 13.06.2013 / 01:24
5

Se você quer ser capaz de inicializar não-assistido e remotamente, você também deve olhar Mandos (que eu e outros escrevemos):

Mandos is a system for allowing servers with encrypted root file systems to reboot unattended and/or remotely. See the intro manual page file for more information, including an FAQ list.

Em suma, o servidor de inicialização obtém a senha pela rede, de maneira segura. Veja o README para detalhes.

    
por 28.04.2011 / 13:08
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 usando a porta serial para gerar as mensagens de inicialização, inserir a senha para desbloquear suas unidades e fazer o login. (Se o seu servidor suportar BIOS serial, ative isso também. Então você nunca terá que conectar um monitor para a máquina em tudo).

Sempre é uma boa ideia ter uma maneira "sem rede" de entrar em um servidor sem cabeçalho.

    
por 29.04.2011 / 14:41
2

No arch linux, há um pacote AUR dropbear_initrd_encrypt que faz o que você quer sair da caixa. Funciona muito bem para interfaces com fio. Eu tive que cortar um pouco para o wireless.

    
por 17.07.2015 / 19:07
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 seu SERVIDOR conectando e desbloqueando a partição criptografada através de seu CLIENTE

Instalar pacotes obrigatórios (no SERVER)

apt-get install dropbear initramfs-tools busybox

Anexe suas chaves públicas desejadas no arquivo authorized_keys do SERVER

Basta copiar e colar suas chaves públicas em /etc/dropbear-initramfs/authorized_keys no 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 \}'\'
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \'ps | grep "\-sh" | grep -v "grep" | awk '{print \}'\'
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

Torne-o 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.conf para 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

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

sudo update-rc.d dropbear disable

Teste

  • Reinicie seu servidor
  • Conecte-se ao seu servidor por meio de ssh [email protected] [-i ~/.ssh/id_rsa]
por 08.04.2017 / 06:06
1

No debian 9 (estável), esta solução estava desatualizada. Durante a instalação, recebo um aviso sobre 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 muito simples, e foi explicado para mim no ótimo canal #debian (obrigado novamente):

Primeiro, certifique-se de que busybox , dropbear e dropbear-initramfs estejam instalados

sudo apt install busybox dropbear*

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

Atualize então initramfs para levar em conta as alterações: : update-initramfs -u

Isso é tudo!

Note que, se você quer evitar um confronto entre as chaves entre dropbear e openssh (eles compartilham o mesmo ip, mas usam uma chave diferente), você pode querer colocar seu cliente em ~/.ssh/config alguma coisa 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 assim que você receber um prompt, digite conforme sugerido pelo prompt busybox:

cryptroot-unlock

e digite sua senha.

Aproveite!

    
por 21.12.2017 / 01:56
0

Eu escrevi um papel Ansible que faz isso por você. Basta pegar o papel debops-contrib.dropbear_initramfs e executá-lo. Consulte a documentação da função para obter detalhes.

    
por 01.03.2015 / 18:46