web-dev-qa-db-ja.com

Live CDから暗号化されたSquashFSを起動する

起動できますか暗号化されたsquashfs fromlivecd可能であれば、OSを復号化して起動するように提案してください。

ここでは、Squashfsファイルを保護するためにluks暗号化技術を使用していますが、保存されたsquashfsファイルコンテナを復号化できません。

おかげで、

1
Mohan

以下は、既存のUbuntuインストールから暗号化されたブート可能なlivecdを作成する「ワンステップ」bashスクリプトです。 (テスト済み/ Ubuntu 18.10で動作)

基本的に、スクリプトは既存のUbuntuインストールを/ tmp/livecdの一連の作業ディレクトリにコピーします。

  • Chrootを使用してインストールにcasperを追加します
  • Casper-helpersを変更して、暗号化されたsquashfsブート機能を追加します
  • ファイルシステム全体を収容する初期の暗号化されていないsquashfsを作成します
  • ランダムな文字列入力を使用して、新しい暗号化されたsquashfsファイルを事前暗号化します
  • 入力したパスフレーズを使用して、暗号化されたsquashfsファイルをセットアップし、ext4ファイルシステムを作成してから、暗号化されていないsquashfsファイルをコピーします
  • 最後に、暗号化されたブート可能なISO(4GB未満のsquashfsファイル用)またはIMG全体が/tmp/livecd/live-cd.isoまたは/tmp/livecd/live-cd.imgに作成されます

ISO/IMGがマシンまたはVMで起動されると、暗号化されたsquashfsは完全にramに転送され、ユーザーは適切なパスフレーズの入力を求められ、その後、squashfsは暗号化されずにシステムの起動に使用されます。

暗号化されたlivecdの作成中に、既存のUbuntuインストールからコピーされたアイテムを追加/削除するように、rsyncコマンドライン文字列を変更できます。

編集:このスクリプトはiso6990 4GBの制限を超える画像を処理するようになりました。作成されたfilesystem.squashfsファイルが4GBを超える場合、ISOが持っていたのと同じファイルを格納するブート可能なext4イメージであるlive-cd.imgが作成されます。また、スクリプトは、filesystem.squahfsファイルが4GBの制限を下回っているときに、isoまたはimgを作成するかどうかを尋ねます。

livecd.sh:

#!/bin/bash

echo 
echo Setting up /tmp/livecd
echo 
Sudo mkdir -p /tmp/livecd/cd/{casper,boot/grub} /tmp/livecd/chroot/rootfs /tmp/livecd/mnt

echo 
echo Installing necessary packages
echo 
Sudo apt-get update
Sudo apt-get install -y grub2 xorriso squashfs-tools cryptsetup

