組み込み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/ を参照してください。だから私はおそらく別の解決策も探し回るでしょう。 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の弱いセキュリティを軽視します。
ユーザーモードFS作成者:buildrootgenext2fs.shまたはAndroid make_ext4fs。を、root /スーパーユーザーなしで暗号化されたイメージをホストで作成するためのaespipeツールと組み合わせて使用できます特権。
ただし、このような暗号化されたイメージを直接マウントできるようにするには、losetup(少なくともまたはmount)に loop-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
Dmcryptを使用してください。これはLinuxの事実上の標準ディスク暗号化サブシステムです。
開発者のマシンでは、 cryptmount および configure it をインストールして、root以外のユーザーとしてマウントできるようにします。 /etc/cryptmount/cmtab
でイメージ(およびマウントポイント)へのパスをハードコーディングする必要があるため、これは面倒です。
upgrade {
keyformat=luks
dev=/home/bob/upgrade/image.enc
dir=/mnt/upgrade
}
マウントおよびアンマウントするには:
cryptmount -m upgrade
cryptmount -u upgrade
または、開発者がパスワードなしでcryptsetup
およびlosetup
を実行できるようにSudoルールを設定します。
Cmnd_Alias CryptLoop = cryptsetup luksOpen * *, cryptsetup remove *, losetup * *
bob ALL=(ALL) NOPASSWD: CryptLoop
私の記憶が正しければ、暗号化のサポートはmount
/losetup
から削除され、セキュリティ上の理由からdmcryptが優先されます。したがって、暗号化せずにlosetup
を使用し、その上にDM暗号デバイスを配置する必要があると想定します。
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
は暗号化されています。 losetup
とcryptsetup
を繰り返すことで、配布して利用できるようにすることができます(その後、復号化されたデバイスをマウントします)。
デフォルトの変更による問題を回避するために、使用する暗号(など)をcryptsetup
呼び出しに追加できます。または、代わりにLUKSを使用してください。ただし、その場合、暗号化されたファイルはクリアテキスト画像よりも少し大きくする必要があります(5 MiBで十分です)。ファイルシステムがおそらくデバイスよりも少し小さいことは問題ではありません。