summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2020-04-10 14:41:35 +0200
committerArmin Kuster <akuster808@gmail.com>2020-05-15 05:28:21 -0700
commitd6369c9aafc433b08f9bb000142b274738be3fb3 (patch)
treed62718bfbdf83ad41946f4fca911c358328ddd56
parentb329e1650daa860c7dfdbd771ddff611452c382b (diff)
downloadmeta-security-d6369c9aafc433b08f9bb000142b274738be3fb3.tar.gz
dm-verity: add a working example for BeagleBone Black
This adds various bits and pieces to enable generating a working example of a full chain of trust up to dm-verity-protected rootfs level on Beagle Bone Black. The new initramfs is quite generic and should work for other SoCs as well when using fitImage. The following config can be used with current master poky, meta-openembedded & meta-security to generate a BBB image using verified boot and dm-verity. UBOOT_SIGN_KEYDIR = "/tmp/test-keys/" UBOOT_SIGN_KEYNAME = "dev" UBOOT_SIGN_ENABLE = "1" UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000" UBOOT_MACHINE_beaglebone-yocto = "am335x_boneblack_vboot_config" IMAGE_CLASSES += "dm-verity-img" IMAGE_FSTYPES += "wic.xz ext4" DM_VERITY_IMAGE = "core-image-full-cmdline" DM_VERITY_IMAGE_TYPE = "ext4" KERNEL_CLASSES += "kernel-fitimage" KERNEL_IMAGETYPE_beaglebone-yocto = "fitImage" IMAGE_INSTALL_remove = " kernel-image-zimage" IMAGE_BOOT_FILES_remove = " zImage" IMAGE_BOOT_FILES_append = " fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE};fitImage" # Using systemd is not strictly needed but deals nicely with read-only # filesystem by default. DISTRO_FEATURES_append = " systemd" DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit" VIRTUAL-RUNTIME_init_manager = "systemd" VIRTUAL-RUNTIME_initscripts = "systemd-compat-units" INITRAMFS_IMAGE = "dm-verity-image-initramfs" INITRAMFS_FSTYPES = "cpio.gz" INITRAMFS_IMAGE_BUNDLE = "1" WKS_FILE = "beaglebone-yocto-verity.wks.in" KERNEL_FEATURES_append = " features/device-mapper/dm-verity.scc" Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Armin Kuster <akuster808@gmail.com>
-rw-r--r--recipes-core/images/dm-verity-image-initramfs.bb26
-rw-r--r--recipes-core/initrdscripts/initramfs-dm-verity.bb13
-rw-r--r--recipes-core/initrdscripts/initramfs-dm-verity/init-dm-verity.sh46
-rw-r--r--wic/beaglebone-yocto-verity.wks.in15
4 files changed, 100 insertions, 0 deletions
diff --git a/recipes-core/images/dm-verity-image-initramfs.bb b/recipes-core/images/dm-verity-image-initramfs.bb
new file mode 100644
index 0000000..f9ea376
--- /dev/null
+++ b/recipes-core/images/dm-verity-image-initramfs.bb
@@ -0,0 +1,26 @@
1DESCRIPTION = "Simple initramfs image for mounting the rootfs over the verity device mapper."
2
3# We want a clean, minimal image.
4IMAGE_FEATURES = ""
5
6PACKAGE_INSTALL = " \
7 initramfs-dm-verity \
8 base-files \
9 busybox \
10 util-linux-mount \
11 udev \
12 cryptsetup \
13 lvm2-udevrules \
14"
15
16# Can we somehow inspect reverse dependencies to avoid these variables?
17do_rootfs[depends] += "${DM_VERITY_IMAGE}:do_image_${DM_VERITY_IMAGE_TYPE}"
18
19IMAGE_FSTYPES = "${INITRAMFS_FSTYPES}"
20
21inherit core-image
22
23deploy_verity_hash() {
24 install -D -m 0644 ${DEPLOY_DIR_IMAGE}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.verity.env ${IMAGE_ROOTFS}/${datadir}/dm-verity.env
25}
26ROOTFS_POSTPROCESS_COMMAND += "deploy_verity_hash;"
diff --git a/recipes-core/initrdscripts/initramfs-dm-verity.bb b/recipes-core/initrdscripts/initramfs-dm-verity.bb
new file mode 100644
index 0000000..b614956
--- /dev/null
+++ b/recipes-core/initrdscripts/initramfs-dm-verity.bb
@@ -0,0 +1,13 @@
1SUMMARY = "Simple init script that uses devmapper to mount the rootfs in read-only mode protected by dm-verity"
2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
4
5SRC_URI = "file://init-dm-verity.sh"
6
7do_install() {
8 install -m 0755 ${WORKDIR}/init-dm-verity.sh ${D}/init
9 install -d ${D}/dev
10 mknod -m 622 ${D}/dev/console c 5 1
11}
12
13FILES_${PN} = "/init /dev/console"
diff --git a/recipes-core/initrdscripts/initramfs-dm-verity/init-dm-verity.sh b/recipes-core/initrdscripts/initramfs-dm-verity/init-dm-verity.sh
new file mode 100644
index 0000000..307d2c7
--- /dev/null
+++ b/recipes-core/initrdscripts/initramfs-dm-verity/init-dm-verity.sh
@@ -0,0 +1,46 @@
1#!/bin/sh
2
3PATH=/sbin:/bin:/usr/sbin:/usr/bin
4RDEV=""
5ROOT_DIR="/new_root"
6
7mkdir -p /proc
8mkdir -p /sys
9mkdir -p /run
10mkdir -p /tmp
11mount -t proc proc /proc
12mount -t sysfs sysfs /sys
13mount -t devtmpfs none /dev
14
15udevd --daemon
16udevadm trigger --type=subsystems --action=add
17udevadm trigger --type=devices --action=add
18udevadm settle --timeout=10
19
20for PARAM in $(cat /proc/cmdline); do
21 case $PARAM in
22 root=*)
23 RDEV=${PARAM#root=}
24 ;;
25 esac
26done
27
28if ! [ -b $RDEV ]; then
29 echo "Missing root command line argument!"
30 exit 1
31fi
32
33case $RDEV in
34 UUID=*)
35 RDEV=$(realpath /dev/disk/by-uuid/${RDEV#UUID=})
36 ;;
37esac
38
39. /usr/share/dm-verity.env
40
41echo "Mounting $RDEV over dm-verity as the root filesystem"
42
43veritysetup --data-block-size=1024 --hash-offset=$DATA_SIZE create rootfs $RDEV $RDEV $ROOT_HASH
44mkdir -p $ROOT_DIR
45mount -o ro /dev/mapper/rootfs $ROOT_DIR
46exec switch_root $ROOT_DIR /sbin/init
diff --git a/wic/beaglebone-yocto-verity.wks.in b/wic/beaglebone-yocto-verity.wks.in
new file mode 100644
index 0000000..cd1702e
--- /dev/null
+++ b/wic/beaglebone-yocto-verity.wks.in
@@ -0,0 +1,15 @@
1# SPDX-License-Identifier: MIT
2#
3# Copyright (C) 2020 BayLibre SAS
4# Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
5#
6# A dm-verity variant of the regular wks for beaglebone black. We need to fetch
7# the partition images from the DEPLOY_DIR_IMAGE as the rootfs source plugin will
8# not recreate the exact block device corresponding with the hash tree. We must
9# not alter the label or any other setting on the image.
10#
11# This .wks only works with the dm-verity-img class.
12
13part /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat --label boot --active --align 4 --size 16 --sourceparams="loader=u-boot" --use-uuid
14part / --source rawcopy --ondisk mmcblk0 --sourceparams="file=${DEPLOY_DIR_IMAGE}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.verity"
15bootloader --append="console=ttyS0,115200"