Skip to content

Commit 931eb5a

Browse files
sacnaikxumia
authored andcommitted
secureboot: Enable signing SONiC kernel (sonic-net#10557)
Why I did it To sign SONiC kernel image and allow secure boot based system to verify SONiC image before loading into the system. How I did it Pass following parameter to rules/config.user Ex: SONIC_ENABLE_SECUREBOOT_SIGNATURE := y SIGNING_KEY := /path/to/key/private.key SIGNING_CERT := /path/to/public/public.cert How to verify it Secure boot enabled system enrolled with right public key of the, image in the platform UEFI database will able to verify image before load. Alternatively one can verify with offline sbsign tool as below. export SBSIGN_KEY=/abc/bcd/xyz/ sbverify --cert $SBSIGN_KEY/public_cert.cert fsroot-platform-XYZ/boot/vmlinuz-5.10.0-8-2-amd64 mage O/P: Signature verification OK
1 parent fa1e364 commit 931eb5a

5 files changed

Lines changed: 40 additions & 0 deletions

File tree

Makefile.work

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,17 @@ ifneq ($(SONIC_DPKG_CACHE_SOURCE),)
182182
DOCKER_RUN += -v "$(SONIC_DPKG_CACHE_SOURCE):/dpkg_cache:rw"
183183
endif
184184

185+
ifeq ($(SONIC_ENABLE_SECUREBOOT_SIGNATURE), y)
186+
ifneq ($(SIGNING_KEY),)
187+
DOCKER_SIGNING_SOURCE := $(shell dirname $(SIGNING_KEY))
188+
DOCKER_RUN += -v "$(DOCKER_SIGNING_SOURCE):$(DOCKER_SIGNING_SOURCE):ro"
189+
endif
190+
ifneq ($(SIGNING_CERT),)
191+
DOCKER_SIGNING_SOURCE := $(shell dirname $(SIGNING_CERT))
192+
DOCKER_RUN += -v "$(DOCKER_SIGNING_SOURCE):$(DOCKER_SIGNING_SOURCE):ro"
193+
endif
194+
endif
195+
185196
ifeq ($(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD), y)
186197
DOCKER_RUN += -v /var/run/docker.sock:/var/run/docker.sock
187198
endif
@@ -278,6 +289,7 @@ SONIC_BUILD_INSTRUCTION := make \
278289
EXTRA_DOCKER_TARGETS=$(EXTRA_DOCKER_TARGETS) \
279290
BUILD_LOG_TIMESTAMP=$(BUILD_LOG_TIMESTAMP) \
280291
SONIC_ENABLE_IMAGE_SIGNATURE=$(ENABLE_IMAGE_SIGNATURE) \
292+
SONIC_ENABLE_SECUREBOOT_SIGNATURE=$(SONIC_ENABLE_SECUREBOOT_SIGNATURE) \
281293
SONIC_DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \
282294
SLAVE_DIR=$(SLAVE_DIR) \
283295
$(SONIC_OVERRIDE_BUILD_VARS)

build_debian.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,23 @@ if [[ $CONFIGURED_ARCH == amd64 ]]; then
143143
sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install dmidecode hdparm
144144
fi
145145

146+
## Sign the Linux kernel
147+
if [ "$SONIC_ENABLE_SECUREBOOT_SIGNATURE" = "y" ]; then
148+
if [ ! -f $SIGNING_KEY ]; then
149+
echo "Error: SONiC linux kernel signing key missing"
150+
exit 1
151+
fi
152+
if [ ! -f $SIGNING_CERT ]; then
153+
echo "Error: SONiC linux kernel signing certificate missing"
154+
exit 1
155+
fi
156+
157+
echo '[INFO] Signing SONiC linux kernel image'
158+
K=$FILESYSTEM_ROOT/boot/vmlinuz-${LINUX_KERNEL_VERSION}-amd64
159+
sbsign --key $SIGNING_KEY --cert $SIGNING_CERT --output /tmp/${K##*/} ${K}
160+
sudo cp -f /tmp/${K##*/} ${K}
161+
fi
162+
146163
## Update initramfs for booting with squashfs+overlay
147164
cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null
148165

rules/config

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ K8s_GCR_IO_PAUSE_VERSION = 3.4.1
169169
# The relative path is build root folder.
170170
SONIC_ENABLE_IMAGE_SIGNATURE ?= n
171171

172+
# SONIC_ENABLE_SECUREBOOT_SIGNATURE - enable SONiC kernel signing to support UEFI secureboot
173+
# To support UEFI secureboot chain of trust requires EFI kernel to be signed as a PE binary
174+
# SIGNING_KEY =
175+
# SIGNING_CERT =
176+
# The absolute path should be provided.
177+
SONIC_ENABLE_SECUREBOOT_SIGNATURE ?= n
178+
172179
# PACKAGE_URL_PREFIX - the package url prefix
173180
PACKAGE_URL_PREFIX ?= https://packages.trafficmanager.net/public/packages
174181

slave.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
10421042
TARGET_PATH=$(TARGET_PATH) \
10431043
SONIC_ENFORCE_VERSIONS=$(SONIC_ENFORCE_VERSIONS) \
10441044
TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) \
1045+
SONIC_ENABLE_SECUREBOOT_SIGNATURE="$(SONIC_ENABLE_SECUREBOOT_SIGNATURE)" \
1046+
SIGNING_KEY="$(SIGNING_KEY)" \
1047+
SIGNING_CERT="$(SIGNING_CERT)" \
10451048
PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \
10461049
MULTIARCH_QEMU_ENVIRON=$(MULTIARCH_QEMU_ENVIRON) \
10471050
./build_debian.sh $(LOG)

sonic-slave-buster/Dockerfile.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ RUN apt-get update && apt-get install -y \
124124
devscripts \
125125
quilt \
126126
stgit \
127+
sbsigntool \
127128
# For platform-modules build
128129
module-assistant \
129130
# For thrift build\

0 commit comments

Comments
 (0)