feat: Allow users to override secure boot key and password (#40)
* feat: Allow users to override secure boot key and password when using container or action * fix: follow redirects * chore: update docs * fix: added comments and removed additional \n * fix: removed defaults * fix: added conditional for adding public key * chore(ci): Added additional test for secure boot * chore(ci): fixed up workflows to match production * fix(ci): added workflow dispatch to test * fix(ci): fixed version and added IMAGE_TAG * chore(ci): changed to bluefin to test both 38 and 39 secure boot * chore(ci): added required variables to entrypoint * chore(ci): added merge_group and added paths-ignore * chore(ci): updated description * chore(ci): set to Silverblue since we are testing Bluefin * chore(ci): Fixed secure boot key not found error Received error in anaconda when check was hit, need to set as a soft failure to exit the script early without stopping anaconda installation. * chore: fixed formatting * chore: fixed whitespace * chore(ci): Removed duplicate test * chore: fix whitespace * chore(ci): fixed test and removed upload to Github Artifacts * chore: updated README * fix: set password to ublue default * fix: changed enrollment password in containerfile
This commit is contained in:
parent
3401b10c56
commit
f70e8ea027
|
@ -1,9 +1,14 @@
|
||||||
---
|
---
|
||||||
name: Build Container Image
|
name: Build Container Image
|
||||||
on:
|
on:
|
||||||
|
merge_group:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- '*.md'
|
||||||
|
- 'LICENSE'
|
||||||
|
- 'CODEOWNERS'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
|
@ -10,6 +10,7 @@ on:
|
||||||
- '*.md'
|
- '*.md'
|
||||||
- 'LICENSE'
|
- 'LICENSE'
|
||||||
- 'CODEOWNERS'
|
- 'CODEOWNERS'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-push-iso:
|
build-and-push-iso:
|
||||||
|
@ -18,15 +19,30 @@ jobs:
|
||||||
container:
|
container:
|
||||||
image: fedora:39
|
image: fedora:39
|
||||||
options: "--privileged"
|
options: "--privileged"
|
||||||
|
volumes:
|
||||||
|
- "/:/host"
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
packages: write
|
packages: write
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
version:
|
version:
|
||||||
- 38
|
- 38
|
||||||
- 39
|
- 39
|
||||||
|
secure_boot:
|
||||||
|
- true
|
||||||
|
- false
|
||||||
|
include:
|
||||||
|
- secure_boot: true
|
||||||
|
SECURE_BOOT_KEY_URL: 'https://github.com/ublue-os/akmods/raw/main/certs/public_key.der'
|
||||||
|
ENROLLMENT_PASSWORD: 'ublue-os'
|
||||||
|
SECURE_BOOT_STRING: '-secure'
|
||||||
|
- secure_boot: false
|
||||||
|
SECURE_BOOT_KEY_URL: ''
|
||||||
|
ENROLLMENT_PASSWORD: ''
|
||||||
|
SECURE_BOOT_STRING: ''
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
@ -41,6 +57,18 @@ jobs:
|
||||||
VERSION: ${{ matrix.version }}
|
VERSION: ${{ matrix.version }}
|
||||||
ACTION_REPO: ${{ github.repository }}
|
ACTION_REPO: ${{ github.repository }}
|
||||||
ACTION_REF: ${{ github.ref }}
|
ACTION_REF: ${{ github.ref }}
|
||||||
|
SECURE_BOOT_KEY_URL: ${{ matrix.SECURE_BOOT_KEY_URL }}
|
||||||
|
ENROLLMENT_PASSWORD: ${{ matrix.ENROLLMENT_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Upload ISO as artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: base-main-${{ matrix.version }}${{ matrix.SECURE_BOOT_STRING }}.iso
|
||||||
|
path: end_iso/*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 0
|
||||||
|
compression-level: 0
|
||||||
|
overwrite: true
|
||||||
|
|
||||||
check:
|
check:
|
||||||
name: Check build successful
|
name: Check build successful
|
||||||
|
@ -55,4 +83,4 @@ jobs:
|
||||||
run: exit 1
|
run: exit 1
|
||||||
- name: Exit
|
- name: Exit
|
||||||
shell: bash
|
shell: bash
|
||||||
run: exit 0
|
run: exit 0
|
||||||
|
|
|
@ -13,6 +13,8 @@ ENV IMAGE_TAG="${VERSION}"
|
||||||
ENV VARIANT="Kinoite"
|
ENV VARIANT="Kinoite"
|
||||||
ENV VERSION="${VERSION}"
|
ENV VERSION="${VERSION}"
|
||||||
ENV WEB_UI="false"
|
ENV WEB_UI="false"
|
||||||
|
ENV SECURE_BOOT_KEY_URL=""
|
||||||
|
ENV ENROLLMENT_PASSWORD="ublue-os"
|
||||||
|
|
||||||
COPY / /isogenerator
|
COPY / /isogenerator
|
||||||
WORKDIR /isogenerator
|
WORKDIR /isogenerator
|
||||||
|
|
11
Makefile
11
Makefile
|
@ -8,6 +8,8 @@ IMAGE_TAG = $(VERSION)
|
||||||
EXTRA_BOOT_PARAMS =
|
EXTRA_BOOT_PARAMS =
|
||||||
VARIANT = Kinoite
|
VARIANT = Kinoite
|
||||||
WEB_UI = false
|
WEB_UI = false
|
||||||
|
ENROLLMENT_PASSWORD = ublue-os
|
||||||
|
SECURE_BOOT_KEY_URL =
|
||||||
|
|
||||||
# Generated vars
|
# Generated vars
|
||||||
## Formatting = _UPPERCASE
|
## Formatting = _UPPERCASE
|
||||||
|
@ -50,6 +52,14 @@ lorax_templates/%.tmpl: lorax_templates/%.tmpl.in
|
||||||
boot.iso: lorax_templates/set_installer.tmpl lorax_templates/configure_upgrades.tmpl
|
boot.iso: lorax_templates/set_installer.tmpl lorax_templates/configure_upgrades.tmpl
|
||||||
rm -Rf $(_BASE_DIR)/results
|
rm -Rf $(_BASE_DIR)/results
|
||||||
|
|
||||||
|
# Set the enrollment password
|
||||||
|
sed 's/@ENROLLMENT_PASSWORD@/$(ENROLLMENT_PASSWORD)/' $(_BASE_DIR)/scripts/enroll-secureboot-key.sh.in > $(_BASE_DIR)/scripts/enroll-secureboot-key.sh
|
||||||
|
|
||||||
|
# Download the secure boot key
|
||||||
|
if [ -n "$(SECURE_BOOT_KEY_URL)" ]; then\
|
||||||
|
curl --fail -L -o $(_BASE_DIR)/sb_pubkey.der $(SECURE_BOOT_KEY_URL);\
|
||||||
|
fi
|
||||||
|
|
||||||
# Remove the "Test this media & install" menu entry
|
# Remove the "Test this media & install" menu entry
|
||||||
sed -i '/menuentry '\''Test this media & install @PRODUCT@ @VERSION@'\'' --class fedora --class gnu-linux --class gnu --class os {/,/}/d' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-bios.cfg
|
sed -i '/menuentry '\''Test this media & install @PRODUCT@ @VERSION@'\'' --class fedora --class gnu-linux --class gnu --class os {/,/}/d' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-bios.cfg
|
||||||
sed -i '/menuentry '\''Test this media & install @PRODUCT@ @VERSION@'\'' --class fedora --class gnu-linux --class gnu --class os {/,/}/d' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-efi.cfg
|
sed -i '/menuentry '\''Test this media & install @PRODUCT@ @VERSION@'\'' --class fedora --class gnu-linux --class gnu --class os {/,/}/d' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-efi.cfg
|
||||||
|
@ -68,6 +78,7 @@ boot.iso: lorax_templates/set_installer.tmpl lorax_templates/configure_upgrades.
|
||||||
sed -i 's/linux @KERNELPATH@ @ROOT@ inst.rescue quiet/linux @KERNELPATH@ @ROOT@ inst.rescue quiet $(EXTRA_BOOT_PARAMS)/g' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-bios.cfg
|
sed -i 's/linux @KERNELPATH@ @ROOT@ inst.rescue quiet/linux @KERNELPATH@ @ROOT@ inst.rescue quiet $(EXTRA_BOOT_PARAMS)/g' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-bios.cfg
|
||||||
sed -i 's/linuxefi @KERNELPATH@ @ROOT@ inst.rescue quiet/linuxefi @KERNELPATH@ @ROOT@ inst.rescue quiet $(EXTRA_BOOT_PARAMS)/g' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-efi.cfg
|
sed -i 's/linuxefi @KERNELPATH@ @ROOT@ inst.rescue quiet/linuxefi @KERNELPATH@ @ROOT@ inst.rescue quiet $(EXTRA_BOOT_PARAMS)/g' /usr/share/lorax/templates.d/99-generic/config_files/x86/grub2-efi.cfg
|
||||||
|
|
||||||
|
# Build boot.iso
|
||||||
lorax -p $(IMAGE_NAME) -v $(VERSION) -r $(VERSION) -t $(VARIANT) \
|
lorax -p $(IMAGE_NAME) -v $(VERSION) -r $(VERSION) -t $(VARIANT) \
|
||||||
--isfinal --buildarch=$(ARCH) --volid=$(_VOLID) \
|
--isfinal --buildarch=$(ARCH) --volid=$(_VOLID) \
|
||||||
$(_LORAX_ARGS) \
|
$(_LORAX_ARGS) \
|
||||||
|
|
29
README.md
29
README.md
|
@ -37,19 +37,24 @@ sudo podman run --rm --privileged --volume .:/isogenerator/output -e VERSION=39
|
||||||
## Customizing
|
## Customizing
|
||||||
The following variables can be used to customize the create image.
|
The following variables can be used to customize the create image.
|
||||||
|
|
||||||
| Variable | Description | Default Value |
|
| Variable | Description | Default Value |
|
||||||
| ----------------- | -------------------------------------------------------- | ---------------------- |
|
| ----------------- | ------------------------------------------------------------ | ---------------------- |
|
||||||
| ARCH | Architecture for image to build | x86_64 |
|
| ARCH | Architecture for image to build | x86_64 |
|
||||||
| VERSION | Fedora version of installer to build | 39 |
|
| VERSION | Fedora version of installer to build | 39 |
|
||||||
| IMAGE_REPO | Repository containing the source container image | ghcr.io/ublue-os |
|
| IMAGE_REPO | Repository containing the source container image | ghcr.io/ublue-os |
|
||||||
| IMAGE_NAME | Name of the source container image | base-main |
|
| IMAGE_NAME | Name of the source container image | base-main |
|
||||||
| IMAGE_TAG | Tag of the source container image | *VERSION* |
|
| IMAGE_TAG | Tag of the source container image | *VERSION* |
|
||||||
| EXTRA_BOOT_PARAMS | Extra params used by grub to boot the anaconda installer | \[empty\] |
|
| EXTRA_BOOT_PARAMS | Extra params used by grub to boot the anaconda installer | \[empty\] |
|
||||||
| VARIANT | Source container variant\* | Kinoite |
|
| VARIANT | Source container variant\* | Kinoite |
|
||||||
| WEB_UI | Enable Anaconda WebUI (experimental) | false |
|
| WEB_UI | Enable Anaconda WebUI (experimental) | false |
|
||||||
|
| ENROLLMENT_PASSWORD | Password used to enroll secure boot key into BIOS\*\* | isogenerator |
|
||||||
|
| SECURE_BOOT_KEY_URL | URL used to download your secure boot key for enrollment\*\* | \[empty\] |
|
||||||
|
|
||||||
Available options for VARIANT can be found by running `dnf provides system-release`.
|
\*Available options for VARIANT can be found by running `dnf provides system-release`. Variant will be the third item in the package name. Example: `fedora-release-kinoite-39-34.noarch` will be kinoite
|
||||||
Variant will be the third item in the package name. Example: `fedora-release-kinoite-39-34.noarch` will be kinoite
|
|
||||||
|
\*\*NOTE: ENROLLMENT_PASSWORD and SECURE_BOOT_KEY_URL are not required. They are only required if you are creating specific kernel modules or if you are using Universal Blue Kernel Modules.
|
||||||
|
|
||||||
|
Our public key for our kmods is located here: https://github.com/ublue-os/akmods/raw/main/certs/public_key.der
|
||||||
|
|
||||||
## VSCode Dev Container
|
## VSCode Dev Container
|
||||||
There is a dev container configuration provided for development. By default it will use the existing container image available at `ghcr.io/ublue-os/isogenerator`, however, you can have it build a new image by editing `.devcontainer/devcontainer.json` and replacing `image` with `build`. `Ctrl+/` can be used to comment and uncomment blocks of code within VSCode.
|
There is a dev container configuration provided for development. By default it will use the existing container image available at `ghcr.io/ublue-os/isogenerator`, however, you can have it build a new image by editing `.devcontainer/devcontainer.json` and replacing `image` with `build`. `Ctrl+/` can be used to comment and uncomment blocks of code within VSCode.
|
||||||
|
|
20
action.yml
20
action.yml
|
@ -32,6 +32,12 @@ inputs:
|
||||||
description: Enable Anaconda WebUI
|
description: Enable Anaconda WebUI
|
||||||
required: true
|
required: true
|
||||||
default: "false"
|
default: "false"
|
||||||
|
ENROLLMENT_PASSWORD:
|
||||||
|
description: Used for supporting secure boot (requires SECURE_BOOT_KEY_URL to be defined)
|
||||||
|
required: false
|
||||||
|
SECURE_BOOT_KEY_URL:
|
||||||
|
description: Secure boot key that is installed from URL location
|
||||||
|
required: false
|
||||||
ACTION_REPO:
|
ACTION_REPO:
|
||||||
description: Repository with the build action
|
description: Repository with the build action
|
||||||
required: false
|
required: false
|
||||||
|
@ -107,7 +113,9 @@ runs:
|
||||||
VARIANT=${{ inputs.VARIANT }} \
|
VARIANT=${{ inputs.VARIANT }} \
|
||||||
VERSION=${{ inputs.VERSION }} \
|
VERSION=${{ inputs.VERSION }} \
|
||||||
WEB_UI=${{ inputs.WEB_UI }} \
|
WEB_UI=${{ inputs.WEB_UI }} \
|
||||||
EXTRA_BOOT_PARAMS=${{ inputs.EXTRA_BOOT_PARAMS }}
|
EXTRA_BOOT_PARAMS=${{ inputs.EXTRA_BOOT_PARAMS }} \
|
||||||
|
SECURE_BOOT_KEY_URL=${{ inputs.SECURE_BOOT_KEY_URL }} \
|
||||||
|
ENROLLMENT_PASSWORD=${{ inputs.ENROLLMENT_PASSWORD }}
|
||||||
|
|
||||||
- name: Create deploy.iso and generate sha256 checksum
|
- name: Create deploy.iso and generate sha256 checksum
|
||||||
shell: bash
|
shell: bash
|
||||||
|
@ -123,13 +131,3 @@ runs:
|
||||||
mkdir end_iso
|
mkdir end_iso
|
||||||
sha256sum ${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}.iso > ./end_iso/${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}-CHECKSUM
|
sha256sum ${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}.iso > ./end_iso/${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}-CHECKSUM
|
||||||
mv ${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}.iso end_iso/
|
mv ${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}.iso end_iso/
|
||||||
|
|
||||||
- name: Upload ISO as artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ${{ inputs.IMAGE_NAME }}-${{ inputs.IMAGE_TAG || inputs.VERSION }}.iso
|
|
||||||
path: end_iso/*
|
|
||||||
if-no-files-found: error
|
|
||||||
retention-days: 0
|
|
||||||
compression-level: 0
|
|
||||||
overwrite: true
|
|
||||||
|
|
|
@ -3,6 +3,15 @@
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# pre-create loop devices manually. In containers we can't use losetup for that.
|
# pre-create loop devices manually. In containers we can't use losetup for that.
|
||||||
mknod -m 0660 /dev/loop0 b 7 0 2> /dev/null || true
|
mknod -m 0660 /dev/loop0 b 7 0 2>/dev/null || true
|
||||||
|
|
||||||
make output/${IMAGE_NAME}-${IMAGE_TAG}.iso ARCH=${ARCH} VERSION=${VERSION} IMAGE_REPO=${IMAGE_REPO} IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} VARIANT=${VARIANT} WEB_UI=${WEB_UI}
|
make output/${IMAGE_NAME}-${IMAGE_TAG}.iso \
|
||||||
|
ARCH=${ARCH} \
|
||||||
|
VERSION=${VERSION} \
|
||||||
|
IMAGE_REPO=${IMAGE_REPO} \
|
||||||
|
IMAGE_NAME=${IMAGE_NAME} \
|
||||||
|
IMAGE_TAG=${IMAGE_TAG} \
|
||||||
|
VARIANT=${VARIANT} \
|
||||||
|
WEB_UI=${WEB_UI} \
|
||||||
|
SECURE_BOOT_KEY_URL=${SECURE_BOOT_KEY_URL} \
|
||||||
|
ENROLLMENT_PASSWORD=${ENROLLMENT_PASSWORD}
|
||||||
|
|
|
@ -2,14 +2,8 @@
|
||||||
|
|
||||||
set -oue pipefail
|
set -oue pipefail
|
||||||
|
|
||||||
readonly SECUREBOOT_KEY="/run/install/repo/ublue-os-akmods-public-key.der"
|
readonly ENROLLMENT_PASSWORD=@ENROLLMENT_PASSWORD@
|
||||||
readonly ENROLLMENT_PASSWORD="ublue-os"
|
readonly SECUREBOOT_KEY="/run/install/repo/sb_pubkey.der"
|
||||||
|
|
||||||
SYS_ID="$(cat /sys/devices/virtual/dmi/id/product_name)"
|
|
||||||
if [[ ":Jupiter:Galileo:" =~ ":$SYS_ID:" ]]; then
|
|
||||||
echo "Steam Deck hardware detected. Skipping key enrollment."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -d "/sys/firmware/efi" ]]; then
|
if [[ ! -d "/sys/firmware/efi" ]]; then
|
||||||
echo "EFI mode not detected. Skipping key enrollment."
|
echo "EFI mode not detected. Skipping key enrollment."
|
||||||
|
@ -17,8 +11,14 @@ if [[ ! -d "/sys/firmware/efi" ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f "${SECUREBOOT_KEY}" ]]; then
|
if [[ ! -f "${SECUREBOOT_KEY}" ]]; then
|
||||||
echo "Secure boot key not found: ${SECUREBOOT_KEY}"
|
echo "Secure boot key not provided: ${SECUREBOOT_KEY}"
|
||||||
exit 1
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
SYS_ID="$(cat /sys/devices/virtual/dmi/id/product_name)"
|
||||||
|
if [[ ":Jupiter:Galileo:" =~ ":$SYS_ID:" ]]; then
|
||||||
|
echo "Steam Deck hardware detected. Skipping key enrollment."
|
||||||
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mokutil --timeout -1 || :
|
mokutil --timeout -1 || :
|
Binary file not shown.
|
@ -5,8 +5,10 @@ echo "-outdev $(pwd)/output/@IMAGE_NAME@-@IMAGE_TAG@.iso"
|
||||||
echo "-boot_image any replay"
|
echo "-boot_image any replay"
|
||||||
echo "-joliet on"
|
echo "-joliet on"
|
||||||
echo "-compliance joliet_long_names"
|
echo "-compliance joliet_long_names"
|
||||||
echo "-map $(pwd)/scripts/ublue-os-akmods-public-key.der ublue-os-akmods-public-key.der"
|
if [ -f $(pwd)/sb_pubkey.der ]; then
|
||||||
echo "-chmod 0444 /ublue-os-akmods-public-key.der"
|
echo "-map $(pwd)/sb_pubkey.der sb_pubkey.der"
|
||||||
|
echo "-chmod 0444 /sb_pubkey.der"
|
||||||
|
fi
|
||||||
echo "-map $(pwd)/scripts/enroll-secureboot-key.sh enroll-secureboot-key.sh"
|
echo "-map $(pwd)/scripts/enroll-secureboot-key.sh enroll-secureboot-key.sh"
|
||||||
echo "-chmod 0777 enroll-secureboot-key.sh"
|
echo "-chmod 0777 enroll-secureboot-key.sh"
|
||||||
cd container
|
cd container
|
||||||
|
|
Loading…
Reference in New Issue