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.
Para versões mais recentes do ubuntu, por exemplo, 14.04, encontrei uma combinação de @dragly e este blogposts respostas muito úteis. Parafrasear:
(No servidor) Instale o Dropbear
Sudo apt-get install dropbear
(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
(No cliente) Buscar chave privada do servidor
scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
(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.
(No servidor) Crie este arquivo em /etc/initramfs-tools/hooks/crypt_unlock.sh
(No servidor) Torne esse arquivo executável
Sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
Atualize o initramfs
Sudo 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
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.
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:
Instale o BusyBox e o Dropbear no seu servidor
Sudo apt-get install dropbear busybox
Atualize seu initramfs no servidor
Sudo update-initramfs -u
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.
Agora você pode transferir a chave privada com scp chamando o seguinte em seu cliente :
scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
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.
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
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.
Feche a conexão digitando
exit
Seu servidor agora deve ter desbloqueado seu disco rígido criptografado e inicializado normalmente.
(Muito obrigado ao autor original da postagem do blog!)
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.
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:
dropbear
busybox
O arquivo
/etc/initramfs-tools/initramfs.conf
Contém as opções de configuração usadas ao criar o initramfs. Ele deve conterBUSYBOX=y
(Definido como o padrão quando o pacote busybox é instalado) para ter o busybox instalado no initramfs e não deve conterDROPBEAR=n
, O que desabilitaria a instalação do dropbear no initramfs . Se definido comoDROPBEAR=y
, O dropbear será instalado em qualquer caso; seDROPBEAR
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
Edropbear_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
(Ouid_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 kernelip=
. 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 kernelip=
Está documentado emDocumentation/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.
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.
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.
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:
apt-get install dropbear initramfs-tools busybox
Basta copiar e colar suas chaves públicas em /etc/dropbear-initramfs/authorized_keys
no SERVIDOR
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
chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
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
update-initramfs -u
Sudo update-rc.d dropbear disable
ssh [email protected] [-i ~/.ssh/id_rsa]
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.
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!
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.
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.