linux – 在不使用环回设备的情况下加密环回映像
作者:互联网
我正在尝试为嵌入式Linux系统设计固件更新系统.我的计划是发送一个可以安装在目标系统上的映像,因此我不需要解压缩整个文件.我还想加密图像,也可以选择压缩它.由于用于创建此映像的构建系统将部署在多台计算机上,因此我还希望构建系统需要最少量的设置,即避免避免需要root权限.
我创建了一个工作模型,我使用losetup挂载图像文件:
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
现在,因为在某些机器上设置这有点麻烦,我想避免创建固定大小的图像.所以我想用其他东西替换losetup命令.我找到了命令virt-make-fs,它可以使用ext2文件系统创建一个可安装的映像.所以现在我只需要以linux内核可解密的方式加密图像文件.我试过使用OpenSSL,但我找不到正确的算法,或者我可能遗漏了一些东西.有人知道怎么做这个吗?基本上我想要类似下面的脚本.
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
在目标系统上,我希望能够使用以下命令,或至少类似的东西.
# 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
所以,只是为了澄清:如何在不成为root的情况下创建加密的可安装映像文件?
如果我正在尝试重新发明轮子,或者如果有其他完善的解决方案来解决这个问题,请随意发表评论.即使有更好的解决方案,我仍然对解决加密问题的命令感兴趣.
编辑:正如已经指出的,cryptoloop是不安全的,请参阅http://lwn.net/Articles/67216/.所以我可能会寻找其他解决方案.我发现了util aespipe,我可以使用它.
编辑2:我已经挖掘了Linux内核的AES模块中的源代码,并且我得出结论,可能是导致问题的密码哈希. aespipe和AES模块都使用AES-256-CBC加密.据我所知,linux内核使用给定的密码作为密钥,而aespipe会对传入的密码进行哈希处理.由于“无根”部分对我来说非常重要,我已经开始寻找其他解决方案,而我目前的计划是在开发计算机上使用以下内容:
tar -cf - file0 file1 ... | gzip -c | aespipe -e aes256 > arhive_file
然后在目标系统上运行
rm -rf /tmp/update ; mkdir -p /tmp/update
aespipe -d -e aes256 < archive.mbl | gzip -cd | tar -C /tmp/update -xf -
解决方法:
根据this,对于cryptloop的弱安全性感到沮丧.
您可以使用usermode FS创建者,例如:buildroot genext2fs.sh或android make_ext4fs.
与aespipe工具结合使用,可以在没有root /超级用户权限的情况下主机创建加密映像.
但是你需要使用loop-aes修补losetup(至少或mount)并激活目标Linux内核的cryptoloop(作为模块或内置),以便能够直接安装这样的加密映像.
以下显示了如何在加密的ext4文件系统映像的情况下执行此操作(对于ext2 FS,您只需使用buildroot genext2fs.sh替换前2个命令[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
标签:linux,security,encryption,mount,not-root-user 来源: https://codeday.me/bug/20190815/1659589.html