Criptografando imagens de loopback sem usar um dispositivo de loopback

3

Estou tentando projetar um sistema de atualização de firmware para um sistema Linux embarcado. Meu plano é enviar uma imagem que possa ser montada no sistema de destino, para que eu não precise descompactar o arquivo inteiro. Eu também quero criptografar a imagem e, opcionalmente, compactá-lo também. Como o sistema de criação para criar essa imagem será implantado em vários computadores, também quero que o sistema de compilação exija uma quantidade mínima de configuração, ou seja, evite evitar privilégios de root.

Eu criei um modelo de trabalho onde montei um arquivo de imagem usando losetup como tal:

dd if=/dev/zero of=image_file bs=1M count=10
losetup -e aes loop0 image_file
mkfs.ext2 /dev/loop0
losetup -d loop0
mount -t ext2 -o loop,encryption=aes image_file some_working_folder/
# Add files to some_working_folder
umount some_working_folder
# Send encrypted image to the target system

Agora, já que isso é um pouco difícil de configurar em algumas máquinas e eu quero evitar a criação de imagens de tamanho fixo. Então, quero substituir os comandos losetup por outra coisa. Eu encontrei o comando virt-make-fs , que pode criar uma imagem montável com o sistema de arquivos ext2 . Então agora eu só preciso criptografar o arquivo de imagem de uma forma que é decifrável pelo kernel do Linux. Eu tentei usar o OpenSSL, mas não consegui encontrar o algoritmo correto, ou talvez esteja faltando alguma coisa. Alguém sabe como fazer isto? Basicamente quero algo como o script abaixo.

tar -cf archive.tar some files
virt-make-fs archive.tar image.ext2
# the below command need to be fixed/replaced
openssl enc -aes192 -in image.ext2 -out image.ext2.aes

No sistema de destino, quero poder usar o seguinte comando ou, pelo menos, algo semelhante.

# The next command should be done on the target
mount -t ext2 -o loop,encryption=aes image.ext2.aes /mnt/upgrade
# work with files in /mnt/upgrade

Então, apenas para esclarecer: Como posso criar um arquivo de imagem montável criptografado sem ser root?

Sinta-se à vontade para comentar se estou tentando reinventar a roda ou se há outra solução bem estabelecida para esse problema. Embora existam soluções melhores, ainda estou interessado no comando para resolver o problema de criptografia.

Edit: Como foi apontado, o cryptoloop não é seguro, veja link . Então provavelmente vou procurar outra solução também. Eu encontrei o util aespipe , que eu posso usar.

Editar 2: Eu pesquisei o código-fonte no módulo AES do kernel do Linux e concluí que é provavelmente o hash da senha que está causando o problema. O aespipe e o módulo AES estão usando uma criptografia AES-256-CBC. Tanto quanto eu posso ver o kernel linux usa a senha dada como chave, e aespipe hashes a senha de entrada. Como a parte "no root" é muito importante para mim, comecei a procurar outras soluções, e meu plano atual é usar algo como o seguinte no computador de desenvolvimento:

tar -cf - file0 file1 ... | gzip -c | aespipe -e aes256 > arhive_file

E, em seguida, na execução do sistema de destino

rm -rf /tmp/update ; mkdir -p /tmp/update
aespipe -d -e aes256 < archive.mbl | gzip -cd | tar -C /tmp/update -xf -
    
por Kotte 26.05.2013 / 20:45

3 respostas

1

Desprezando a fraca segurança do cryptloop de acordo com este .

Você pode usar o usermode FS creator como: buildroot genext2fs.sh ou android make_ext4fs. com combinação com a ferramenta aespipe para criação de host de sua imagem criptografada sem privilégios de root / superusuário.

Mas você precisa corrigir o losetup (pelo menos ou montar) com loop-aes e ativar o cryptoloop (como módulo ou builtin) para o kernel Linux do seu destino, para poder montar essa imagem criptografada diretamente.

O seguinte mostra como fazer isso em caso de imagem criptografada do sistema de arquivos ext4 (para ext2 FS você pode simplesmente substituir os 2 primeiros comandos pelo genext2fs.sh [3]):

HOST $ make_ext4fs -s -l 512M -a data yourimage.simg folder/
HOST $ simg2img yourimage.simg yourimage.img
HOST $ cat yourimage.img | aespipe -e aes256 > yourimage.crypt

TARGET # modprobe cryptoloop #in case of cryptoloop as module.
TARGET # losetup.patched -e aes-256 /dev/loop0 yourimage.crypt
TARGET # mount -t ext4 /dev/loop0 /mnt/uncrypt
    
por 13.03.2014 / 13:49
1

Use dmcrypt, é o subsistema padrão de criptografia de disco padrão no Linux.

Em máquinas para desenvolvedores, instale cryptmount e configure-o para permitir a montagem como um usuário não-root. Isso é complicado, pois é necessário codificar o caminho para a imagem (e o ponto de montagem) em /etc/cryptmount/cmtab .

upgrade {
    keyformat=luks
    dev=/home/bob/upgrade/image.enc
    dir=/mnt/upgrade
}

Para montar e desmontar:

cryptmount -m upgrade
cryptmount -u upgrade

Como alternativa, configure as regras sudo para permitir que os desenvolvedores executem cryptsetup e losetup sem uma senha.

Cmnd_Alias CryptLoop = cryptsetup luksOpen * *, cryptsetup remove *, losetup * *
bob ALL=(ALL) NOPASSWD: CryptLoop
    
por 28.05.2013 / 02:00
0

Se bem me lembro, o suporte à criptografia foi removido do mount / losetup para considerações de segurança em favor do dmcrypt. Assim, presumo que você tenha que usar losetup sem criptografia e colocar um dispositivo de criptografia DM sobre ele.

losetup /dev/loop0 /image/clearfile.img
losetup /dev/loop1 /image/cryptfile.img
cryptsetup create cr_loop /dev/loop1
dd if=/dev/loop0 of=/dev/mapper/cr_loop bs=100M

Em seguida, cryptfile.img é criptografado. Você pode distribuí-lo e disponibilizá-lo repetindo losetup e cryptsetup (e montar o dispositivo descriptografado posteriormente).

Você pode adicionar a cifra (e assim por diante) para ser usada na chamada cryptsetup para evitar problemas com os padrões alterados. Ou use LUKS em vez disso. Mas, nesse caso, o arquivo criptografado deve ser um pouco maior que a imagem em texto puro (5 MiB deve ser suficiente); que o sistema de arquivos é provavelmente um pouco menor que o dispositivo, então não importa.

    
por 27.05.2013 / 00:24