O Ubuntu 14.04 pode usar a troca criptografada sem recorrer a hacks não oficiais?

2

Em uma nova instalação do Ubuntu 14.04, recebo essa mensagem de erro durante a inicialização

  

a unidade de disco para / dev / mapper / cryptswap1 ainda não está pronta ou não está presente

e a partição swap nunca é ativada. De minhas pesquisas até agora eu encontrei:

  • É um problema generalizado, provavelmente afetando cada instalação do Ubuntu 14.04 na qual a troca criptografada foi ativada.
  • Parte do problema é um bug fácil de corrigir, fazendo com que o cabeçalho de troca criptografada (gerado durante a inicialização) sobrescreva o cabeçalho de troca não criptografado, o que torna impossível encontrar a partição correta novamente durante a próxima inicialização.
  • Todas as soluções propostas para obtê-lo funcionar parecem ser simplesmente soluções alternativas no valor de: 1. Desativar a troca configurando-a como noauto no fstab. 2. Crie um arquivo /etc/rc.local (ou defina seu próprio serviço para ser ativado durante a inicialização), que ativa a partição swap.

É possível usar a troca criptografada no Ubuntu 14.04 sem usar esse tipo de invasão? Estou perfeitamente confortável atualizando todos os pacotes instalados e corrijo esses arquivos de configuração, que foram inicializados com conteúdo incorreto devido a scripts de instalação com bugs. Eu prefiro evitar ter que usar meu próprio script para ativar a troca, já que esse tipo de abordagem tende a quebrar quando os pacotes são atualizados.

É assim que meu /etc/crypttab se parece:

cryptswap1 /dev/sda6 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16

E a linha relevante do meu /etc/fstab é:

/dev/mapper/cryptswap1 none swap sw 0 0

O que eu tentei até agora:

Eu encontrei a unidade de disco de mensagens para / dev / mapper / cryptswap1 ainda não está pronta ou não está presente depois de tentar várias opções perguntando sobre o que pode ser o mesmo cenário.

Mas a única resposta é sugerir o uso de troca não criptografada.

Encontrei o link que afirma ter uma solução, mas a solução não faz sentido para mim.

A primeira parte da solução proposta é reescrever o cabeçalho de swap criptografado usando o mkswap. No entanto, como esse cabeçalho é criptografado com uma chave, que não é persistente nas reinicializações, essa etapa não ajudaria a fazer com que a troca funcionasse após a próxima reinicialização.

Ele também sugere atualizações para o / etc / fstab, mas parece que meu fstab já está olhando corretamente.

A postagem assume o LVM, que eu não uso. Não tenho conhecimento de nada, isso faria diferença.

Eu encontrei o link que me ajudou a entender o problema com o swap cabeçalho sendo sobrescrito e que adicionando offset a crypttab e regenerando o cabeçalho de swap não criptografado, pode resolver esse problema.

No entanto, o cabeçalho sobrescrito não é o único problema em questão, há outro problema, que eu ainda não entendi completamente.

Outras coisas que descobri sobre o problema:

A partir da leitura de /lib/cryptsetup/cryptdisks.functions , aprendi que, durante a inicialização, o dispositivo deve ser criado usando o nome cryptswap1_unformatted , o cabeçalho de permuta criptografado deve ser gravado e o dispositivo deve ser renomeado como cryptswap1 . No log do kernel eu encontrei esta mensagem de erro:

[   39.419429] device-mapper: ioctl: Unable to change name on mapped device cryptswap1_unformatted to one that already exists: cryptswap1

Confusamente, o resultado disso é que o dispositivo acaba tendo o nome cryptswap1 , mas o cabeçalho swap nunca foi escrito.

A troca funciona durante as inicializações em que a verificação do sistema de arquivos foi executada. É somente quando nenhuma verificação do sistema de arquivos é executada, que recebo o temido erro cryptswap1 is not ready yet .

