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 -