LVM で起動することも出来た。
ext4 on dm-crypt で起動するようにする。 raspberry pi だからといって、特殊なことは何もない。通常通りのUSBメモリへOSインストール手順と、ほとんど同じ。
USBメモリを突っ込んでおく。
USBメモリは以前にGPT実験でつかったのでパーティションがそのままあるので流用。
sudo sgdisk -p /dev/sdb Number Start (sector) End (sector) Size Code Name 1 2048 1050623 512.0 MiB 0700 Microsoft basic data 2 1050624 250069646 118.7 GiB 8300 Linux
luks でフォーマットする。
sudo cryptsetup luksFormat /dev/sdb2 -- format options sudo cryptsetup luksOpen /dev/sdb2 crypt sudo cryptsetup config /dev/sdb2 --label root-crypt
パフォーマンスに差が出るので、暗号化がアルゴリズムを予め決めておく。
sudo cryptsetup luksFormat \ --type luks2 \ --cipher xchacha20,aes-adiantum-plain64 \ --hash sha256 --iter-time 5000 \ -s 256 --pbkdf argon2i \ /dev/sdb2
xchacha12,aes-adiantum-plain64
もあるけど、xchacha20,aes-adiantum-plain64
でいいと思います。
ブート用のパーティションを用意する。
sudo mkfs.vfat /dev/sdb1
MicroSDの内容をUSBへ移動する。
sudo mount /dev/mapper/crypted /mnt sudo rsync -av --progress --one-file-system / /mnt
boot の内容を移動する。
sudo mount /dev/sdb1 /mnt/boot/firmware sudo rsync -av --progress --one-file-system /boot/firmware/ /mnt/boot/firmware/
わたしは、raspi-ubuntu(arm64) を使っているので、boot/firmware/
raspi3 / raspbian だと異なるかもしれない。
lvm on dm-crypt なので、crypttab fstab を変更する必要がある。
## ディスクのUUIDの確認 3つのコマンドのどれかで調べる。 lsblk -f blkid ls -l /dev/disk/by-uuid/
crypttab / fstab を書き換える。
UUIDを確認する。
sudo lsblk -f
現在の状態。
sdb ├─sdb1 vfat FAT32 system-boot FE3C-0011 └─sdb2 crypto_LUKS 2 root-crypted xxx-b2ed-xxxx └─crypt ext4 1.0 writable 406d-8c6c-xxxx
crypttab を確認
cat /mnt/etc/crypttab # <target name> <source device> <key file> <options> # 2023-02-03 crypt UUID="xxx-xxxx-xxxx-xxxx-xxxx" none luks,initramfs
fstab を確認
cat /mnt/etc/fstab LABEL=writable / ext4 discard,errors=remount-ro,commit=240 0 1 LABEL=system-boot /boot/firmware vfat defaults 0 1 /swap.img none swap sw 0 0
fstab はLABELなので、そのままでも問題なさそう。
cmdline.txt を編集
root=LABEL=writable root=/dev/mapper/crypt cryptdevice=UUID=xxxxx-xxxx-xxxx-xxxx-xxxxxxx:crypt
入れたのは、次の項目。
## 実際は1行にかく root=LABEL=writable cryptdevice=UUID=XXXX-XXXX-XXXX-XXXX-XXXXXXXXXX:crypt rootfstype=ext4 ip=192.168.12.240::192.168.12.1:255.255.0.0:raspi-ubuntu:eth0:none
ブートの書き換えのためにchrootに入る。
## デバイスの準備 sudo mount -t proc none /mnt/proc/ sudo mount -t sysfs none /mnt/sys/ sudo mount -o bind /dev /mnt/dev/ sudo mount -o bind /dev/pts /mnt/dev/pts/ ## chroot sudo -E LANG=C chroot /mnt/
必要なパッケージを入れていく。
root@chroot: # apt update root@chroot: # apt install lvm2 busybox cryptsetup dropbear-initramfs root@chroot: # echo "CRYPTSETUP=y" >> /etc/cryptsetup-initramfs/conf-hook
あとは、細かいところを参考資料に従って変えていく。
vim /usr/share/initramfs-tools/hooks/cryptroot sed -i 's/^TIMEOUT=.*/TIMEOUT=100/g' /usr/share/cryptsetup/initramfs/bin/cryptroot-unlock
SSHのホスト鍵をOpenSSHd とDropbear で共通にする。
cat <<EOS > dropbear-hostkey.sh for key_type in {ecdsa,rsa,ed25519} ; do src=/etc/ssh/ssh_host_${key_type}_key tmp=/tmp/$( basename $src) dst=/etc/dropbear/initramfs/dropbear_${key_type}_host_key ## cp "${src}" "${tmp}"; ssh-keygen -p -m PEM -f "${tmp}" dropbearconvert openssh dropbear "${tmp}" "${dst}" done; EOS bash dropbear-hostkey.sh
ログイン可能なユーザのauthorized_keys を登録する
sudo cp /home/takuya/.ssh/authorized_keys //mnt/etc/dropbear/initramfs/authorized_keys
initramfs を再構成する
root@chroot: # update-initramfs -u
特に警告もなく終われば、多分大丈夫
再起動後
USB メモリを差し替えて、起動を確認する。
再起動して確認したら、起動出来た。
sda 8:16 1 14.3G 0 disk ├─sda1 8:17 1 256M 0 part /boot/firmware └─sda2 8:18 1 14.1G 0 part └─crypt 253:3 0 14.1G 0 crypt /
initramfsからブートするする
initramfsで止まったときも、自分で何とかすることができる。
(initramfs) cryptsetup luksOpen /dev/sda3 dm_crypt-0 (initramfs) mount /dev/mapper/vg-lv /root (initramfs) exec swich_root /root /sbin/init
ssh のブートアンロック
ssh のdropbear 経由でのアンロックを試す。
ssh \ -o UserKnownHostsFile=/dev/null \ -o StrictHostKeyChecking=no \ root@192.168.12.122
鍵が同じなってることを確認
ssh root@192.168.12.122
参考資料
- https://gist.github.com/arcezd/c8df7b8a5735c884b927b36c6cc73006
- https://andreashug.medium.com/raspberry-pi-4-with-encrypted-root-partition-lvm-and-remote-unlock-457e680fc8d5
- https://gist.github.com/arcezd/c8df7b8a5735c884b927b36c6cc73006
- https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/
- https://github.com/ViRb3/pi-encrypted-boot-ssh/tree/8044e5036f2218146a6be443f480f289d860944a
- https://askubuntu.com/questions/1287837/luks-disk-encryption-on-raspberry-pi-4-and-ubuntu-desktop-20-10
- https://rr-developer.github.io/LUKS-on-Raspberry-Pi/
- https://www.kali.org/docs/arm/raspberry-pi-with-luks-full-disk-encryption-2/
- https://www.kali.org/docs/arm/raspberry-pi-with-luks-full-disk-encryption/
- https://slide.rabbit-shocker.org/authors/kenhys/osc2021-online-nagoya-lt-20210529/osc2021-online-nagoya-lt.pdf
- https://takuya-1st.hatenablog.jp/entry/2021/11/17/090809
- https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/