Commit 02f4e89a5174b2d5c26a362c300b5977612c41a8

Authored by Tim Gover
Committed by GitHub
2 parents 5e0ae34d 6af4fdef

Merge pull request #140 from timg236/secure-boot-quickstart

documentation: Secure boot quick start / walkthough
Readme.md
@@ -76,7 +76,7 @@ via RPIBOOT on Compute Module 4. @@ -76,7 +76,7 @@ via RPIBOOT on Compute Module 4.
76 | [secure-boot-msd](secure-boot-msd/README.md) | Scripts for signing the MSD firmware so that it can be used on a secure-boot device | 76 | [secure-boot-msd](secure-boot-msd/README.md) | Scripts for signing the MSD firmware so that it can be used on a secure-boot device |
77 | [secure-boot-example](secure-boot-example/README.md) | Simple Linux initrd with a UART console. 77 | [secure-boot-example](secure-boot-example/README.md) | Simple Linux initrd with a UART console.
78 78
79 -** The `secure-boot-msd`, `rpi-imager-embedded` and `mass-storage-gadget` extensions require that the `2022-04-26` (or newer) bootloader EEPROM release has already been written to the EEPROM using `recovery.bin` ** 79 +**The `secure-boot-msd`, `rpi-imager-embedded` and `mass-storage-gadget` extensions require that the `2022-04-26` (or newer) bootloader EEPROM release has already been written to the EEPROM using `recovery.bin`**
80 80
81 ## Booting Linux 81 ## Booting Linux
82 The `RPIBOOT` protocol provides a virtual file-system to the Raspberry Pi bootloader and GPU firmware. It's therefore possible to 82 The `RPIBOOT` protocol provides a virtual file-system to the Raspberry Pi bootloader and GPU firmware. It's therefore possible to
@@ -91,6 +91,9 @@ Secure Boot requires the latest stable bootloader image. @@ -91,6 +91,9 @@ Secure Boot requires the latest stable bootloader image.
91 WARNING: If the `revoke_devkey` option is used to revoke the ROM development key then it will 91 WARNING: If the `revoke_devkey` option is used to revoke the ROM development key then it will
92 not be possible to downgrade to a bootloader older than 2022-01-06 OR disable secure-boot mode. 92 not be possible to downgrade to a bootloader older than 2022-01-06 OR disable secure-boot mode.
93 93
  94 +### Tutorial
  95 +Creating a secure-boot system from scratch can be quite complex. The [secure-boot tutorial](secure-boot-example/README.md) uses a minimal example OS image to demonstrate how the Raspberry Pi specific aspects of secure-boot work.
  96 +
