it-swarm-pt.tech

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

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 poderei descriptografá-lo durante a inicialização. Eu seria capaz de efetuar 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.

62
hpy

Para versões mais recentes do ubuntu, por exemplo, 14.04, encontrei uma combinação de @dragly e este blogposts respostas 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 usuário para 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.

26
nsg

Um guia para fazer essa configuração com o BusyBox e o Dropbear é mostrado em esta postagem no 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 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!)

23
dragly

Eu acho que 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.

18
wag

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 a resposta do 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 frágil script do Shell 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: dropbearbusybox

O arquivo /etc/initramfs-tools/initramfs.conf Conté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) para 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, O dropbear será instalado em qualquer caso; se DROPBEAR nã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_key E 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 obtidas de /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.pub Será adicionado a ele. Se o último arquivo também não existir, ele será gerado automaticamente - você encontrará a chave privada correspondente que mais tarde precisará fazer login no initramfs em /etc/initramfs-tools/root/.ssh/id_rsa (Ou id_rsa.dropbear Em caso seja necessário 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

Caso você queira que alguma interface seja configurada usando dhcp, a configuração DEVICE= Em /etc/initramfs-tools/initramfs.conf Deve ser suficiente. O initramfs também deve respeitar o parâmetro do kernel ip=. No caso de você usar o grub, é provável que você queira configurá-lo em /boot/grub/menu.lst, Na linha '# kopt=' Ou anexado a linhas específicas 'kernel'. O parâmetro do kernel ip= Está documentado em Documentation/nfsroot.txt Na árvore de fontes do kernel.

Problemas

Não se esqueça de executar update-initramfs Quando 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 arquivo known_hosts Extra "~/.ssh/known_hosts.initramfs" Que contém a chave Host do sistema de criptografia, que você possui um arquivo "~/id_rsa.initramfs" Que contém o chave para o sistema de criptografia, que o nome do sistema de criptografia é "initramfshost.example.com" e que a senha da criptografia é "secret"

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

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

16
gertvdijk

Se você deseja inicializar autônoma e remotamente, consulte também Mandos (que eu e outros escreveu):

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

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

6
Teddy

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 efetuar login. um monitor para a máquina).

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

2
LawrenceC

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

De qualquer forma, instruções a seguir funcionou:

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 em /etc/dropbear-initramfs/authorized_keys no SERVIDOR

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 "\[email protected]"
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)

Editar /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

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

Teste

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

No Arch Linux, há 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.

2
user3188445

No debian 9 (stable), 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 simples e me foi explicado no ótimo canal #debian (obrigado novamente):

Primeiro, verifique se busybox, dropbear e dropbear-initramfs estão 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!

Observe que, se você quiser evitar conflitos entre as chaves entre dropbear e openssh (eles compartilham o mesmo ip, mas usam uma chave diferente), convém colocar no seu cliente ~/.ssh/config algo parecido:

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.

Aproveitar!

2
tobiasBora

Eu uso a técnica explicada por outras pessoas nesta página (SSH no initramfs com um parâmetro kernel IP 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 a desenvolver um Python ( nlock-remote-system )) que faz o desbloqueio real para mim, porque o processo de fazer isso manualmente parecia um pouco frágil e comecei a temer reiniciar meus servidores, então, no espírito de "se dói, vale a pena automatizar", codifiquei meu conhecimento em Python ???? (e isso tem sido realmente 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 em 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.

1
xolox

Eu escrevi um papel Ansible que faz isso por você. Apenas pegue a função debops-contrib.dropbear_initramfs e execute-a. Consulte a documentação da função para obter detalhes.

0
ypid