echo 
echo Copying over existing system
echo 
Sudo rsync -av --one-file-system --exclude=/swapfile --exclude=/proc/* --exclude=/dev/* \
--exclude=/sys/* --exclude=/tmp/* --exclude=/lost+found \
--exclude=/var/tmp/* --exclude=/boot/grub/* --exclude=/root/* \
--exclude=/var/mail/* --exclude=/var/spool/* --exclude=/media/* \
--exclude=/etc/fstab --exclude=/etc/mtab --exclude=/etc/hosts \
--exclude=/etc/timezone \
--exclude=/etc/X11/xorg.conf* --exclude=/etc/gdm/custom.conf \
--exclude=/etc/lightdm/lightdm.conf --exclude=/tmp/livecd/chroot/rootfs / /tmp/livecd/chroot/rootfs

echo 
echo Setting up links to chroot
echo 
Sudo mount --bind /dev/ /tmp/livecd/chroot/rootfs/dev
Sudo mount -t proc proc /tmp/livecd/chroot/rootfs/proc
Sudo mount -t sysfs sysfs /tmp/livecd/chroot/rootfs/sys
Sudo mount -o bind /run /tmp/livecd/chroot/rootfs/run

echo 
echo Processing chroot commands
echo 
cat <<'ABC' | Sudo chroot /tmp/livecd/chroot/rootfs /bin/bash
LANG=
apt-get update
apt-get install -y casper lupin-casper
cat >> /etc/cryptsetup-initramfs/conf-hook <<'DEF'
CRYPTSETUP=Y
DEF
patch -d /usr/share/initramfs-tools/scripts /usr/share/initramfs-tools/scripts/casper-helpers <<'GHI'
@@ -141,6 +141,13 @@
                 losetup -o "$offset" "$dev" "$fspath"
             else
                 losetup "$dev" "$fspath"
+                modprobe dm-crypt
+                mkdir /mnt
+                echo "Enter passphrase: " >&6
+                cryptsetup --type plain -c aes-xts-plain64 -h sha512 -s 512 open "$dev" squash >&6
+                mount -t ext4 /dev/mapper/squash /mnt
+                dev="$(losetup -f)"
+                losetup "$dev" /mnt/filesystem.squashfs
             fi
             echo "$dev"
             return 0
GHI
depmod -a $(uname -r)
update-initramfs -u -k $(uname -r)
apt autoremove
apt clean
find /var/log -regex '.*?[0-9].*?' -exec rm -v {} \;
find /var/log -type f | while read file
do
        cat /dev/null | tee $file
done
rm /etc/resolv.conf /etc/hostname
exit
ABC

echo 
echo Copying chroot images to livecd
echo 
export kversion=`cd /tmp/livecd/chroot/rootfs/boot && ls -1 vmlinuz-* | tail -1 | sed 's@vmlinuz-@@'`
Sudo cp -vp /tmp/livecd/chroot/rootfs/boot/vmlinuz-${kversion} /tmp/livecd/cd/casper/vmlinuz
Sudo cp -vp /tmp/livecd/chroot/rootfs/boot/initrd.img-${kversion} /tmp/livecd/cd/casper/initrd.img
Sudo cp -vp /tmp/livecd/chroot/rootfs/boot/memtest86+.bin /tmp/livecd/cd/boot

echo 
echo Removing chroot links
echo 
Sudo umount /tmp/livecd/chroot/rootfs/proc
Sudo umount /tmp/livecd/chroot/rootfs/sys
Sudo umount /tmp/livecd/chroot/rootfs/dev

echo 
echo Creating the squashfs file
echo 
Sudo mksquashfs /tmp/livecd/chroot/rootfs /tmp/livecd/filesystem.squashfs -noappend

echo 
echo Setting up encrypted squashfs file
echo 
size=$(du --block-size=1 /tmp/livecd/filesystem.squashfs | awk '{print $1}')
((size=size+size/10))
((size=size/1024))
echo $size
Sudo dd if=/dev/zero of=/tmp/livecd/cd/casper/filesystem.squashfs bs=1024 count=$size status=progress
dev="$(losetup -f)"
Sudo losetup "$dev" /tmp/livecd/cd/casper/filesystem.squashfs

echo 
echo Enter a large string of random text below to setup the pre-encryption.
echo 
Sudo cryptsetup --type plain -c aes-xts-plain64 -h sha512 -s 512 open "$dev" squash

echo 
echo Pre-encrypting entire squshfs with random data
echo 
Sudo dd if=/dev/zero of=/dev/mapper/squash bs=1M status=progress
sync
sync
sync
sync
Sudo cryptsetup close squash

echo 
echo Enter the desired passphrase for the encrypted livecd below.
echo 
Sudo cryptsetup --type plain -c aes-xts-plain64 -h sha512 -s 512 open "$dev" squash

echo 
echo Creating ext4 into encrypted container
echo 
Sudo mkfs.ext4 -m 0 /dev/mapper/squash
Sudo mount -t ext4 /dev/mapper/squash /tmp/livecd/mnt

echo 
echo Moving unencrypted squashfs file into encrypted sqaushfs container
echo 
Sudo mv /tmp/livecd/filesystem.squashfs /tmp/livecd/mnt
sync
sync
sync
sync
Sudo umount /tmp/livecd/mnt
Sudo cryptsetup close squash
Sudo losetup -d "$dev"

echo 
echo Creating size and md5sum cd files
echo 
echo -n $(Sudo du -s --block-size=1 /tmp/livecd/chroot/rootfs | tail -1 | awk '{print $1}') | Sudo tee /tmp/livecd/cd/casper/filesystem.size
find /tmp/livecd/cd -type f -print0 | Sudo xargs -0 md5sum | sed "s@/tmp/livecd/cd@.@" | grep -v md5sum.txt | Sudo tee -a /tmp/livecd/cd/md5sum.txt

echo 
echo Creating grub.cfg for the livecd
echo 
Sudo bash -c 'cat > /tmp/livecd/cd/boot/grub/grub.cfg <<EOF
set default="0"
set timeout=10

menuentry "Ubuntu GUI from RAM" {
linux /casper/vmlinuz boot=casper toram quiet
initrd /casper/initrd.img
}

EOF'

filesize=$(Sudo du --block-size=1 -s /tmp/livecd/cd/casper/filesystem.squashfs | tail -1 | awk '{print $1}')

echo "filesystem.squashfs size: $filesize"

devflag=0

if [ $filesize -lt 4294967295 ]
then
    echo
    echo filesystem.squashfs is under the 4GB iso6990 limit
    echo
    echo "Create a bootable iso or bootable device img for (usb, hd)?"
    select yn in "iso" "dev"; do
        case $yn in
        iso )   echo;
            echo Creating bootable ISO at /tmp/livecd for the now encrypted livecd;
            echo;
            Sudo grub-mkrescue -o /tmp/livecd/live-cd.iso /tmp/livecd/cd;
            echo
            echo COMPLETE!
            echo
            break;;
        dev )   devflag=1;
            break;;
        esac
    done
else
    devflag=1
fi

if [ $devflag -eq 1 ]
then
    echo
    echo Setting up /tmp/livecd/live-cd.img
    echo
    filesize=$(Sudo du -s --block-size=1 /tmp/livecd/cd | tail -1 | awk '{print $1}')
    ((filesize=filesize+filesize/10))
    ((filesize=filesize/1024))
    Sudo dd if=/dev/zero of=/tmp/livecd/live-cd.img bs=1024 count=$filesize status=progress
    dev="$(losetup -f)"
    Sudo losetup $dev /tmp/livecd/live-cd.img
    echo
    echo Formating /tmp/livecd/live-cd.img to ext4
    echo
    Sudo mkfs.ext4 -m 0 $dev
    echo
    echo Installing grub and copying live system files
    echo
    Sudo mount -t ext4 $dev /tmp/livecd/mnt
    Sudo grub-install --no-floppy --force --root-directory=/tmp/livecd/mnt $dev
    Sudo rsync -av --one-file-system /tmp/livecd/cd/ /tmp/livecd/mnt
    sync
    sync
    sync
    sync
    Sudo umount /tmp/livecd/mnt
    Sudo losetup -d $dev
    echo
    echo COMPLETE!
    echo live-cd.img can now be written to a usb or hard drive using dd or similar
    echo
fi
1
live.cd