Setup Machine Owner Key (MOK)

If your system is using secure boot, you'll need to sign the kernel modules.

Produce a password first!

mkdir /root/module-signing
cd /root/module-signing
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv \
  -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=$(hostname -f)/"
mokutil --import /root/module-signing/MOK.der
sync
reboot

Enroll the key from the Bootloader, and confirm after boot with:

dmesg | grep -i efi

Sign Modules

This script is currently configured to sign VirtualBox kernel modules (vbox*.ko). Tweaks will be necessary to sign other modules.

Content of /root/module-signing/sign.sh:

#!/bin/bash

if [ ${#} == 0 ]; then
  KVER=$(uname -r)
elif [ ${#} == 1 ]; then
  KVER=${1}
else
  echo -e "usage:\n\t$0 [kernel_version]" >&2
  exit 1
fi

MODULE_DIR="/lib/modules/${KVER}/"
SIGN_FILE="/usr/src/linux-headers-${KVER}/scripts/sign-file"

if [ ! -d "${MODULE_DIR}" ]; then
  echo -e "error: missing module directory...\n\t${MODULE_DIR}" >&2
  exit 1
elif [ ! -x "${SIGN_FILE}" ]; then
  echo -e "error: missing or non-executable sign-file script...\n\t${SIGN_FILE}" >&2
  exit 1
fi

find "${MODULE_DIR}" -name 'vbox*.ko' \
  | while read module; do
    echo "Signing '${module##*/}'..."
    "${SIGN_FILE}" \
      sha256 \
      /root/module-signing/MOK.priv \
      /root/module-signing/MOK.der \
      "${module}"
  done

Load Modules

modprobe ${MODULE_NAME}

Sign Modules on Kernel Upgrade

ln -s /root/module-signing/sign.sh /etc/kernel/postinst.d/module-signing