LINUX.ORG.RU

LiveUSB с зашифрованной корневой ФС

 , , , ,


0

2

Пытаюсь сделать загрузочный образ с ubuntu 18.04:

# 0_debootstrap.sh
rm -rf rootfs
arch="amd64"
hostname="custom"
mirror="http://ru.archive.ubuntu.com/ubuntu/"
suite="bionic"
variant="minbase"
components="main,universe,restricted,multiverse"
include="linux-image-4.15.0-20-generic, live-boot, dropbear, cryptsetup, systemd-sysv"
debootstrap  --merged-usr --cache-dir=`(pwd)`/cache --arch="$arch" --include="$include" --components="$components" --variant="$variant" "$suite"  rootfs "$mirror"
echo "$hostname" > rootfs/etc/hostname
echo "Setting root passwd"

echo "CRYPTSETUP=y" > rootfs/etc/cryptsetup-initramfs/conf-hook
chroot rootfs /bin/bash -c "echo -e 'zaq1xsw2\nzaq1xsw2\n' | passwd root"
#разрешить ssh в initrd по паролю
sed -i 's/local flags=\"Fs\"/local flags=\"F\"/' rootfs/usr/share/initramfs-tools/scripts/init-premount/dropbear
#скопировать рутовый пароль в initramfs
cp passwd_hook.sh rootfs/etc/initramfs-tools/hooks/

chroot rootfs /bin/bash -c "update-initramfs -u"
rm -rf image
mkdir -p image/{live,isolinux}
mksquashfs rootfs image/live/filesystem.squashfs  -e boot
#password_hook.sh  chmod +x password_hook.sh
#!/bin/sh

PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
	prereqs)
		prereqs
		exit 0
	;;
esac

grep -e root /etc/shadow > ${DESTDIR}/etc/shadow

#создание криптоконтейнера
rm crypt.img
size=`du  --block-size=512 image/live/filesystem.squashfs |  awk '{print $1}'`
dd if=/dev/zero of=crypt.img bs=512 count=1 seek=$(($size+10320))
loopdev=`losetup -f`
losetup $loopdev crypt.img
echo -n "mypass" |  cryptsetup -q luksFormat $loopdev -
echo -n "mypass" |  cryptsetup -q luksOpen $loopdev crypt
dd if=image/live/filesystem.squashfs of=/dev/mapper/crypt bs=512
# mkdir /mnt/crypt
# mount /dev/mapper/crypt /mnt/crypt
# umount /mnt/crypt
# rmdir /mnt/crypt
cryptsetup luksClose crypt
losetup -d $loopdev
mv crypt.img image/live/filesystem.squashfs
#Генерация загрузочного образа
mkdir -p image/live image/isolinux
rm live.iso
echo "prompt 0
DEFAULT Custom
menu title Boot Menu
timeout 300

label Custom
menu label ^Custom
menu default
kernel /live/vmlinuz
append initrd=/live/initrd ipv6.disable=1 net.ifnames=0 biosdevname=0 ip=192.168.0.192::192.168.0.1:255.255.255.0::eth0:none boot=live" > image/isolinux/isolinux.cfg
cp rootfs/boot/vmlinuz* image/live/vmlinuz
cp rootfs/boot/initrd* image/live/initrd
cp /usr/lib/ISOLINUX/isolinux.bin image/isolinux/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32  image/isolinux/

xorriso -as mkisofs -r -J -joliet-long -l -cache-inodes \
-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 \
-A "ISO"  \
-b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table \
-o live.iso image

Гружусь в созданный образ, загрузка доходит до монтирования fs и останавливается. Так и планируется. Заходим по ssh и монтируем:

loopdev=`losetup -f`
losetup $loopdev /live/medium/live/filesystem.squashfs
cryptsetup luksOpen $loopdev crypt
# тут вводим пароль
mkdir /newroot
mount /dev/mapper/crypt /newroot
mount --move /sys /newroot/sys
mount --move /proc/newroot/proc
mount --move /dev/newroot/dev
exec switch_root /newroot /sbin/init

После switch_root получаю kernel panic! Без шифрования всё работает. Хочу спрятать корень от посторонних глаз (система на флешке, могут ведь и конфиги посмотреть да и другого чего вытащить).

UPD: https://github.com/CrazyAlex25/CryptLiveUSB

могут ведь и конфиги посмотреть

Ой вэй, какой ужас. По делу: тебе нужна самодельная initramfs, скорее всего. С нужными утилитами, модулем FS и т.д.

Meyer ★★★★ ()
Последнее исправление: Meyer (всего исправлений: 1)

А ты выкинь из уравнения squashfs, а еще лучше весь свой скрипт целиком.

Берешь установщик, устанавливаешь, готово.

Если захочется автоматизировать, берешь гайд по автоматизации установщика, автоматизируешь, готово.

t184256 ★★★★★ ()
Ответ на: комментарий от CrazyAlex25
  1. устанавливаешь как на HDD

  2. грузишься как с HDD

  3. раскидываешь образ с помощью dd на USB\HDD, или

  4. сразу прожигаешь на диск.

расскажи, какой из этих шагов «с установщиком сложнее сделать». пойми, теряешь ты только в сжатии (в уровне, если юзаешь btrfs) и в геморрое

t184256 ★★★★★ ()
Ответ на: комментарий от t184256

При установке он прописывает диски по UUID. Как изменить это поведение я незнаю. Сейчас же я понял на каком моменте ядро в панику уходит.

cryptsetup (disk): set up successfully
Running /scripts/init-bottom
# тут всё done
run-init: /sbin/init no such file or directory
run-init: /etc/init no such file or directory
run-init: /bin/init no such file or directory

# тут передаётся управление
[8.877379] Invalid argument reading file caps for /bin/sh
[8.877379] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100
....

Видимо на каком-то этапе все носители размонтируются, или изменяется точка монтирования. По коду за это отвечают скрипты live-boot. Пока изучаю что они выполняют и в каком порядке.

CrazyAlex25 ★★ ()
Последнее исправление: CrazyAlex25 (всего исправлений: 1)
Ответ на: комментарий от CrazyAlex25

Если избавиться от live=boot (в загрузчике поменять boot=local), добавить хук rootfs/etc/initramfs-tools/local-premount/00_test.sh

...
mount /dev/mapper/disk /root
То система грузиться, но половина сервисов не может стартануть, тк корень весь в ro. Как сделать так же, как в случае с live-boot, когда система стартует с ro, но выглядит как rw?

CrazyAlex25 ★★ ()
Последнее исправление: CrazyAlex25 (всего исправлений: 1)

Тема решена!

  • Выкинул скрипты live=boot, из 0_debootstrap.sh убрал установку live-boot
  • Добавил скрипт в etc/initramfs-tools/scripts/local-bottom/overlay.sh
#!/bin/sh
prepreqs()
{
echo ""
}
case $1 in
prereqs)
   prereqs
   exit 0
;;
esc
mkdir /run/lower
mkdir /run/upper
mkdir /run/work
mount /dev/mapper/disk /run/lower
mount -t overlay -o lowerdir=/run/lower,upperdir=/run/upper,workdir=/run/work none /root

Все! Теперь есть шифрованный образ, с разблокировкой по ssh.

CrazyAlex25 ★★ ()
Последнее исправление: CrazyAlex25 (всего исправлений: 1)