在不使用環回設備的情況下加密環回圖像
我正在嘗試為嵌入式 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 模組中的原始碼,我得出的結論是,可能是導致問題的密碼散列。和 AES 模組都
aespipe
使用 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 -
儘管據此cryptloop 的安全性較弱。
您可以使用使用者模式 FS 創建器,例如:buildroot genext2fs.sh 或 android make_ext4fs。與 aespipe 工具相結合,無需 root/超級使用者權限即可創建加密圖像的主機。
但是您需要使用loop-aes修補 losttup(至少或掛載)並為目標的 Linux 核心啟動 cryptoloop(作為模組或內置),以便能夠直接掛載此類加密圖像。
以下顯示了在加密 ext4 文件系統映像的情況下如何執行此操作(對於 ext2 FS,您只需將前 2 個命令替換為 buildroot 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