94 ### Host setup 97 ### Host setup
95 Secure boot require a 2048 bit RSA asymmetric keypair and the Python `pycrytodomex` module to sign the EEPROM config and boot image. 98 Secure boot require a 2048 bit RSA asymmetric keypair and the Python `pycrytodomex` module to sign the EEPROM config and boot image.
96 99
@@ -130,7 +133,7 @@ script depends upon the `mkfs.fat` and `losetup` tools and only runs on Linux. @@ -130,7 +133,7 @@ script depends upon the `mkfs.fat` and `losetup` tools and only runs on Linux.
130 ### Root file-system 133 ### Root file-system
131 Normally, the Kernel modules and overlays for a secure-boot system would be provided 134 Normally, the Kernel modules and overlays for a secure-boot system would be provided
132 in an [initramfs](https://www.raspberrypi.com/documentation/computers/config_txt.html#initramfs) 135 in an [initramfs](https://www.raspberrypi.com/documentation/computers/config_txt.html#initramfs)
133 -and built with (buildroot)[https://buildroot.org/] or (yocto)[https://www.yoctoproject.org/]. 136 +and built with [buildroot](https://buildroot.org/) or [yocto](https://www.yoctoproject.org/).
134 137
135 This ensures that all of the kernel modules and device tree dependencies are covered 138 This ensures that all of the kernel modules and device tree dependencies are covered
136 by the secure-boot signature. 139 by the secure-boot signature.
@@ -201,7 +204,7 @@ the public key may be specified separately via the `-p` argument to `update-piee @@ -201,7 +204,7 @@ the public key may be specified separately via the `-p` argument to `update-piee
201 204
202 To extract the public key in PEM format from a private key PEM file, run: 205 To extract the public key in PEM format from a private key PEM file, run:
203 ```bash 206 ```bash
204 -openssl rsa -in private.pem -pubout -out public.pem` 207 +openssl rsa -in private.pem -pubout -out public.pem
205 ``` 208 ```
206 209
207 #### Copy the secure boot image to the boot partition on the Raspberry Pi. 210 #### Copy the secure boot image to the boot partition on the Raspberry Pi.
secure-boot-example/README.md
1 -This directory contains an example secure boot image signed with the example private key in this directory. 1 +# Secure-boot quickstart
  2 +
  3 +## Overview
  4 +Secure-boot is a mechanism for verifying the integrity of the kernel image and
  5 +other files required during boot by storing them in a signed ramdisk image.
  6 +These files include the GPU firmware (start.elf etc), Kernel, initrd, device-tree tree
  7 +and overlays.
  8 +Secure-boot does not depend on particular OS, nor does it provide services
  9 +to the OS after startup. However, since the secure-boot will only load trusted
  10 +kernel + initrd images the kernel/initrd can safely verify or mount an
  11 +an encrypted file-system e.g. by using a TPM.
  12 +
  13 +N.B The memory for the secure ramdisk is reclaimed as soon as the CPU is started.
  14 +
  15 +## Example OS
  16 +This example includes a simple buildroot image for Compute Module 4 in order
  17 +to demonstrate secure-boot on a simple but functional OS.
  18 +
  19 +The example does NOT modify the OTP or make other permanent changes to the system
  20 +and the code-signing can be disabled by reflashing the default bootloader EEPROM.
  21 +
  22 +The tutorial does not cover how to create the `boot.img` file or permanently
  23 +require secure-boot in OTP. Please see the top level [README](../Readme.md#building) and
  24 +[secure-boot-recovery/README](../secure-boot-recovery/README.md) guides for
  25 +more information.
  26 +
  27 +### Requirements for running this example
  28 +* A Raspberry Pi Compute Module 4
  29 +* Micro USB cable for `rpiboot` connection
  30 +* USB serial cable (for debug logs)
  31 +* Linux or Cygwin (Windows 10)
  32 +* OpenSSL
  33 +* Python3
  34 +* Python `cryptodomex`
  35 +
  36 +```bash
  37 +python3 -m pip install pycryptodomex
  38 +# or
  39 +pip install pycryptodomex
  40 +```
  41 +
  42 +### Clean configuration
  43 +Before starting it's advisable to create a fresh clone of the `usbboot` repo
  44 +to ensure that there are no stale configuration files.
  45 +
  46 +```bash
  47 +git clone https://github.com/raspberrypi/usbboot secure-boot
  48 +cd secure-boot
  49 +make
  50 +```
  51 +See the top-level [README](../Readme.md) for build instructions.
  52 +
  53 +### Hardware setup for `rpiboot` mode
  54 +Prepare the Compute Module for `rpiboot` mode.
  55 +
  56 +* Set the `nRPIBOOT` jumper which is labelled `Fit jumper to disable eMMC Boot' on the Compute Module 4 IO board.
  57 +* Connect the micro USB cable to the `USB slave` port on the CM4 IO board.
  58 +* Power cycle the CM4 IO board.
  59 +* Connect the USB serial adapter to [GPIO 14/15](https://www.raspberrypi.com/documentation/computers/os.html#gpio-and-the-40-pin-header) on the 40-pin header.
  60 +
  61 +### Reset the Compute Module EEPROM
  62 +Enable `rpiboot` mode and flash the latest EEPROM image
  63 +```bash
  64 +./rpiboot -d recovery
  65 +```
  66 +
  67 +### Boot the example image
  68 +Enable `rpiboot` mode and load the OS via `rpiboot` without enabling code-signing.
  69 +```bash
  70 +./rpiboot -d secure-boot-example
  71 +```
  72 +The OS should load and show activity on the boot UART and HDMI console.
  73 +
  74 +### Generate a signing key
  75 +Secure-boot requires a 2048 bit RSA private key. You can either use a pre-existing
  76 +key or generate an specific key for this example. The `KEY_FILE` environment variable
  77 +used in the following instructions must contain the absolute path to the RSA private key in
  78 +PEM format.
  79 +
  80 +```bash
  81 +openssl genrsa 2048 > private.pem
  82 +export KEY_FILE=$(pwd)/private.pem
  83 +```
  84 +
  85 +**In a production environment it's essential that this key-file is stored privately and securely.**
  86 +
  87 +### Update the EEPROM to require signed OS images
  88 +Enable `rpiboot` mode and flash the bootloader EEPROM with updated setting enables code-signing.
  89 +
  90 +The `boot.conf` file sets the `SIGNED_BOOT` property `1` which instructs the bootloader to only
  91 +load files (firmware, kernel, overlays etc) from `boot.img` instead of the normal boot partition and verify the `boot.img` signature `boot.sig` using the public key in the EEPROM.
  92 +
  93 +The `update-pieeprom.sh` generates the signed `pieeprom.bin` image.
  94 +
  95 +```bash
  96 +cd secure-boot-recovery
  97 +# Generate the signed EEPROM image.
  98 +../tools/update-pieeprom.sh -k "${KEY_FILE}"
  99 +cd ..
  100 +./rpiboot -d secure-boot-recovery
  101 +```
  102 +
  103 +At this stage OTP has not been modified and the signed image requirement can be reverted by flashing a default, unsigned image.
  104 +However, once the [OTP secure-boot flags](../secure-boot-recovery/README.md#locking-secure-boot-mode) are set then `SIGNED_BOOT` is permenantely enabled and cannot be overriden via the EEPROM config.
  105 +
  106 +
  107 +### Update the signature for the example OS image
  108 +```bash
  109 +cd secure-boot-example
  110 +../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}"
  111 +cd ..
  112 +```
  113 +
  114 +### Launch the signed OS image
  115 +Enable `rpiboot` mode and run the example OS as before. However, if the
  116 +`boot.sig` signature does not match `boot.img` the bootloader will refuse to
  117 +load the OS.
2 118
3 -To sign the image with a different key run  
4 ```bash 119 ```bash
  120 +./rpiboot -d secure-boot-example
  121 +```
  122 +
  123 +This example OS image is minimal Linux ramdisk image. Login as `root` with the empty password.
  124 +
  125 +### Mount the CM4 SD/EMMC after enabling secure-boot
  126 +Now that `SIGNED_BOOT` is enabled the bootloader will only load images signed with private key generated earlier.
  127 +To boot the Compute Module in mass-storage mode a signed version of this code must be generated.
  128 +
  129 +**This signed-image should not be made available for download because it gives access to the EMMC as a block device**
  130 +
  131 +
  132 +#### Sign the mass storage firmware image
  133 +Sign the mass-storage drivers in the `secure-boot-msd` directory. Please see the [top level README](../Readme.md#compute-module-4-extensions) for a description of the different `usbboot` firmware drivers.
  134 +```bash
  135 +cd secure-boot-msd
5 ../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}" 136 ../tools/rpi-eeprom-digest -i boot.img -o boot.sig -k "${KEY_FILE}"
  137 +cd ..
6 ``` 138 ```
7 139
8 -Clearly, product releases should never be signed with `example-private.pem`. 140 +#### Enable MSD mode.
  141 +A new mass-storage device should now be visible on the host-OS. On Linux check `dmesg` for something like '/dev/sda'
  142 +```bash
  143 +./rpiboot -d secure-boot-msd
  144 +```
  145 +
  146 +### Loading `boot.img` from SD/EMMC.
  147 +The bootloader can load a ramdisk `boot.img` from any of the bootable modes defined by the [BOOT_ORDER](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER) EEPROM config setting.
  148 +
  149 +For example.
  150 +
  151 +* Boot the CM4 in MSD mode as explained in the previous step.
  152 +* Copy the `boot.img` and `boot.sig` files from the `secure-boot-example` stage to the mass-storage-drive. No other files are required.
  153 +* Remove the `nRPIBOOT` jumper.
  154 +* Power cycle the CM4 IO board.
  155 +* The system should now boot into the OS.
  156 +
  157 +N.B. The example image is currently the same as the `mass-storage-gadget so the EMMC/SD will appear as block devices on the host PC if the micro USB cable is still connected.
  158 +
secure-boot-example/boot.img
No preview for this file type
secure-boot-example/boot.sig
1 -f2557e1745433a570d9f2f0d9f69b7ca3123d2be20425c0fd80c5ffbec0cba69  
2 -ts: 1645529528  
3 -rsa2048: b4e1467691c03a1faf467166d4d1439704fb52cd8fd8b8016f6bd144fb750a80dbb933ea85e352c080f9cccd170cdd71565d00b4e80d6d8ec6374aa5826eb5470b17a8bb47a3ef5ad111cd253092c9dca3488c73d653a3ed04c92fab08e142908e2f7f5e393d65a2e1cb8e7748d3f75ae66d904e1ff253e4e28ed58b66e93bac4e88ea4b544353310f103bf6e2cbd59df9df0e2d548f71219d8d1aeeb101dc5a3d507d87b26ae656d00b14554af30bc2ba18b76783c3666db1743bd210b3f31e4ee49743ba04bd27e05d7c1d244c4066dc312ec793cda30f93f3031b8394206b1cd488d8589040392a3a5186332c134be1a6c25b72212fed12ff4bb7032fa5ea 1 +087d95cc403464a5d2385a0832c912fffb084799952c207a0867d8269acb1c55
  2 +ts: 1652640519
  3 +rsa2048: d97c850205fde305a24e12ea4c31994d57c95f394b83cc62e2878ab122f3b4688a0a577acb7de74f800866c6676cba1d646cb7e3b4e2ea30786aa193326db6461776d30264a4e7ef9f5465a8e4c31129515305ffa4ca91499372d663b18e3f7505e4d1a83fd930df8296bee056d1ec823bc8909a836e2ae21d131ed33779665abfc2d0b47b66f109246b89a6d4b8ee8df8334d6ef7e910b5624c299fcb16efb62d43d7b228d2ef770d0326132b97d54a8d2afbbf09bf53034f2c1f3c748a619437cd523c5c6a706d12fc2e3e285ec7d3b65be16c1ed33e47faf6565ab13cee4a01682ecc70d10c683c193caf02a6a2380572aa590f06be13481f365c0e686a78
secure-boot-example/bootcode4.bin 0 → 100644
No preview for this file type
secure-boot-example/config.txt 0 → 100644
  1 +# Load the boot files from the ramdisk which is signed in secure-boot mode
  2 +boot_ramdisk=1
  3 +uart_2ndstage=1