Substituir a partição LUKS pela partição ext4 pelo mesmo conteúdo

2

Eu tenho uma partição LUKS (Linux Unified Key Setup) que contém o rootfs. Desejo substituí-lo por uma partição ext4 não criptografada contendo os mesmos rootfs. Tendo pesquisado de longe e de longe, não vi ferramentas para ajudar nesse processo. Eu senti falta de alguma coisa?

Se não, qual é a solução? Use parted para excluir a partição LUKS, criar uma partição ext4 e copiar os rootfs nela?

    
por jski 28.09.2018 / 18:27

2 respostas

2

Esta é uma operação perigosa altamente e deve ser executada com muita cautela.

No nível mais simplificado, existe um utilitário chamado cryptsetup-reencrypt que permite esta operação. Ele explicitamente chama em sua página man:

   WARNING: The cryptsetup-reencrypt program is not resistant to
   hardware or kernel failures during reencryption (you can lose your
   data in this case).

   ALWAYS BE SURE YOU HAVE RELIABLE BACKUP BEFORE USING THIS TOOL.
   The reencryption can be temporarily suspended (by TERM signal or by
   using ctrl+c) but you need to retain temporary files named
   LUKS-<uuid>.[log|org|new].  LUKS device is unavailable until
   reencryption is finished though.

De acordo com a seção "Exemplos" da página man:

   Remove LUKS encryption completely

          cryptsetup-reencrypt /dev/sdb1 --decrypt

Isso provavelmente precisará ser feito a partir de um ambiente "Live" (significando um ambiente Linux efêmero totalmente em execução, como o fornecido por Fedora Live ou Ubuntu Live .

Como uma alternativa a esse fluxo de trabalho, você também pode usar a rota mais explícita de fazer backup dos dados, remover a partição e recriá-la. O Arch Linux possui uma excelente documentação sobre este fluxo de trabalho, bem como etapas adicionais de solução de problemas:

link

Mais uma vez, deve-se ressaltar que esta não é uma operação trivial e os backups de todos os dados são fundamentais em caso de falha catastrófica.

    
por 28.09.2018 / 18:53
0

Como diz o @BrianRedbeard, há uma ferramenta para isso ( cryptsetup-reencrypt ). Leia a documentação relacionada com cuidado. Esta é uma operação perigosa. (A conversão de dados no local é sempre. Um passo errado e ele fica em chamas.)

Apenas por diversão, o processo manual:

Na verdade, é bem simples (e não funciona dessa maneira na outra direção!). Você pode simplesmente copiá-lo assim:

pv < /dev/mapper/cryptsdx1 > /dev/sdx1

Mas como estamos lendo e gravando no mesmo dispositivo físico, pode ser mais rápido fazer com dd e um tamanho grande de blocos (desde que você tenha muita RAM). Em um HDD, isso provavelmente é mais rápido, já que faz menos buscas, e as buscas são lentas.

dd status=progress bs=1G iflag=fullblock if=/dev/mapper/cryptsdx1 of=/dev/sdx1

Mas primeiro, você deve fazer o backup do seu cabeçalho LUKS, já que o cabeçalho LUKS é a primeira coisa que você irá sobrescrever nesse processo, e você não poderá continuar mesmo que queira.

cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file myluksheader.backup

E certifique-se de manter esse backup seguro, não apenas na RAM de um ambiente LiveCD.

O dispositivo LUKS basicamente é assim:

| LUKS HEADER | ENCRYPTED DATA |

e depois do pv / dd, deve ficar assim:

| DECRYPTED DATA | FREE SPACE |

Portanto, o cabeçalho LUKS está no início do dispositivo e tem cerca de 2 MiB de tamanho (costumava ser 1 MiB mais alguns setores). E como estamos nos livrando dele, haverá espaço livre no final do dispositivo, e você poderá aumentar o sistema de arquivos em 2MiB. Wheee!

Os dados em si são, portanto, encontrados em um deslocamento (geralmente de 2 MiB, verifique com cryptsetup luksDump ). Esse deslocamento é importante aqui - significa que os dados não apenas precisam ser descriptografados, mas também deslocados - o início da descriptografia aparecerá onde originalmente o cabeçalho LUKS estava armazenado.

Isso também significa que, durante todo o processo, haverá uma região sobreposta que existe em formulários descriptografados e criptografados. Isso é útil caso a máquina falhe e você tenha que encontrar o ponto de retorno.

Então, o que fazer em caso de falha?

Primeiro você tem que recriar o dispositivo crypt usando o backup:

cryptsetup --header myluksheader.backup luksOpen /dev/sdx1 cryptsdx1

Em seguida, encontre o ponto de sobreposição:

skip=0 # or skip=X if you're sure at least X bytes were copied
step=$((1024*1024)) # 1MiB, use 512KiB for old 1MiB headers (offset / 2)
while ! cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip
do
    skip=$(($skip+$step))
done

cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip && echo $skip || echo fail

Por fim, retome:

dd status=progress bs=1G iflag=fullblock,skip_bytes oflag=seek_bytes \
   skip=$skip seek=$skip if=/dev/mapper/cryptsdx1 of=/dev/sdx1

Antes de usar qualquer um dos métodos em seu sistema de arquivos real, vale a pena executar uma prática em uma partição não relacionada (ou mesmo apenas em um dispositivo de loop) apenas para garantir que ela ainda funcione.

Por exemplo, eu não levei em conta o novo formato LUKS2, que em sua forma básica funciona da mesma maneira (cabeçalho 4MiB), mas suporta coisas estranhas como múltiplos segmentos de dados e outros. Então, se você estiver usando esses recursos, é um pouco mais complicado (e eu não acho que cryptsetup-reencrypt cobre isso ainda).

    
por 28.09.2018 / 20:08