diff options
| -rw-r--r-- | docs/dm-verity.txt | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/docs/dm-verity.txt b/docs/dm-verity.txt new file mode 100644 index 0000000..602a826 --- /dev/null +++ b/docs/dm-verity.txt | |||
| @@ -0,0 +1,114 @@ | |||
| 1 | dm-verity and Yocto/OE | ||
| 2 | ---------------------- | ||
| 3 | The dm-verity feature provides a level of data integrity and resistance to | ||
| 4 | data tampering. It does this by creating a hash for each data block of | ||
| 5 | the underlying device as the base of a hash tree. There are many | ||
| 6 | documents out there to further explain the implementaion, such as the | ||
| 7 | in-kernel one itself: | ||
| 8 | |||
| 9 | https://docs.kernel.org/admin-guide/device-mapper/verity.html | ||
| 10 | |||
| 11 | The goal of this document is not to reproduce that content, but instead to | ||
| 12 | capture the Yocto/OE specifics of the dm-verity infrastructure used here. | ||
| 13 | |||
| 14 | Ideally this should enable a person to build and deploy an image on one of | ||
| 15 | the supported reference platforms, and then further adapt to their own | ||
| 16 | platform and specific storage requirements. | ||
| 17 | |||
| 18 | Basic Settings | ||
| 19 | -------------- | ||
| 20 | Largely everything is driven off of a dm-verity image class; a typical | ||
| 21 | block of non MACHINE specific settings are shown below: | ||
| 22 | |||
| 23 | INITRAMFS_IMAGE = "dm-verity-image-initramfs" | ||
| 24 | DM_VERITY_IMAGE = "core-image-minimal" | ||
| 25 | DM_VERITY_IMAGE_TYPE = "ext4" | ||
| 26 | IMAGE_CLASSES += "dm-verity-img" | ||
| 27 | INITRAMFS_IMAGE_BUNDLE = "1" | ||
| 28 | |||
| 29 | Kernel Configuration | ||
| 30 | -------------------- | ||
| 31 | Kernel configuration for dm-verity happens automatically via IMAGE_CLASSES | ||
| 32 | which will source features/device-mapper/dm-verity.scc when dm-verity-img | ||
| 33 | is used. [See commit d9feafe991c] | ||
| 34 | |||
| 35 | Supported Platforms | ||
| 36 | ------------------- | ||
| 37 | In theory, you can use dm-verity anywhere - there is nothing arch/BSP | ||
| 38 | specific in the core kernel support. However, at the BSP level, one | ||
| 39 | eventually has to decide what device(s) are to be hashed, and where the | ||
| 40 | hash tables are stored. | ||
| 41 | |||
| 42 | To that end, the BSP storage specifics live in meta-security/wic dir and | ||
| 43 | represent the current set of example configurations that have been tested | ||
| 44 | and submitted at some point. | ||
| 45 | |||
| 46 | Getting Started | ||
| 47 | --------------- | ||
| 48 | This document assumes you are starting from the basic auto-created | ||
| 49 | conf/local.conf and conf/bblayers.conf from the oe-init-build-env | ||
| 50 | |||
| 51 | Firstly, you need the meta-security layer to conf/bblayers.conf along with | ||
| 52 | the dependencies it has -- see the top level meta-security README for that. | ||
| 53 | |||
| 54 | Next, assuming you'll be using dm-verity for validation of your rootfs, | ||
| 55 | you'll need to enable read-only rootfs support in your local.conf with: | ||
| 56 | |||
| 57 | EXTRA_IMAGE_FEATURES = "read-only-rootfs" | ||
| 58 | |||
| 59 | For more details, see the associated documentation: | ||
| 60 | |||
| 61 | https://docs.yoctoproject.org/dev/dev-manual/read-only-rootfs.html | ||
| 62 | |||
| 63 | Also add the basic block of dm-verity settings shown above, and select | ||
| 64 | your MACHINE from one of the supported platforms. | ||
| 65 | |||
| 66 | If there is a dm-verity-<MACHINE>.txt file for your BSP, check that for | ||
| 67 | any additional platform specific recommended settings, such as the | ||
| 68 | WKS_FILES which can specify board specific storage layout discussed below. | ||
| 69 | |||
| 70 | Then you should be able to do a "bitbake core-image-minimal" just like any | ||
| 71 | other normal build. What you will notice, is the content in | ||
| 72 | tmp/deploy/images/<MACHINE>/ now have suffixes like "rootfs.ext4.verity" | ||
| 73 | |||
| 74 | While you can manually work with these images just like any other build, | ||
| 75 | this is where the BSP specific recipes in meta-security/wic can simplify | ||
| 76 | things and remove a bunch of manual steps that might be error prone. | ||
| 77 | |||
| 78 | Consider for example, the beaglebone black WIC file, which contains: | ||
| 79 | |||
| 80 | part /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat | ||
| 81 | --label boot --active --align 4 --fixed-size 32 --sourceparams="loader=u-boot" --use-uuid | ||
| 82 | part / --source rawcopy --ondisk mmcblk0 --sourceparams="file=${IMGDEPLOYDIR}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.verity" | ||
| 83 | bootloader --append="console=ttyS0,115200" | ||
| 84 | |||
| 85 | As can be seen, it maps out the partitions, including the bootloader, and | ||
| 86 | saves doing a whole bunch of manual partitioning and dd steps. | ||
| 87 | |||
| 88 | This file is copied into tmp/deploy/images/<MACHINE>/ with bitbake | ||
| 89 | variables expanded with their corresponding values for wic to make use of. | ||
| 90 | |||
| 91 | Continuing with the beaglebone example, we'll see output similar to: | ||
| 92 | |||
| 93 | ---------------------- | ||
| 94 | $ wic create -e core-image-minimal beaglebone-yocto-verity | ||
| 95 | |||
| 96 | [...] | ||
| 97 | |||
| 98 | INFO: Creating image(s)... | ||
| 99 | |||
| 100 | INFO: The new image(s) can be found here: | ||
| 101 | ./beaglebone-yocto-verity.wks-202303070223-mmcblk0.direct | ||
| 102 | |||
| 103 | The following build artifacts were used to create the image(s): | ||
| 104 | BOOTIMG_DIR: /home/paul/poky/build-bbb-verity/tmp/work/beaglebone_yocto-poky-linux-gnueabi/core-image-minimal/1.0-r0/recipe-sysroot/usr/share | ||
| 105 | KERNEL_DIR: /home/paul/poky/build-bbb-verity/tmp/deploy/images/beaglebone-yocto | ||
| 106 | NATIVE_SYSROOT: /home/paul/poky/build-bbb-verity/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/wic-tools/1.0-r0/recipe-sysroot-native | ||
| 107 | |||
| 108 | INFO: The image(s) were created using OE kickstart file: | ||
| 109 | /home/paul/poky/meta-security/wic/beaglebone-yocto-verity.wks.in | ||
| 110 | ---------------------- | ||
| 111 | |||
| 112 | The "direct" image contains the partition table, bootloader, and dm-verity | ||
| 113 | enabled ext4 image all in one -- ready to write to a raw device, such as a | ||
| 114 | u-SD card in the case of the beaglebone. | ||
