それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Raspberry pi を dm-crypt(LUKS) にして暗号化する。(その2構成実践)

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

参考資料