Raspberry Piでネットワーク構築/ルートファイルシステム暗号化

提供: Medeshima wiki
ナビゲーションに移動 検索に移動

概要

ルートファイルシステムを暗号化する。Raspberry Piで暗号化設定を行った後、PCで実際の暗号化を行う。

ハードウェア Raspberry Pi 4 Model B
ストレージ USB接続のSSD
OS Raspberry Pi OS (Debian version: 11 (bullseye))

ストレージのベンチマーク

ハードウェアAESがないため、処理速度が遅くなる。

$ sudo hdparm -t /dev/mapper/crypt

ストレージのベンチマーク
デバイス 速度 [MB/s]
/dev/mapper/crypt 94.41
/dev/sda2 293.22

事前設定

ストレージにRaspberry Pi OSをインストールする。

Raspberry Piでの作業

ソフトウェアを更新する。

$ sudo apt update
$ sudo apt upgrade

必要なソフトウェアをインストールする。

$ sudo apt install cryptsetup

PCでの作業

必要に応じて、データをバックアップする。

$ sudo cp -a /dev/BOOT/* boot
$ sudo cp -a /dev/ROOT/* root

BOOT Raspberry Piのブート
ROOT Raspberry Piのルート

暗号化設定

Raspberry Piでの作業

以下の順に、それぞれ変更を加える。

/boot/cmdline.txt

rootパラメータを次のように書き換える。

root=/dev/mapper/crypt cryptdevice=/dev/sda2:crypt

変更後

console=serial0,115200 console=tty1 root=/dev/mapper/crypt cryptdevice=/dev/sda2:crypt rootfstype=ext4 fsck.repair=yes rootwait

/etc/fstab

ルートファイルシステムを次のように書き換える。

/dev/mapper/crypt  /               ext4    defaults  0       1

/etc/crypttab

次の設定を追加する。

crypt   /dev/sda2 none luks,discard,initramfs

initramfs作成

initramfsを作成する。以下のエラーメッセージが出る。

$ sudo update-initramfs -c -k `uname -r`
update-initramfs: Generating /boot/initrd.img-5.10.92-v7l+
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8156b-2.fw for built-in driver r8152
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8156a-2.fw for built-in driver r8152
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8153c-1.fw for built-in driver r8152
cryptsetup: ERROR: Couldn't resolve device /dev/root
cryptsetup: WARNING: Couldn't determine root device
cryptsetup: ERROR: crypt: Source mismatch
device-mapper: table ioctl on crypt  failed: No such device or address
Command failed.
cryptsetup: WARNING: Couldn't determine cipher modules to load for crypt
W: Couldn't identify type of root file system for fsck hook

Raspberry Pi 4 32bit v7l+
Raspberry Pi 4 64bit v8+

暗号モジュールが組み込まれているか確認する。

$ lsinitramfs /boot/initrd.img-5.10.92-v7l+ | grep crypt

/boot/config.txt

次の設定を最後に追加する。

initramfs initrd.img-RELEASE followkernel

RELEASE カーネルリリース番号

initramfs initrd.img-5.10.92-v7l+ followkernel

※起動メッセージが途中で表示されなくなる場合

vc4-kms-v3dを無効にする。

# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d

カーネル更新後の対応

カーネルが更新された場合、initramfsを作り直す必要がある。

  • /etc/default/raspberrypi-kernel
INITRD=Yes

  • /etc/kernel/postinst.d/initramfs-tools

/boot/config.txtを書き換えるため、次の処理を最後に追加する。

※カーネル更新後、再起動せずに再度カーネルを更新した場合、書き換えられないことに注意

※行を削除して、再度挿入するようにした方がよい

# /boot/config.txt
current_release=$(uname -r)
sed -i "/^initramfs /{s/${current_release%-*}/${version%+}/}" "${bootdir}/config.txt"

変数versionには、次のような値が設定される。

5.15.32+
5.15.32-v7+
5.15.32-v7l+
5.15.32-v8+

ストレージのファイルシステムを暗号化

Raspberry Piのルートファイルシステムをバックアップし、ストレージを暗号化した後にコピーする。

PCでの作業

ルートファイルシステムのバックアップ

$ sudo cp -a ROOT/* root

ROOT Raspberry Piのルート

ファイルシステムを暗号化し、ルートファイルシステムをコピー

$ sudo cryptsetup luksFormat /dev/SDX
$ sudo cryptsetup luksOpen /dev/SDX crypt
$ sudo mkfs.ext4 /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt crypt
$ sudo cp -a ROOT/* crypt
$ sudo umount /dev/mapper/crypt
$ sudo cryptsetup close crypt

SDX Raspberry Piのルートデバイス名
ROOT コピーしておいた、Raspberry Piのルートファイル

補足

有線LAN経由でLUKS暗号を解錠

概要

次の表のとおりである。

SSHサーバ dropbear

Raspberry Piでの作業

$ sudo apt install dropbear

次のファイルを作成する。

  • /etc/dropbear-initramfs/authorized_keys
  • /boot/cmdline.txt
ip=192.168.0.55::192.168.0.1:255.255.255.0::eth0:none

$ sudo update-initramfs -u
ln: '/boot/initrd.img-5.15.32-v8+.dpkg-bak' から '/boot/initrd.img-5.15.32-v8+' へのハードリンクの作成に失敗しました: 許可されていない操作です
update-initramfs: Generating /boot/initrd.img-5.15.32-v8+
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8156b-2.fw for built-in driver r8152
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8156a-2.fw for built-in driver r8152
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8153c-1.fw for built-in driver r8152

PCでの作業

Raspberry Piが起動し、IPアドレスが設定されたら、次のコマンドを実行する。

$ ssh root@192.168.0.55
# cryptroot-unlock

参考: Debian(PC)の場合

$ sudo update-initramfs -u

  • /etc/default/grub
GRUB_CMDLINE_LINUX="ip=192.168.0.55::192.168.0.1:255.255.255.0::enp37s0:none"

$ sudo update-grub