ループバックデバイスを使用せずにループバックイメージを暗号化

ループバックデバイスを使用せずにループバックイメージを暗号化

私は組み込み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

したがって、明確にすると、ルートにならずに暗号化されたインストール可能イメージファイルをどのように生成しますか?

私が新しい方法を試している場合、またはこの問題に対する他の実証済みの解決策がある場合は、いつでもコメントを残してください。より良い解決策がありますが、暗号化の問題を解決するコマンドにはまだ興味があります。


編集:指摘したように、cryptoloopは安全ではありません。http://lwn.net/Articles/67216/。したがって、他の解決策を見つけることもできます。 utilを見つけaespipeたのに使えるかもしれませんね。


編集2:LinuxカーネルのAESモジュールのソースコードを調べたところ、おそらく問題を引き起こすのはパスワードのハッシュであるという結論に達しました。 AESモジュールはすべてaespipeAES-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 -

答え1

cryptloopのセキュリティは脆弱ですが、これ

ユーザーモードFSコンストラクタを使用できます(例:buildroot geneext2fs.shやandroid make_ext4fs)。 aespipeツールと一緒に使用すると、root / superuser権限なしでホストに暗号化されたイメージを作成できます。

ただし、Lostupをパッチする必要があります(少なくともインストールする必要があります)。ループaesそして、ターゲットの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

答え2

Linuxの事実上、標準のディスク暗号化サブシステムであるdmcryptを使用してください。

開発者コンピュータからインストールクリプトのインストールそして構成するroot以外のユーザーとしてインストールできます。に入らなければならないので面倒です/etc/cryptmount/cmtab

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

インストールとアンインストール:

cryptmount -m upgrade
cryptmount -u upgrade

または、開発者がcryptsetupパスワードなしで実行できるようにsudoルールを設定します。losetup

Cmnd_Alias CryptLoop = cryptsetup luksOpen * *, cryptsetup remove *, losetup * *
bob ALL=(ALL) NOPASSWD: CryptLoop

答え3

私が正確に覚えている場合、セキュリティ上の問題のためにdmcryptを好むことによって暗号化のサポートがmount削除されました。そのため、暗号化なしで使用し、その上にDM暗号化デバイスを設置する必要があるとしますlosetuplosetup

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

そしてcryptfile.img暗号化があります。 (復号化されたデバイスを取り付けた後)を繰り返し展開して使用可能にすることができますlosetupcryptsetup

cryptsetupデフォルトを変更したときに問題が発生しないように、通話などに使用するパスワードを追加できます。または代わりにLUKSを使用してください。ただし、この場合、暗号化されたファイルはプレーンテキスト画像よりわずかに大きくなければなりません(5MiBで十分です)。ファイルシステムはデバイスよりわずかに小さいかもしれませんが、これは重要ではありません。

関連情報