12daf84b2SAndrew Geisslerdm-verity and Yocto/OE
22daf84b2SAndrew Geissler----------------------
32daf84b2SAndrew GeisslerThe dm-verity feature provides a level of data integrity and resistance to
42daf84b2SAndrew Geisslerdata tampering.  It does this by creating a hash for each data block of
52daf84b2SAndrew Geisslerthe underlying device as the base of a hash tree.  There are many
62daf84b2SAndrew Geisslerdocuments out there to further explain the implementaion, such as the
72daf84b2SAndrew Geisslerin-kernel one itself:
82daf84b2SAndrew Geissler
92daf84b2SAndrew Geisslerhttps://docs.kernel.org/admin-guide/device-mapper/verity.html
102daf84b2SAndrew Geissler
112daf84b2SAndrew GeisslerThe goal of this document is not to reproduce that content, but instead to
122daf84b2SAndrew Geisslercapture the Yocto/OE specifics of the dm-verity infrastructure used here.
132daf84b2SAndrew Geissler
142daf84b2SAndrew GeisslerIdeally this should enable a person to build and deploy an image on one of
152daf84b2SAndrew Geisslerthe supported reference platforms, and then further adapt to their own
162daf84b2SAndrew Geisslerplatform and specific storage requirements.
172daf84b2SAndrew Geissler
182daf84b2SAndrew GeisslerBasic Settings
192daf84b2SAndrew Geissler--------------
202daf84b2SAndrew GeisslerLargely everything is driven off of a dm-verity image class; a typical
212daf84b2SAndrew Geisslerblock of non MACHINE specific settings are shown below:
222daf84b2SAndrew Geissler
232daf84b2SAndrew GeisslerINITRAMFS_IMAGE = "dm-verity-image-initramfs"
242daf84b2SAndrew GeisslerDM_VERITY_IMAGE = "core-image-minimal"
252daf84b2SAndrew GeisslerDM_VERITY_IMAGE_TYPE = "ext4"
262daf84b2SAndrew GeisslerIMAGE_CLASSES += "dm-verity-img"
272daf84b2SAndrew GeisslerINITRAMFS_IMAGE_BUNDLE = "1"
282daf84b2SAndrew Geissler
292daf84b2SAndrew GeisslerKernel Configuration
302daf84b2SAndrew Geissler--------------------
312daf84b2SAndrew GeisslerKernel configuration for dm-verity happens automatically via IMAGE_CLASSES
322daf84b2SAndrew Geisslerwhich will source features/device-mapper/dm-verity.scc when dm-verity-img
332daf84b2SAndrew Geissleris used. [See commit d9feafe991c]
34*dc9d6147SAndrew GeisslerIMPORTANT: As per the top level README, you *must* put security in the
35*dc9d6147SAndrew GeisslerDISTRO_FEATURES, or else you won't get the dm-verity kernel settings.
362daf84b2SAndrew Geissler
372daf84b2SAndrew GeisslerSupported Platforms
382daf84b2SAndrew Geissler-------------------
392daf84b2SAndrew GeisslerIn theory, you can use dm-verity anywhere - there is nothing arch/BSP
402daf84b2SAndrew Geisslerspecific in the core kernel support.  However, at the BSP level, one
412daf84b2SAndrew Geisslereventually has to decide what device(s) are to be hashed, and where the
422daf84b2SAndrew Geisslerhash tables are stored.
432daf84b2SAndrew Geissler
442daf84b2SAndrew GeisslerTo that end, the BSP storage specifics live in meta-security/wic dir and
452daf84b2SAndrew Geisslerrepresent the current set of example configurations that have been tested
462daf84b2SAndrew Geisslerand submitted at some point.
472daf84b2SAndrew Geissler
482daf84b2SAndrew GeisslerGetting Started
492daf84b2SAndrew Geissler---------------
502daf84b2SAndrew GeisslerThis document assumes you are starting from the basic auto-created
512daf84b2SAndrew Geisslerconf/local.conf and conf/bblayers.conf from the oe-init-build-env
522daf84b2SAndrew Geissler
532daf84b2SAndrew GeisslerFirstly, you need the meta-security layer to conf/bblayers.conf along with
542daf84b2SAndrew Geisslerthe dependencies it has -- see the top level meta-security README for that.
552daf84b2SAndrew Geissler
56*dc9d6147SAndrew GeisslerNote that if you are using dm-verity for your rootfs, then it enforces a
57*dc9d6147SAndrew Geisslerread-only mount right at the kernel level, so be prepared for issues such
58*dc9d6147SAndrew Geissleras failed creation of temporary files and similar.
59*dc9d6147SAndrew Geissler
60*dc9d6147SAndrew GeisslerYocto does support additional checks and changes via setting:
612daf84b2SAndrew Geissler
622daf84b2SAndrew GeisslerEXTRA_IMAGE_FEATURES = "read-only-rootfs"
632daf84b2SAndrew Geissler
64*dc9d6147SAndrew Geissler...but since read-only is enforced at the kernel level already, using
65*dc9d6147SAndrew Geisslerthis feature isn't a hard requirement.  It may be best to delay/defer
66*dc9d6147SAndrew Geisslermaking use of this until after you've established basic booting.
67*dc9d6147SAndrew Geissler
682daf84b2SAndrew GeisslerFor more details, see the associated documentation:
692daf84b2SAndrew Geissler
702daf84b2SAndrew Geisslerhttps://docs.yoctoproject.org/dev/dev-manual/read-only-rootfs.html
712daf84b2SAndrew Geissler
722daf84b2SAndrew GeisslerAlso add the basic block of dm-verity settings shown above, and select
732daf84b2SAndrew Geissleryour MACHINE from one of the supported platforms.
742daf84b2SAndrew Geissler
752daf84b2SAndrew GeisslerIf there is a dm-verity-<MACHINE>.txt file for your BSP, check that for
762daf84b2SAndrew Geisslerany additional platform specific recommended settings, such as the
772daf84b2SAndrew GeisslerWKS_FILES which can specify board specific storage layout discussed below.
782daf84b2SAndrew Geissler
792daf84b2SAndrew GeisslerThen you should be able to do a "bitbake core-image-minimal" just like any
802daf84b2SAndrew Geisslerother normal build.  What you will notice, is the content in
812daf84b2SAndrew Geisslertmp/deploy/images/<MACHINE>/ now have suffixes like "rootfs.ext4.verity"
822daf84b2SAndrew Geissler
832daf84b2SAndrew GeisslerWhile you can manually work with these images just like any other build,
842daf84b2SAndrew Geisslerthis is where the BSP specific recipes in meta-security/wic can simplify
852daf84b2SAndrew Geisslerthings and remove a bunch of manual steps that might be error prone.
862daf84b2SAndrew Geissler
872daf84b2SAndrew GeisslerConsider for example, the beaglebone black WIC file, which contains:
882daf84b2SAndrew Geissler
892daf84b2SAndrew Geisslerpart /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat
902daf84b2SAndrew Geissler--label boot --active --align 4 --fixed-size 32 --sourceparams="loader=u-boot" --use-uuid
912daf84b2SAndrew Geisslerpart / --source rawcopy --ondisk mmcblk0 --sourceparams="file=${IMGDEPLOYDIR}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.verity"
922daf84b2SAndrew Geisslerbootloader --append="console=ttyS0,115200"
932daf84b2SAndrew Geissler
942daf84b2SAndrew GeisslerAs can be seen, it maps out the partitions, including the bootloader, and
952daf84b2SAndrew Geisslersaves doing a whole bunch of manual partitioning and dd steps.
962daf84b2SAndrew Geissler
972daf84b2SAndrew GeisslerThis file is copied into tmp/deploy/images/<MACHINE>/ with bitbake
982daf84b2SAndrew Geisslervariables expanded with their corresponding values for wic to make use of.
992daf84b2SAndrew Geissler
1002daf84b2SAndrew GeisslerContinuing with the beaglebone example, we'll see output similar to:
1012daf84b2SAndrew Geissler
1022daf84b2SAndrew Geissler             ----------------------
1032daf84b2SAndrew Geissler$ wic create -e core-image-minimal beaglebone-yocto-verity
1042daf84b2SAndrew Geissler
1052daf84b2SAndrew Geissler[...]
1062daf84b2SAndrew Geissler
1072daf84b2SAndrew GeisslerINFO: Creating image(s)...
1082daf84b2SAndrew Geissler
1092daf84b2SAndrew GeisslerINFO: The new image(s) can be found here:
1102daf84b2SAndrew Geissler  ./beaglebone-yocto-verity.wks-202303070223-mmcblk0.direct
1112daf84b2SAndrew Geissler
1122daf84b2SAndrew GeisslerThe following build artifacts were used to create the image(s):
1132daf84b2SAndrew Geissler  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
1142daf84b2SAndrew Geissler  KERNEL_DIR:        /home/paul/poky/build-bbb-verity/tmp/deploy/images/beaglebone-yocto
1152daf84b2SAndrew Geissler  NATIVE_SYSROOT:    /home/paul/poky/build-bbb-verity/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/wic-tools/1.0-r0/recipe-sysroot-native
1162daf84b2SAndrew Geissler
1172daf84b2SAndrew GeisslerINFO: The image(s) were created using OE kickstart file:
1182daf84b2SAndrew Geissler  /home/paul/poky/meta-security/wic/beaglebone-yocto-verity.wks.in
1192daf84b2SAndrew Geissler             ----------------------
1202daf84b2SAndrew Geissler
1212daf84b2SAndrew GeisslerThe "direct" image contains the partition table, bootloader, and dm-verity
1222daf84b2SAndrew Geisslerenabled ext4 image all in one -- ready to write to a raw device, such as a
1232daf84b2SAndrew Geissleru-SD card in the case of the beaglebone.
124