Em /var/log/upstart/cryptdisks.log , localizei a mensagem de erro

Device cryptswap1_unformatted already exists.

No entanto, adicionando um log adicional a /lib/cryptsetup/cryptdisks.functions , aprendi que há uma corrida entre /etc/init.d/cryptdisks-early e /etc/init/cryptdisks.conf . Qualquer registro que eu adicione ao cryptdisks.functions pode influenciar como as ações dos dois scripts são intercaladas e, ocasionalmente, acaba funcionando.

É claro que os dois não devem manipular o mesmo dispositivo em paralelo. Como posso obter os dois scripts serializados, de modo que a troca funcione em cada inicialização?

    
por kasperd 14.03.2015 / 18:59

1 resposta

4

Existem dois problemas separados que devem ser resolvidos para que o cryptswap1 funcione corretamente no Ubuntu 14.04.

Problema 1: cabeçalho de troca sobrescrito

A partição foi originalmente formatada com um cabeçalho de swap não criptografado, que é usado para localizar a partição correta a ser usada durante a inicialização. Como a chave de criptografia muda a cada inicialização, o cabeçalho de troca criptografada será reescrito em cada inicialização. Devido a um erro na geração de /etc/crypttab , o cabeçalho de troca criptografado sobrescreve o cabeçalho de swap não criptografado. Isso impedirá que a partição swap seja encontrada em todas as inicializações futuras.

Problema 2: condição de corrida durante o arranque

Existe uma condição de corrida durante a inicialização entre /etc/init.d/cryptdisks-early e /etc/init/cryptdisks.conf . Ambos tentarão simultaneamente ativar todos os dispositivos listados em crypttab . No caso de troca criptografada, o resultado da condição de corrida na maior parte do tempo será que ela não funciona. Algumas verificações de integridade falham, fazendo com que a gravação do cabeçalho de troca criptografada seja ignorada, a fim de evitar perda potencial de dados.

Corrigindo e contornando os problemas

O primeiro problema pode ser facilmente corrigido. O segundo pode ser contornado. Em /etc/crypttab , identifique a linha de swap. Deve ficar assim (exceto que o UUID será diferente):

cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256

No meu caso, esta foi a única linha em /etc/crypttab . Para corrigir a sobregravação do cabeçalho de troca, um deslocamento deve ser adicionado. Fontes discordam sobre o que exatamente o valor correto é usado, mas usar um valor muito grande não faz mal. Eu consegui trabalhar usando um deslocamento de 16 .

Além disso, adicionei noearly , o que faz com que /etc/init.d/cryptdisks-early ignore essa linha e assim funciona em torno da condição de corrida.

A linha resultante se parece com:

cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16,noearly

Isso evitará que o cabeçalho de swap não criptografado seja sobrescrito novamente, mas ainda precisamos recriá-lo na partição. Nesta etapa é crucial usar a partição correta porque usar a partição incorreta irá causar perda de dados. Eu usei fdisk -l para encontrar a partição correta, que no meu caso é /dev/sda6 .

Agora use mkswap para reescrever o cabeçalho de swap não criptografado.

mkswap /dev/sda6 -U f9a0f20c-fac4-408c-a8b9-47300216f727

O UUID é aquele que a partição swap tinha antes de ser sobrescrita (que você ainda pode ver em /etc/crypttab ). Uma vez feito isso, é necessário reiniciar e tudo deve funcionar.

Verificando a operação correta

Eu recomendo reiniciar três vezes para verificar se continua funcionando.

A mensagem de erro the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present permanece visível brevemente durante a inicialização. No entanto, isso parece não ser um problema, pois fica pronto antes que o processo de inicialização seja concluído.

Faça o login e digite cat /proc/swaps para ver se a troca está ativa. Você deve ver uma partição de troca com o nome /dev/dm-0 , em que dm indica que está realmente usando a camada de mapeador de dispositivo, que fornece a criptografia.

    
por kasperd 15.03.2015 / 18:10